【发布时间】:2011-04-28 20:53:08
【问题描述】:
我能找到的所有文档似乎都表明我只能提取整个文件的内容。但我需要单独提取页面。我需要为此编写自己的解析器吗?有没有我遗漏的明显方法?
【问题讨论】:
标签: text apache-tika
我能找到的所有文档似乎都表明我只能提取整个文件的内容。但我需要单独提取页面。我需要为此编写自己的解析器吗?有没有我遗漏的明显方法?
【问题讨论】:
标签: text apache-tika
实际上,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) 了解如何处理。
【讨论】:
标签也计算正常段落,而不仅仅是页面,至少对我而言。
您需要使用底层库 - Tika 在页面级别不做任何事情。
对于 PDF 文件,PDFBox 应该能够为您提供一些页面内容。对于 Word,来自 Apache POI 的 HWPF 和 XWPF 并没有真正做页面级别的事情 - 分页符不存储在文件中,而是需要根据文本 + 字体 + 页面大小动态计算......
【讨论】:
您可以使用 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");
【讨论】: