iText – PDF generieren in Java

PDF generieren in Java mit iText

iText ist eine Bibliothek, die unter Anderem das Erstellen und Überprüfen von Dokumenten im Portable Document Format, kurz PDF, in Java bzw. Android ermöglicht. So können zum Beispiel Dokumente und Berichte auf Grundlage von Daten aus einer XML-Datei oder einer Datenbank erstellt oder Lese- und Wasserzeichen in bestehende PDF-Dokumente hinzugefügt werden.

Wie einfach es sein kann, ein PDF in Java zu erstellen, wird im folgenden Artikel erläutert.

iText

Zunächst bindet man die iText Bibliothek in sein Projekt ein. Entweder über einen direkten Download von hier oder hier oder mittels Maven, wie im Folgenden zu sehen ist:

<dependency>
     <groupId>com.itextpdf</groupId>
     <artifactId>itextpdf</artifactId>
     <version>5.5.6</version>
</dependency>

Das Dokument

Zunächst wird ein FileOutputStream geöffnet und der Name der zu speichernden Datei bekanntgegeben. Danach wird eine Instanz der Document Klasse erstellt welche im Weiteren den Inhalt des zu erstellenden PDF´s beinhaltet. Der FileOutputStream und das Document werden an die Instanz von PdfWriter übergeben, welche die einzelnen Elemente der Document-Klasse in den OutputStream schreibt:

//...
Document document = new Document(PageSize.A4);
PdfWriter.getInstance(document, new FileOutputStream(file));
document.open();
//...
document.close();

Die zuvor erwähnten Elemente, welche das eigentliche Dokument ausmachen werden wie folgt hinzugefügt.

Beispiel Titel:

Der eigentliche String, welcher die Überschrift im Dokument darstellen soll, wird an ein Chunk-Objekt übergeben, da dieses folglich auch die Informationen über Schriftart, Farbe und Größe hält.

String title = "Ein PDF-Dokument mit iText und Java";
Font titleFont = new Font(Font.FontFamily.COURIER, 22, Font.BOLD, BaseColor.WHITE);
Chunk titleObj = new Chunk(title, titleFont);
titleObj.setBackground(new BaseColor(33, 33, 233), 1f, 1f, 1f, 3f);

Beispiel Liste:

Um ein Element einer Liste hinzuzufügen wird lediglich add() Methode aufgerufen.

List list = new List(true, 30);
list.add(new ListItem("Erstens"));
list.add(new ListItem("Zweitens"));
list.add(new ListItem("Drittens"));

Beispiel Tabelle:

Um eine Tabelle hinzuzufügen, wird eine Instanz der Klasse PdfPTable mit der Größe der gewünschten Spalten erstellt. Das folgende Beispiel erstellt ein Tabelle mit zwei Spalten und zwei Reihen, welche die komplette Breite der Seite einnehmen soll.

PdfPTable table = new PdfPTable(2);
table.setWidthPercentage(100);
table.setSpacingAfter(10f);
table.setSpacingBefore(15f);
table.setWidths(new float[] { 2f, 2f });

Font fontHeader = new Font(Font.FontFamily.COURIER, 15, Font.BOLD, BaseColor.DARK_GRAY);
PdfPCell headerCell = new PdfPCell(new Phrase("Überschrift 1", fontHeader));
headerCell.setBackgroundColor(BaseColor.LIGHT_GRAY);
headerCell.setPaddingBottom(5f);
table.addCell(headerCell);
headerCell = new PdfPCell(new Phrase("Überschrift 2", fontHeader));
headerCell.setBackgroundColor(BaseColor.LIGHT_GRAY);
headerCell.setPaddingBottom(5f);

table.addCell(headerCell);
table.addCell("Data 1");
table.addCell("Data 2");
table.addCell("Data 3");
table.addCell("Data 4");

Beispiel Bild:

Um ein Bild hinzuzufügen, wird der lediglich der Pfad der Bilddatei an die Instanz des Image-Objektes übergeben. Um die Breite und Höhe des Bildes zu bestimmen, werden die Werte als float an die Funktion scaleAbsolute() übergeben.

String imagePath = "logo.JPG";
Image img = Image.getInstance(imagePath);
img.scaleAbsolute(137f, 64f);

Letzten Endes werden die zuvor gezeigten Elemente an das Document-Objekt übergeben. Dazu wird das Document-Objekt mit open() geöffnet und die Elemente mit der Funktion add() hinzugefügt:

document.open();
document.add(img);
document.add(new Paragraph(""));
document.add(Chunk.NEWLINE);
document.add(titleObj);
document.add(Chunk.NEWLINE);
document.add(new Paragraph("Beispiel einer Liste"));
document.add(list);
document.newPage();
document.add(table);
document.close();

Das Ergebnis

Hier ein Ausschnitt der einzelnen Seiten des generierten PDF-Dokumentes.

PDF Seite 1 mit iText generiert PDF Seite 2 mit iText generiert

An dieser Stelle sei noch zu erwähnen, dass, abgesehen von etlichen kommerziellen Bibliotheken, sich auch noch Apache´s PDFBox anbieten würde, um PDF´s zu generieren, da dieses auch kostenlos und Open Source ist.

Das komplette Beispiel

Hier noch einmal der Quellcode für das komplette Beispiel:

package at.gridtec.itext.example;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Image;
import com.itextpdf.text.List;
import com.itextpdf.text.ListItem;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;

public class ItextExample {

    public static void main(String[] args) throws DocumentException, MalformedURLException, 
        IOException {

        File file = new File("PdfFile.pdf");
        file.delete();
        Document document = new Document(PageSize.A4);
        PdfWriter.getInstance(document, new FileOutputStream(file));
        document.open();
        document.addAuthor("Grid");

        // Title
        String title = "Ein PDF-Dokument mit iText und Java";
        Font titleFont = new Font(Font.FontFamily.COURIER, 22, Font.BOLD, BaseColor.WHITE);
        Chunk titleObj = new Chunk(title, titleFont);
        titleObj.setBackground(new BaseColor(33, 33, 233), 1f, 1f, 1f, 3f);

        // List
        List list = new List(true, 30);
        list.add(new ListItem("Erstens"));
        list.add(new ListItem("Zweitens"));
        list.add(new ListItem("Drittens"));

        // Table
        PdfPTable table = new PdfPTable(2);
        table.setWidthPercentage(100);
        table.setSpacingAfter(10f);
        table.setSpacingBefore(15f);
        table.setWidths(new float[] { 2f, 2f });
        Font fontHeader = new Font(Font.FontFamily.COURIER, 15, Font.BOLD, BaseColor.DARK_GRAY);
        PdfPCell headerCell = new PdfPCell(new Phrase("Überschrift 1", fontHeader));
        headerCell.setBackgroundColor(BaseColor.LIGHT_GRAY);
        headerCell.setPaddingBottom(5f);
        table.addCell(headerCell);
        headerCell = new PdfPCell(new Phrase("Überschrift 2", fontHeader));
        headerCell.setBackgroundColor(BaseColor.LIGHT_GRAY);
        headerCell.setPaddingBottom(5f);
        table.addCell(headerCell);
        table.addCell("Data 1");
        table.addCell("Data 2");
        table.addCell("Data 3");
        table.addCell("Data 4");

        // Image
        String imagePath = "logo.JPG";
        Image img = Image.getInstance(imagePath);
        img.scaleAbsolute(137f, 64f);

        // Document
        document.open();
        document.add(img);
        document.add(new Paragraph(""));
        document.add(Chunk.NEWLINE);
        document.add(titleObj);
        document.add(Chunk.NEWLINE);
        document.add(new Paragraph("Beispiel einer Liste"));
        document.add(list);
        document.newPage();
        document.add(table);
        document.close();

        System.out.println("done");
    }
}
Tagged with:     , ,

About the author /


Einst gelernter Werkzeugbautechniker, habe ich vor etlichen Jahren mein Leben der Informatik verschrieben. Zur Zeit studiere ich noch Informatik auf der Fachhochschule Technikum Wien und beschäftige mich am liebsten mit Java, Android und Elektronik.

Related Articles

Post your comments

Your email address will not be published. Required fields are marked *

*

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden .

Unterstütz uns!

Folgt uns!

Diese Seite

wurde erstellt mit Ehrgeiz, Liebe und viel Koffein. Bei der Erstellung kamen keine jar-Dateien zu Schaden. Das Logo wurde erstellt von Star-seven.at.