使用 aspose.words 中的 DOM 在每个页面中添加单独的 header/footer
Adding seperate header/footer in each page using DOM in aspose.words
我正在使用文档对象模型从 XHTML 创建 docx。
我能够创建具有两个共同部分的文档(一个用于正文,另一个用于启用了第一页不同选项的页眉和页脚)。
现在因为我们有一个要求为不同的页面创建不同的页眉和页脚。我不确定如何使用 DOM 来做到这一点。
在用于创建不同页眉和页脚的普通 Word 文档中,我们需要将每个页面拆分为分页符,然后在页眉和页脚中它会显示为不同的部分,我们可以禁用 "linktoprevious" 选项并为不同的部分创建不同的页眉页脚页。
我想知道是否有任何方法 aspose.words 会自动识别每一页,并基于此我们可以在阅读文档时创建分节符(下一页)。
或者让我知道是否可以使用 aspose.words .Net
中的文档对象模型为每个页面创建不同的页眉和页脚
谢谢
这很棘手,但可以通过 Aspose.Words 使用 LayoutCollector API 找到节点的页码。这个想法是遍历文档中的每个 运行 并在每个页面的最后一个节点插入一个分节符。尝试下面的示例代码,它适用于我最后仅包含 text/paragraphs 的文件。
// Load document
Aspose.Words.Document doc = new Aspose.Words.Document(src);
DocumentBuilder builder = new DocumentBuilder(doc);
// Get all runs
NodeCollection runs = doc.GetChildNodes(NodeType.Run, true);
foreach(Run run in runs)
{
// Find the page number
LayoutCollector collector = new LayoutCollector(doc);
int pageNumber = collector.GetEndPageIndex(run);
// If next run is on next page, add a page break
Node nextNode = run.ParentNode.NextSibling;
if (nextNode == null)
continue;
int nextPageNumber = collector.GetStartPageIndex(nextNode);
if (nextPageNumber > pageNumber)
{
Console.WriteLine("Add a break here.");
builder.MoveTo(run);
builder.InsertBreak(BreakType.SectionBreakNewPage);
// Modify header footer
Section currentSection = builder.CurrentSection;
builder.MoveToHeaderFooter(HeaderFooterType.HeaderPrimary);
builder.Write("Header of page " + nextPageNumber);
builder.MoveToHeaderFooter(HeaderFooterType.FooterPrimary);
builder.Write("Footer of page " + nextPageNumber);
}
}
我正在使用文档对象模型从 XHTML 创建 docx。 我能够创建具有两个共同部分的文档(一个用于正文,另一个用于启用了第一页不同选项的页眉和页脚)。 现在因为我们有一个要求为不同的页面创建不同的页眉和页脚。我不确定如何使用 DOM 来做到这一点。 在用于创建不同页眉和页脚的普通 Word 文档中,我们需要将每个页面拆分为分页符,然后在页眉和页脚中它会显示为不同的部分,我们可以禁用 "linktoprevious" 选项并为不同的部分创建不同的页眉页脚页。 我想知道是否有任何方法 aspose.words 会自动识别每一页,并基于此我们可以在阅读文档时创建分节符(下一页)。
或者让我知道是否可以使用 aspose.words .Net
中的文档对象模型为每个页面创建不同的页眉和页脚谢谢
这很棘手,但可以通过 Aspose.Words 使用 LayoutCollector API 找到节点的页码。这个想法是遍历文档中的每个 运行 并在每个页面的最后一个节点插入一个分节符。尝试下面的示例代码,它适用于我最后仅包含 text/paragraphs 的文件。
// Load document
Aspose.Words.Document doc = new Aspose.Words.Document(src);
DocumentBuilder builder = new DocumentBuilder(doc);
// Get all runs
NodeCollection runs = doc.GetChildNodes(NodeType.Run, true);
foreach(Run run in runs)
{
// Find the page number
LayoutCollector collector = new LayoutCollector(doc);
int pageNumber = collector.GetEndPageIndex(run);
// If next run is on next page, add a page break
Node nextNode = run.ParentNode.NextSibling;
if (nextNode == null)
continue;
int nextPageNumber = collector.GetStartPageIndex(nextNode);
if (nextPageNumber > pageNumber)
{
Console.WriteLine("Add a break here.");
builder.MoveTo(run);
builder.InsertBreak(BreakType.SectionBreakNewPage);
// Modify header footer
Section currentSection = builder.CurrentSection;
builder.MoveToHeaderFooter(HeaderFooterType.HeaderPrimary);
builder.Write("Header of page " + nextPageNumber);
builder.MoveToHeaderFooter(HeaderFooterType.FooterPrimary);
builder.Write("Footer of page " + nextPageNumber);
}
}