java讀取word內容
最近有一個需求,通過java讀取word文件,獲取裡面的批註內容,批註的作者以及被批註的內容,被批註內容所在的章節數和頁碼數。poi提供的API都是英文的,而且針對word的操作並不是很完善,所以就自己總結了一下。
首先,這裡使用的是XWPFDocument物件來讀取word文件的,XWPFDocument物件提供了一個方法,可以直接獲取word文件裡所有的批註:
public XWPFComment[] getComments();
返回的是一個數組,裡面包含所有的批註物件。
通過這種方式獲取的XWPFDocument物件,其實是以一種xml格式,可以通過各種方式來驗證。批註的格式為:
<w:commentRangeStart w:id="0" />
<w:t>正文文字</w:t>
</w:r>
<w:commentRangeEnd w:id="0" />
其中w:commentRangeStart表示標註的開始,w:commentRangeEnd表示標註結束了,w:t標籤的值就是標註所引用的正文,w:id是標註的唯一標識。如果被引用的正文是圖片的話,則標籤為:
<wp:docPr id="1" name="xxx" descr="yyy.png" />
如果僅僅獲取標註的資訊的話,上面的內容已經足夠了。下面介紹一下如何獲取章節數和頁碼數。
前提條件是整個word的格式正確,否則得不到想要的結果。另外,需要說明的是,因為頁碼是根據目錄來的,所有如果說某一個章節跨頁的話,獲取的頁碼可能不準確,存在偏差。
獲取目錄
public List<XWPFParagraph> getParagraphs();
通過上面的方法,對整個word文件逐行的進行解析,前面已經提到,解析到的物件是一種xml格式的資料,由各種標籤控制著。
public CTHyperlink[] getHyperlinkArray();
如果所在的行是目錄的話,會存在w:hyperlink標籤,可通過上面的方法獲取整個目錄的內容,另外,還會存在w:anchor這樣一個標籤,也需要獲取這個標籤的值,因為這個值與下文的標題有關聯,可通過這個值找到標題與目錄的關聯關係。
CTR[] rArray = ctHyperlink.getRArray();
for(CTR ctr : rArray) {
CTText[] tArray = ctr.getTArray();
for(CTText t : tArray) {
sb.append(t.getStringValue());
}
}
通過上面的方法可獲取目錄的內容。
獲取正文標題
正文中的標題會有一個w:bookmarkStart標籤標識,還有一個w:name標籤,該標籤的值與目錄中的w:anchor的值一致,通過這個值,可以找到目錄內容,從而得知該段落所在的章節數和頁碼數。
public CTBookmark[] getBookmarkStartArray();
可以通過上面的方法獲取正文標題的內容。
END
上面這些方法已經足夠完成需求了。可以先獲取所有的標註,然後再解析word,在解析的過程中,儲存章節數和頁碼數,最後通過標註的唯一標識id來封裝最終的物件。
章節數 | 頁碼數 | 作者 | 批註內容 | 批註引用正文 |
1.1 | 3 | Steven_sf | 批註 | test |
關於word解析後的xml格式,裡面還有很多標籤可以使用,有興趣的請自行了解。
相關原始碼下載