Generierung von PDF-Berichten in Kotlin: Überblick über Bibliotheken und praktische Beispiele
Kotlin, als moderne Sprache für die JVM, eignet sich hervorragend für die Entwicklung von Serveranwendungen, einschließlich der Generierung komplexer PDF-Berichte. Im Gegensatz zu Python, wo ReportLab oder FPDF beliebt sind, werden im Kotlin/Java-Ökosystem bewährte Bibliotheken verwendet: iText, Apache PDFBox und OpenPDF. In diesem Artikel werden wir jede von ihnen analysieren, Codebeispiele in Kotlin zeigen und Empfehlungen zur Auswahl geben.
1. iText (Versionen 7 und 8)
iText ist der De-facto-Standard für die PDF-Generierung auf der JVM. Die Bibliothek bietet eine leistungsstarke API zum Erstellen von Dokumenten von Grund auf, zum Arbeiten mit Formularen, Wasserzeichen und digitalen Signaturen. Ab Version 7 ist iText jedoch unter der AGPL-Lizenz (oder kommerziell) lizenziert, was bei der kommerziellen Nutzung zu beachten ist.
Beispiel für die Erstellung eines einfachen PDFs mit einer Tabelle in 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)
// Überschrift document.add(Paragraph("Verkaufsbericht").setFontSize(20))
// Tabelle val table = Table(UnitValue.createPercentArray(3)).useAllAvailableWidth() table.addCell("Produkt") table.addCell("Menge") table.addCell("Preis") table.addCell("Laptop") table.addCell("10") table.addCell("75000") table.addCell("Monitor") table.addCell("5") table.addCell("25000")
document.add(table) document.close() println("PDF erstellt: $outputPath")}2. Apache PDFBox
PDFBox ist eine kostenlose Bibliothek (Apache 2.0-Lizenz), die nicht nur das Erstellen von PDFs, sondern auch das Extrahieren von Text, das Ausfüllen von Formularen und das Rendern von Seiten in Bilder ermöglicht. Die API ist etwas niedriger als bei iText, bietet aber die volle Kontrolle über den Inhalt.
Beispiel mit Bild und Textformatierung:
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) // Schriftart laden (TrueType) val font = PDType0Font.load(document, File("fonts/DejaVuSans.ttf")) contentStream.setFont(font, 14f)
// Text contentStream.beginText() contentStream.newLineAtOffset(50f, 750f) contentStream.showText("Bericht für Januar 2025") contentStream.endText()
// Bild (Logo) val image = PDImageXObject.createFromFile("logo.png", document) contentStream.drawImage(image, 50f, 650f, 100f, 50f)
contentStream.close() document.save(outputPath) document.close() println("PDFBox-Bericht fertig: $outputPath")}3. OpenPDF
OpenPDF ist ein Fork der alten iText-Version (LGPL), der vollständig frei bleibt. Ideal für einfache Berichte: Text, Tabellen, grundlegende grafische Primitive. Die API erinnert an iText 2.x, was im modernen Kotlin-Code jedoch kein Problem darstellt.
Beispiel für die Erstellung eines PDFs mit Absätzen und einer Liste:
import com.lowagie.text.Documentimport com.lowagie.text.Paragraphimport com.lowagie.text.pdf.PdfWriterimport java.io.FileOutputStream
fun generateReportOpenPdf(outputPath: String) { Auch in der Bibliothek
Bean Validation (Jakarta Validation) — Datenvalidierung in Java
E-Mail-Versand mit Go: Vollständiger Leitfaden zu Bibliotheken und Tools
Chalk für JavaScript (Node.js): Komplettguide mit Beispielen
CLI-Frameworks für Kotlin: Clikt, kotlinx-cli, picocli – Überblick und Vergleich