PDF-Konvertierungen in Java

1. Einleitung

In diesem kurzen Artikel konzentrieren wir uns auf die programmgesteuerte Konvertierung zwischen PDF-Dateien und anderen Formaten in Java .

Im Einzelnen wird beschrieben, wie Sie PDFs als Bilddateien wie PNG oder JPEG speichern, PDFs in Microsoft Word-Dokumente konvertieren, als HTML exportieren und die Texte mithilfe mehrerer Java-Open-Source-Bibliotheken extrahieren.

2. Maven-Abhängigkeiten

Die erste Bibliothek, die wir uns ansehen werden, ist Pdf2Dom . Beginnen wir mit den Maven-Abhängigkeiten, die wir unserem Projekt hinzufügen müssen:

 org.apache.pdfbox pdfbox-tools 2.0.3   net.sf.cssbox pdf2dom 1.6 

Wir werden die erste Abhängigkeit verwenden, um die ausgewählte PDF-Datei zu laden. Die zweite Abhängigkeit ist für die Konvertierung selbst verantwortlich. Die neuesten Versionen finden Sie hier: pdfbox-tools und pdf2dom.

Darüber hinaus verwenden wir iText , um den Text aus einer PDF-Datei zu extrahieren, und POI , um den zu erstellen. docx- Dokument.

Werfen wir einen Blick auf die Maven-Abhängigkeiten, die wir in unser Projekt aufnehmen müssen:

 com.itextpdf itextpdf 5.5.10   com.itextpdf.tool xmlworker 5.5.10   org.apache.poi poi-ooxml 3.15   org.apache.poi poi-scratchpad 3.15 

Die neueste Version von iText finden Sie hier und Sie können hier nach Apache POI suchen.

3. PDF- und HTML-Konvertierungen

Um mit HTML-Dateien zu arbeiten, verwenden wir Pdf2Dom - einen PDF-Parser, der die Dokumente in eine HTML-DOM-Darstellung konvertiert. Der erhaltene DOM-Baum kann dann in eine HTML-Datei serialisiert oder weiterverarbeitet werden.

Um PDF in HTML zu konvertieren, müssen wir XMLWorker verwenden, eine Bibliothek, die von iText bereitgestellt wird .

3.1. PDF zu HTML

Schauen wir uns eine einfache Konvertierung von PDF nach HTML an:

private void generateHTMLFromPDF(String filename) { PDDocument pdf = PDDocument.load(new File(filename)); Writer output = new PrintWriter("src/output/pdf.html", "utf-8"); new PDFDomTree().writeText(pdf, output); output.close(); } 

Im obigen Code-Snippet laden wir die PDF-Datei mithilfe der Lade-API von PDFBox. Wenn das PDF geladen ist, verwenden wir den Parser, um die Datei zu analysieren und in die von java.io.Writer angegebene Ausgabe zu schreiben.

Beachten Sie, dass das Konvertieren von PDF in HTML niemals ein 100% iges Pixel-zu-Pixel-Ergebnis ist. Die Ergebnisse hängen von der Komplexität und der Struktur der jeweiligen PDF-Datei ab.

3.2. HTML zu PDF

Schauen wir uns nun die Konvertierung von HTML in PDF an:

private static void generatePDFFromHTML(String filename) { Document document = new Document(); PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("src/output/html.pdf")); document.open(); XMLWorkerHelper.getInstance().parseXHtml(writer, document, new FileInputStream(filename)); document.close(); }

Beachten Sie, dass Sie beim Konvertieren von HTML in PDF sicherstellen müssen, dass in HTML alle Tags ordnungsgemäß gestartet und geschlossen wurden. Andernfalls wird das PDF nicht erstellt. Der positive Aspekt dieses Ansatzes ist, dass PDF genauso erstellt wird wie in einer HTML-Datei.

4. Konvertierungen von PDF in Bild

Es gibt viele Möglichkeiten, PDF-Dateien in ein Bild zu konvertieren. Eine der beliebtesten Lösungen heißt Apache PDFBox . Diese Bibliothek ist ein Open-Source-Java-Tool für die Arbeit mit PDF-Dokumenten. Für die Konvertierung von Bildern in PDF verwenden wir iText erneut.

4.1. PDF zu Bild

Um PDFs in Bilder zu konvertieren, müssen wir die im vorherigen Abschnitt erwähnte Abhängigkeit verwenden - pdfbox-tools .

Schauen wir uns das Codebeispiel an:

private void generateImageFromPDF(String filename, String extension) { PDDocument document = PDDocument.load(new File(filename)); PDFRenderer pdfRenderer = new PDFRenderer(document); for (int page = 0; page < document.getNumberOfPages(); ++page) { BufferedImage bim = pdfRenderer.renderImageWithDPI( page, 300, ImageType.RGB); ImageIOUtil.writeImage( bim, String.format("src/output/pdf-%d.%s", page + 1, extension), 300); } document.close(); }

Der oben genannte Code enthält nur wenige wichtige Teile. Wir müssen verwenden PDFRenderer , um PDF als zu machen BufferedImage . Außerdem muss jede Seite der PDF-Datei separat gerendert werden.

Schließlich verwenden wir ImageIOUtil von Apache PDFBox Tools, um ein Bild mit der von uns angegebenen Erweiterung zu schreiben. Mögliche Dateiformate sind JPEG, JPG, GIF, TIFF oder PNG.

Beachten Sie, dass Apache PDFBox ein erweitertes Tool ist. Wir können unsere eigenen PDF-Dateien von Grund auf neu erstellen, Formulare in PDF-Dateien ausfüllen, die PDF-Datei signieren und / oder verschlüsseln.

4.2. Bild zu PDF

Schauen wir uns das Codebeispiel an:

private static void generatePDFFromImage(String filename, String extension) { Document document = new Document(); String input = filename + "." + extension; String output = "src/output/" + extension + ".pdf"; FileOutputStream fos = new FileOutputStream(output); PdfWriter writer = PdfWriter.getInstance(document, fos); writer.open(); document.open(); document.add(Image.getInstance((new URL(input)))); document.close(); writer.close(); }

Bitte beachten Sie, dass wir ein Bild als Datei bereitstellen oder von der URL laden können, wie im obigen Beispiel gezeigt. Darüber hinaus sind die Erweiterungen der Ausgabedatei, die wir verwenden können, jpeg, jpg, gif, tiff oder png.

5. Konvertierungen von PDF in Text

Um den Rohtext aus einer PDF-Datei zu extrahieren, verwenden wir auch wieder Apache PDFBox . Für die Konvertierung von Text in PDF verwenden wir iText .

5.1. PDF zu Text

Wir haben eine Methode namens generateTxtFromPDF (…) erstellt und geteiltin drei Hauptteile: Laden der PDF-Datei, Extrahieren von Text und endgültige Dateierstellung.

Beginnen wir mit dem Laden des Teils:

File f = new File(filename); String parsedText; PDFParser parser = new PDFParser(new RandomAccessFile(f, "r")); parser.parse();

Zum Lesen einer PDF-Datei verwenden wir PDFParser mit der Option „r“ (Lesen). Darüber hinaus müssen wir die Methode parser.parse () verwenden, mit der die PDF-Datei als Stream analysiert und in das COSDocument- Objekt eingefügt wird.

Werfen wir einen Blick auf den Textteil zum Extrahieren:

COSDocument cosDoc = parser.getDocument(); PDFTextStripper pdfStripper = new PDFTextStripper(); PDDocument pdDoc = new PDDocument(cosDoc); parsedText = pdfStripper.getText(pdDoc);

In the first line, we'll save COSDocument inside the cosDoc variable. It will be then used to construct PDocument, which is the in-memory representation of the PDF document. Finally, we will use PDFTextStripper to return the raw text of a document. After all of those operations, we'll need to use close() method to close all the used streams.

In the last part, we'll save text into the newly created file using the simple Java PrintWriter:

PrintWriter pw = new PrintWriter("src/output/pdf.txt"); pw.print(parsedText); pw.close();

Please note that you cannot preserve formatting in a plain text file because it contains text only.

5.2. Text to PDF

Converting text files to PDF is bit tricky. In order to maintain the file formatting, you'll need to apply additional rules.

In the following example, we are not taking into consideration the formatting of the file.

First, we need to define the size of the PDF file, version and output file. Let's have a look at the code example:

Document pdfDoc = new Document(PageSize.A4); PdfWriter.getInstance(pdfDoc, new FileOutputStream("src/output/txt.pdf")) .setPdfVersion(PdfWriter.PDF_VERSION_1_7); pdfDoc.open();

In the next step, we'll define the font and also the command that is used to generate new paragraph:

Font myfont = new Font(); myfont.setStyle(Font.NORMAL); myfont.setSize(11); pdfDoc.add(new Paragraph("\n"));

Finally, we are going to add paragraphs into newly created PDF file:

BufferedReader br = new BufferedReader(new FileReader(filename)); String strLine; while ((strLine = br.readLine()) != null) { Paragraph para = new Paragraph(strLine + "\n", myfont); para.setAlignment(Element.ALIGN_JUSTIFIED); pdfDoc.add(para); } pdfDoc.close(); br.close();

6. PDF to Docx Conversions

Creating PDF file from Word document is not easy, and we'll not cover this topic here. We recommend 3rd party libraries to do it, like jWordConvert.

To create Microsoft Word file from a PDF, we'll need two libraries. Both libraries are open source. The first one is iText and it is used to extract the text from a PDF file. The second one is POI and is used to create the .docx document.

Let's take a look at the code snippet for the PDF loading part:

XWPFDocument doc = new XWPFDocument(); String pdf = filename; PdfReader reader = new PdfReader(pdf); PdfReaderContentParser parser = new PdfReaderContentParser(reader); 

After loading of the PDF, we need to read and render each page separately in the loop, and then write to the output file:

for (int i = 1; i <= reader.getNumberOfPages(); i++) { TextExtractionStrategy strategy = parser.processContent(i, new SimpleTextExtractionStrategy()); String text = strategy.getResultantText(); XWPFParagraph p = doc.createParagraph(); XWPFRun run = p.createRun(); run.setText(text); run.addBreak(BreakType.PAGE); } FileOutputStream out = new FileOutputStream("src/output/pdf.docx"); doc.write(out); // Close all open files

Please note, that with the SimpleTextExtractionStrategy() extraction strategy, we'll lose all formatting rules. In order to fix it, play with extraction strategies described here, to achieve a more complex solution.

7. PDF to X Commercial Libraries

In den vorherigen Abschnitten haben wir Open Source-Bibliotheken beschrieben. Es gibt nur noch wenige bemerkenswerte Bibliotheken, die jedoch bezahlt werden:

  • jPDFImages - jPDFImages können Bilder aus Seiten eines PDF-Dokuments erstellen und als JPEG-, TIFF- oder PNG-Bilder exportieren.
  • JPEDAL - JPedal ist ein aktiv entwickeltes und sehr leistungsfähiges natives Java PDF Library SDK, das zum Drucken, Anzeigen und Konvertieren von Dateien verwendet wird
  • pdfcrowd - es ist eine weitere Web / HTML zu PDF und PDF zu Web / HTML Konvertierungsbibliothek mit erweiterter GUI

8. Fazit

In diesem Artikel haben wir die Möglichkeiten zum Konvertieren von PDF-Dateien in verschiedene Formate erläutert .

Die vollständige Implementierung dieses Tutorials finden Sie im GitHub-Projekt - dies ist ein Maven-basiertes Projekt. Führen Sie zum Testen einfach die Beispiele aus und sehen Sie die Ergebnisse im Ausgabeordner .