以下は私が使用しているコードで、コマンドラインへの入力として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
Java)で外部依存関係(この場合はPDFパーサー)を使用してプログラムを実行する場合、適切なJARファイルをCLASSPATHに含める必要があります。
スタックオーバーフローの他のスレッド または Oracleのドキュメント を参照してください。
私はjarfinder.comで見つからないクラスを検索しましたが、(少なくとも)2つの異なるJARファイルを含める必要があることがわかりました- フォントボックス および pdfボックス JAR。
ここからfontbox jarを取得できます http://mvnrepository.com/artifact/org.Apache.pdfbox/fontbox/1.8.5
Maven org.Apache.pdfbox fontbox 1.8.5を使用している場合
Apache pdfbox jarとは別に、クラスパスにfontbox-1.3.1 jarを含める必要があります。これにより、PDFBoxが内部的に使用するfontbox-1.3。 1
この問題を解決して、pdfbox依存関係のivyファイル内にtransitive = true
を挿入しました。
<dependency org="org.Apache.pdfbox" name="pdfbox" rev="1.8.11" transitive="true"/>