Génération de rapports PDF en Java avec iText et Apache PDFBox

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Génération de rapports PDF en Java : aperçu des bibliothèques iText et Apache PDFBox

La création de documents PDF est l'une des tâches fréquentes dans les applications Java d'entreprise. Rapports, factures, bons de livraison, certificats — tout cela peut être facilement généré par programmation. Dans l'écosystème Java, il existe deux bibliothèques principales pour travailler avec les PDF : iText (standard industriel, mais avec une licence commerciale pour les nouvelles versions) et Apache PDFBox (entièrement gratuite et open source). Dans cet article, nous analyserons les deux, montrerons des exemples de code et vous aiderons à choisir l'outil adapté à votre projet.



1. Apache PDFBox — une alternative gratuite aux fonctionnalités étendues

Apache PDFBox est une bibliothèque open source (licence Apache 2.0). Elle permet de créer des PDF à partir de zéro, de modifier des PDF existants, d'extraire du texte et des métadonnées. PDFBox ne nécessite pas de licence commerciale, ce qui en fait un choix idéal pour les startups et les projets open source.

Fonctionnalités principales :

  • Création de documents avec du texte, des images, des tableaux.
  • Gestion des polices (y compris le cyrillique).
  • Ajout de signets, de liens hypertextes, de filigranes.
  • Chiffrement et protection par mot de passe.
  • Extraction de texte et d'images à partir de PDF existants.


Exemple : création d'un rapport PDF simple avec un tableau

import org.apache.pdfbox.pdmodel.PDDocument;import org.apache.pdfbox.pdmodel.PDPage;import org.apache.pdfbox.pdmodel.PDPageContentStream;import org.apache.pdfbox.pdmodel.font.PDType0Font;import org.apache.pdfbox.pdmodel.common.PDRectangle;import java.io.File;import java.io.IOException;

public class PdfBoxReport { public static void main(String[] args) throws IOException { try (PDDocument document = new PDDocument()) { PDPage page = new PDPage(PDRectangle.A4); document.addPage(page);

// Chargement de la police avec support du cyrillique PDType0Font font = PDType0Font.load(document, new File("fonts/arial.ttf"));

try (PDPageContentStream cs = new PDPageContentStream(document, page)) { // Titre cs.beginText(); cs.setFont(font, 18); cs.newLineAtOffset(50, 750); cs.showText("Rapport des ventes pour le T1 2025"); cs.endText();

// Tableau (implémentation simple via lignes et texte) cs.setFont(font, 12); // Dessiner les en-têtes de colonnes float margin = 50; float yStart = 700; float tableWidth = 500; float rowHeight = 25; String[] headers = {"Produit", "Quantité", "Prix, €"}; String[][] data = {{"Ordinateur portable", "10", "85000"}, {"Souris", "50", "1500"}, {"Clavier", "30", "3500"}};

// En-tête du tableau cs.setLineWidth(1f); for (int i = 0; i < headers.length; i++) { cs.addRect(margin + i * (tableWidth / 3), yStart - rowHeight, tableWidth / 3, rowHeight); cs.stroke(); cs.beginText(); cs.newLineAtOffset(margin + i * (tableWidth / 3) + 5, yStart - rowHeight + 5); cs.showText(headers[i]); cs.endText(); }

// Données float yPos = yStart - rowHeight; for (String[] row : data) { yPos -= rowHeight; for (int i = 0; i < row.length; i++) { cs.addRect(margin + i * (tableWidth / 3), yPos, tableWidth / 3, rowHeight); cs.stroke(); cs.beginText(); cs.newLineAtOffset(margin + i * (tableWidth / 3) + 5, yPos + 5); cs.showText(row[i]); cs.endText();

Recommendations