web-dev-qa-db-fra.com

Comment extraire le texte d'un PDF Fichier avec Apache PDFBox

Je voudrais extraire le texte d'un fichier PDF donné avec Apache PDFBox.

J'ai écrit ce code:

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

Cependant, j'ai eu l'erreur suivante:

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

J'ai ajouté pdfbox-1.8.5.jar et fontbox-1.8.5.jar au chemin de classe.

Modifier

J'ai ajouté System.out.println("program starts"); au début du programme.

Je l'ai couru, puis j'ai eu la même erreur que celle mentionnée ci-dessus et program starts n'apparaissait pas dans la console.

Ainsi, je pense avoir un problème avec le chemin de classe ou quelque chose.

Je vous remercie.

24
Benben

J'ai exécuté votre code et cela a fonctionné correctement. Peut-être que votre problème est lié à FilePath que vous avez donné au fichier. Je mets mon pdf en C et codé en dur le chemin du fichier. Voici mon code:

// 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();
        } 
    }
}
31
Emad

Avec PDFBox 2.0.7, voici comment obtenir le texte d'un PDF:

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

Appelez ça comme ça:

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

Depuis l'utilisateur oivemaria demandé dans les commentaires:

Vous pouvez utiliser PDFBox dans votre application en l'ajoutant à vos dépendances dans build.gradle:

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

Voici plus sur la gestion de la dépendance à l'aide de Gradle.


Si vous souhaitez conserver le format du fichier PDF dans le texte analysé, essayez PDFLayoutTextStripper a try.

31
Matthias Braun

PdfBox 2.0.3 a également un outil de ligne de commande.

  1. Télécharger le fichier 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
4
sonus21

Maven dep:

    <dependency>
        <groupId>org.Apache.pdfbox</groupId>
        <artifactId>pdfbox</artifactId>
        <version>2.0.9</version>
    </dependency>

Ensuite, la fonction pour obtenir le texte pdf en tant que chaîne.

private static String readPDF(File pdf) throws InvalidPasswordException, IOException {
    try (PDDocument document = PDDocument.load(pdf)) {

        document.getClass();

        if (!document.isEncrypted()) {

            PDFTextStripperByArea stripper = new PDFTextStripperByArea();
            stripper.setSortByPosition(true);

            PDFTextStripper tStripper = new PDFTextStripper();

            String pdfFileInText = tStripper.getText(document);
            // System.out.println("Text:" + st);

            // split by whitespace
            String lines[] = pdfFileInText.split("\\r?\\n");
            List<String> pdfLines = new ArrayList<>();
            StringBuilder sb = new StringBuilder();
            for (String line : lines) {
                System.out.println(line);
                pdfLines.add(line);
                sb.append(line + "\n");
            }
            return sb.toString();
        }

    }
    return null;
}
1
Farkas Csanád

Cela fonctionne bien pour extraire les données d'un fichier PDF contenant du contenu texte à l'aide de 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;
   }
}
0
Sunil K Chaudhary