Práce se sekcemi

Někdy chcete dokument, který nemá stejné formátování na všech stránkách. Možná budete muset například upravit formáty čísel stránek, mít jinou velikost a orientaci stránky nebo mít první stránku dokumentu jako titulní stránku bez jakéhokoli číslování. Můžete toho dosáhnout pomocí sekcí.

Sekce jsou uzly úrovně, které řídí záhlaví a zápatí, orientaci, sloupce, okraje, formátování čísla stránky a další.

Aspose.Words umožňuje spravovat oddíly, rozdělit dokument na oddíly a provádět změny formátování, které se vztahují pouze na konkrétní sekci. Aspose.Words ukládá informace o formátování oddílů, jako jsou záhlaví a zápatí, nastavení stránky a nastavení sloupců do konce oddílů.

Tento článek vysvětluje, jak pracovat s oddíly a zlomy sekcí.

Jaký úsek a konec úseku je

Sekce dokumentů jsou reprezentovány třídami Section a SectionCollection. Objekty sekce jsou bezprostředními podřízenými uzlu Document a lze k nim přistupovat pomocí vlastnosti Sections. Tyto uzly můžete spravovat pomocí některých metod, například Remove, Add, IndexOf, a další.

Konec oddílu je možnost, která rozděluje stránky dokumentu na sekce s přizpůsobitelnými rozvrženími.

Typy přerušení sekce

Aspose.Words umožňuje rozdělit a formátovat dokumenty pomocí různých konců oddílů výčtu BreakType:

  • SectionBreakContinuous
  • SectionBreakNewColumn
  • SectionBreakNewPage
  • SectionBreakEvenPage
  • SectionBreakOddPage

Můžete také použít výčet SectionStart k výběru typu přerušení, který platí pouze pro první část, například NewColumn, NewPage, EvenPage, a OddPage.

Správa sekce

Protože sekce je normální složený uzel, lze k manipulaci se sekcemi použít celou manipulaci s uzlem API: Přidat, Odebrat a další operace v sekcích. Více o uzlech si můžete přečíst v článku Aspose.Words Model Objektu Dokumentu (DOM).

Na druhou stranu můžete také použít DocumentBuilder API pro práci se sekcemi. V tomto článku se zaměříme na tento konkrétní způsob práce se sekcemi.

Vložení nebo odebrání konce oddílu

Aspose.Words umožňuje vložit konec oddílu do textu pomocí metody InsertBreak.

Následující příklad kódu ukazuje, jak vložit konec oddílu do dokumentu:

// 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();
}
}
}

Pomocí metody Remove Odstraňte konec oddílu. Pokud nepotřebujete odstranit konkrétní konec oddílu a místo toho odstranit obsah této sekce, můžete použít metodu ClearContent.

Následující příklad kódu ukazuje, jak odstranit konce oddílů:

// 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();
}
}

Přesunout sekci

Pokud chcete v dokumentu přesunout sekci z jedné pozice na druhou, musíte získat index této sekce. Aspose.Words umožňuje získat pozici sekce z SectionCollection. K získání všech oddílů v dokumentu můžete použít vlastnost Sections. Pokud však chcete získat pouze první sekci, můžete použít vlastnost FirstSection.

Následující příklad kódu ukazuje, jak přistupovat k první sekci a iterovat prostřednictvím podřízených složeného uzlu:

// 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.");
}
}
}
}

Určení rozložení sekce

Někdy chcete, aby váš dokument vypadal lépe vytvořením kreativních rozvržení pro různé sekce dokumentů. Pokud chcete určit typ aktuální mřížky sekce, můžete zvolit režim rozvržení sekce pomocí výčtu SectionLayoutMode:

  • Default
  • Mřížka
  • LineGrid
  • SnapToChars

Následující příklad kódu ukazuje, jak omezit počet řádků, které může mít každá stránka:

// 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");

Upravit sekci

Když do dokumentu přidáte nový oddíl, nebude existovat žádné tělo ani odstavec, který byste mohli upravit. Aspose.Words umožňuje zaručit, že sekce obsahuje tělo s alespoň jedním odstavcem pomocí metody EnsureMinimum – automaticky přidá do dokumentu uzel Body (nebo HeaderFooter) a poté do něj přidá odstavec.

Následující příklad kódu ukazuje, jak připravit nový uzel sekce pomocí 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!"));

Připojit nebo připravit obsah

Pokud chcete nakreslit nějaký tvar nebo přidat text nebo obrázek na začátek/konec sekce, můžete použít metody AppendContent a PrependContent třídy Section.

Následující příklad kódu ukazuje, jak připojit obsah existující sekce:

// 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);

Klonování sekce

Aspose.Words umožňuje duplikovat sekci vytvořením její úplné kopie pomocí metody Clone.

Následující příklad kódu ukazuje, jak klonovat první část dokumentu:

// 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

Kopírování sekcí mezi dokumenty

V některých případech můžete mít velké dokumenty s mnoha oddíly a chcete zkopírovat obsah oddílu z jednoho dokumentu do druhého.

Aspose.Words umožňuje kopírovat oddíly mezi dokumenty pomocí metody ImportNode.

Následující příklad kódu ukazuje, jak kopírovat oddíly mezi dokumenty:

// 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

Práce s hlavičkou a zápatí sekce

Základní pravidla pro zobrazení záhlaví nebo zápatí pro každou sekci jsou poměrně jednoduchá:

  1. Pokud sekce nemá vlastní záhlaví / zápatí určitého typu, je převzata z předchozí sekce.
  2. Typ záhlaví / zápatí zobrazený na stránce je řízen nastavením sekce" různé první stránky “a” různé liché a sudé stránky " – pokud jsou deaktivovány, pak jsou ignorovány vlastní názvy sekce.

Následující příklad kódu ukazuje, jak vytvořit 2 sekce s různými záhlaví:

Pokud chcete odstranit text záhlaví a zápatí bez odstranění objektů HeaderFooter v dokumentu, můžete použít metodu ClearHeadersFooters. Kromě toho můžete pomocí metody DeleteHeaderFooterShapes Odebrat všechny tvary ze záhlaví a zápatí v dokumentu.

Následující příklad kódu ukazuje, jak vymazat obsah všech záhlaví a zápatí v sekci:

Následující příklad kódu, jak odstranit všechny obrazce ze všech záhlaví zápatí v oddílu:

Přizpůsobení vlastností stránky v sekci

Před tiskem stránky nebo dokumentu můžete upravit a upravit velikost a rozložení jedné stránky nebo celého dokumentu. Pomocí nastavení stránky můžete změnit nastavení stránek dokumentu, jako jsou okraje, orientace a velikost pro tisk různých prvních stránek nebo lichých stránek.

Aspose.Words umožňuje přizpůsobit vlastnosti stránky a sekce pomocí třídy PageSetup.

Následující příklad kódu ukazuje, jak nastavit takové vlastnosti, jako je velikost stránky a orientace pro aktuální sekci:

// 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");

Následující příklad kódu ukazuje, jak upravit vlastnosti stránky ve všech sekcích:

// 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");

Vidět