PDF-Konvertierungen in Java

PDF-Konvertierungen in Java

1. Einführung

In diesem kurzen Artikel konzentrieren wir uns auf programmatischeconversion between PDF files and other formats 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, istPdf2Dom. 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 undpdf2dom.

Darüber hinaus verwenden wiriText, um den Text aus einer PDF-Datei zu extrahieren, undPOI, um das Dokument.docxzu erstellen.

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 unterhere, und Sie können nach Apache POIhere suchen.

3. PDF- und HTML-Konvertierungen

Für die Arbeit mit HTML-Dateien verwenden wirPdf2Dom - einen PDF-Parser, der die Dokumente in eine HTMLDOM-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 voniText bereitgestellt wird.

3.1. PDF zu HTML

Schauen wir uns eine einfache Konvertierung von PDF in 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 durchjava.io.Writer. angegebene Ausgabe zu schreiben

Beachten Sie, dassconverting PDF to HTML is never a 100%, pixel-to-pixel result. 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, dassconverting HTML to PDF, you need to ensure that HTML has all tags properly started and closed, otherwise the PDF will be not created. Der positive Aspekt dieses Ansatzes ist, dass PDF genau so erstellt wird, wie es in einer HTML-Datei war.

4. PDF to Image Conversions

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

4.1. PDF zu Bild

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

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üssenPDFRenderer verwenden, um PDF alsBufferedImage zu rendern. Außerdem muss jede Seite der PDF-Datei separat gerendert werden.

Schließlich verwenden wirImageIOUtil aus den Apache PDFBox Tools, um ein Bild mit der von uns angegebenen Erweiterung zu schreiben. Mögliche Dateiformate sindjpeg, jpg, gif, tiff oderpng.

Note that Apache PDFBox is an advanced tool - 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();
}

Please note, that we can provide an image as a file, or load it from URL, as it is shown in the example above. Darüber hinaus sind die Erweiterungen der Ausgabedatei, die wir verwenden können,jpeg, jpg, gif, tiff oderpng.

5. PDF to Text Conversions

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

5.1. PDF zu Text

Wir haben eine Methode namensgenerateTxtFromPDF(…) erstellt und __ in drei Hauptteile unterteilt: 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();

Um eine PDF-Datei zu lesen, verwenden wirPDFParser mit der Option „r“ (Lesen). Darüber hinaus müssen wir die Methodeparser.parse()verwenden, mit der die PDF-Datei als Stream analysiert und in das ObjektCOSDocumenteingefü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 der ersten Zeile speichern wirCOSDocument in der VariablencosDoc. Es wird dann verwendet, umPDocument zu konstruieren, die die speicherinterne Darstellung des PDF-Dokuments ist. Schließlich verwenden wirPDFTextStripper, um den Rohtext eines Dokuments zurückzugeben. Nach all diesen Vorgängen müssen wir die Methodeclose()verwenden, um alle verwendeten Streams.zu schließen

Im letzten Teil speichern wir Text in der neu erstellten Datei mit den einfachen JavaPrintWriter:

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

Bitte beachten Sie, dass Sie die Formatierung in einer Nur-Text-Datei nicht beibehalten können, da sie nur Text enthält.

5.2. Text in PDF

Das Konvertieren von Textdateien in PDF ist etwas schwierig. In order to maintain the file formatting, you’ll need to apply additional rules.

Im folgenden Beispiel wird die Formatierung der Datei nicht berücksichtigt.

Zuerst müssen wir die Größe der PDF-Datei, die Version und die Ausgabedatei definieren. Schauen wir uns das Codebeispiel an:

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

Im nächsten Schritt definieren wir die Schriftart und den Befehl, mit dem ein neuer Absatz generiert wird:

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

Zuletzt werden Absätze in neu erstellte PDF-Dateien eingefügt:

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

Das Erstellen einer PDF-Datei aus einem Word-Dokument ist nicht einfach und wir werden dieses Thema hier nicht behandeln. Wir empfehlen Bibliotheken von Drittanbietern, wiejWordConvert.

Zum Erstellen einer Microsoft Word-Datei aus einer PDF-Datei benötigen wir zwei Bibliotheken. Beide Bibliotheken sind Open Source. Der erste istiText und wird verwendet, um den Text aus einer PDF-Datei zu extrahieren. Der zweite istPOI und wird zum Erstellen des Dokuments.POIverwendet.

Schauen wir uns das Code-Snippet für den PDF-Ladeteil an:

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

Nach dem Laden der PDF müssen wir jede Seite einzeln in der Schleife lesen und rendern und dann in die Ausgabedatei schreiben:

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

Bitte beachten Sie, dass mit der Extraktionsstrategie vonSimpleTextExtractionStrategy()alle Formatierungsregeln verloren gehen. Um dies zu beheben, spielen Sie mit den beschriebenen Extraktionsstrategienhere, um eine komplexere Lösung zu erhalten.

7. PDF to X Commercial Libraries

In den vorherigen Abschnitten haben wir Open Source-Bibliotheken beschrieben. Es gibt einige weitere Bibliotheken, die es zu beachten gilt, 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 handelt sich um eine weitere Konvertierungsbibliothek für Web / HTML zu PDF und PDF zu Web / HTML mit erweiterter Benutzeroberfläche

8. Conclusion

In diesem Artikel haben wir die Methoden zuconvert PDF file into various formats besprochen.

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