PDF-Berichte in Java mit iText und Apache PDFBox generieren

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

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();

Empfehlungen