example ejemplo java pdfbox

java - ejemplo - Cómo extraer texto de un archivo PDF con Apache PDFBox



pdfbox jar java (5)

Me gustaría extraer texto de un archivo PDF dado con Apache PDFBox.

Escribí este código:

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

Sin embargo, tengo el siguiente error:

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

Agregué pdfbox-1.8.5.jar y fontbox-1.8.5.jar a la ruta de clase.

Editar

System.out.println("program starts"); Al inicio del programa.

Lo ejecuté, luego obtuve el mismo error que se mencionó anteriormente y el program starts no apareció en la consola.

Por lo tanto, creo que tengo un problema con la ruta de clase o algo así.

Gracias.


Ejecuté tu código y funcionó correctamente. Tal vez su problema esté relacionado con FilePath que ha asignado al archivo. Puse mi pdf en la unidad C y codifiqué la ruta del archivo. Aquí está mi código:

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


Esto funciona bien para extraer datos de un archivo PDF que tiene contenido de texto usando 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; } }


Maven dep:

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

Luego la función para obtener el texto pdf como String.

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


Usando PDFBox 2.0.7, así es como obtengo el texto de un PDF:

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

Llámalo así:

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

Dado que el usuario oivemaria preguntó en los comentarios:

Puede usar PDFBox en su aplicación agregándolo a sus dependencias en build.gradle :

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

Aquí hay más información sobre la gestión de dependencias utilizando Gradle.

Si desea mantener el formato PDF en el texto analizado, PDFLayoutTextStripper .


PDFBox 2.0.3 también tiene una herramienta de línea de comandos.

  1. Descargar el archivo 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