Apache POI: - 从DOC文件中获取标题

时间:2013-10-30 08:09:11

标签: java apache-poi

我正在搞乱apache poi操纵word文档。有没有办法从doc文件中获取标题?我能够从文档中获取纯文本,但我需要区分文档文件中的所有标题?是apache poi api中的任何函数,只能从ms word文件中获取标题吗?

3 个答案:

答案 0 :(得分:2)

宣传对答案的评论

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

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

  2. 突出显示一行,然后提高字体大小+使其变为粗体或斜体

  3. 如果您的用户正在做#2,那么您基本上没有希望找到标题。如果没有写一些模糊匹配逻辑来试图发现字体大小何时跳跃,那你就不幸了

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

    如果你看一下构建在POI之上的Apache Tika MS-Word parser,你会看到一个很好的例子来迭代这些段落并检查样式

答案 1 :(得分:1)

正如Gagravarr所说:

对于#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默认分配给普通(非标题)段落的值。