我有一个场景,我需要调和两个文档,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
实例中获得所需的计数?提前谢谢。
答案 0 :(得分:1)
首先,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);
如果您根本不关心文本,只有元数据传入虚拟内容处理程序