Lägg till eller ta bort sidhuvud och sidfot i Word-dokument med C++

Sidhuvuden och sidfötter i Word-dokument används för att formatera och visa viktig information som ämne, kapitel, sidnummer, Copywrite, etc. När du arbetar med Word-dokument programmatiskt kan du behöva lägga till eller ta bort sidhuvuden och sidfötter. För detta ändamål kommer den här artikeln att lära dig hur du lägger till och tar bort sidhuvuden och sidfötter i Word-dokument med C++.

För att lägga till sidhuvuden och sidfötter i Word-dokument kommer vi att använda Aspose.Words for C++ API. Det är ett inbyggt C++ API som stöder att skapa, läsa och ändra Word-dokument utan att Microsoft Word behöver installeras. Du kan antingen installera API:t genom NuGet eller ladda ner det direkt från avsnittet Nedladdningar.

PM> Install-Package Aspose.Words.Cpp

Sidhuvuden och sidfötter i ett Word-dokument är indelade i tre sektioner, titelsidan, jämna sidor och udda sidor. Du kan lägga till olika sidhuvuden och sidfötter för dessa avsnitt. Dessutom kan du också lägga till element som bilder och tabeller i sidhuvuden och sidfötter.

I det här exemplet kommer vi att skapa ett nytt Word-dokument och lägga till en annan rubrik för titelsidan. Vi kommer att lägga till ett sidhuvud med en bild och en sidfot med en tabell på de efterföljande sidorna. Följande är stegen för att lägga till sidhuvuden och sidfötter i Word-dokument.

Följande exempelkod visar hur du lägger till sidhuvuden och sidfötter i Word-dokument med C++.

void CopyHeadersFootersFromPreviousSection(const System::SharedPtr<Section>& section)
{
	System::SharedPtr<Section> previousSection = System::DynamicCast<Section>(section->get_PreviousSibling());

	if (previousSection == nullptr)
	{
		return;
	}

	section->get_HeadersFooters()->Clear();

	for (System::SharedPtr<Node> headerFooterNode : System::IterateOver(previousSection->get_HeadersFooters()))
	{
		section->get_HeadersFooters()->Add(headerFooterNode->Clone(true));
	}
}

int main()
{
	// Käll- och utdatakatalogsökvägar.
	System::String inputDataDir = u"SourceDirectory\\";
	System::String outputDataDir = u"OutputDirectory\\";

	System::SharedPtr<Document> doc = System::MakeObject<Document>();
	System::SharedPtr<DocumentBuilder> builder = System::MakeObject<DocumentBuilder>(doc);

	System::SharedPtr<Section> currentSection = builder->get_CurrentSection();
	System::SharedPtr<PageSetup> pageSetup = currentSection->get_PageSetup();

	// Ange om vi vill att sidhuvuden/sidfötter på första sidan ska skilja sig från andra sidor.
	// Du kan också använda egenskapen PageSetup.OddAndEvenPagesHeaderFooter för att ange
	// Olika sidhuvuden/sidfötter för udda och jämna sidor.
	pageSetup->set_DifferentFirstPageHeaderFooter(true);

	// --- Skapa rubrik för första sidan. ---
	pageSetup->set_HeaderDistance(20);
	builder->MoveToHeaderFooter(HeaderFooterType::HeaderFirst);
	builder->get_ParagraphFormat()->set_Alignment(ParagraphAlignment::Center);

	// Ställ in teckensnittsegenskaper för rubriktext.
	builder->get_Font()->set_Name(u"Arial");
	builder->get_Font()->set_Bold(true);
	builder->get_Font()->set_Size(14);

	// Ange rubriktitel för första sidan.
	builder->Write(u"Aspose.Words Header/Footer Creation Primer - Title Page.");

	// --- Skapa rubrik för andra sidor än den första sidan. ---
	pageSetup->set_HeaderDistance(20);
	builder->MoveToHeaderFooter(HeaderFooterType::HeaderPrimary);

	// Infoga en absolut positionerad bild i det övre/vänstra hörnet av rubriken.
	// Avståndet från sidans övre/vänsterkant är satt till 10 punkter.
	System::String imageFileName = inputDataDir + u"Desert.jpg";
	builder->InsertImage(imageFileName, RelativeHorizontalPosition::Page, 10, RelativeVerticalPosition::Page, 10, 50, 50, WrapType::Through);

	builder->get_ParagraphFormat()->set_Alignment(ParagraphAlignment::Right);

	// Ange rubriktitel för andra sidor.
	builder->Write(u"Aspose.Words Header/Footer Creation Primer.");

	// --- Skapa sidfot för andra sidor än första sidan. ---
	builder->MoveToHeaderFooter(HeaderFooterType::FooterPrimary);

	// Vi använder tabell med två celler för att göra en del av texten på raden (med sidnumrering)
	// Att justeras till vänster och den andra delen av texten (med upphovsrätt) ska justeras till höger.
	builder->StartTable();

	// Rensa bordskanter.
	builder->get_CellFormat()->ClearFormatting();

	builder->InsertCell();

	// Ställ in den första cellen på 1/3 av sidbredden.
	builder->get_CellFormat()->set_PreferredWidth(PreferredWidth::FromPercent(100 / 3));

	// Infoga sidnumreringstext här.
	// Den använder PAGE- och NUMPAGES-fälten för att automatiskt beräkna aktuellt sidnummer och totalt antal sidor.
	builder->Write(u"Page ");
	builder->InsertField(u"PAGE", u"");
	builder->Write(u" of ");
	builder->InsertField(u"NUMPAGES", u"");

	// Justera denna text till vänster.
	builder->get_CurrentParagraph()->get_ParagraphFormat()->set_Alignment(ParagraphAlignment::Left);

	builder->InsertCell();

	// Ställ in den andra cellen på 2/3 av sidbredden.
	builder->get_CellFormat()->set_PreferredWidth(PreferredWidth::FromPercent(100 * 2 / 3));

	builder->Write(u"(C) 2001 Aspose Pty Ltd. All rights reserved.");

	// Justera denna text till höger.
	builder->get_CurrentParagraph()->get_ParagraphFormat()->set_Alignment(ParagraphAlignment::Right);

	builder->EndRow();
	builder->EndTable();

	builder->MoveToDocumentEnd();

	// Lägg till en sidbrytning för att skapa en andra sida där de primära sidhuvuden/sidfötterna kommer att synas.
	builder->InsertBreak(BreakType::PageBreak);

	// Lägg till en avsnittsbrytning för att skapa en tredje sida med annan sidorientering.
	builder->InsertBreak(BreakType::SectionBreakNewPage);

	// Skaffa det nya avsnittet och dess sidinställningar.
	currentSection = builder->get_CurrentSection();
	pageSetup = currentSection->get_PageSetup();

	// Ställ in sidriktningen för det nya avsnittet till liggande.
	pageSetup->set_Orientation(Orientation::Landscape);

	// Det här avsnittet behöver inte annan sidhuvud/sidfot på första sidan.
	// Vi behöver bara en titelsida i dokumentet. Sidhuvudet/sidfoten för denna sida
	// har redan definierats i föregående avsnitt
	pageSetup->set_DifferentFirstPageHeaderFooter(false);

	// Det här avsnittet visar sidhuvuden/sidfötter från föregående avsnitt som standard.
	// Ring currentSection.HeadersFooters.LinkToPrevious(false) för att avbryta detta beteende.
	// Sidbredden är annorlunda för det nya avsnittet och därför måste vi ställa in 
	// olika cellbredder för en sidfotstabell.
	currentSection->get_HeadersFooters()->LinkToPrevious(false);

	// Om vi vill använda den redan befintliga sidhuvud/sidfotsuppsättningen för detta avsnitt 
	// men med några mindre ändringar kan det vara lämpligt att kopiera sidhuvuden/sidfötter
	// från föregående avsnitt och tillämpa nödvändiga ändringar där vi vill ha dem.
	CopyHeadersFootersFromPreviousSection(currentSection);

	// Hitta sidfoten som vi vill ändra.
	System::SharedPtr<HeaderFooter> primaryFooter = currentSection->get_HeadersFooters()->idx_get(HeaderFooterType::FooterPrimary);

	System::SharedPtr<Row> row = primaryFooter->get_Tables()->idx_get(0)->get_FirstRow();
	row->get_FirstCell()->get_CellFormat()->set_PreferredWidth(PreferredWidth::FromPercent(100 / 3));
	row->get_LastCell()->get_CellFormat()->set_PreferredWidth(PreferredWidth::FromPercent(100 * 2 / 3));

	System::String outputPath = outputDataDir + u"CreateHeaderFooter.docx";

	// Spara det resulterande dokumentet.
	doc->Save(outputPath);
}
Förhandsgranskning av utskriften som genereras av exempelkoden

Förhandsgranskning av utskriften som genereras av exempelkoden

I föregående avsnitt lärde du dig hur du lägger till sidhuvuden och sidfötter i Word-dokument. På samma sätt som att lägga till kan du ta bort sidhuvuden och sidfötter från titeln, jämna och udda sidor enligt dina behov. Följande är stegen för att ta bort alla sidhuvuden och sidfötter i ett Word-dokument.

Följande exempelkod visar hur du tar bort alla sidhuvuden och sidfötter i ett Word-dokument med C++.

// Käll- och utdatakatalogsökvägar.
System::String inputDataDir = u"SourceDirectory\\";
System::String outputDataDir = u"OutputDirectory\\";

System::SharedPtr<Document> doc = System::MakeObject<Document>(inputDataDir + u"SampleHeaderFooter.docx");

for (System::SharedPtr<Section> section : System::IterateOver<System::SharedPtr<Section>>(doc))
{
	// Upp till tre olika sidhuvuden och sidfötter är möjliga i ett avsnitt (för första, jämna och udda sidor).
	// Vi kontrollerar och raderar dem alla.
	System::SharedPtr<HeaderFooter> header;
	System::SharedPtr<HeaderFooter> footer;

	header = section->get_HeadersFooters()->idx_get(HeaderFooterType::HeaderFirst);
	footer = section->get_HeadersFooters()->idx_get(HeaderFooterType::FooterFirst);
	if (header != nullptr)
	{
		header->Remove();
	}
	if (footer != nullptr)
	{
		footer->Remove();
	}

	// Primär sidhuvud och sidfot används för udda sidor.
	header = section->get_HeadersFooters()->idx_get(HeaderFooterType::HeaderPrimary);
	footer = section->get_HeadersFooters()->idx_get(HeaderFooterType::FooterPrimary);
	if (header != nullptr)
	{
		header->Remove();
	}
	if (footer != nullptr)
	{
		footer->Remove();
	}

	header = section->get_HeadersFooters()->idx_get(HeaderFooterType::HeaderEven);
	footer = section->get_HeadersFooters()->idx_get(HeaderFooterType::FooterEven);
	if (header != nullptr)
	{
		header->Remove();
	}
	if (footer != nullptr)
	{
		footer->Remove();
	}
}

// Utdatafilens sökväg
System::String outputPath = outputDataDir + u"RemoveFooters.docx";

// Spara dokumentet.
doc->Save(outputPath);

Skaffa en gratis licens

Du kan prova API:et utan utvärderingsbegränsningar genom att begära en gratis tillfällig licens.

Slutsats

Att arbeta med sidhuvuden och sidfötter i Word-dokument är ett vanligt och frekvent användningsfall. I den här artikeln har du lärt dig hur du arbetar med sidhuvuden och sidfötter i Word-dokument med C++. Specifikt har du lärt dig hur du lägger till och tar bort sidhuvuden och sidfötter i Word-dokument med Aspose.Words för C++ API. API:et tillhandahåller ett gäng ytterligare funktioner för att arbeta med Word-dokument som du kan utforska i detalj genom att besöka den officiella dokumentationen. Om du har några frågor är du välkommen att kontakta oss på vårt gratis supportforum.

Se även