1

我有一个场景,我需要协调两个文档,一个 Word (.docx) 文档以及一个 PDF。两者应该是“相同的”(PDF 只是 DOCX 文件的 PDF 版本);意味着它们应该包含相同的文本、内容等。

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

看起来 Apache Tika(我对 1.3 感兴趣)是适合这里工作的工具。我在这个源文件中看到 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实例中获得所需的计数?提前致谢。

4

1 回答 1

1

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

否则,您的代码几乎就在那里,但并不完全。您很可能希望使用DefaultParseror 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);

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

于 2013-02-20T22:45:59.977 回答