【问题标题】:Is it possible to extract text by page for word/pdf files using Apache Tika?是否可以使用 Apache Tika 逐页提取 word/pdf 文件的文本?
【发布时间】:2011-04-28 20:53:08
【问题描述】:

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

【问题讨论】:

    标签: text apache-tika


    【解决方案1】:

    实际上,Tika 确实通过在页面开始前发送元素 <div><p> 和在页面结束后发送 </p></div> 来处理页面(至少在 pdf 中)。您可以使用它在处理程序中轻松设置页数(仅使用 <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 执行此操作时,当解析器未按正确顺序发送文本行时,您可能会遇到问题 - 请参阅 Extracting text from PDF files with Apache Tika 0.9 (and PDFBox under the hood) 了解如何处理。

    【讨论】:

    • 仅计算

      标签也计算正常段落,而不仅仅是页面,至少对我而言。

    【解决方案2】:

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

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

    【讨论】:

    • 因此,虽然 Tika 在后台使用 PDFBox,但它提供的功能范围不如 PDFBox?我特别担心 Tika 不允许您以 PDFBox 允许的方式设置开始页面 - 正如这个 SO 线程演示的那样 stackoverflow.com/questions/6839787/…
    • Apache Tika 为各种文件格式提供通用功能。它永远不会暴露每个库所做的一切,而是让生活变得简单和一致
    • 因此,如果我想使用 PDF 等逐页操作,Tika 不会让我到达那里,我基本上应该使用 PDFBox?
    【解决方案3】:

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

    Parser parser = new AutoDetectParser();
    Metadata metadata = new Metadata();
    ParseContext parseContext = new ParseContext();
    parser.parse(fis, handler, metadata, parseContext);
    metadata.get("xmpTPg:NPages");
    

    【讨论】:

    • 这并不能回答实际问题。问题不在于如何获取总页数,而在于如何逐页提取文本。
    猜你喜欢
    • 2018-01-06
    • 2015-11-28
    • 2012-11-11
    • 1970-01-01
    • 1970-01-01
    • 2020-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多