OpenXML 文字处理按页面迭代
本文关键字:迭代 文字处理 OpenXML | 更新日期: 2023-09-27 18:34:41
如何按页面循环?我需要为所有页面设置一些元素的顶部和底部,而无需使用页眉、页脚和水印。我使用下面的代码,但它不适用于所有文档。
public void AddLabel()
{
IEnumerable<Paragraph> topP = wdDoc.MainDocumentPart.Document.Body.Elements<Paragraph>();
bool skip = false;
foreach (Paragraph p in topP)
{
if (!ContainLastRenderedPageBreak(p))
{
if (!skip)
{
p.Append(runElementFooter.CloneNode(true));
p.Append(runElementHeader.CloneNode(true));
skip = true;
}
}
else skip = false;
if (ContainPageBreak(p))
{
p.Append(runElementFooter.CloneNode(true));
p.Append(runElementHeader.CloneNode(true));
skip = false;
}
}
}
public bool ContainPageBreak(Paragraph p)
{
return p.Elements<Run>().FirstOrDefault(r => r.Elements<Break>().FirstOrDefault(b => b.Type == BreakValues.Page) != null) != null;
}
public bool ContainLastRenderedPageBreak(Paragraph p)
{
return p.Elements<Run>().FirstOrDefault(r => r.Elements<LastRenderedPageBreak>().FirstOrDefault() != null) != null;
}
类似的东西(即依靠LastRenderedPageBreak(是最好的,而不是构建页面布局模型(如果你的页面只包含文本段落,这很容易;在更一般的情况下更难(。