2013-08-29 27 views
11

Dưới đây là mã mà tôi đang sử dụng, tôi đã cung cấp một tệp pdf và một tệp văn bản làm đầu vào cho dòng lệnh.Nhận java.lang.NoClassDefFoundError: org/pdfbox/pdfparser/

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

Sau khi chạy mã này qua dòng lệnh với 2 đầu vào một tên tệp pdf và tên tệp văn bản khác, tôi nhận được ngoại lệ noClassDefFound. Dưới đây là dấu vết ngăn xếp.

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 

Sau khi thêm đường dẫn lớp Tôi nhận được dưới đây Exceptions

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 
+0

Đỗ bạn có tệp JAR thư viện trên CLASSPATH của bạn khi chạy ứng dụng? –

+0

Bạn có chắc chắn rằng bạn có [tệp JAR phông chữ] (http://www.jarfinder.com/index.php/java/info/org.fontbox.afm.AFMParser) trên CLASSPATH của bạn không? Vui lòng cho chúng tôi biết lệnh bạn sử dụng để khởi chạy ứng dụng. –

+0

chỉ là một câu hỏi mà các tệp jar tôi cần thêm vào tệp chính "PDFBox-0.7.3.jar" của classpath hoặc tất cả các tệp có trong thư mục bên ngoài? – Paras

Trả lời

4

Khi chạy một chương trình với phụ thuộc bên ngoài (phân tích cú pháp PDF trong trường hợp của bạn) trong Java bạn phải bao gồm các tập tin JAR thích hợp để classpath của bạn .

Xem this other thread on Stack Overflow hoặc the documentation at Oracle.

Tôi đã tìm kiếm các lớp không thể tìm thấy tại jarfinder.com và hóa ra bạn cần bao gồm (ít nhất) hai tệp JAR khác nhau - font box và các JAR pdf box.

+0

Ngoại lệ trong chuỗi "chính" java.lang.NoClassDefFoundError: org/fontbox/afm/AFMPa rser tại org.pdfbox.pdmodel.font.PDFont.getAFM (PDFont.java:350) tại org.pdfbox.pdmodel. font.PDFont.getAverageFontWidthFromAFMFile (. PDFont java: 313) tại org.pdfbox.pdmodel.font.PDSimpleFont.getAverageFontWidth (PDSimpleFont java: 231) tại org.pdfbox.util.PDFStreamEngine.showString (PDFStreamEngine.java: 276) tại org.pdfbox.util.operator.ShowTextGlyph.process (ShowTextGlyph.java:80) tại org.pdfbox.util.PDFStreamEngine.processOperator (PDFStreamEngine.java: 452) – Paras

+0

Bạn không thể dán khối lớn của văn bản trong nhận xét nhưng bạn có thể chỉnh sửa câu hỏi của mình và nối thêm thông tin. Ngoài ra, bạn có thể đăng lệnh bạn sử dụng để khởi chạy ứng dụng không? –

+0

k cho phép tôi đăng lại toàn bộ logTrace – Paras

-4

Tôi đã sử dụng thư viện iText để giải quyết mục đích của mình. Nó hoạt động khá tốt cho tôi.

+5

-1 không thực sự là câu trả lời cho câu hỏi –

0

tôi risolved vấn đề này chèn transitive = true bên trong của tôi ivy tập tin cho pdfbox dipendency.

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

Bạn cần phải bao gồm fontbox-1.3.1 jar trong đường dẫn lớp ngoài Apache pdfbox jar mà sẽ khắc phục vấn đề của bạn như PDFBox nội bộ sử dụng fontbox-1.3.1

Các vấn đề liên quan