2013-02-18 91 views

回答

5

这是不可能得到页码使用OpanXml Sdk,因为这是由客户端(如MS Word)中处理的Word文档。

然而,如果你有预先由单词客户端打开并保存后工作文件,然后在客户端将增加LastRenderedPageBreak识别分页符。有关LastRenderedPageBreak s的更多信息,请参阅我的回答here。这使您可以在段落之前计算LastRenderedPageBreak元素的数量以获取当前页数。

如果不是,则情况诺迪选项,以解决您的要求是,以添加页码脚注(可能是相同的颜色作为你的文件实际上隐藏了!)。只有一个选项 - 如果您使用OpenXML sdk自动生成Word文档。

1

@Flowerking:谢谢你提供的信息。

因为我需要循环反正所有的段落来搜索特定字符串,我可以使用下面的代码查找页码:

using (var document = WordprocessingDocument.Open(@"c:\test.docx", false)) 
{ 
    var paragraphInfos = new List<ParagraphInfo>(); 

    var paragraphs = document.MainDocumentPart.Document.Descendants<Paragraph>(); 

    int pageIdx = 1; 
    foreach (var paragraph in paragraphs) 
    { 
     var run = paragraph.GetFirstChild<Run>(); 

     if (run != null) 
     { 
      var lastRenderedPageBreak = run.GetFirstChild<LastRenderedPageBreak>(); 
      var pageBreak = run.GetFirstChild<Break>(); 
      if (lastRenderedPageBreak != null || pageBreak != null) 
      { 
       pageIdx++; 
      } 
     } 

     var info = new ParagraphInfo 
     { 
      Paragraph = paragraph, 
      PageNumber = pageIdx 
     }; 

     paragraphInfos.Add(info); 
    } 

    foreach (var info in paragraphInfos) 
    { 
     Console.WriteLine("Page {0}/{1} : '{2}'", info.PageNumber, pageIdx, info.Paragraph.InnerText); 
    } 
} 
+0

不错。我应该在我的答案,如果你提供你的Q. 一个catch一些代码来提供类似的代码=>'变种分页符= run.GetFirstChild ();'在开放式XML - 并非所有'Break's是pagebreaks! – Flowerking 2013-02-18 20:55:14

+5

**对于所有未来的访问者,op认为这回答了他的问题。但它在很多情况下都失败了。当您使用多列布局时,它会失败。另外'run.GetFirstChild ();'会给你各种各样的休息,其中可能包括除了分页符之外的休息。所以在使用上面的代码时请记住这些要点。** – Flowerking 2013-02-24 22:07:12

+0

doc你有LastRenderedPageBreak的文档也会有Break,所以只需使用Break检查就可以了。但有些情况下,不会有任何突破,但内容可以扩展到多个页面,您如何通过页面识别和分离内容? – HaBo 2016-10-13 11:23:22

0

这是我该做的扩展方法:

public static int GetPageNumber(this OpenXmlElement elem, OpenXmlElement root) 
    { 
     int pageNbr = 1; 
     var tmpElem = elem; 
     while (tmpElem != root) 
     { 
      var sibling = tmpElem.PreviousSibling(); 
      while (sibling != null) 
      { 
       pageNbr += sibling.Descendants<LastRenderedPageBreak>().Count(); 
       sibling = sibling.PreviousSibling(); 
      } 
      tmpElem = tmpElem.Parent; 
     } 
     return pageNbr; 
    } 
+0

LastRenderedPageBreak并非总是可用 – HaBo 2016-10-13 09:59:10

+0

这只会计算现有文档中插入分页符的数量,例如,一旦它在Word中打开,将插入中断。如果您自己生成文档,使用SDK,文档中的唯一分页符将会是您自己插入的文档,而您不需要进行计数。 – IanGSY 2017-04-05 12:51:55