PDF-Berichte in Java generieren: Überblick über die Bibliotheken iText und Apache PDFBox
Die Erstellung von PDF-Dokumenten ist eine häufige Aufgabe in unternehmenskritischen Java-Anwendungen. Berichte, Rechnungen, Lieferscheine, Zertifikate – all das lässt sich bequem programmatisch erstellen. Im Java-Ökosystem gibt es zwei Hauptbibliotheken für die Arbeit mit PDF: iText (Industriestandard, aber mit kommerzieller Lizenz für neuere Versionen) und Apache PDFBox (vollständig kostenlos, Open Source). In diesem Artikel werden wir beide untersuchen, Codebeispiele zeigen und Ihnen helfen, das passende Werkzeug für Ihr Projekt auszuwählen.
1. Apache PDFBox – Kostenlose Alternative mit umfangreichen Funktionen
Apache PDFBox ist eine Open-Source-Bibliothek (Apache 2.0-Lizenz). Sie ermöglicht das Erstellen von PDFs von Grund auf, das Bearbeiten vorhandener PDFs sowie das Extrahieren von Text und Metadaten. PDFBox erfordert keine kommerzielle Lizenz, was sie zur idealen Wahl für Startups und Open-Source-Projekte macht.
Hauptfunktionen:
- Erstellung von Dokumenten mit Text, Bildern und Tabellen.
- Arbeit mit Schriftarten (einschließlich Kyrillisch).
- Hinzufügen von Lesezeichen, Hyperlinks und Wasserzeichen.
- Verschlüsselung und Passwortschutz.
- Extrahieren von Text und Bildern aus vorhandenen PDFs.
Beispiel: Erstellen eines einfachen PDF-Berichts mit einer Tabelle
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);
// Schriftart mit Kyrillisch-Unterstützung laden PDType0Font font = PDType0Font.load(document, new File("fonts/arial.ttf"));
try (PDPageContentStream cs = new PDPageContentStream(document, page)) { // Überschrift cs.beginText(); cs.setFont(font, 18); cs.newLineAtOffset(50, 750); cs.showText("Verkaufsbericht Q1 2025"); cs.endText();
// Tabelle (einfache Implementierung über Linien und Text) cs.setFont(font, 12); // Spaltenüberschriften zeichnen float margin = 50; float yStart = 700; float tableWidth = 500; float rowHeight = 25; String[] headers = {"Produkt", "Menge", "Preis, EUR"}; String[][] data = {{"Laptop", "10", "85000"}, {"Maus", "50", "1500"}, {"Tastatur", "30", "3500"}};
// Tabellenkopf 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(); }
// Daten 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(); Auch in der Bibliothek
MailKit für C# (.NET): Komplettguide mit Praxisbeispielen
EasyNetQ für C# (.NET): Vollständiges Tutorial mit Beispielen
regex in Rust: Komplettleitfaden mit Beispielen
Kotlinx.serialization und Valiktor: Datenvalidierung in Kotlin
Maschinelles Lernen mit Rust: Überblick über Bibliotheken für ML und Data Science