Trabalhando com seções
Às vezes você deseja um documento que não tenha a mesma formatação em todas as páginas. Por exemplo, pode ser necessário modificar formatos de número de página, ter tamanho e orientação de página diferentes ou ter a primeira página do documento como capa sem qualquer numeração. Você pode conseguir isso com seções.
Seções são nós de nível que controlam cabeçalhos e rodapés, orientação, colunas, margens, formatação de número de página e outros.
Aspose.Words permite gerenciar seções, dividir um documento em seções e fazer alterações de formatação que se aplicam apenas a uma seção específica. Aspose.Words armazena informações sobre formatação de seção, como cabeçalhos e rodapés, configuração de página e configurações de coluna na quebra de seção.
Este artigo explica como trabalhar com seções e quebras de seção.
O que é seção e quebra de seção
As seções do documento são representadas pelas classes Section e SectionCollection. Os objetos de seção são filhos imediatos do nó Document e podem ser acessados por meio da propriedade Sections. Você pode gerenciar esses nós usando alguns métodos como Remove, Add, IndexOf e outros.
A quebra de seção é uma opção que divide as páginas do documento em seções com layouts personalizáveis.
Tipos de quebra de seção
Aspose.Words permite dividir e formatar documentos usando diferentes quebras de seção da enumeração BreakType:
- SectionBreakContinuo
- SeçãoBreakNewColumn
- SeçãoBreakNewPage
- SeçãoBreakEvenPage
- SectionBreakOddPage
Você também pode usar a enumeração SectionStart para escolher um tipo de quebra que se aplica somente à primeira seção, como NewColumn, NewPage, EvenPage e OddPage.
Gerenciar uma seção
Como uma seção é um nó composto normal, toda a manipulação do nó API pode ser usada para manipular seções: para adicionar, remover e outras operações em seções. Você pode ler mais sobre nós no artigo Aspose.Words Document Object Model (DOM).
Por outro lado, você também pode usar o DocumentBuilder
API para trabalhar com seções. Neste artigo, focaremos nesta forma específica de trabalhar com seções.
Inserir ou remover uma quebra de seção
Aspose.Words permite inserir uma quebra de seção no texto usando o método InsertBreak.
O exemplo de código a seguir mostra como inserir uma quebra de seção em um documento:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
/// <summary> | |
/// Insert section breaks before the specified paragraphs. | |
/// </summary> | |
private void InsertSectionBreaks(List<Paragraph> topicStartParas) | |
{ | |
DocumentBuilder builder = new DocumentBuilder(mDoc); | |
foreach (Paragraph para in topicStartParas) | |
{ | |
Section section = para.ParentSection; | |
// Insert section break if the paragraph is not at the beginning of a section already. | |
if (para != section.Body.FirstParagraph) | |
{ | |
builder.MoveTo(para.FirstChild); | |
builder.InsertBreak(BreakType.SectionBreakNewPage); | |
// 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.Body.LastParagraph.Remove(); | |
} | |
} | |
} |
Use o método Remove para excluir uma quebra de seção. Se você não precisar remover uma quebra de seção específica e, em vez disso, excluir o conteúdo dessa seção, poderá usar o método ClearContent.
O exemplo de código a seguir mostra como remover quebras de seção:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.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.Sections.Count - 2; i >= 0; i--) | |
{ | |
// Copy the content of the current section to the beginning of the last section. | |
doc.LastSection.PrependContent(doc.Sections[i]); | |
// Remove the copied section. | |
doc.Sections[i].Remove(); | |
} | |
} |
Mover uma seção
Se quiser mover uma seção de uma posição para outra no documento, você precisará obter o índice dessa seção. Aspose.Words permite obter uma posição de seção de um SectionCollection usando a propriedade Item. Você pode usar a propriedade Sections para obter todas as seções do seu documento. Mas se quiser obter apenas a primeira seção, você pode usar a propriedade FirstSection.
O exemplo de código a seguir mostra como acessar a primeira seção e iterar pelos filhos de um nó composto:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
builder.Write("Section 1"); | |
builder.MoveToHeaderFooter(HeaderFooterType.HeaderPrimary); | |
builder.Write("Primary header"); | |
builder.MoveToHeaderFooter(HeaderFooterType.FooterPrimary); | |
builder.Write("Primary footer"); | |
Section section = doc.FirstSection; | |
// 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. | |
foreach (Node node in section) | |
{ | |
switch (node.NodeType) | |
{ | |
case NodeType.Body: | |
{ | |
Body body = (Body)node; | |
Console.WriteLine("Body:"); | |
Console.WriteLine($"\t\"{body.GetText().Trim()}\""); | |
break; | |
} | |
case NodeType.HeaderFooter: | |
{ | |
HeaderFooter headerFooter = (HeaderFooter)node; | |
Console.WriteLine($"HeaderFooter type: {headerFooter.HeaderFooterType}:"); | |
Console.WriteLine($"\t\"{headerFooter.GetText().Trim()}\""); | |
break; | |
} | |
default: | |
{ | |
throw new Exception("Unexpected node type in a section."); | |
} | |
} | |
} |
Especifique um layout de seção
Às vezes, você deseja que seu documento tenha uma aparência melhor criando layouts criativos para diferentes seções do documento. Se quiser especificar o tipo da grade de seção atual, você pode escolher um modo de layout de seção usando a enumeração SectionLayoutMode:
- Padrão
- Grade
- Grade de Linha
- SnapToChars
O exemplo de código a seguir mostra como limitar o número de linhas que cada página pode ter:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.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.PageSetup.LayoutMode = SectionLayoutMode.LineGrid; | |
builder.PageSetup.LinesPerPage = 15; | |
builder.ParagraphFormat.SnapToGrid = 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(ArtifactsDir + "WorkingWithDocumentOptionsAndSettings.LinesPerPage.docx"); |
Editar uma seção
Quando você adiciona uma nova seção ao seu documento, não haverá corpo ou parágrafo que você possa editar. Aspose.Words permite garantir que uma seção contém um corpo com pelo menos um parágrafo usando o método EnsureMinimum – ele adicionará automaticamente um nó Corpo (ou HeaderFooter) ao documento e, em seguida, adicionará um Parágrafo a ele.
O exemplo de código a seguir mostra como preparar um novo nó de seção usando EnsureMinimum:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.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.Sections.Add(new Section(doc)); | |
// Run the "EnsureMinimum" method to add a body and a paragraph to this section to begin editing it. | |
doc.LastSection.EnsureMinimum(); | |
doc.Sections[0].Body.FirstParagraph.AppendChild(new Run(doc, "Hello world!")); |
Anexar ou preceder conteúdo
Se quiser desenhar alguma forma ou adicionar texto ou imagem no início/fim de uma seção, você pode usar os métodos AppendContent e PrependContent da classe Section.
O exemplo de código a seguir mostra como anexar conteúdo de uma seção existente:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
builder.Write("Section 1"); | |
builder.InsertBreak(BreakType.SectionBreakNewPage); | |
builder.Write("Section 2"); | |
builder.InsertBreak(BreakType.SectionBreakNewPage); | |
builder.Write("Section 3"); | |
Section section = doc.Sections[2]; | |
// Insert the contents of the first section to the beginning of the third section. | |
Section sectionToPrepend = doc.Sections[0]; | |
section.PrependContent(sectionToPrepend); | |
// Insert the contents of the second section to the end of the third section. | |
Section sectionToAppend = doc.Sections[1]; | |
section.AppendContent(sectionToAppend); |
Clonar uma seção
Aspose.Words permite duplicar uma seção criando uma cópia completa dela usando o método Clone.
O exemplo de código a seguir mostra como clonar a primeira seção do seu documento:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
Document doc = new Document(MyDir + "Document.docx"); | |
Section cloneSection = doc.Sections[0].Clone(); |
Copiar seções entre documentos
Em alguns casos, você pode ter documentos grandes com muitas seções e desejar copiar o conteúdo de uma seção de um documento para outro.
Aspose.Words permite copiar seções entre documentos usando o método ImportNode.
O exemplo de código a seguir mostra como copiar seções entre documentos:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
Document srcDoc = new Document(MyDir + "Document.docx"); | |
Document dstDoc = new Document(); | |
Section sourceSection = srcDoc.Sections[0]; | |
Section newSection = (Section)dstDoc.ImportNode(sourceSection, true); | |
dstDoc.Sections.Add(newSection); | |
dstDoc.Save(ArtifactsDir + "WorkingWithSection.CopySection.docx"); |
Trabalhar com cabeçalho e rodapé de seção
As regras básicas para exibir um cabeçalho ou rodapé para cada seção são bastante simples:
- Se a seção não tiver cabeçalhos/rodapés próprios de um determinado tipo, ela será retirada da seção anterior.
- O tipo de cabeçalho/rodapé exibido na página é controlado pelas configurações da seção “Primeira página diferente” e “Páginas pares e ímpares diferentes” – se estiverem desabilitadas, os próprios títulos da seção serão ignorados.
O exemplo de código a seguir mostra como criar 2 seções com cabeçalhos diferentes:
Se quiser remover o texto dos cabeçalhos e rodapés sem remover os objetos HeaderFooter do seu documento, você pode usar o método ClearHeadersFooters. Além disso, você pode usar o método DeleteHeaderFooterShapes para remover todas as formas dos cabeçalhos e rodapés do seu documento.
O exemplo de código a seguir mostra como limpar o conteúdo de todos os cabeçalhos e rodapés de uma seção:
O exemplo de código a seguir mostra como remover todas as formas de todos os cabeçalhos e rodapés em uma seção:
Personalize as propriedades da página em uma seção
Antes de imprimir uma página ou documento, você pode personalizar e modificar o tamanho e o layout de uma única página ou de todo o documento. Com a configuração de página, você pode alterar as configurações das páginas do documento, como margens, orientação e tamanho, para imprimir primeiras páginas diferentes ou páginas ímpares.
Aspose.Words permite personalizar propriedades de páginas e seções usando a classe PageSetup.
O exemplo de código a seguir mostra como definir propriedades como tamanho de página e orientação para a seção atual:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
Document doc = new Document(); | |
DocumentBuilder builder = new DocumentBuilder(doc); | |
builder.PageSetup.Orientation = Orientation.Landscape; | |
builder.PageSetup.LeftMargin = 50; | |
builder.PageSetup.PaperSize = PaperSize.Paper10x14; | |
doc.Save(ArtifactsDir + "WorkingWithDocumentOptionsAndSettings.PageSetupAndSectionFormatting.docx"); |
O exemplo de código a seguir mostra como modificar as propriedades da página em todas as seções:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.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. | |
foreach (Section section in doc) | |
section.PageSetup.PaperSize = PaperSize.Letter; | |
doc.Save(ArtifactsDir + "WorkingWithSection.ModifyPageSetupInAllSections.doc"); |