使用Tika 1.10 Parser获取文件内容

时间:2015-08-17 16:06:54

标签: java maven jboss apache-tika

尝试使用Tika Parser获取文件内容时出现异常问题。在JUnit测试中运行时,以下代码可以正常工作,有几种类型的文件输入(例如doc,docx,txt,pdf)(即我能够获取每个文件的文本内容)。当我在我的应用程序中运行此代码时,不返回任何文本。没有异常,只是来自handler.toString()的空字符串。

public static String parseFile(final String path, final int charCountLimit) {

    if(path == null){
        throw new InvalidParameterException("parameter is null");
    } 

    if(charCountLimit < -1 || charCountLimit == 0){
        throw new InvalidParameterException("char count limit is out of range");
    }

    final File file = new File(path);

    if(! file.exists()){
        throw new InvalidParameterException(String.format("file does not exist %s", path));
    }

    try (InputStream stream = new FileInputStream(file.getAbsolutePath());){
        final AutoDetectParser parser = new AutoDetectParser();
        final BodyContentHandler handler = new BodyContentHandler(charCountLimit);

        Metadata metadata = new Metadata();
        /* the following setting is required for Office 2007 and later files, 
         * despite not being specified in the Tika Parser documentation
         */
        metadata.set(Metadata.RESOURCE_NAME_KEY, file.getName());

        parser.parse(stream, handler, metadata);
        return handler.toString();

    } catch (EncryptedDocumentException e){
        //handle exception
    } catch (IOException | SAXException | TikaException e) {
        //handle exception
    }
}

我的第一个想法是我的应用程序对我正在使用的文件做了一些事情,但是我通过对我的文件系统上的一个测试用例文件进行静态引用来排除这一点。

我的另一个想法是我遇到了某种版本冲突。在我的项目的POM中,我参考了tika-core的v 1.10,但是父POM指定了v 1.8。我已将父POM的引用更改为1.10,但问题仍然存在。

    <dependency>
        <groupId>org.apache.tika</groupId>
        <artifactId>tika-parsers</artifactId>
        <version>1.10</version>
    </dependency>
    <dependency>
        <groupId>org.apache.tika</groupId>
        <artifactId>tika-core</artifactId>
        <version>1.10</version>
    </dependency>

我很感激有关如何解决这个问题的建议。

更新

经过http://wiki.apache.org/tika/Troubleshooting%20Tika#No_Content_Extracted我已经解决了所有解析器都缺失的问题。在JUnit中,

org.apache.tika.parser.DefaultParser 

包含58个解析器。在我的JBoss 8服务器上运行时,在应用程序中,DefaultParser不包含解析器。添加JVM参数

-Dorg.apache.tika.service.error.warn=true 

没有java.lang.NoClassDefFoundError表示无法加载解析器。

1 个答案:

答案 0 :(得分:2)

我解决了我的问题。该问题与包含我的“解析文件”jar的EAR文件中的依赖关系有关。

在我的EAR的POM中,已经存在对tika-core的依赖引用。在运行时,EAR的tika-core副本用于实例化AutoDetectParser。由于我在EAR的POM中没有对tika-parsers的依赖引用,因此无法加载解析器类。

所以,似乎问题是由不正确的Maven POM依赖配置引起的,由于DefaultParser(由AutoDetectParser获取)默认情况下不会生成任何输出(或抛出异常)而变得更难找到任何解析器。