我能找到的所有文档似乎都暗示我只能提取整个文件的内容。但我需要单独提取页面。我需要为此编写自己的解析器吗?是否有一些我遗漏的明显方法?
答案 0 :(得分: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;
}
...
}
使用pdf执行此操作时,如果解析器未按正确顺序发送文本行,则可能会遇到问题 - 有关如何处理此问题,请参阅Extracting text from PDF files with Apache Tika 0.9 (and PDFBox under the hood)。
答案 1 :(得分:5)
您需要使用底层库 - Tika在页面级别不执行任何操作。
对于PDF文件,PDFBox应该能够为您提供一些页面内容。对于Word,来自Apache POI的HWPF和XWPF并不真正做页面级别的事情 - 分页符不存储在文件中,而是需要根据文本+字体+页面大小动态计算...
答案 2 :(得分: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");