OpenXML文字处理按页面迭代

时间:2012-05-21 05:27:36

标签: c# ms-word openxml openxml-sdk

如何逐页循环?我需要为所有页面设置一些元素到顶部和底部,而不使用页眉,页脚和水印。我使用下面的代码,但它并不适用于所有文档。

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;
}

1 个答案:

答案 0 :(得分:0)

这样的事情(即依赖 LastRenderedPageBreak )是你做的最好的事情,而不是构建页面布局模型(如果你的页面只包含文本段落,那就太容易了;一般情况)。