我正在搞乱apache poi操纵word文档。有没有办法从doc文件中获取标题?我能够从文档中获取纯文本,但我需要区分文档文件中的所有标题?是apache poi api中的任何函数,只能从ms word文件中获取标题吗?
答案 0 :(得分:2)
宣传对答案的评论
有两种方法可以在Word中制作“标题”。 “适当”的方式,以及大多数人似乎都这样做的方式......
在样式下拉列表中,选择合适的标题样式,编写文本,然后返回到下一行的正常段落样式
突出显示一行,然后提高字体大小+使其变为粗体或斜体
如果您的用户正在做#2,那么您基本上没有希望找到标题。如果没有写一些模糊匹配逻辑来试图发现字体大小何时跳跃,那你就不幸了
对于#1,它在Apache POI中相当容易。您要做的是获取适用于段落的样式的样式描述,然后获取样式的名称。如果以Heading
开头(不区分大小写),则表示您已找到标题。获取该段落的文本,然后继续阅读该文档。
如果你看一下构建在POI之上的Apache Tika MS-Word parser,你会看到一个很好的例子来迭代这些段落并检查样式
答案 1 :(得分:1)
对于#1,它在Apache POI中相当容易。您要做的是获取适用于段落的样式的样式描述,然后获取样式的名称。如果以Heading(不区分大小写)开头,则表示您已找到标题。获取该段落的文本,然后继续阅读该文档。
使用像这样的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
}
}
}
}
答案 2 :(得分:0)
至少对于HWPF(即旧的二进制文档格式),如果你有一个格式正确的文件(所以键入其他答案的#1),你不应该完全依赖于样式名称 - 事实上,这可能是一个语言依赖值(英语中的“标题”,法语中的“标题”等)。
编码Paragraph.getLvl()的 level where the respective paragraph is shown in Word's outline view通常是一个很好的辅助来源。 ?- reversePairs([1,2,3,4,5,6,7,9], R).
R = [7,9,5,6,3,4,1,2]. % observed answer
构成最重要的级别,所有后续数字.so
代表不太重要的标题候选者,1
是Word默认分配给普通(非标题)段落的值。