2014-05-22 46 views
18

Vorrei estrarre il testo da un determinato file PDF con Apache PDFBox.Come estrarre il testo da un file PDF con Apache PDFBox

Ho scritto questo codice:

PDFTextStripper pdfStripper = null; 
PDDocument pdDoc = null; 
COSDocument cosDoc = null; 
File file = new File(filepath); 

PDFParser parser = new PDFParser(new FileInputStream(file)); 
parser.parse(); 
cosDoc = parser.getDocument(); 
pdfStripper = new PDFTextStripper(); 
pdDoc = new PDDocument(cosDoc); 
pdfStripper.setStartPage(1); 
pdfStripper.setEndPage(5); 
String parsedText = pdfStripper.getText(pdDoc); 
System.out.println(parsedText); 

Tuttavia, ho ottenuto il seguente errore:

Exception in thread "main" java.lang.NullPointerException 
at org.apache.fontbox.afm.AFMParser.main(AFMParser.java:304) 

ho aggiunto PDFBox-1.8.5.jar e fontbox-1.8.5.jar al percorso di classe.

Modifica

ho aggiunto System.out.println("program starts"); all'inizio del programma.

L'ho eseguito, quindi ho ricevuto lo stesso errore di cui sopra e program starts non visualizzato nella console.

Quindi, penso di avere un problema con il percorso di classe o qualcosa del genere.

Grazie.

+0

Probabilmente il PDF il file non è completamente valido e fa inciampare PDFBox.È possibile che si desideri fornire il PDF per l'ispezione. – mkl

+1

Sei sicuro di aver avviato il metodo 'main()' corretto? L'eccezione sembra iniziare con il 'main()' di 'org.apache.fontbox.afm.AFMParser' che sembra codice PDFBox, non il tuo codice. – mkl

+0

Hai ragione. Ho resettato la configurazione della corsa e ora il programma funziona. Grazie mille, mkl. – Benben

risposta

27

Ho eseguito il codice e ha funzionato correttamente. Forse il tuo problema è legato a FilePath che hai dato al file. Ho messo il mio pdf nell'unità C e duro codificato il file path.here è il mio codice:

// PDFBox 2.0.8 require org.apache.pdfbox.io.RandomAccessRead 
// import org.apache.pdfbox.io.RandomAccessFile; 

public class PDFReader{ 
    public static void main(String args[]) { 
     PDFTextStripper pdfStripper = null; 
     PDDocument pdDoc = null; 
     COSDocument cosDoc = null; 
     File file = new File("C:/my.pdf"); 
     try { 
      // PDFBox 2.0.8 require org.apache.pdfbox.io.RandomAccessRead 
      // RandomAccessFile randomAccessFile = new RandomAccessFile(file, "r"); 
      // PDFParser parser = new PDFParser(randomAccessFile); 

      PDFParser parser = new PDFParser(new FileInputStream(file)); 
      parser.parse(); 
      cosDoc = parser.getDocument(); 
      pdfStripper = new PDFTextStripper(); 
      pdDoc = new PDDocument(cosDoc); 
      pdfStripper.setStartPage(1); 
      pdfStripper.setEndPage(5); 
      String parsedText = pdfStripper.getText(pdDoc); 
      System.out.println(parsedText); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
} 
+0

Funziona bene quando otteniamo il file pdf dal computer, ma sto cercando di ottenerlo dalla scheda SD in Android, dando un errore come "java.lang.ClassNotFoundException: Non ho trovato la classe" java.awt.print.Printable " sul percorso: DexPathList [[zip file "/data/app/com.geeklabs.pdfreader-1/base.apk"],nativeLibraryDirectories=[/vendor/lib,/system/lib]]" –

+0

E anche ottenere "java. lang.NoClassDefFoundError: org.pdfbox.pdmodel.PDDocument "anche se si aggiungono librerie per costruire il percorso –

+0

Come viene utilizzato PDFbox? Sono nuovo di questo concetto ma non ho idea da dove cominciare. Ho scaricato il file jar ma il doppio clic non funziona. – oivemaria

25

Utilizzando PDFBox 2.0.7, questo è come ottenere il testo di un PDF:

static String getText(File pdfFile) throws IOException { 
    PDDocument doc = PDDocument.load(pdfFile); 
    return new PDFTextStripper().getText(doc); 
} 

Chiamatela come questo:

try { 
    String text = getText(new File("/home/me/test.pdf")); 
    System.out.println("Text in PDF: " + text); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 

Dal oivemaria utente ha chiesto nei commenti:

È possibile utilizzare PDFBox nell'applicazione aggiungendo alle proprie dipendenze in build.gradle:

dependencies { 
    compile group: 'org.apache.pdfbox', name: 'pdfbox', version: '2.0.7' 
} 

Here's more sulla gestione delle dipendenze utilizzando Gradle.


Se si desidera mantenere il formato PDF nel testo analizzato, dare PDFLayoutTextStripper una prova.

+1

Questo è migliore della risposta accettata. Ho usato lo stesso per ottenere la risorsa come InputStream per caricare il file dalla cartella 'src \ resources'. Puoi anche usare la dipendenza di maven da m2repo https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox – Lucky

4

PdfBox 2.0.3 dispone anche di uno strumento da riga di comando.

  1. file Download jar
  2. java -jar pdfbox-app-2.0.3.jar ExtractText [OPTIONS] <inputfile> [output-text-file]
Options: 
    -password <password>  : Password to decrypt document 
    -encoding <output encoding> : UTF-8 (default) or ISO-8859-1, UTF-16BE, UTF-16LE, etc. 
    -console      : Send text to console instead of file 
    -html      : Output in HTML format instead of raw text 
    -sort      : Sort the text before writing 
    -ignoreBeads     : Disables the separation by beads 
    -debug      : Enables debug output about the time consumption of every stage 
    -startPage <number>   : The first page to start extraction(1 based) 
    -endPage <number>   : The last page to extract(inclusive) 
    <inputfile>     : The PDF document to use 
    [output-text-file]   : The file to write the text to 
0

Questo funziona bene per estrarre dati da un file PDF che ha un contenuto di testo utilizzando PDFBox 2.0.6

import java.io.File; 
import java.io.IOException; 
import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.text.PDFTextStripper; 
import org.apache.pdfbox.text.PDFTextStripperByArea; 

public class PDFTextExtractor { 
    public static void main(String[] args) throws IOException { 
     System.out.println(readParaFromPDF("C:\\sample1.pdf",3, "Enter Start Text Here", "Enter Ending Text Here")); 
    //Enter FilePath, Page Number, StartsWith, EndsWith 
    } 
    public static String readParaFromPDF(String pdfPath, int pageNo, String strStartIndentifier, String strEndIdentifier) { 
     String returnString = ""; 
     try { 
      PDDocument document = PDDocument.load(new File(pdfPath)); 
      document.getClass();   
      if (!document.isEncrypted()) { 
       PDFTextStripperByArea stripper = new PDFTextStripperByArea(); 
       stripper.setSortByPosition(true); 
       PDFTextStripper tStripper = new PDFTextStripper(); 
       tStripper.setStartPage(pageNo); 
       tStripper.setEndPage(pageNo); 
       String pdfFileInText = tStripper.getText(document); 
       String strStart = strStartIndentifier; 
       String strEnd = strEndIdentifier; 
       int startInddex = pdfFileInText.indexOf(strStart); 
       int endInddex = pdfFileInText.indexOf(strEnd); 
       returnString = pdfFileInText.substring(startInddex, endInddex) + strEnd; 
      } 
      } catch (Exception e) { 
       returnString = "No ParaGraph Found"; 
     } 
      return returnString; 
    } 
}