我有一个需要调和两个文档(Word(.docx)文档和PDF)的方案。两者应该彼此“相同”(PDF只是DOCX文件的PDF版本)。表示它们应包含相同的文本,内容等。

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

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

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实例中获得所需的计数?提前致谢。

最佳答案

首先,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);


如果您根本不在乎文本,只需在元数据中传入一个虚拟内容处理程序

10-07 12:31