PDF Dokumente mit .NET generieren Teil 1: Einführung in itextsharp

Oft muss man in einer Webanwendung Dokumente generieren und diese dem Benutzer “irgendwie” ausdruckbar machen. Mit HTML ist dies zwar grundsätzlich möglich, jedoch bietet eine PDF Version eines Dokumentes oft Vorteile.

PDF Dokumente kann man in .NET auf vielfältigste Weise erstellen. Es gibt eine ganze Reihe an kommerziell verfügbaren Tools welche dies ermöglichen. In diesem Beispiel wollen wir uns ansehen wie man Dokumente mit dem frei verfügbaren “itextsharp” erstellen kann. ITextSharp kann man über https://sourceforge.net/projects/itextsharp/ beziehen. Hierbei handelt es sich um eine low-level API da man Dokumente – ähnlich wie bei OpenXML – sehr nahe am Dateilevel erstellt. Für komplexe Berichte muss man unter umständen auf andere Tools zurückgreifen.

Ein itextsharp-Dokument heißt “Document”. Die Seitenränder kann man über die Methode “SetMargins” einstellen. In unserem Beispiel verwenden wir jeweils 50. Standardgemäß wird A4 für unser Beispiel als Formatvorlage verwendet.

 private static Document pdfdoc;

static void Main(string[] args)
{
    pdfdoc = new Document();
    pdfdoc.SetMargins(50, 50, 50, 50);

    CreatePDF();
}

Im oben bezeigten Beispiel wird die Methode “CreatePDF” aufgerufen. Hierbei erstellen wir die PDF Datei an sich. Zuerst brauchen wir einen Speicherort. In unserem Fall ist dies einfach der lokale Pfad mit einem GUID (ich liebe diese Art von Dateinamen 20140720 (5)). Für den zweiten Teil der Serie benötigen wir noch den PdfWriter – dieser ist vor allem für Bilder und dergleichen notwendig. Dies wird jedoch erst später benötigt. Damit wir “in das Dokument” schreiben können müssen wir dieses noch öffnen.

 private static void CreatePDF()
{
    string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, string.Format(@"Chunk\{0}.pdf", Guid.NewGuid()));

    PdfWriter writer = PdfWriter.GetInstance(pdfdoc, new FileStream(path, FileMode.Create));
    pdfdoc.Open();

    PdfContentByte pdfcontent = writer.DirectContent;

Bevor wir Text schreiben wollen wir noch verschiedene Schriftarten erstellen. Eine Schriftart wird in itextsharp mit der FontFactory erstellt. Für unser Beispiel verwenden wir 5 Schriften. Die letzten 2 Schriften werden mit den Attributen “Fett” und “Kursiv” versehen.

 iTextSharp.text.Font title = iTextSharp.text.FontFactory.GetFont("Arial", 18);
iTextSharp.text.Font standard = iTextSharp.text.FontFactory.GetFont("Arial", 10);
iTextSharp.text.Font small = iTextSharp.text.FontFactory.GetFont("Arial", 8);

iTextSharp.text.Font standardbold = iTextSharp.text.FontFactory.GetFont("Arial", 10, Font.BOLD);
iTextSharp.text.Font smallitalic = iTextSharp.text.FontFactory.GetFont("Arial", 8, Font.ITALIC);

Im nächsten Schritt schreiben wir uns 2 Hilfsmethoden welche uns diverse Elemente, welche häufig vorkommen, abnehmen werden. Dies ist die Methode um einen neuen Paragrafen zu erstellen.

 public static Paragraph CreateParagraph(string text, Font font)
{
    return new iTextSharp.text.Paragraph(new iTextSharp.text.Chunk(text, font));
}

Außerdem erstellen wir uns eine Methode, welche einen leeren Paragraphen einfügt. Es gibt auch andere (und elegantere) Methoden wie dies gelöst werden kann. In unserem Fall verwenden wir jedoch dies als “schnelle” Hilfsmethode.

 public static Paragraph AddEmptyParagraph()
{
    iTextSharp.text.Font standard = iTextSharp.text.FontFactory.GetFont("Tahoma", 10);

    return CreateParagraph(Environment.NewLine, standard);
}

Nun müssen wir nur noch Text einfügen. Dies erledigen wir durch die “Add” Methode am Webservice.

 Paragraph headline = CreateParagraph("Ticket für Event \"CloudVision\"", title);
pdfdoc.Add(headline);
pdfdoc.Add(AddEmptyParagraph());
pdfdoc.Add(AddEmptyParagraph());
pdfdoc.Add(CreateParagraph("Ausgestellt für: Mario Meir-Huber", standard));
pdfdoc.Add(CreateParagraph("Gültig am: " + DateTime.Now.ToLongDateString(), standard));
 pdfdoc.Add(AddEmptyParagraph());
pdfdoc.Add(AddEmptyParagraph());

pdfdoc.Add(CreateParagraph("Ihr Ticket für die Veranstaltung", standardbold));

pdfdoc.Add(AddEmptyParagraph());
pdfdoc.Add(CreateParagraph("Platzhalter für Tabelle", standard));
pdfdoc.Add(AddEmptyParagraph());
pdfdoc.Add(CreateParagraph("Platzhalter für Barcode", standard));

pdfdoc.Add(AddEmptyParagraph());
pdfdoc.Add(AddEmptyParagraph());

pdfdoc.Close();

Nachdem dies aufgerufen ist kann man das neu erstellte Dokument bereits verarbeiten. Im nächsten Beitrag werde ich erklären wie man Bilder, Tabellen und Barcodes einfügt.