【问题标题】:Getting paragraph count from Tika for both Word and PDF从 Tika 获取 Word 和 PDF 的段落计数
【发布时间】:2013-02-20 21:50:59
【问题描述】:

我有一个场景,我需要协调两个文档,一个 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 实例中获得所需的计数?提前致谢。

【问题讨论】:

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


    【解决方案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);
    

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

    【讨论】:

    • 太棒了 - 谢谢@Gagravarr (+1) - 快速提问 - 在你的回答中,你的网站 Office.PARAGRAPH_COUNT。第二个应该是Pdf.PARAGRAPH_COUNT,还是Office.PARAGRAPH_COUNT 对这两种文档类型都有效?如果是这样,如何/为什么?我想我只是设想 PDF 类型定义自己的属性,而不是 Office.PARAGRAPH_COUNT 应用于所有文档。例如,我如何知道Office.PARAGRAPH_COUNT适用于哪些文档类型?等等。再次感谢!
    • 涵盖段落计数的元数据命名空间在Office class 中定义。 Tika 所做的一件事是将元数据标准化为一组通用定义,因此您无需了解每种格式的特性
    猜你喜欢
    • 1970-01-01
    • 2011-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多