获取java.lang.NoClassDefFoundError:org/pdfbox/pdfparser/
下面是我正在使用的代码,我提供了一个pdf文件和一个文本文件作为命令行的输入获取java.lang.NoClassDefFoundError:org/pdfbox/pdfparser/,java,pdfbox,Java,Pdfbox,下面是我正在使用的代码,我提供了一个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 ja
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]);
}
}
}
在通过命令行运行这段代码并输入两个参数后,一个是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
在Java中运行具有外部依赖项(在您的例子中是PDF解析器)的程序时,必须将适当的JAR文件包含到类路径中 看到或看到
我搜索了在jarfinder.com上找不到的类,结果发现您需要(至少)包含两个不同的JAR文件-和JAR。您可以从这里获得fontbox JAR 如果你用的是maven org.apache.pdfbox 方盒 1.8.5
我解决了这个问题,在我的ivy文件中插入了pdfbox依赖项的
transitive=true
<dependency org="org.apache.pdfbox" name="pdfbox" rev="1.8.11" transitive="true"/>
您需要在类路径中包括fontbox-1.3.1jar,而不是Apache pdfbox jar,它将解决您的问题,因为pdfbox内部使用fontbox-1.3.1将以下依赖项添加到pom.xml中
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>fontbox</artifactId>
<version>3.0.0-RC1</version>
</dependency>
org.apache.pdfbox
运行应用程序时,您的类路径上是否有库JAR文件?您确定您的类路径上有库JAR文件吗?请向我们展示您用于启动应用程序的命令。还有一个问题,我需要将哪些jar文件添加到类路径主“PDFBox-0.7.3.jar”文件或外部文件夹中的所有文件?下面是我使用的命令。。java-cp。;C:\Users\Desktop\lib\PDFBox-0.7.3.jar PDFTextParser“xyz.pdf”“text.txt”要消除您遇到的错误,您至少需要添加字体框和pdf框jar文件(请参见我编辑的答案)。解决这两个问题后,应用程序可能会抛出新的异常,并且您必须在线程“main”java.lang.NoClassDefFoundError:org/fontbox/afm/AFMPa rser的org.pdfbox.pdmodel.font.PDFont.getAFM(PDFont.java:350)中添加更多的jar.Exception在org.pdfbox.pdmodel.font.PDFont.getAverageFontWidthFromAFMFile(PDFont.java:313)在org.pdfbox.pdmodel.font.PDSimpleFont.getAverageFontWidth(PDSimpleFont.java:231)在org.pdfbox.util.PDFStreamEngine.showString(PDFStreamEngine.java:276)在org.pdfbox.util.operator.ShowTextGlyph.process(ShowTextGlyph.java:80)上在org.pdfbox.util.PDFStreamEngine.processOperator(PDFStreamEngine.java:452)上,您不能在注释中粘贴大块文本,但可以编辑问题并附加更多信息。另外,您能发布用于启动应用程序的命令吗?k让我重新发布完整的日志跟踪我已经添加了新的日志跟踪。。。它与pdf字体有关吗?