使用 C++ 在 Word 文档中添加或删除页眉和页脚

Word 文档中的页眉和页脚用于格式化和显示重要信息,例如主题、章节、页码、文案等。以编程方式处理 Word 文档时,您可能需要添加或删除页眉和页脚。为此,本文将教您如何使用 C++ 在 Word 文档中添加和删除页眉和页脚。

要在 Word 文档中添加页眉和页脚,我们将使用 Aspose.Words for C++ API。它是一个原生 C++ API,支持创建、读取和修改 Word 文档,无需安装 Microsoft Word。您可以通过 NuGet 安装 API,也可以直接从 下载 部分下载。

PM> Install-Package Aspose.Words.Cpp

Word 文档中的页眉和页脚分为三个部分,即标题页、偶数页和奇数页。您可以为这些部分添加不同的页眉和页脚。此外,您还可以在页眉和页脚中添加图像和表格等元素。

在此示例中,我们将创建一个新的 Word 文档并为标题页添加不同的标题。我们将在后续页面中添加带有图像的页眉和带有表格的页脚。以下是在 Word 文档中添加页眉和页脚的步骤。

以下示例代码演示了如何使用 C++ 在 Word 文档中添加页眉和页脚。

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()
{
	// 源和输出目录路径。
	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();

	// 指定我们是否希望第一页的页眉/页脚与其他页面不同。
	// 您还可以使用 PageSetup.OddAndEvenPagesHeaderFooter 属性来指定
	// 奇数页和偶数页的不同页眉/页脚。
	pageSetup->set_DifferentFirstPageHeaderFooter(true);

	// --- 为第一页创建页眉。 ---
	pageSetup->set_HeaderDistance(20);
	builder->MoveToHeaderFooter(HeaderFooterType::HeaderFirst);
	builder->get_ParagraphFormat()->set_Alignment(ParagraphAlignment::Center);

	// 设置标题文本的字体属性。
	builder->get_Font()->set_Name(u"Arial");
	builder->get_Font()->set_Bold(true);
	builder->get_Font()->set_Size(14);

	// 指定第一页的页眉标题。
	builder->Write(u"Aspose.Words Header/Footer Creation Primer - Title Page.");

	// --- 为第一页以外的页面创建页眉。 ---
	pageSetup->set_HeaderDistance(20);
	builder->MoveToHeaderFooter(HeaderFooterType::HeaderPrimary);

	// 将绝对定位的图像插入标题的上/左角。
	// 与页面顶部/左侧边缘的距离设置为 10 点。
	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);

	// 指定其他页面的标题标题。
	builder->Write(u"Aspose.Words Header/Footer Creation Primer.");

	// --- 为第一页以外的页面创建页脚。 ---
	builder->MoveToHeaderFooter(HeaderFooterType::FooterPrimary);

	// 我们使用带有两个单元格的表格来制作一行文字的一部分(带页码)
	// 左对齐,文本的其他部分(有版权)右对齐。
	builder->StartTable();

	// 清除表格边框。
	builder->get_CellFormat()->ClearFormatting();

	builder->InsertCell();

	// 将第一个单元格设置为页面宽度的 1/3。
	builder->get_CellFormat()->set_PreferredWidth(PreferredWidth::FromPercent(100 / 3));

	// 在此处插入页码文本。
	// 它使用 PAGE 和 NUMPAGES 字段来自动计算当前页码和总页数。
	builder->Write(u"Page ");
	builder->InsertField(u"PAGE", u"");
	builder->Write(u" of ");
	builder->InsertField(u"NUMPAGES", u"");

	// 将此文本左对齐。
	builder->get_CurrentParagraph()->get_ParagraphFormat()->set_Alignment(ParagraphAlignment::Left);

	builder->InsertCell();

	// 将第二个单元格设置为页面宽度的 2/3。
	builder->get_CellFormat()->set_PreferredWidth(PreferredWidth::FromPercent(100 * 2 / 3));

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

	// 将此文本右对齐。
	builder->get_CurrentParagraph()->get_ParagraphFormat()->set_Alignment(ParagraphAlignment::Right);

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

	builder->MoveToDocumentEnd();

	// 添加一个分页符以创建第二个页面,在该页面上可以看到主要的页眉/页脚。
	builder->InsertBreak(BreakType::PageBreak);

	// 添加分节符以创建具有不同页面方向的第三页。
	builder->InsertBreak(BreakType::SectionBreakNewPage);

	// 获取新部分及其页面设置。
	currentSection = builder->get_CurrentSection();
	pageSetup = currentSection->get_PageSetup();

	// 将新部分的页面方向设置为横向。
	pageSetup->set_Orientation(Orientation::Landscape);

	// 此部分不需要不同的首页页眉/页脚。
	// 我们只需要文档中的一个扉页。此页面的页眉/页脚
	// 已经在上一节中定义
	pageSetup->set_DifferentFirstPageHeaderFooter(false);

	// 此部分默认显示上一部分的页眉/页脚。
	// 调用 currentSection.HeadersFooters.LinkToPrevious(false) 以取消此行为。
	// 新部分的页面宽度不同,因此我们需要设置 
	// 页脚表格的不同单元格宽度。
	currentSection->get_HeadersFooters()->LinkToPrevious(false);

	// 如果我们想为此部分使用已经存在的页眉/页脚集 
	// 但是通过一些小的修改,复制页眉/页脚可能是方便的
	// 从上一节开始,并在我们想要的地方应用必要的修改。
	CopyHeadersFootersFromPreviousSection(currentSection);

	// 找到我们要更改的页脚。
	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";

	// 保存生成的文档。
	doc->Save(outputPath);
}
示例代码生成的输出的打印预览

示例代码生成的输出的打印预览

在上一节中,您学习了如何在 Word 文档中添加页眉和页脚。与添加类似,您可以根据需要从标题、偶数页和奇数页中删除页眉和页脚。以下是删除 Word 文档中所有页眉和页脚的步骤。

以下示例代码展示了如何使用 C++ 删除 Word 文档中的所有页眉和页脚。

// 源和输出目录路径。
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))
{
	// 在一个部分中最多可以有三个不同的页眉和页脚(第一页、偶数页和奇数页)。
	// 我们检查并删除所有这些。
	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();
	}

	// 主页眉和页脚用于奇数页。
	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();
	}
}

// 输出文件路径
System::String outputPath = outputDataDir + u"RemoveFooters.docx";

// 保存文档。
doc->Save(outputPath);

获得免费许可证

您可以通过请求 免费的临时许可证 来试用该 API,而不受评估限制。

结论

在 Word 文档中使用页眉和页脚是一个常见且频繁的用例。在本文中,您学习了如何使用 C++ 在 Word 文档中处理页眉和页脚。具体来说,您已经学习了如何使用 Aspose.Words for C++ API 在 Word 文档中添加和删除页眉和页脚。 API 提供了一系列用于处理 Word 文档的附加功能,您可以通过访问 官方文档 进行详细探索。如有任何问题,请随时通过我们的 免费支持论坛 与我们联系。

也可以看看