是否可以使用Apache Tika逐页提取word/pdf文件?

Asi*_*ikh 10 text apache-tika

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

top*_*hef 6

实际上,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;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

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


Gag*_*arr 5

您需要使用底层库 - Tika在页面级别不执行任何操作.

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


hd1*_*hd1 5

您可以使用元数据对象的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");
Run Code Online (Sandbox Code Playgroud)

  • 这并没有回答实际的问题。问题不在于如何获取总页数,而在于如何逐页提取文本。 (2认同)