11

我能找到的所有文档似乎都表明我只能提取整个文件的内容。但我需要单独提取页面。我需要为此编写自己的解析器吗?是否有一些我遗漏的明显方法?

4

3 回答 3

7

<div><p>实际上,Tika 确实通过在页面开始之前和</p></div>页面结束之后发送元素来处理页面(至少在 pdf 中) 。您可以使用它轻松地在处理程序中设置页数(仅使用 only 计算页数<p>):

public abstract class MyContentHandler implements ContentHandler {
    private String pageTag = "p";
    protected int pageNumber = 0;
    ...
    @Override
    public void startElement (String uri, String localName, String qName, Attributes atts) throws SAXException  {  

        if (pageTag.equals(qName)) {
            startPage();
        }
    }

    @Override
    public void endElement (String uri, String localName, String qName) throws SAXException {  

        if (pageTag.equals(qName)) {
            endPage();
        }
    }

    protected void startPage() throws SAXException {
    pageNumber++;
    }

    protected void endPage() throws SAXException {
    return;
    }
    ...
}

使用 pdf 执行此操作时,当解析器未按正确顺序发送文本行时,您可能会遇到问题 - 请参阅使用 Apache Tika 0.9(和引擎盖下的 PDFBox)从 PDF 文件中提取文本以了解如何处理此问题。

于 2011-06-07T21:09:30.253 回答
5

您需要使用底层库 - Tika 在页面级别不做任何事情。

对于 PDF 文件,PDFBox 应该能够为您提供一些页面内容。对于 Word,来自 Apache POI 的 HWPF 和 XWPF 并没有真正做页面级别的事情 - 分页符不存储在文件中,而是需要根据文本 + 字体 + 页面大小动态计算......

于 2011-04-29T01:58:38.020 回答
5

您可以使用元数据对象的键获取 Pdf 中的页数,xmpTPg:NPages如下所示:

Parser parser = new AutoDetectParser();
Metadata metadata = new Metadata();
ParseContext parseContext = new ParseContext();
parser.parse(fis, handler, metadata, parseContext);
metadata.get("xmpTPg:NPages");
于 2013-07-24T21:22:22.440 回答