2013-10-30 168 views
0

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

+0

您是在寻找一种文本,其中应用了“标题1”的样式,或者某些文本行的粗体+周围点大于10点的算法,因此可能是某种标题? – Gagravarr

+0

两者。基本上我需要从doc文件中检索所有标题(小标题)。我不是基于字体大小和大胆编写我们自己的算法,而是在API中寻找一种方法,该方法从doc文件中获取所有标题。 – Stunner

+1

POI可以告诉你哪些事物具有应用于他们的标题样式,但是当人们不将它标记为标题时,这并不会起作用,而只是增加字体大小...... – Gagravarr

回答

2

推进的注释来回答

有两种方法做一个“标题”在Word中。 “适当”的方式,并的方式,大多数人似乎做...

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

  2. 高亮显示一行,并撞了字体大小+使其粗体或斜体

如果你的用户在做#2,你已经确定了标题的基本上没有真正的希望。编写一些模糊匹配逻辑以尝试识别字体大小跳跃时,您很失败

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

如果你看一下它是建立在POI顶部的Apache Tika MS-Word parser,你会看到一个很好的例子有遍历段落和检查风格

1

的一样Gagravarr说:

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

      } 


     } 
0

至少在HWPF(即旧的二进制文档格式),如果你有一个正确格式的文件(这样键入其他的答案#1),你应该不完全依赖于风格名称 - 事实上,这可能是一种与语言相关的价值(英文中的“Heading”,法语中的“Titre”等)。

Paragraph.getLvl(),它编码level where the respective paragraph is shown in Word's outline view,往往是一个很好的次要来源。 1构成最重要的级别,所有后续数字最多为8代表较不重要的标题候选,9是默认情况下Word分配给普通(非标题)段落的值。

相关问题