Génération de rapports PDF en Kotlin : revue des bibliothèques et exemples pratiques
Kotlin, en tant que langage moderne pour la JVM, est parfaitement adapté à la création d'applications serveur, y compris la génération de rapports PDF complexes. Contrairement à Python, où ReportLab ou FPDF sont populaires, l'écosystème Kotlin/Java utilise des bibliothèques éprouvées : iText, Apache PDFBox et OpenPDF. Dans cet article, nous analyserons chacune d'elles, montrerons des exemples de code en Kotlin et donnerons des recommandations pour le choix.
1. iText (versions 7 et 8)
iText est la norme de facto pour la génération de PDF sur la JVM. La bibliothèque fournit une API puissante pour créer des documents à partir de zéro, travailler avec des formulaires, des filigranes et des signatures numériques. Cependant, depuis la version 7, iText est passé sous licence AGPL (ou commerciale), ce qui est important à prendre en compte pour une utilisation commerciale.
Exemple de création d'un PDF simple avec un tableau en Kotlin :
import com.itextpdf.kernel.pdf.PdfDocumentimport com.itextpdf.kernel.pdf.PdfWriterimport com.itextpdf.layout.Documentimport com.itextpdf.layout.element.Paragraphimport com.itextpdf.layout.element.Tableimport com.itextpdf.layout.property.UnitValue
fun generateReportItext(outputPath: String) { val writer = PdfWriter(outputPath) val pdf = PdfDocument(writer) val document = Document(pdf)
// Titre document.add(Paragraph("Rapport de ventes").setFontSize(20))
// Tableau val table = Table(UnitValue.createPercentArray(3)).useAllAvailableWidth() table.addCell("Produit") table.addCell("Quantité") table.addCell("Prix") table.addCell("Ordinateur portable") table.addCell("10") table.addCell("75000") table.addCell("Moniteur") table.addCell("5") table.addCell("25000")
document.add(table) document.close() println("PDF créé : $outputPath")}2. Apache PDFBox
PDFBox est une bibliothèque gratuite (licence Apache 2.0) qui permet non seulement de créer des PDF, mais aussi d'extraire du texte, de remplir des formulaires, de rendre des pages en images. L'API est légèrement plus bas niveau que celle d'iText, mais offre un contrôle total sur le contenu.
Exemple avec une image et un formatage de texte :
import org.apache.pdfbox.pdmodel.PDDocumentimport org.apache.pdfbox.pdmodel.PDPageimport org.apache.pdfbox.pdmodel.PDPageContentStreamimport org.apache.pdfbox.pdmodel.font.PDType0Fontimport org.apache.pdfbox.pdmodel.graphics.image.PDImageXObjectimport java.io.File
fun generateReportPdfBox(outputPath: String) { val document = PDDocument() val page = PDPage() document.addPage(page)
val contentStream = PDPageContentStream(document, page) // Chargement de la police (TrueType) val font = PDType0Font.load(document, File("fonts/DejaVuSans.ttf")) contentStream.setFont(font, 14f)
// Texte contentStream.beginText() contentStream.newLineAtOffset(50f, 750f) contentStream.showText("Rapport de janvier 2025") contentStream.endText()
// Image (logo) val image = PDImageXObject.createFromFile("logo.png", document) contentStream.drawImage(image, 50f, 650f, 100f, 50f)
contentStream.close() document.save(outputPath) document.close() println("Rapport PDFBox prêt : $outputPath")}3. OpenPDF
OpenPDF est un fork de l'ancienne version d'iText (LGPL), qui reste entièrement libre. Idéal pour les rapports simples : texte, tableaux, primitives graphiques de base. L'API rappelle iText 2.x, mais ce n'est pas un problème dans le code Kotlin moderne.
Exemple de création d'un PDF avec des paragraphes et une liste :
import com.lowagie.text.Documentimport com.lowagie.text.Paragraphimport com.lowagie.text.pdf.PdfWriterimport java.io.FileOutputStream
fun generateReportOpenPdf(outputPath: String) { Aussi dans la bibliothèque
Travailler avec CSV en Swift (iOS/macOS) — bibliothèques et exemples de code
Bibliothèque standard C# (.NET) : aperçu complet
NaturalLanguage pour Swift : guide complet avec exemples