web-dev-qa-db-ja.com

Java.lang.NoClassDefFoundErrorの取得:org / pdfbox / pdfparser /

以下は私が使用しているコードで、コマンドラインへの入力として1つのPDFファイルと1つのテキストファイルを提供しています。

import org.pdfbox.cos.COSDocument;
import org.pdfbox.pdfparser.PDFParser;
import org.pdfbox.pdmodel.PDDocument;
import org.pdfbox.pdmodel.PDDocumentInformation;
import org.pdfbox.util.PDFTextStripper;

import Java.io.File;
import Java.io.FileInputStream;
import Java.io.PrintWriter;

public class PDFTextParser {

    PDFParser parser;
    String parsedText;
    PDFTextStripper pdfStripper;
    PDDocument pdDoc;
    COSDocument cosDoc;
    PDDocumentInformation pdDocInfo;

    // PDFTextParser Constructor 
    public PDFTextParser() {
    }

    // Extract text from PDF Document
    String pdftoText(String fileName) {

        System.out.println("Parsing text from PDF file " + fileName + "....");
        File f = new File(fileName);

        if (!f.isFile()) {
            System.out.println("File " + fileName + " does not exist.");
            return null;
        }

        try {
            parser = new PDFParser(new FileInputStream(f));
        } catch (Exception e) {
            System.out.println("Unable to open PDF Parser.");
            return null;
        }

        try {
            parser.parse();
            cosDoc = parser.getDocument();
            pdfStripper = new PDFTextStripper();
            pdDoc = new PDDocument(cosDoc);
            parsedText = pdfStripper.getText(pdDoc);
        } catch (Exception e) {
            System.out.println("An exception occured in parsing the PDF Document.");
            e.printStackTrace();
            try {
                if (cosDoc != null) cosDoc.close();
                if (pdDoc != null) pdDoc.close();
            } catch (Exception e1) {
                e.printStackTrace();
            }
            return null;
        }
        System.out.println("Done.");
        return parsedText;
    }

    // Write the parsed text from PDF to a file
    void writeTexttoFile(String pdfText, String fileName) {

        System.out.println("\nWriting PDF text to output text file " + fileName + "....");
        try {
            PrintWriter pw = new PrintWriter(fileName);
            pw.print(pdfText);
            pw.close();  
        } catch (Exception e) {
            System.out.println("An exception occured in writing the pdf text to file.");
            e.printStackTrace();
        }
        System.out.println("Done.");
    }

    //Extracts text from a PDF Document and writes it to a text file
    public static void main(String args[]) {

        if (args.length != 2) {
            System.out.println("Usage: Java PDFTextParser  ");
            System.exit(1);
        }

        PDFTextParser pdfTextParserObj = new PDFTextParser();
        String pdfToText = pdfTextParserObj.pdftoText(args[0]);

        if (pdfToText == null) {
            System.out.println("PDF to Text Conversion failed.");
        }
        else {
            System.out.println("\nThe text parsed from the PDF Document....\n" + pdfToText);
            pdfTextParserObj.writeTexttoFile(pdfToText, args[1]);
        }
    }
}

2つの入力を1つのPDFファイル名と別のテキストファイル名でコマンドラインを介してこのコードを実行した後、noClassDefFound例外が発生します。以下はスタックトレースです。

Exception in thread "main" Java.lang.NoClassDefFoundError: org/pdfbox/pdfparser/
PDFParser
        at PDFTextParser.pdftoText(PDFTextParser.Java:42)
        at PDFTextParser.main(PDFTextParser.Java:93)
Caused by: Java.lang.ClassNotFoundException: org.pdfbox.pdfparser.PDFParser
        at Java.net.URLClassLoader$1.run(URLClassLoader.Java:202)
        at Java.security.AccessController.doPrivileged(Native Method)
        at Java.net.URLClassLoader.findClass(URLClassLoader.Java:190)
        at Java.lang.ClassLoader.loadClass(ClassLoader.Java:306)
        at Sun.misc.Launcher$AppClassLoader.loadClass(Launcher.Java:301)
        at Java.lang.ClassLoader.loadClass(ClassLoader.Java:247)
        ... 2 more

クラスパスを追加すると、例外が発生します

Exception in thread "main" Java.lang.NoClassDefFoundError: org/fontbox/afm/AFMParser
        at org.pdfbox.pdmodel.font.PDFont.getAFM(PDFont.Java:350)
        at org.pdfbox.pdmodel.font.PDFont.getAverageFontWidthFromAFMFile(PDFont.Java:313)
        at org.pdfbox.pdmodel.font.PDSimpleFont.getAverageFontWidth(PDSimpleFont.Java:231)
        at org.pdfbox.util.PDFStreamEngine.showString(PDFStreamEngine.Java:276)
        at org.pdfbox.util.operator.ShowTextGlyph.process(ShowTextGlyph.Java:80)
        at org.pdfbox.util.PDFStreamEngine.processOperator(PDFStreamEngine.Java:452)
        at org.pdfbox.util.PDFStreamEngine.processSubStream(PDFStreamEngine.Java:215)
        at org.pdfbox.util.PDFStreamEngine.processStream(PDFStreamEngine.Java:174)
        at org.pdfbox.util.PDFTextStripper.processPage(PDFTextStripper.Java:336)
        at org.pdfbox.util.PDFTextStripper.processPages(PDFTextStripper.Java:259)
        at org.pdfbox.util.PDFTextStripper.writeText(PDFTextStripper.Java:216)
        at org.pdfbox.util.PDFTextStripper.getText(PDFTextStripper.Java:149)
        at PDFTextParser.pdftoText(PDFTextParser.Java:53)
        at PDFTextParser.main(PDFTextParser.Java:93)
Caused by: Java.lang.ClassNotFoundException: org.fontbox.afm.AFMParser
        at Java.net.URLClassLoader$1.run(URLClassLoader.Java:202)
        at Java.security.AccessController.doPrivileged(Native Method)
        at Java.net.URLClassLoader.findClass(URLClassLoader.Java:190)
        at Java.lang.ClassLoader.loadClass(ClassLoader.Java:306)
        at Sun.misc.Launcher$AppClassLoader.loadClass(Launcher.Java:301)
        at Java.lang.ClassLoader.loadClass(ClassLoader.Java:247)
        ... 14 more
14
Paras

Java)で外部依存関係(この場合はPDFパーサー)を使用してプログラムを実行する場合、適切なJARファイルをCLASSPATHに含める必要があります。

スタックオーバーフローの他のスレッド または Oracleのドキュメント を参照してください。

私はjarfinder.comで見つからないクラスを検索しましたが、(少なくとも)2つの異なるJARファイルを含める必要があることがわかりました- フォントボックス および pdfボックス JAR。

5

ここからfontbox jarを取得できます http://mvnrepository.com/artifact/org.Apache.pdfbox/fontbox/1.8.5

Maven org.Apache.pdfbox fontbox 1.8.5を使用している場合

3
James879

Apache pdfbox jarとは別に、クラスパスにfontbox-1.3.1 jarを含める必要があります。これにより、PDFBoxが内部的に使用するfontbox-1.3。 1

2
SiddP

この問題を解決して、pdfbox依存関係のivyファイル内にtransitive = trueを挿入しました。

<dependency org="org.Apache.pdfbox" name="pdfbox" rev="1.8.11" transitive="true"/>
0
Marco