使用Apache Tika是否可以按页提取Word/PDF文件中的文本?

11

我找到的所有文档都似乎表明只能提取整个文件的内容,但我需要分别提取每一页的内容。我是否需要编写自己的解析器?有没有一些我忽略了的明显方法?

3个回答

7
实际上,Tika可以处理页面(至少在pdf中),通过在页面开始前发送元素<div><p>,并在页面结束后发送</p></div>。您可以使用此方法轻松设置处理程序中的页面计数(只需使用<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文件中提取文本以了解如何处理此问题。


只计算<p>标签也会计算普通段落,而不仅仅是页面,至少对我来说是这样。 - Philipp Nowak

5
您可以使用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");

2
这并没有回答实际问题。问题不是关于如何获取总页数,而是关于如何逐页提取文本的问题。 - Abraham Milano

5

您需要与底层库一起使用-Tika不在页面级别上执行任何操作。

对于PDF文件,PDFBox应该能够提供一些页面内容。对于Word文档,Apache POI的HWPF和XWPF并不真正执行页面级别的操作-页面断点不存储在文件中,而是需要根据文本+字体+页面大小动态计算...


因此,尽管Tika在内部使用PDFBox,但它并没有提供与PDFBox相同的功能广度?我特别担心的是,从我所看到的来看,Tika不允许您像PDFBox那样设置起始-结束页面 - 正如这个SO线程所展示的那样https://dev59.com/I2w15IYBdhLWcg3wFHzf - Don Cheadle
1
Apache Tika 提供了跨越非常广泛的文件格式的通用功能。它永远不会暴露每个库所做的所有事情,而是使生活变得简单和一致。 - Gagravarr
那么,如果我想要使用PDF等文件进行逐页操作,Tika就无法满足我的需求,我应该使用PDFBox? - Don Cheadle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接