1

我正在使用 apache poi 来操作 word 文档。有没有办法从 doc 文件中获取标题?我能够从文档中获取纯文本,但我需要区分文档文件中的所有标题?apache poi api中是否有任何功能可以仅从ms word文件中获取标题?

4

3 回答 3

2

将评论推广到答案

在 Word 中制作“标题”有两种方法。“正确”的方式,以及大多数人似乎这样做的方式......

  1. 在样式下拉列表中,选择适当的标题样式,编写文本,然后返回下一行的正常段落样式

  2. 突出显示一行,并增加字体大小+使其粗体或斜体

如果您的用户正在执行 #2,那么您基本上没有真正希望识别标题。如果没有编写一些模糊匹配逻辑来尝试发现字体大小何时跳跃,那么您就不走运了

对于#1,它在 Apache POI 中相当容易。您要做的是获取适用于段落的样式的样式描述,然后获取样式的名称。如果它以Heading(不区分大小写)开头,您就知道您找到了一个标题。获取该段落的文本,然后继续阅读文档。

如果您查看构建在 POI 之上的Apache Tika MS-Word 解析器,您会看到一个很好的例子,它可以遍历段落并检查样式

于 2013-11-01T13:42:33.560 回答
2

正如加格拉瓦所说:

对于#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
                    }
                }

            }


        }
于 2015-12-01T11:51:16.833 回答
0

至少对于 HWPF(即旧的二进制 doc 格式),如果您有一个格式正确的文件(因此键入其他答案的 #1),您不应该完全依赖样式名称 - 事实上,这可能与语言有关值(英语中的“标题”,法语中的“标题”等)。

Paragraph.getLvl() ,它对各个段落在 Word 的大纲视图中显示的级别进行编码,通常是一个很好的辅助来源。1构成最重要的级别,所有后续数字8代表不太重要的候选标题,并且9是 Word 默认分配给普通(非标题)段落的值。

于 2015-12-31T15:02:30.750 回答