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
Socket.io für JavaScript (Node.js): Vollständiger Leitfaden mit Beispielen
Geolokalisierung und Karten in Kotlin: Bibliotheken, Werkzeuge und Beispiele
Überwachung von C# (.NET)-Anwendungen mit AppMetrics
DashMap für Rust: Vollständige Anleitung mit Beispielen
Caching in TypeScript: Redis und andere Lösungen für Node.js