Tika 1.14:获取PDFTextStripper的java.lang.NullPointerException

时间:2017-01-04 13:07:50

标签: java eclipse pdfbox apache-tika

使用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

我在之前收到错误,在 之后收到错误。 Tika 1.14应该与PDFBox捆绑在一起。在Eclipse IDE屏幕下方,显示所有信息和Java代码。

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();
        }       
    }
}

Eclipse IDE view of code, libraries, and console

1 个答案:

答案 0 :(得分:0)

我知道这个问题比较老,但我今天和Eclipse Neon一起遇到了同样的问题。

所以这里可以解释你的问题。

  • PDFbox有一些类初始值设定项,它们使用逻辑&#34;&lt; Class&gt; .class.getClassLoader()&#34;获取与该类关联的类加载器的实例。我希望您的PDFTextStripper.java文件的第1852行被用作您使用的版本的源代码,它将包含对此调用的引用。
  • 如果您决定将Eclipse库标记为&#34;系统库&#34;然后getClassLoader将返回&#34; null&#34;因为它们被挂载到引导加载程序中,所以你得到一个NullPointerException。正在针对空值尝试后续的getResourceAsStream调用,因此它显然会失败。
  • 这也适用于Apache XML-Beans 2.6,或Apache POI和其他实现。

可能的简单解决方案:删除标记&#34;系统库&#34;从Eclipse库定义和getClassLoader将返回一个实例到类加载器。因此,您不再会遇到异常。

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