2013-10-30 63 views
0

我在搞apache poi來操縱word文檔。有沒有辦法從doc文件中獲取標題?我能夠從文檔中獲取純文本,但我需要區分文檔文件中的所有標題?是在apache poi api中可用的任何函數只能從ms文件中獲取標題?Apache POI: - 從DOC文件獲取標題

+0

您是在尋找一種文本,其中應用了「標題1」的樣式,或者某些文本行的粗體+周圍點大於10點的算法,因此可能是某種標題? – Gagravarr

+0

兩者。基本上我需要從doc文件中檢索所有標題(小標題)。我不是基於字體大小和大膽編寫我們自己的算法,而是在API中尋找一種方法,該方法從doc文件中獲取所有標題。 – Stunner

+1

POI可以告訴你哪些事物具有應用於他們的標題樣式,但是當人們不將它標記爲標題時,這並不會起作用,而只是增加字體大小...... – Gagravarr

回答

2

推進的註釋來回答

有兩種方法做一個「標題」在Word中。 「適當」的方式,並的方式,大多數人似乎做...

  1. 在樣式下拉列表中,挑選適當的標題樣式,寫你的文字,然後返回到正常的段落樣式下一行

  2. 高亮顯示一行,並撞了字體大小+使其粗體或斜體

如果你的用戶在做#2,你已經確定了標題的基本上沒有真正的希望。編寫一些模糊匹配邏輯以嘗試識別字體大小跳躍時,您很失敗

對於#1,在Apache POI中相當容易。你想要做的是獲取適用於段落的樣式的樣式描述,然後獲取樣式的名稱。如果以Heading開頭(不區分大小寫),則表明您已找到標題。獲取該段的文本,然後繼續閱讀文檔。

如果你看一下它是建立在POI頂部的Apache Tika MS-Word parser,你會看到一個很好的例子有遍歷段落和檢查風格

1

的一樣Gagravarr說:

對於# 1,在Apache POI中相當容易。你想要做的是獲取適用於段落的樣式的樣式描述,然後獲取樣式的名稱。如果以標題開頭(不區分大小寫),則知道已找到標題。獲取該段的文本,然後繼續閱讀文檔。

使用Apache POI這樣的代碼:

 File f=new File("test.docx"); 
     FileInputStream fis = new FileInputStream(f); 
     XWPFDocument xdoc=new XWPFDocument(OPCPackage.open(fis)); 
     XWPFStyles styles=xdoc.getStyles();   
     List<XWPFParagraph> xwpfparagraphs =xdoc.getParagraphs(); 
     System.out.println(); 
     for(int i=0;i<xwpfparagraphs.size();i++) 
     { 
      System.out.println("paragraph style id "+(i+1)+":"+xwpfparagraphs.get(i).getStyleID());       
      if(xwpfparagraphs.get(i).getStyleID()!=null) 
      { 
       String styleid=xwpfparagraphs.get(i).getStyleID(); 
       XWPFStyle style=styles.getStyle(styleid); 
       if(style!=null) 
       { 
        System.out.println("Style name:"+style.getName()); 
        if(style.getName().startsWith("heading")) 
        { 
         //this is a heading 
        } 
       } 

      } 


     } 
0

至少在HWPF(即舊的二進制文檔格式),如果你有一個正確格式的文件(這樣鍵入其他的答案#1),你應該不完全依賴於風格名稱 - 事實上,這可能是一種與語言相關的價值(英文中的「Heading」,法語中的「Titre」等)。

Paragraph.getLvl(),它編碼level where the respective paragraph is shown in Word's outline view,往往是一個很好的次要來源。 1構成最重要的級別,所有後續數字最多爲8代表較不重要的標題候選,9是默認情況下Word分配給普通(非標題)段落的值。

相關問題