我试图通过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());
}
我能够使用此代码获取段落列表但不能获取标题信息。简而言之,我会对所有标题感兴趣,它们可能会通过使用样式或使用大字体显式标记为标题。
答案 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
}
}