使用apache-poi从doc和docx文件中提取标题和段落

时间:2015-04-08 15:36:57

标签: java apache-poi

我试图通过apache-poi阅读Microsoft word文档,发现提供了几种方便的方法来扫描文档,如getText(),getParagraphList()等。但我的用例略有不同,方式我们要浏览任何文档,它应该以与文档相同的顺序向我们提供标题,段落,表格等事件/信息。它将帮助我准备像

这样的文档结构
    <content>

    <section>

         <heading> ABC </heading>

         <paragraph>xyz </paragraph>

        <paragraph>scanning through APIs</paragraph>        

    <section>
    .
    .
    .

    </content>

主要目的是保持标题和段落之间的关系,如原始文档中所示。不确定,但这样的事情对我有用,

    Iterator<IBodyElement> itr = doc.getBodyElementsIterator();

        while(itr.hasNext()) {

          IBodyElement ele = itr.next();

          System.out.println(ele.getElementType());

        }

我能够使用此代码获取段落列表但不能获取标题信息。简而言之,我会对所有标题感兴趣,它们可能会通过使用样式或使用大字体显式标记为标题。

1 个答案:

答案 0 :(得分:0)

标题不是内嵌在主文档中,它们存在于其他地方,这就是为什么你没有将它们作为主体元素。正文元素是部分,段落和表格,而不是标题,因此您必须自己获取它们。

如果你看一下this code in Apache Tika,你会看到一个如何做的例子。假设你正在遍历body元素,并想要段落的页眉/页脚,你会想要这样的代码(基于Tika代码):

for(IBodyElement element : bodyElement.getBodyElements()) {
    if(element instanceof XWPFParagraph) {
         XWPFParagraph paragraph = (XWPFParagraph)element;
         XWPFHeaderFooterPolicy headerFooterPolicy = null;

         if (paragraph.getCTP().getPPr() != null) {
            CTSectPr ctSectPr = paragraph.getCTP().getPPr().getSectPr();
            if(ctSectPr != null) {
               headerFooterPolicy = new XWPFHeaderFooterPolicy(document, ctSectPr);
               // Handle Header
            }
         }
         // Handle paragraph
         if (headerFooterPolicy != null) {
            // Handle footer
         }
    }
    if(element instanceof XWPFTable) {
         XWPFTable table = (XWPFTable)element;
         // Handle table
    }
    if (element instanceof XWPFSDT){
        XWPFSDT sdt = (XWPFSDT) element;
        // Handle SDT
    }
}