在Word文档中查找标题/段落

时间:2011-03-16 13:07:44

标签: java apache-poi

我正在尝试在word文档中发现段落/标题。
我使用Apache POI来做到这一点。 我使用的一个例子是:

            fs = new POIFSFileSystem(new FileInputStream(filesname));
            HWPFDocument doc = new HWPFDocument(fs);
            WordExtractor we = new WordExtractor(doc);
            ArrayList titles = new ArrayList();

            try {
                for (int i = 0; i < we.getText().length() - 1; i++) {
                    int startIndex = i;
                    int endIndex = i + 1;
                    Range range = new Range(startIndex, endIndex, doc);
                    CharacterRun cr = range.getCharacterRun(0);

                    if (cr.isBold() || cr.isItalic() || cr.getUnderlineCode() != 0) {
                        while (cr.isBold() || cr.isItalic() || cr.getUnderlineCode() != 0) {
                            i++;
                            endIndex += 1;
                            range = new Range(endIndex, endIndex + 1, doc);
                            cr = range.getCharacterRun(0);
                        }
                        range = new Range(startIndex, endIndex - 1, doc);
                        titles.add(range.text());
                    }

                }
            }
            catch (IndexOutOfBoundsException iobe) {
                //sometimes this happens have to find out why.
            }`enter code here`

这适用于所有粗体,斜体或带下划线的文本。
但我想要的是发现最常用的字体。然后发现与该字体样式相比的变化。

任何想法?

3 个答案:

答案 0 :(得分:2)

嗯,有些想法是尝试以下一些方法:

    可以在段落的开头使用
  • cr.getFontSize()来查看范围是否更改字体大小。与粗体,斜体或下划线相结合将是一个很好的标识符。
  • cr.getFontName()也可用于确定字体在给定范围内的变化时间和位置。
  • cr.getColor()可以帮助确定用户是否使用不同颜色的字体。

我想我会遍历范围并在每次文本特征更改时创建多个CharacterRun项。然后根据段落中的位置以及所有上述特征(大小,颜色,名称,粗体,斜体等)评估每个项目。也许根据最常见的值创建某种加权比例。

创建Title对象并存储每组特征的值以帮助在同一文档中的后续字符运行中优化搜索也是有价值的。

答案 1 :(得分:1)

您可能需要查看Tika的WordExtractor中的 buildParagraphTagAndStyle 方法: https://svn.apache.org/repos/asf/tika/trunk/tika-parsers/src/main/java/org/apache/tika/parser/microsoft/WordExtractor.java

对于HWPF(.doc),要调用它,你会这样做:

      StyleDescription style = 
         document.getStyleSheet().getStyleDescription(p.getStyleIndex());
      TagAndStyle tas = buildParagraphTagAndStyle(
            style.getName(), (parentTableLevel>0)
      );

对于XWPF(.docx),您可以:

      XWPFStyle style = styles.getStyle(paragraph.getStyleID());

      TagAndStyle tas = WordExtractor.buildParagraphTagAndStyle(
            style.getName(), paragraph.getPartType() == BodyType.TABLECELL
      );

答案 2 :(得分:0)

如果您通过将数据转换为段落来处理数据会更容易。

 WordExtractor we = new WordExtractor(doc);
 String[] para = we.getParagraphText();

然后工作段落明智。如果您的代码已经无法找出标题,那么您可以检查每个段落中的粗体和下划线。

段落的功能如下:

for(int i=0;i<para.length;i++)
{
System.out.println("Length of paragraph "+(i+1)+": "+ para[i].length());
    System.out.println(para[i].toString());
}

可以在这里找到一个工作示例: http://sanjaal.com/java/120/java-file/how-to-read-doc-file-using-java-and-apache-poi/#comments