从Tika获取Word和PDF的段落数

时间:2013-02-20 21:50:59

标签: java pdf docx apache-tika text-analysis

我有一个场景,我需要调和两个文档,Word(.docx)文档和PDF。这两者应该是彼此“混淆”的(PDF只是DOCX文件的PDF版本);意思是它们应该包含相同的文字,内容等。

具体来说,我需要确保两个文档包含相同数量的段落。因此,我需要阅读DOCX,获取段落计数,然后阅读PDF并抓住其段落计数。如果两个数字相同,那么我就是在做生意。

看起来Apache Tika(我对1.3 感兴趣)是这里工作的正确工具。我在this source file中看到Tika支持段落计数的概念,但试图弄清楚如何从两个文档中获取计数。这是我最好的尝试,但我正在窒息连接一些最后的点:

InputStream docxStream = new FileInputStream("some-doc.docx");
InputStream pdfStream = new FileInputStream("some-doc.pdf");

ContentHandler handler = new DefaultContentHandler();
Metadata docxMeta = new Metadata();
Metadata pdfMeta = new Metadata();
Parser parser = new OfficeParser();
ParseContext pc = new ParseContext();

parser.parse(docxStream, handler, docxMeta, pc);
parser.parse(pdfStream, handler, pdfMeta, pc);

docxStream.close();
pdfStream.close();

int docxParagraphCount = docxMeta.getXXX(???);
int pdfParagraphCount = pdfMeta.getXXX(???);

if(docxParagraphCount == pdfParagraphCount)
    setInBusiness(myself, true);

所以我问:我是否正确设置了这个?或者我离开了基地?如果偏离基地,请给我一些帮助让我回到正轨。如果我已正确设置,那么如何从两个Metadata实例中获得所需的计数?提前谢谢。

1 个答案:

答案 0 :(得分:1)

首先,Tika只会回复您文档中包含的元数据。它不会为你计算任何东西。因此,如果您的某个文档缺少段落计数元数据,那么您就不走运了。如果你的一个文件有duff数据(即编写文件的程序错了),你就不走运了。

否则,您的代码几乎就在那里,但并不完全。您最有可能希望使用DefaultParserAutoDetectParser - OfficeParser仅用于Microsoft文件格式,而其他人则自动加载所有可用的解析器并选择正确的解析器。

您想要的属性是PARAGRAPH_COUNT,它来自Office元数据命名空间。您的代码将类似于:

TikaInputStream docxStream = TikaInputStream.get(new File("some-doc.docx"));
TikaInputStream pdfStream = TikaInputStream.get(new File("some-doc.pdf"));

ContentHandler handler = new DefaultContentHandler();
Metadata docxMeta = new Metadata();
Metadata pdfMeta = new Metadata();
ParseContext pc = new ParseContext();

Parser parser = TikaConfig.getDefaultConfig().getParser();

parser.parse(docxStream, handler, docxMeta, pc);
parser.parse(pdfStream, handler, pdfMeta, pc);

int docxParagraphCount = docxMeta.getInt(Office.PARAGRAPH_COUNT);
int pdfParagraphCount = pdfMeta.getInt(Office.PARAGRAPH_COUNT);

如果您根本不关心文本,只有元数据传入虚拟内容处理程序