【问题标题】:Tika 1.14: getting java.lang.NullPointerException for PDFTextStripperTika 1.14:为 PDFTextStripper 获取 java.lang.NullPointerException
【发布时间】:2017-01-04 13:07:49
【问题描述】:

使用 Apache Tika 的 PDFParser 解析 PDF 文件时收到以下错误消息

    Exception in thread "main" java.lang.ExceptionInInitializerError
    at org.apache.tika.parser.pdf.PDFParser.parse(PDFParser.java:150)
    at tikapdf.TikaPdfParser.main(TikaPdfParser.java:29)
Caused by: java.lang.NullPointerException
    at org.apache.pdfbox.text.PDFTextStripper.<clinit>(PDFTextStripper.java:1852)
    ... 2 more

beforeafter 添加 PDFBox jar 时出现错误。 Tika 1.14 应该已经与 PDFBox 捆绑在一起。显示所有信息和 Java 代码的 Eclipse IDE 屏幕下方。

package tikapdf;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.IOException;

import org.apache.tika.exception.TikaException;
import org.apache.tika.metadata.Metadata;
import org.apache.tika.parser.ParseContext;
import org.apache.tika.parser.pdf.PDFParser;
import org.apache.tika.sax.*;
import org.xml.sax.SAXException;

public class TikaPdfParser {

    public static void main(final String[] args) throws IOException, SAXException, TikaException {
        try {
            InputStream input = new FileInputStream(new File("D:\\Users\\bguarism\\workspace\\NLP\\invoice89526610.pdf"));

            BodyContentHandler textHandler = new BodyContentHandler(-1); //-1 to allow parsing for unlimited character          
            Metadata metadata = new Metadata();
            ParseContext context = new ParseContext();          

            //parsing the document using PDF parser
            PDFParser parser = new PDFParser();         
            parser.parse(input, textHandler, metadata, context);

            System.out.println("Title: "+ metadata.get(Metadata.TITLE));
            //System.out.println("Body: "+ textHandler.toString());

            input.close();

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }       
    }
}

【问题讨论】:

  • 该代码行正在搜索资源“org/apache/pdfbox/resources/text/BidiMirroring.txt”。找出它是否在 tika 应用程序中会很有趣。你检查过大小和/或校验和吗?
  • 感谢您的快速回答。我只下载了 JAR 文件。现在,在下载pdfbox-2.0.4-src(源代码)后,我在pdfbox-2.0.4\pdfbox\src\main\resources\org\apache\pdfbox\resources 文件夹中找到了BidiMirroring.txt 文件。让它与我的 Tika 代码一起工作的最简单方法是什么?
  • 它也应该在 tika app jar 中。据我了解,您不需要 pdfbox 文件,因为它们是 tika 的一部分。这就是为什么我问“你检查过大小和/或校验和吗?”。
  • MD5 签名匹配!没问题。
  • 我查看了 tika jar,文件在 org\apache\pdfbox\resources\text\ 中。所以我怀疑一些日食问题。因为我使用的是 netbeans,所以我无能为力。

标签: java eclipse pdfbox apache-tika


【解决方案1】:

我知道这个问题比较老,但是我今天结合 Eclipse Neon 遇到了同样的问题。

所以这里有一个可能的解释你的问题。

  • PDFbox 有一些类初始化器,它们使用逻辑“.class.getClassLoader()”来获取与类关联的类加载器的实例。我希望您的 PDFTextStripper.java 文件的第 1852 行被用作您一直在使用的版本的源代码,其中包含对此调用的引用。
  • 如果您决定将 Eclipse 库标记为“系统库”,那么 getClassLoader 将在它们被装入引导加载程序时返回“null”,因此您会收到 NullPointerException。随后的 getResourceAsStream 调用正在尝试针对空值,因此显然失败了。
  • 这也适用于 Apache XML-Beans 2.6 或 Apache POI 和其他实现。

可能的简单解决方案:从 Eclipse 库定义中删除标志“系统库”,getClassLoader 将向类加载器返回一个实例。这样你就不会再遇到异常了。

更严格的分辨率:修补 PDFBox 的代码库并检查空值。如果适用,请使用 ClassLoader.getSystemClassLoader() instaead。用 Maven 重新编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 2011-03-07
    • 1970-01-01
    相关资源
    最近更新 更多