Współpraca z sekcjami
Czasami chcesz dokument, który nie ma tego samego formatowania na wszystkich stronach. Na przykład, może być konieczne zmodyfikowanie formatów numerów stron, mieć inny rozmiar strony i orientację, lub mieć pierwszą stronę dokumentu jako okładkę strony bez żadnej numeracji. Można to osiągnąć dzięki sekcjom.
Sekcje to węzły poziomu, które kontrolują nagłówki i stopy, orientację, kolumny, marginesy, formatowanie numeru strony i inne.
Aspose.Words pozwala na zarządzanie sekcjami, dzielenie dokumentu na sekcje i wprowadzanie formatowania zmian, które dotyczą tylko określonej sekcji. Aspose.Words przechowuje informacje o formatowaniu sekcji, takie jak nagłówki i stopy, konfiguracja strony i ustawienia kolumn w przerwie sekcji.
Ten artykuł wyjaśnia jak pracować z sekcjami i przerwami sekcji.
Co sekcja i sekcja przerwa jest
Sekcje dokumentów są reprezentowane przez Section oraz SectionCollection zajęcia. Obiekty sekcji są natychmiastowe dzieci Document węzeł i można uzyskać dostęp przez Sections nieruchomości. Można zarządzać tymi węzłami za pomocą niektórych metod, takich jak Remove, Add, IndexOf, I innych.
Przerwa w sekcji jest opcją, która dzieli strony dokumentów na sekcje z możliwością dostosowania układów.
Rodzaje przerw sekcyjnych
Aspose.Words pozwala dzielić i formatować dokumenty przy użyciu różnych przerw sekcji BreakType wyliczenie:
- SectionBreakContinuous
- SectionBreakNewColumn
- SectionBreakNewPage
- SectionBreakEvenPage
- SectionBreakOddPage
Można również użyć SectionStart wyliczenie wyboru typu przerwy, który dotyczy tylko pierwszej sekcji, takiej jak NewColumn, NewPage, EvenPage i OddPage.
Zarządzanie sekcją
Ponieważ sekcja jest normalnym węzłem kompozytowym, cała obsługa węzła API mogą być wykorzystywane do manipulowania sekcjami: do dodawania, usuwania i innych operacji na sekcjach. Możesz przeczytać więcej o węzłach w artykule Aspose.Words Document Object Model (DOM).
Z drugiej strony, można również użyć DocumentBuilder
API do pracy z sekcjami. W tym artykule skupimy się na tym szczególnym sposobie pracy z sekcjami.
Wstaw lub usuń przerwę sekcji
Aspose.Words pozwala na wprowadzenie sekcji przerwy w tekście za pomocą InsertBreak Metoda.
Poniższy przykład kodu pokazuje, jak wstawić włamanie sekcji do dokumentu:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git. | |
/// <summary> | |
/// Insert section breaks before the specified paragraphs. | |
/// </summary> | |
private void insertSectionBreaks(ArrayList<Paragraph> topicStartParas) | |
{ | |
DocumentBuilder builder = new DocumentBuilder(mDoc); | |
for (Paragraph para : topicStartParas) | |
{ | |
Section section = para.getParentSection(); | |
// Insert section break if the paragraph is not at the beginning of a section already. | |
if (para != section.getBody().getFirstParagraph()) | |
{ | |
builder.moveTo(para.getFirstChild()); | |
builder.insertBreak(BreakType.SECTION_BREAK_NEW_PAGE); | |
// This is the paragraph that was inserted at the end of the now old section. | |
// We don't really need the extra paragraph, we just needed the section. | |
section.getBody().getLastParagraph().remove(); | |
} | |
} | |
} |
Użyj Remove metoda usuwania przerwy w sekcji. Jeśli nie trzeba usunąć określonej przerwy w sekcji i zamiast usunąć zawartość tej sekcji, można użyć ClearContent Metoda.
Poniższy przykład kodu pokazuje jak usunąć przerwy sekcje:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git. | |
private void removeSectionBreaks(Document doc) | |
{ | |
// Loop through all sections starting from the section that precedes the last one and moving to the first section. | |
for (int i = doc.getSections().getCount() - 2; i >= 0; i--) | |
{ | |
// Copy the content of the current section to the beginning of the last section. | |
doc.getLastSection().prependContent(doc.getSections().get(i)); | |
// Remove the copied section. | |
doc.getSections().get(i).remove(); | |
} | |
} |
Przesuń sekcję
Jeśli chcesz przenieść sekcję z jednej pozycji do drugiej w dokumencie, musisz uzyskać indeks tej sekcji. Aspose.Words pozwala uzyskać pozycję sekcji z SectionCollection. Można użyć Sections właściwość, aby uzyskać wszystkie sekcje w dokumencie. Ale jeśli chcesz dostać tylko pierwszą sekcję, można użyć FirstSection nieruchomości.
Poniższy przykład kodu pokazuje, jak uzyskać dostęp do pierwszej sekcji i iterate przez dzieci węzła kompozytowego:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git. | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
builder.write("Section 1"); | |
builder.moveToHeaderFooter(HeaderFooterType.HEADER_PRIMARY); | |
builder.write("Primary header"); | |
builder.moveToHeaderFooter(HeaderFooterType.FOOTER_PRIMARY); | |
builder.write("Primary footer"); | |
Section section = doc.getFirstSection(); | |
// A Section is a composite node and can contain child nodes, | |
// but only if those child nodes are of a "Body" or "HeaderFooter" node type. | |
for (Node node : section) | |
{ | |
switch (node.getNodeType()) | |
{ | |
case NodeType.BODY: | |
{ | |
Body body = (Body)node; | |
System.out.println("Body:"); | |
System.out.println(MessageFormat.format("\t\"{0}\"", body.getText().trim())); | |
break; | |
} | |
case NodeType.HEADER_FOOTER: | |
{ | |
HeaderFooter headerFooter = (HeaderFooter)node; | |
System.out.println(MessageFormat.format("HeaderFooter type: {0}:", headerFooter.getHeaderFooterType())); | |
System.out.println(MessageFormat.format("\t\"{0}\"", headerFooter.getText().trim())); | |
break; | |
} | |
default: | |
{ | |
throw new Exception("Unexpected node type in a section."); | |
} | |
} | |
} |
Określić układ sekcji
Czasami chcesz, aby twój dokument wyglądał lepiej, tworząc kreatywne układy dla różnych sekcji dokumentu. Jeśli chcesz określić typ bieżącej siatki sekcji, możesz wybrać tryb układu sekcji za pomocą SectionLayoutMode wyliczenie:
- Domyślnie
- Sieć
- LineGrid
- SnapToChars
Poniższy przykład kodu pokazuje jak ograniczyć liczbę wierszy, które każda strona może posiadać:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git. | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
// Enable pitching, and then use it to set the number of lines per page in this section. | |
// A large enough font size will push some lines down onto the next page to avoid overlapping characters. | |
builder.getPageSetup().setLayoutMode(SectionLayoutMode.LINE_GRID); | |
builder.getPageSetup().setLinesPerPage(15); | |
builder.getParagraphFormat().setSnapToGrid(true); | |
for (int i = 0; i < 30; i++) | |
builder.write("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. "); | |
doc.save(getArtifactsDir() + "WorkingWithDocumentOptionsAndSettings.LinesPerPage.docx"); |
Edytuj sekcję
Po dodaniu nowej sekcji do dokumentu, nie będzie ciała ani akapitu, który można edytować. Aspose.Words pozwala zagwarantować, że sekcja zawiera ciało z co najmniej jednym akapitem przy użyciu EnsureMinimum metoda - automatycznie doda do dokumentu węzeł Body (lub HeaderFooter), a następnie doda do niego paragraf.
Poniższy przykład kodu pokazuje jak przygotować nowy węzeł sekcji używając EnsureMinimum:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git. | |
Document doc = new Document(); | |
// If we add a new section like this, it will not have a body, or any other child nodes. | |
doc.getSections().add(new Section(doc)); | |
// Run the "EnsureMinimum" method to add a body and a paragraph to this section to begin editing it. | |
doc.getLastSection().ensureMinimum(); | |
doc.getSections().get(0).getBody().getFirstParagraph().appendChild(new Run(doc, "Hello world!")); |
Zawartość dodatku lub prependium
Jeśli chcesz narysować jakiś kształt lub dodać tekst lub obraz na początku / końcu sekcji, można użyć AppendContent oraz PrependContent metody Section Klasa.
Poniższy przykład kodu pokazuje, jak uzupełnić zawartość istniejącej sekcji:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git. | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
builder.write("Section 1"); | |
builder.insertBreak(BreakType.SECTION_BREAK_NEW_PAGE); | |
builder.write("Section 2"); | |
builder.insertBreak(BreakType.SECTION_BREAK_NEW_PAGE); | |
builder.write("Section 3"); | |
// This is the section that we will append and prepend to. | |
Section section = doc.getSections().get(2); | |
// Insert the contents of the first section to the beginning of the third section. | |
Section sectionToPrepend = doc.getSections().get(0); | |
section.prependContent(sectionToPrepend); | |
// Insert the contents of the second section to the end of the third section. | |
Section sectionToAppend = doc.getSections().get(1); | |
section.appendContent(sectionToAppend); |
Klon a sekcja
Aspose.Words pozwala na powielenie sekcji poprzez utworzenie pełnej kopii za pomocą deepClone Metoda.
Poniższy przykład kodu pokazuje jak sklonować pierwszą sekcję dokumentu:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git. | |
Document doc = new Document(getMyDir() + "Document.docx"); | |
Section cloneSection = doc.getSections().get(0).deepClone(); |
Kopiuj sekcje pomiędzy dokumentami
W niektórych przypadkach możesz mieć duże dokumenty z wieloma sekcjami i chcesz skopiować zawartość sekcji z jednego dokumentu do drugiego.
Aspose.Words pozwala na kopiowanie sekcji pomiędzy dokumentami za pomocą ImportNode Metoda.
Poniższy przykład kodu pokazuje jak kopiować sekcje pomiędzy dokumentami:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git. | |
Document srcDoc = new Document(getMyDir() + "Document.docx"); | |
Document dstDoc = new Document(); | |
Section sourceSection = srcDoc.getSections().get(0); | |
Section newSection = (Section) dstDoc.importNode(sourceSection, true); | |
dstDoc.getSections().add(newSection); | |
dstDoc.save(getArtifactsDir() + "WorkingWithSection.CopySection.docx"); |
Praca z działem Nagłówek i Footer
Podstawowe zasady wyświetlania nagłówka lub stopki dla każdej sekcji są dość proste:
- Jeżeli sekcja nie posiada własnych nagłówków / stóp określonego typu, to jest ona pobierana z poprzedniej sekcji.
- Typ nagłówka / stopki wyświetlany na stronie jest sterowany ustawieniami sekcji “Inna Pierwsza Strona” i “Różne Odd & Even Pages” - jeśli są wyłączone, to własne tytuły sekcji są ignorowane.
Poniższy przykład kodu pokazuje jak stworzyć 2 sekcje z różnymi nagłówkami:
Jeśli chcesz usunąć tekst nagłówków i stóp bez usuwania HeaderFooter obiektów w dokumencie, można użyć ClearHeadersFooters Metoda. Ponadto, można użyć DeleteHeaderFooterShapes metody usuwania wszystkich kształtów z nagłówków i stóp w dokumencie.
Poniższy przykład kodu pokazuje, jak usunąć zawartość wszystkich nagłówków i stóp w sekcji:
Poniższy przykład kodu, jak usunąć wszystkie kształty ze wszystkich nagłówków w sekcji:
Dostosuj właściwości strony w sekcji
Przed wydrukowaniem strony lub dokumentu można dostosować i zmodyfikować rozmiar i układ jednej strony lub całego dokumentu. Dzięki ustawieniu strony można zmienić ustawienia stron dokumentów, takich jak marginesy, orientacja i rozmiar do drukowania różnych pierwszych stron lub stron nieparzystych.
Aspose.Words pozwala dostosować właściwości strony i sekcji za pomocą PageSetup Klasa.
Poniższy przykład kodu pokazuje, jak ustawić takie właściwości jak rozmiar strony i orientacja dla bieżącej sekcji:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git. | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
builder.getPageSetup().setOrientation(Orientation.LANDSCAPE); | |
builder.getPageSetup().setLeftMargin(50.0); | |
builder.getPageSetup().setPaperSize(PaperSize.PAPER_10_X_14); | |
doc.save(getArtifactsDir() + "WorkingWithDocumentOptionsAndSettings.SetPageSetupAndSectionFormatting.docx"); |
Poniższy przykład kodu pokazuje jak zmodyfikować właściwości strony we wszystkich sekcjach:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java.git. | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
builder.writeln("Section 1"); | |
doc.appendChild(new Section(doc)); | |
builder.writeln("Section 2"); | |
doc.appendChild(new Section(doc)); | |
builder.writeln("Section 3"); | |
doc.appendChild(new Section(doc)); | |
builder.writeln("Section 4"); | |
// It is important to understand that a document can contain many sections, | |
// and each section has its page setup. In this case, we want to modify them all. | |
for (Section section : doc.getSections()) | |
section.getPageSetup().setPaperSize(PaperSize.LETTER); | |
doc.save(getArtifactsDir() + "WorkingWithSection.ModifyPageSetupInAllSections.doc"); |