【问题标题】:Getting java.lang.NoClassDefFoundError: org/pdfbox/pdfparser/获取 java.lang.NoClassDefFoundError: org/pdfbox/pdfparser/
【发布时间】:2013-08-29 05:47:37
【问题描述】:

以下是我正在使用的代码,我提供了一个 pdf 文件和一个文本文件作为命令行的输入。

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 个输入一个 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

【问题讨论】:

  • 在运行应用程序时,您的 CLASSPATH 中是否有库 JAR 文件?
  • 您确定您的 CLASSPATH 中有 the fontbox JAR file 吗?请向我们展示您用于启动应用程序的命令。
  • 只有一个问题,我需要将哪些 jar 文件添加到类路径主“PDFBox-0.7.3.jar”文件或外部文件夹中的所有文件中?
  • 下面是我使用的命令.. java -cp .;C:\Users\Desktop\lib\PDFBox-0.7.3.jar PDFTextParser "xyz.pdf" "text.txt "
  • 要消除您遇到的错误,您至少需要添加 font-box 和 pdf-box JAR 文件(请参阅我编辑的答案)。解决这两个问题后,应用程序可能会抛出新的异常,您将不得不添加更多的 JAR。

标签: java pdfbox


【解决方案1】:

在 Java 中运行具有外部依赖项的程序(在您的情况下为 PDF 解析器)时,您必须将适当的 JAR 文件包含到您的 CLASSPATH 中。

请参阅this other thread on Stack Overflowthe documentation at Oracle

我搜索了在 jarfinder.com 上找不到的类,结果发现您需要(至少)包含两个不同的 JAR 文件 - font boxpdf box JAR。

【讨论】:

  • 线程“main”中的异常 java.lang.NoClassDefFoundError: org.pdfbox.pdmodel.font.PDFont.getAFM(PDFont.java:350) at org.pdfbox.pdmodel.font.PDFont.getAFM(PDFont.java:350) 的 org/fontbox/afm/AFMPa rser。 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)在 org.pdfbox.util.PDFStreamEngine.processOperator(PDFStreamEngine.java:452)的 org.pdfbox.util.operator.ShowTextGlyph.process(ShowTextGlyph.java:80)
  • 您不能在评论中粘贴大量文本,但您可以编辑您的问题并附加更多信息。另外,你能发布你用来启动应用程序的命令吗?
  • k 让我重新发布完整的 logTrace
  • 我已经添加了新的日志跟踪...它与 pdf 字体有关吗?
【解决方案2】:

你可以从这里获取 fontbox jar http://mvnrepository.com/artifact/org.apache.pdfbox/fontbox/1.8.5

如果你使用的是 maven org.apache.pdfbox 字体框 1.8.5

【讨论】:

    【解决方案3】:

    除了 Apache pdfbox jar 之外,您需要在类路径中包含 fontbox-1.3.1 jar,这将解决您的问题,因为 PDFBox 内部使用 fontbox- 1.3.1

    【讨论】:

      【解决方案4】:

      我解决了这个问题,在我的 ivy 文件中插入 transitive = true 以获取 pdfbox 依赖项。

      <dependency org="org.apache.pdfbox" name="pdfbox" rev="1.8.11" transitive="true"/>
      

      【讨论】:

        【解决方案5】:

        在 pom.xml 中添加如下依赖

        <dependency>
            <groupId>org.apache.pdfbox</groupId>
            <artifactId>fontbox</artifactId>
            <version>3.0.0-RC1</version>
        </dependency>
        

        然后运行mvn cleanmvn install 问题将得到解决。

        注意:您可以从以下链接中找到最新版本的 pdfbox 和 fontbox

        https://mvnrepository.com/artifact/org.apache.pdfbox/fontbox/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-04-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-12
          • 1970-01-01
          相关资源
          最近更新 更多