PDF Dokumente mit .NET generieren Teil 2: Tabellen und Bilder


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 http://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. Dies ist bereits der zweite Post, eine Einführung zu itextsharp wurde in diesem Post behandelt.

Zu Beginn ist es notwendig, das einige Elemente des Codes des letzten Posts umgeschrieben werden. Das erste ist eine Hilfsfunktion die uns eine Standardphrase einfügt.

private static PdfPCell CreateStandardPhrase(string text, Font standard)
{
    return new PdfPCell(new Phrase(text, standard)) { Border = Rectangle.NO_BORDER };
}

Da wir eine Tabelle erstellen wollen, ist es auch notwendig diese mit Daten zu versorgen. In unserem Fall fügen wir hierfür eine Klasse “PersonPurchase” ein, welche uns den Namen der Person, Gültigkeitsdatum, Sitzplatz und Preis zurück liefert.

public class PersonPurchase
{
    public string PersonName { get; set; }

    public DateTime ValidOn { get; set; }

    public string Seat { get; set; }

    public double Price { get; set; }
}

Und übergeben eine Liste von Einkäufen an die PDF Erstellung.

CreatePDF(new List<PersonPurchase>()
    {
        new PersonPurchase()
        {
            PersonName = "Mario Meir-Huber",
            Seat = "C41",
            ValidOn = DateTime.Today.AddDays(5.0),
            Price = 32.00
        },
        new PersonPurchase()
        {
            PersonName = "Rolf Mistelbacher",
            Seat = "A2",
            ValidOn = DateTime.Today.AddDays(5.0),
            Price = 132.00
        }
    });

Wichtig ist auch noch, die Parameter der Methode hinzuzufügen:

private static void CreatePDF(List<PersonPurchase> purchases)

Eine Tabelle wird in itextsharp mit PdfPTable erstellt. Hierbei muss man die Anzahl der Spalten als Parameter angeben. Da unsere Tabelle sich auf 100% der Breite erstrecken soll, wird dies ebenfalls angegeben. Mit “AddCell” kann man neue Zellen einfügen. Will man den Rahmen kontrollieren, so gibt man dies über “Border = Rectangle.xxx” an. Wir wollen in unserem Fall keinen Border, daher geben wir “Rectangle.NO_BORDER” an.

PdfPTable overviewtable = new PdfPTable(4);
overviewtable.WidthPercentage = 100;
overviewtable.AddCell(CreateStandardPhrase("Name der Person", standard));
overviewtable.AddCell(new PdfPCell(new Phrase("gültig am", standard)) { Border = Rectangle.NO_BORDER });
overviewtable.AddCell(new PdfPCell(new Phrase("Sitzplatz", standard)) { Border = Rectangle.NO_BORDER });
overviewtable.AddCell(new PdfPCell(new Phrase("Preis", standard)) { Border = Rectangle.NO_BORDER });

Schlussendlich wollen wir noch über die Einkäufe iterieren und jeweilig diese Zellen einfügen. Die Vorgehensweise ist hierbei ähnlich wie in der vorigen Vorgangsweise.

double sum = 0.0;

if (purchases != null)
{
    foreach (var itm in purchases)
    {
        overviewtable.AddCell(CreateStandardPhrase(itm.PersonName, standard));
        overviewtable.AddCell(CreateStandardPhrase(itm.ValidOn.ToShortDateString(), standard));
        overviewtable.AddCell(CreateStandardPhrase(itm.Seat, standard));
        overviewtable.AddCell(CreateStandardPhrase(itm.Price.ToString("c"), standard));

        sum += itm.Price;
    }

    overviewtable.AddCell(CreateStandardPhrase(string.Empty, standard));
    overviewtable.AddCell(CreateStandardPhrase(string.Empty, standard));
    overviewtable.AddCell(CreateStandardPhrase("Summe", standard));
    overviewtable.AddCell(CreateStandardPhrase(sum.ToString("c"), standard));
}

pdfdoc.Add(overviewtable);

Wesentlich einfacher gestaltet sich das Einfügen von Bildern in das Dokument. Hier lädt man ein neues Bild und setzt die Parameter. In unserem Fall wollen wir es am unteren Rand haben – dies ist 0.0 und 0.0. PDF fängt von unten zum Zählen an Zwinkerndes Smiley. Außerdem wollen wir das Bild noch richtig skalieren, damit es nicht abgeschnitten oder verzehrt dargestellt wird.

pdfdoc.Add(overviewtable);

Image footerimage = Image.GetInstance(AppDomain.CurrentDomain.BaseDirectory
    + "\\images\\msdn-header.jpg");

footerimage.SetAbsolutePosition(0.0f, 0.0f);
footerimage.ScalePercent(59.5f);
pdfdoc.Add(footerimage);

Im letzten Post, welchen ich noch vor Weihnachten Online stellen werde, geht es um das Einfügen von BarCodes in das Dokument.


Skip to main content