我有一个需要调和两个文档(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数据(即,将文件写出的程序弄错了),那么您将很不走运。
否则,您的代码就在那儿,但不尽然。您很可能只想使用DefaultParser
或AutoDetectParser
-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);
如果您根本不在乎文本,只需在元数据中传入一个虚拟内容处理程序