2013-02-18 222 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

相關問題