Conversions PDF en Java

1. Introduction

Dans cet article rapide, nous nous concentrerons sur la conversion par programme entre des fichiers PDF et d'autres formats en Java .

Plus précisément, nous décrirons comment enregistrer des fichiers PDF en tant que fichiers image, tels que PNG ou JPEG, convertir des fichiers PDF en documents Microsoft Word, exporter au format HTML et extraire les textes, à l'aide de plusieurs bibliothèques open source Java.

2. Dépendances de Maven

La première bibliothèque que nous examinerons est Pdf2Dom . Commençons par les dépendances Maven que nous devons ajouter à notre projet:

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

Nous allons utiliser la première dépendance pour charger le fichier PDF sélectionné. La deuxième dépendance est responsable de la conversion elle-même. Les dernières versions peuvent être trouvées ici: pdfbox-tools et pdf2dom.

De plus, nous utiliserons iText pour extraire le texte d'un fichier PDF et un POI pour créer le fichier . document docx .

Jetons un coup d'œil aux dépendances Maven que nous devons inclure dans notre projet:

 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 

La dernière version d'iText peut être trouvée ici et vous pouvez rechercher Apache POI ici.

3. Conversions PDF et HTML

Pour travailler avec des fichiers HTML, nous utiliserons Pdf2Dom - un analyseur PDF qui convertit les documents en une représentation HTML DOM. L'arbre DOM obtenu peut ensuite être sérialisé dans un fichier HTML ou traité ultérieurement.

Pour convertir un PDF en HTML, nous devons utiliser XMLWorker, la bibliothèque fournie par iText .

3.1. PDF en HTML

Jetons un coup d'œil à une simple conversion de PDF en HTML:

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

Dans l'extrait de code ci-dessus, nous chargeons le fichier PDF à l'aide de l'API de chargement de PDFBox. Une fois le PDF chargé, nous utilisons l'analyseur pour analyser le fichier et écrire dans la sortie spécifiée par java.io.Writer.

Notez que la conversion de PDF en HTML n'est jamais un résultat à 100% pixel à pixel. Les résultats dépendent de la complexité et de la structure du fichier PDF particulier.

3.2. HTML en PDF

Voyons maintenant la conversion du HTML en PDF:

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

Notez que lors de la conversion de HTML en PDF, vous devez vous assurer que toutes les balises HTML sont correctement démarrées et fermées, sinon le PDF ne sera pas créé. L'aspect positif de cette approche est que le PDF sera créé exactement de la même manière qu'il l'était dans un fichier HTML.

4. Conversions PDF en image

Il existe de nombreuses façons de convertir des fichiers PDF en image. L'une des solutions les plus populaires s'appelle Apache PDFBox . Cette bibliothèque est un outil Java open source pour travailler avec des documents PDF. Pour la conversion d'image en PDF, nous utiliserons à nouveau iText .

4.1. PDF en image

Pour commencer à convertir des PDF en images, nous devons utiliser la dépendance mentionnée dans la section précédente - pdfbox-tools .

Jetons un coup d'œil à l'exemple de code:

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

Il y a quelques parties importantes dans le code susmentionné. Nous devons utiliser PDFRenderer , afin de rendre le PDF en tant que BufferedImage . En outre, chaque page du fichier PDF doit être rendue séparément.

Enfin, nous utilisons ImageIOUtil , d'Apache PDFBox Tools, pour écrire une image, avec l'extension que nous spécifions. Les formats de fichier possibles sont jpeg, jpg, gif, tiff ou png.

Notez qu'Apache PDFBox est un outil avancé - nous pouvons créer nos propres fichiers PDF à partir de zéro, remplir des formulaires dans un fichier PDF, signer et / ou crypter le fichier PDF.

4.2. Image en PDF

Jetons un coup d'œil à l'exemple de code:

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

Veuillez noter que nous pouvons fournir une image sous forme de fichier, ou la charger à partir de l'URL, comme indiqué dans l'exemple ci-dessus. De plus, les extensions du fichier de sortie que nous pouvons utiliser sont jpeg, jpg, gif, tiff ou png.

5. Conversions PDF en texte

Pour extraire le texte brut d'un fichier PDF, nous utiliserons également à nouveau Apache PDFBox . Pour la conversion de texte en PDF, nous allons utiliser iText .

5.1. PDF en texte

Nous avons créé une méthode nommée generateTxtFromPDF (…) et l' avons diviséeen trois parties principales: chargement du fichier PDF, extraction du texte et création finale du fichier.

Commençons par charger la partie:

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

Pour lire un fichier PDF, nous utilisons PDFParser , avec une option «r» (lecture). De plus, nous devons utiliser la méthode parser.parse () qui fera que le PDF sera analysé en tant que flux et rempli dans l' objet COSDocument .

Jetons un coup d'œil à la partie de texte d'extraction:

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

Dans les sections précédentes, nous avons décrit les bibliothèques open source. Il existe peu de bibliothèques supplémentaires qui méritent d'être signalées, mais elles sont payantes:

  • jPDFImages - jPDFImages peut créer des images à partir de pages d'un document PDF et les exporter sous forme d'images JPEG, TIFF ou PNG.
  • JPEDAL - JPedal est un SDK natif de bibliothèque PDF Java activement développé et très performant utilisé pour l'impression, la visualisation et la conversion de fichiers
  • pdfcrowd - c'est une autre bibliothèque de conversion Web / HTML vers PDF et PDF vers Web / HTML, avec une interface graphique avancée

8. Conclusion

Dans cet article, nous avons discuté des moyens de convertir un fichier PDF en différents formats .

L'implémentation complète de ce didacticiel se trouve dans le projet GitHub - il s'agit d'un projet basé sur Maven. Pour tester, exécutez simplement les exemples et voyez les résultats dans le dossier de sortie .