2013-08-29 2 views
11

Ниже приведен код, который я использую, я предоставил один файл pdf и один текстовый файл в качестве ввода в командную строку.Получение 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]); 
     } 
    } 
} 

После выполнения этого кода с помощью командной строки с 2 входами один имя этого файла и другое имя текстового файла Я получаю 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 
+0

Do у вас есть файл JAR библиотеки на вашем CLASSPATH при запуске приложения? –

+0

У вас есть [файл JAN-файла шрифтов] (http://www.jarfinder.com/index.php/java/info/org.fontbox.afm.AFMParser) на вашем CLASSPATH? Пожалуйста, покажите нам команду, которую вы используете для запуска приложения. –

+0

только один вопрос, какие файлы jar мне нужно добавить в основной файл «PDFBox-0.7.3.jar» или все файлы, которые есть во внешней папке? – Paras

ответ

4

При запуске программы с внешними зависимостями (PDF парсер в вашем случае) в Java вы должны включить соответствующие JAR файлы в CLASSPATH ,

См. this other thread on Stack Overflow или the documentation at Oracle.

Я искал классы, которые не могут быть найдены на jarfinder.com, и, оказывается, вам нужно включить (по крайней мере) два разных файла JAR - font box и pdf box JAR.

+0

Исключение в потоке "основного" java.lang.NoClassDefFoundError: орг/fontbox/AFM/AFMPa rser на org.pdfbox.pdmodel.font.PDFont.getAFM (PDFont.java:350) на 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) – Paras

+0

Вы не можете вставлять большие куски текстав комментарии, но вы можете отредактировать свой вопрос и добавить дополнительную информацию. Кроме того, можете ли вы опубликовать команду, которую вы используете для запуска приложения? –

+0

k Позвольте мне переустановить полный logTrace – Paras

-4

Я использовал iText библиотеку, чтобы решить мою цель. Его работа очень хорошо для меня.

+5

-1 не совсем ответ на вопрос –

0

Я risolved этот вопрос вставив transitive = true внутри моего ivy файл для PDFbox.

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

Вам нужно включить fontbox-1.3.1 баночки в классе пути, кроме Apache pdfbox баночки который будет исправить вашу проблему как PDFBox внутренне использует fontbox-1.3.1

Смежные вопросы