Conversions PDF en Java

Conversions PDF en Java

1. introduction

Dans cet article rapide, nous nous concentrerons sur la réalisation deconversion between PDF files and other formats in Java programmatiques.

Plus précisément, nous décrirons comment enregistrer des fichiers PDF en tant que fichiers image, tels que PNG ou JPEG, convertir des 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 Maven

La première bibliothèque que nous allons examiner estPdf2Dom. 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 etpdf2dom.

De plus, nous utiliseronsiText pour extraire le texte d’un fichier PDF etPOI pour créer le 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éehere et vous pouvez rechercher les POI Apachehere.

3. Conversions PDF et HTML

Pour travailler avec des fichiers HTML, nous utiliseronsPdf2Dom - un analyseur PDF qui convertit les documents en une représentation HTMLDOM. 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 pariText.

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. Avec le PDF chargé, nous utilisons l'analyseur pour analyser le fichier et écrire dans la sortie spécifiée parjava.io.Writer.

Notez queconverting PDF to HTML is never a 100%, pixel-to-pixel result. 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 au 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 queconverting HTML to PDF, you need to ensure that HTML has all tags properly started and closed, otherwise the PDF will be not created. 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. PDF to Image Conversions

Il existe de nombreuses façons de convertir des fichiers PDF en images. L'une des solutions les plus populaires est nomméeApache PDFBox. Cette bibliothèque est un outil Java open source permettant de travailler avec des documents PDF. Pour la conversion d'image en PDF, nous utiliserons à nouveauiText.

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 œ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 peu de parties importantes dans le code mentionné ci-dessus. Nous devons utiliserPDFRenderer, afin de rendre le PDF en tant queBufferedImage. De plus, chaque page du fichier PDF doit être rendue séparément.

Enfin, nous utilisonsImageIOUtil, d'Apache PDFBox Tools, pour écrire une image, avec l'extension que nous spécifions. Les formats de fichier possibles sontjpeg, jpg, gif, tiff oupng.

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

Please note, that we can provide an image as a file, or load it from URL, as it is shown in the example above. De plus, les extensions du fichier de sortie que nous pouvons utiliser sontjpeg, jpg, gif, tiff oupng.

5. PDF to Text Conversions

Pour extraire le texte brut d'un fichier PDF, nous utiliserons à nouveauApache PDFBox. Pour la conversion de texte en PDF, nous allons utiliseriText.

5.1. PDF en texte

Nous avons créé une méthode nomméegenerateTxtFromPDF(…) et l'avons divisée __ en trois parties principales: chargement du fichier PDF, extraction de 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 utilisonsPDFParser, avec une option «r» (lecture). De plus, nous devons utiliser la méthodeparser.parse() qui fera que le PDF sera analysé comme un flux et rempli dans l'objetCOSDocument.

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

Dans la première ligne, nous enregistreronsCOSDocument dans la variablecosDoc. Il sera ensuite utilisé pour construirePDocument, qui est la représentation en mémoire du document PDF. Enfin, nous utiliseronsPDFTextStripper pour renvoyer le texte brut d'un document. Après toutes ces opérations, nous devrons utiliser la méthodeclose() pour fermer tous les flux utilisés.

Dans la dernière partie, nous enregistrerons le texte dans le fichier nouvellement créé en utilisant les simples JavaPrintWriter:

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

Veuillez noter que vous ne pouvez pas conserver la mise en forme dans un fichier texte brut car il contient uniquement du texte.

5.2. Texte en PDF

La conversion de fichiers texte au format PDF est un peu délicate. In order to maintain the file formatting, you’ll need to apply additional rules.

Dans l'exemple suivant, nous ne prenons pas en compte la mise en forme du fichier.

Premièrement, nous devons définir la taille du fichier PDF, la version et le fichier de sortie. Jetons un œil à l'exemple de code:

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

Dans l'étape suivante, nous définirons la police ainsi que la commande utilisée pour générer un nouveau paragraphe:

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

Enfin, nous allons ajouter des paragraphes dans le fichier PDF nouvellement créé:

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

Créer un fichier PDF à partir d'un document Word n'est pas facile et nous n'aborderons pas ce sujet ici. Nous recommandons aux bibliothèques tierces de le faire, commejWordConvert.

Pour créer un fichier Microsoft Word à partir d'un PDF, nous avons besoin de deux bibliothèques. Les deux bibliothèques sont open source. Le premier estiText et il est utilisé pour extraire le texte d'un fichier PDF. Le second estPOI et est utilisé pour créer le document.docx.

Jetons un coup d'œil à l'extrait de code de la partie chargement du PDF:

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

Après le chargement du fichier PDF, nous devons lire et afficher chaque page séparément dans la boucle, puis écrire dans le fichier de sortie:

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

Veuillez noter qu'avec la stratégie d'extractionSimpleTextExtractionStrategy(), nous perdrons toutes les règles de mise en forme. Pour y remédier, jouez avec les stratégies d'extraction décriteshere, pour parvenir à une solution plus complexe.

7. PDF to X Commercial Libraries

Dans les sections précédentes, nous avons décrit les bibliothèques open source. Il y a peu de bibliothèques qui méritent d'être notées, mais elles sont payées:

  • 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 deconvert PDF file into various formats.

L'implémentation complète de ce tutoriel peut être trouvée dansthe GitHub project - il s'agit d'un projet basé sur Maven. Pour tester, exécutez simplement les exemples et voyez les résultats dans le dossieroutput.