Работа със секции

Понякога искате документ, който няма едно и също форматиране на всички страници. Например може да се наложи да промените числовите формати на страниците, да имате различен размер на страницата и ориентация или да имате първата страница на документа като титулна страница без никакво номериране. Това може да се постигне с раздели.

Секциите са възли на ниво, които контролират горни и долни колонтитули, ориентация, колони, полета, форматиране на номера на страници и други.

Aspose.Words Позволява ви да управлявате секции, да разделяте документ на секции и да правите промени във форматирането, които се прилагат само към определена секция. Aspose.Words съхранява информация за форматирането на секции, като горни и долни колонтитули, настройка на страници и настройки на колони в знак за нов знак за раздел.

Тази статия обяснява как да работите с раздели и раздели.

Какво е раздел и прекъсване на Раздел

Разделите на документа са представени от класовете Section и SectionCollection. Обектите на секцията са непосредствени деца на възела Document и могат да бъдат достъпни чрез собствеността Sections. Можете да управлявате тези възли, като използвате някои методи като Remove, Add, IndexOf, и други.

Нов раздел е опция, която разделя страниците на документа на секции с персонализируеми оформления.

Типове на прекъсване на секция

Aspose.Words Позволява ви да разделяте и форматирате документи, като използвате различни прекъсвания на секциите на BreakType изброяване:

  • SectionBreakContinuous
  • SectionBreakNewColumn
  • SectionBreakNewPage
  • SectionBreakEvenPage
  • SectionBreakOddPage

Можете също да използвате изброяването SectionStart, за да изберете тип прекъсване, което се отнася само за първия раздел, като например NewColumn, NewPage, EvenPage, и OddPage.

Управление на секция

Тъй като дадена секция е нормален композитен възел, цялата манипулация на възел API може да се използва за манипулиране на секции: за добавяне, премахване и други операции върху секции. Можете да прочетете повече за възлите в статията Aspose.Words Документ Обектен Модел (DOM).

От друга страна, можете да използвате DocumentBuilder API за работа със секции. В тази статия ще се съсредоточим върху този конкретен начин на работа с раздели.

Вмъкване или премахване на нов раздел

Aspose.Words ви позволява да вмъкнете раздел в текста, като използвате метода InsertBreak.

Следващият пример за код показва как да вмъкнете нов раздел в документ:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C.git.
void WordToHtmlConverter::InsertSectionBreaks(System::SharedPtr<System::Collections::Generic::List<System::SharedPtr<Paragraph>>> topicStartParas)
{
auto builder = System::MakeObject<DocumentBuilder>(mDoc);
for (const auto& para : topicStartParas)
{
System::SharedPtr<Section> section = para->get_ParentSection();
// Insert section break if the paragraph is not at the beginning of a section already.
if (para != section->get_Body()->get_FirstParagraph())
{
builder->MoveTo(para->get_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->get_Body()->get_LastParagraph()->Remove();
}
}
}

Използвайте метода Remove, за да изтриете нов раздел. Ако не е необходимо да премахвате определен знак за нов раздел, а вместо това да изтриете съдържанието на този раздел, можете да използвате метода ClearContent.

Следващият пример за код показва как да премахнете прекъсванията на секциите:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C.git.
void RemoveSectionBreaks(SharedPtr<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->get_Sections()->get_Count() - 2; i >= 0; i--)
{
// Copy the content of the current section to the beginning of the last section.
doc->get_LastSection()->PrependContent(doc->get_Sections()->idx_get(i));
// Remove the copied section.
doc->get_Sections()->idx_get(i)->Remove();
}
}

Преместване на секция

Ако искате да преместите секция от една позиция в друга във вашия документ, трябва да получите индекса на тази секция. Aspose.Words ви позволява да получите позиция на секция от SectionCollection. Можете да използвате свойството Sections, за да получите всички раздели във вашия документ. Но ако искате да получите само първата секция, можете да използвате свойството FirstSection.

Следващият пример за код показва как да получите достъп до първата секция и да итерирате чрез децата на съставен възел:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C.git.
auto doc = MakeObject<Document>();
auto builder = MakeObject<DocumentBuilder>(doc);
builder->Write(u"Section 1");
builder->MoveToHeaderFooter(HeaderFooterType::HeaderPrimary);
builder->Write(u"Primary header");
builder->MoveToHeaderFooter(HeaderFooterType::FooterPrimary);
builder->Write(u"Primary footer");
// 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 (const auto& srcSection : System::IterateOver(doc->get_Sections()->LINQ_OfType<SharedPtr<Section>>()))
{
for (const auto& srcNode : System::IterateOver(srcSection->get_Body()))
{
switch (srcNode->get_NodeType())
{
case NodeType::Body:
{
auto body = System::ExplicitCast<Body>(srcNode);
std::cout << "Body:" << std::endl;
std::cout << std::endl;
std::cout << "\t\"" << body->GetText().Trim() << "\"" << std::endl;
break;
}
case NodeType::HeaderFooter:
{
auto headerFooter = System::ExplicitCast<HeaderFooter>(srcNode);
auto headerFooterType = headerFooter->get_HeaderFooterType();
std::cout << "HeaderFooter type: " << static_cast<std::underlying_type<HeaderFooterType>::type>(headerFooterType) << std::endl;
std::cout << "\t\"" << headerFooter->GetText().Trim() << "\"" << std::endl;
break;
}
default:
{
throw System::Exception(u"Unexpected node type in a section.");
}
}
}
}

Задаване на оформление на секция

Понякога искате документът ви да изглежда по-добре, като създавате творчески оформления за различни секции на документа. Ако искате да зададете типа на текущата мрежа на секцията, можете да изберете режим на оформление на секцията, като използвате изброяването SectionLayoutMode:

  • По подразбиране
  • Мрежа
  • LineGrid
  • SnapToChars

Следващият пример за код показва как да ограничите броя на редовете, които всяка страница може да има:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C.git.
auto doc = MakeObject<Document>();
auto builder = MakeObject<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->get_PageSetup()->set_LayoutMode(SectionLayoutMode::LineGrid);
builder->get_PageSetup()->set_LinesPerPage(15);
builder->get_ParagraphFormat()->set_SnapToGrid(true);
for (int i = 0; i < 30; i++)
builder->Write(u"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ");
doc->Save(ArtifactsDir + u"WorkingWithDocumentOptionsAndSettings.LinesPerPage.docx");

Редактиране на секция

Когато добавите нова секция към вашия документ, няма да има тяло или абзац, които можете да редактирате. Aspose.Words ви позволява да гарантирате, че даден раздел съдържа тяло с поне един абзац, като използвате метода EnsureMinimum – той автоматично ще добави тяло (или HeaderFooter) възел към документа и след това ще добави абзац към него.

Следващият пример за код показва как да подготвите нов възел на секция, като използвате EnsureMinimum:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C.git.
auto doc = MakeObject<Document>();
// If we add a new section like this, it will not have a body, or any other child nodes.
doc->get_Sections()->Add(MakeObject<Section>(doc));
// Run the "EnsureMinimum" method to add a body and a paragraph to this section to begin editing it.
doc->get_LastSection()->EnsureMinimum();
doc->get_Sections()->idx_get(0)->get_Body()->get_FirstParagraph()->AppendChild(MakeObject<Run>(doc, u"Hello world!"));

Добавяне или предплащане на съдържание

Ако искате да нарисувате някаква фигура или да добавите текст или изображение в началото/края на секция, можете да използвате методите AppendContent и PrependContent от класа Section.

Следният пример за код показва как да добавите съдържание на съществуващ раздел:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C.git.
auto doc = MakeObject<Document>();
auto builder = MakeObject<DocumentBuilder>(doc);
builder->Writeln(u"Hello1");
doc->AppendChild(MakeObject<Section>(doc));
builder->Writeln(u"Hello22");
doc->AppendChild(MakeObject<Section>(doc));
builder->Writeln(u"Hello3");
doc->AppendChild(MakeObject<Section>(doc));
builder->Writeln(u"Hello45");
// This is the section that we will append and prepend to.
SharedPtr<Section> section = doc->get_Sections()->idx_get(2);
// This copies the content of the 1st section and inserts it at the beginning of the specified section.
SharedPtr<Section> sectionToPrepend = doc->get_Sections()->idx_get(0);
section->PrependContent(sectionToPrepend);
// This copies the content of the 2nd section and inserts it at the end of the specified section.
SharedPtr<Section> sectionToAppend = doc->get_Sections()->idx_get(1);
section->AppendContent(sectionToAppend);

Клон А секция

Aspose.Words ви позволява да дублирате секция, като създадете пълно копие от нея, като използвате метода Clone.

Следващият пример за код показва как да клонирате първата секция във вашия документ:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C.git.
auto doc = MakeObject<Document>(MyDir + u"Document.docx");
SharedPtr<Section> cloneSection = doc->get_Sections()->idx_get(0)->Clone();
view raw clone-section.h hosted with ❤ by GitHub

Копиране на раздели между документи

В някои случаи може да имате големи документи с много секции и искате да копирате съдържанието на секция от един документ в друг.

Aspose.Words ви позволява да копирате раздели между документи, като използвате метода ImportNode.

Следващият пример за код показва как да копирате раздели между документи:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C.git.
auto srcDoc = MakeObject<Document>(MyDir + u"Document.docx");
auto dstDoc = MakeObject<Document>();
SharedPtr<Section> sourceSection = srcDoc->get_Sections()->idx_get(0);
auto newSection = System::ExplicitCast<Section>(dstDoc->ImportNode(sourceSection, true));
dstDoc->get_Sections()->Add(newSection);
dstDoc->Save(ArtifactsDir + u"WorkingWithSection.CopySection.docx");
view raw copy-section.h hosted with ❤ by GitHub

Работа с горен и Долен колонтитул на секция

Основните правила за показване на горен или долен колонтитул за всеки раздел са доста прости.:

  1. Ако секцията няма собствени горни / долни колонтитули от определен тип, тогава тя е взета от предишния раздел.
  2. Типът на горния / долния колонтитул, показан на страницата, се контролира от настройките на секцията “различни първи страници” и “различни четни и нечетни страници” – ако са деактивирани, собствените заглавия на секцията се игнорират.

Следващият пример за код показва как да създадете 2 секции с различни заглавки:

Ако искате да премахнете текста на горни и долни колонтитули, без да премахвате HeaderFooter обекти във вашия документ, можете да използвате метода ClearHeadersFooters. Освен това можете да използвате метода DeleteHeaderFooterShapes, за да премахнете всички фигури от горни и долни колонтитули във вашия документ.

Следващият пример за код показва как да изчистите съдържанието на всички горни и долни колонтитули в секция:

Следният пример код как да премахнете всички фигури от всички горни колонтитули в секция:

Персонализиране на свойствата на страницата в секция

Преди да отпечатате страница или документ, може да искате да персонализирате и промените размера и оформлението на една страница или целия документ. С настройката на страниците можете да промените настройките на страниците на документа, като полета, ориентация и размер за отпечатване на различни първи страници или нечетни страници.

Aspose.Words Позволява ви да персонализирате свойствата на страница и секция, като използвате класа PageSetup.

Следващият пример за код показва как да зададете свойства като размер на страница и ориентация за текущата секция:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C.git.
auto doc = MakeObject<Document>();
auto builder = MakeObject<DocumentBuilder>(doc);
builder->get_PageSetup()->set_Orientation(Orientation::Landscape);
builder->get_PageSetup()->set_LeftMargin(50);
builder->get_PageSetup()->set_PaperSize(PaperSize::Paper10x14);
doc->Save(ArtifactsDir + u"WorkingWithDocumentOptionsAndSettings.PageSetupAndSectionFormatting.docx");

Следният пример за код показва как да промените свойствата на страницата във всички раздели:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C.git.
auto doc = MakeObject<Document>();
auto builder = MakeObject<DocumentBuilder>(doc);
builder->Writeln(u"Hello1");
doc->AppendChild(MakeObject<Section>(doc));
builder->Writeln(u"Hello22");
doc->AppendChild(MakeObject<Section>(doc));
builder->Writeln(u"Hello3");
doc->AppendChild(MakeObject<Section>(doc));
builder->Writeln(u"Hello45");
// 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 (const auto& section : System::IterateOver<Section>(doc))
{
section->get_PageSetup()->set_PaperSize(PaperSize::Letter);
}
doc->Save(ArtifactsDir + u"WorkingWithSection.ModifyPageSetupInAllSections.doc");

Вижте Също