Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Lesedauer 5 Min.

PDFs generieren

Wie Sie PDF-Dokumente mit C# erzeugen.
© dotnetpro
Ein Thema, das .NET-Entwicklern immer wieder Kopfzerbrechen bereitet, ist das Generieren von Berichten und PDF-Dokumenten. In der Vergangenheit war das nie einfach, und es standen auch nur wenige Tools dafür zur Verfügung. Besonders zu Zeiten des klassischen .NET Frameworks gab es nur eine Handvoll kostenpflichtiger Lösungen zur PDF-Generierung. Mit .NET Core und der Open-Source-Entwicklung hat sich in den letzten Jahren jedoch viel getan – eine besonders beliebte Bibliothek ist QuestPDF. Es ist an der Zeit, einen Blick auf diese Lösung zu werfen.Die Open-Source-Lösung QuestPDF [1] hat in jüngster Zeit einen beträchtlichen Aufschwung erlebt und erlaubt das Erzeugen von PDFs mit einer schlanken und sehr performanten Bibliothek. Die Lizenzbedingungen wurden vor geraumer Zeit geändert; seither gilt, dass die Nutzung von QuestPDF für kleinere Projekte oder Unternehmen kostenlos ist. Für größere Unternehmen ist hingegen eine Lizenz für das Entwicklungsteam erforderlich, Details dazu finden Sie unter [2]. Doch auch diese Kosten sind im Vergleich zu anderen Lösungen überschaubar. Wichtiger ist aber, dass der Funktionsumfang von QuestPDF mittlerweile recht groß ist.

Lets get started!

Ein kleines Beispiel soll demonstrieren, wie man mit der Bibliothek PDFs generieren kann und was QuestPDF so besonders macht. Die Entwickler von QuestPDF haben für das Erzeugen von PDFs einen Developer-First-Ansatz gewählt. Man startet also nicht mit einem Designer, einem WYSIWYG-Editor oder ähnlichen Tools, sondern mit purem C#-Code. Die Lösung ist damit für Entwickler maßgeschneidert. Für die Umsetzung reicht eine einfache Konsolenanwendung, die vom NuGet-Paket QuestPDF [3] unterstützt wird (Bild 1). Für das Beispiel kommt .NET 8 zum Einsatz.
Das NuGet-Paket QuestPDF (Bild 1) © Autor
Direkt nach der Installation des NuGet-Pakets steht die Factory-Methode Document.Create zur Verfügung, deren Aufruf mit einigen wenigen Vorgaben ein erstes PDF baut, siehe Bild 2.
Wenige Zeilen Code genügen für ein einfaches PDF-Dokument im DIN-A4-Format (Bild 2) © Autor
QuestPDF schlägt dabei den Weg des Fluent API ein: Als Vorgaben für das zu erzeugende PDF-Dokument werden mehrere Lambda-Ausdrücke aneinandergereiht und weitere Parameter gegebenenfalls über Method Chaining hintereinander gesetzt (etwa x.Bold().FontSize(20)).Im ersten Beispiel wird ein Dokument angefordert, das in DIN-A4-Größe gerendert werden soll, Weiß als Hintergrundfarbe hat und – sofern nicht abweichend bestimmt – mit fetter Schrift in der Schriftgröße 20 pt mit Text befüllt wird.Hat man ein Dokument auf diese Weise konfiguriert, kann es mithilfe unterschiedlicher Methoden in das gewünschte Ausgabeformat konvertiert werden. Dabei ist PDF in der Regel das Zielformat, aber QuestPDF erlaubt auch den Export in den Formaten XPS und SVG oder in Form von Bildern (Bild 3).
Die Ausgabeformate von QuestPDF (Bild 3) © Autor
Die Methode GeneratePDF liefert das gewünschte Ergebnis als Byte-Array. Wer möchte, kann auch einen Pfad angeben, unter dem die Daten gespeichert werden sollen. Der in Bild 2 genutzte Aufruf GeneratePdfAndShow dient dazu, das PDF in einem temporären Ordner zu erzeugen, um es anschließend mit dem Standard-PDF-Viewer zu öffnen.Damit Sie das Beispiel nachvollziehen können, muss zuvor noch einmalig die Lizenz für den Prozess festgelegt werden. Dies erfolgt – wie in Bild 4 zu sehen ist – über das Setzen der Property License in der Settings-Klasse. Anschließend zeigt die Bibliothek das PDF-Dokument zum Startbeispiel bereits an, siehe Bild 5.
Über Settings.License wird die Lizenz festgelegt (Bild 4) © Autor
Die Vorschau des Startbeispiels (Bild 5) © Autor

Lasset die Spiele beginnen

Das leere weiße Blatt macht kaum Aufwand. Wie sieht es aber aus, wenn mit QuestPDF komplexe Dokumente erzeugt werden sollen? Zunächst kommen Kopf- und Fußzeilen dazu. Diese lassen sich in den Page(…)-Aufruf einbauen, und dazwischen wird der Content der Seite platziert:

Page.Header()
...
Page.Content()
...
Page.Footer() 
In Bild 6 sehen Sie ein Beispiel für ein Dokument mit Kopf- und Fußzeile sowie etwas Text. Die Fußzeile wird dabei angewiesen, die aktuelle Seitennummer anzuzeigen. Direkt nach dem Start des Programms erscheint die aktuelle Fassung auf dem Monitor (Bild 7).
Code für ein Dokument mit Kopf- und Fußzeile und Inhalt (Bild 6) © Autor
Vorschau des PDF-Dokuments mit Kopf- und Fußzeile und Text (Bild 7) © Autor
Wie Sie erkennen können, stellt die Bibliothek auch kleine „Helferlein“ für das schnelle Prototyping zur Verfügung; so wurden hier ein Platzhalter für Blindtext (Placeholders.LoremIpsum()) und einer für ein Bild genutzt (Placeholders.Image(width: 200, height: 100)).Auf der Webseite von QuestPDF finden Sie einige komplexere Beispiele [4] sowie eine sehr gute Dokumentation. Zu den Beispielen gehören Dokumente mit Tabellen, Karten und Bildern sowie Rechnungen (siehe Bild 8 und Bild 9) – alle mit Code, den man für die eigenen Anforderungen anpassen kann.
Beispiel eines komplexen Dokuments mit Tabellen und Bildern von der Getting-Started-Webseite (Bild 8) © Autor
Ein Rechnungsdokument mit Tabelle und Summenfunktion (Bild 9) © Autor

Weitere Funktionen

Nachdem QuestPDF stark auf C# fokussiert ist, integriert es sich sehr gut in die Programmiersprache: Grundsätzlich ist zum Beispiel ein Document immer ein IDocument und ein Container ein IContainer. Dies führt dazu, dass man Vorlagen beziehungsweise Templates für eigene Dokumente anlegen kann, siehe Bild 10 und Bild 11.
Komponentenorientiertes Programmieren mit QuestPDF (Bild 10) © Autor
Wiederverwendbare Komponente für das Rendern von Dokumenten (Bild 11) © Autor
Es ist möglich, beliebige Komponenten oder Vorlagen zu definieren und mit der jeweiligen Datenquelle zu verbinden. Dies erleichtert die Wiederverwendbarkeit und sorgt für einen einheitlichen Look in verschiedenen Dokumenten. Diese Funktionalität lässt sich von IComponent bis hin zu ganzen Dokumenten übertragen. Mittels IDocument kann das Erzeugen eines Berichts oder Dokuments vollständig in eine Klasse gekapselt werden. Da es sich um einfachen C#-Code handelt, lässt sich dieser mit beliebigen Daten verknüpfen. Egal ob REST-Schnittstelle, ADO.NET, EF Core oder In-Memory-Daten – alles kann programmatisch mit dem Dokument verknüpft werden.

Fazit

Dieses Mal gewährt NETirol keinen Blick in die Welt von Microsoft, sondern betrachtet ein – meines Erachtens – besonders nützliches Werkzeug im .NET-Umfeld. Für die Qualitäten von QuestPDF spricht auch, dass der Entwicklerwerkzeug-Hersteller JetBrains die Bibliothek QuestPDF als Beispiel für Performance-Optimierung herangezogen hat [5]. Wer also gerade eine nervige PDF-Aufgabe vor sich hat oder davon ausgeht, dass das in absehbarer Zeit der Fall sein wird, für den ist QuestPDF einen näheren Blick wert.

Fussnoten

  1. QuestPDF, http://www.questpdf.com
  2. Lizenz von QuestPDF, http://www.questpdf.com/license/
  3. NuGet-Paket QuestPDF, http://www.nuget.org/packages/QuestPDF
  4. QuestPDF, Getting Started, http://www.questpdf.com/getting-started.html
  5. JetBrains, Profiling QuestPDF: In Pursuit of Performance, http://www.dotnetpro.de/SL2412NETirol1

Neueste Beiträge

DWX hakt nach: Wie stellt man Daten besonders lesbar dar?
Dass das Design von Websites maßgeblich für die Lesbarkeit der Inhalte verantwortlich ist, ist klar. Das gleiche gilt aber auch für die Aufbereitung von Daten für Berichte. Worauf besonders zu achten ist, erklären Dr. Ina Humpert und Dr. Julia Norget.
3 Minuten
27. Jun 2025
DWX hakt nach: Wie gestaltet man intuitive User Experiences?
DWX hakt nach: Wie gestaltet man intuitive User Experiences? Intuitive Bedienbarkeit klingt gut – doch wie gelingt sie in der Praxis? UX-Expertin Vicky Pirker verrät auf der Developer Week, worauf es wirklich ankommt. Hier gibt sie vorab einen Einblick in ihre Session.
4 Minuten
27. Jun 2025
„Sieh die KI als Juniorentwickler“
CTO Christian Weyer fühlt sich jung wie schon lange nicht mehr. Woran das liegt und warum er keine Angst um seinen Job hat, erzählt er im dotnetpro-Interview.
15 Minuten
27. Jun 2025
Miscellaneous

Das könnte Dich auch interessieren

UIs für Linux - Bedienoberflächen entwickeln mithilfe von C#, .NET und Avalonia
Es gibt viele UI-Frameworks für .NET, doch nur sehr wenige davon unterstützen Linux. Avalonia schafft als etabliertes Open-Source-Projekt Abhilfe.
16 Minuten
16. Jun 2025
Mythos Motivation - Teamentwicklung
Entwickler bringen Arbeitsfreude und Engagement meist schon von Haus aus mit. Diesen inneren Antrieb zu erhalten sollte für Führungskräfte im Fokus stehen.
13 Minuten
19. Jan 2017
Bausteine guter Architektur - Entwurf und Entwicklung wartbarer Softwaresysteme, Teil 2
Code sauberer gestalten anhand von wenigen Patterns und Grundhaltungen.
6 Minuten
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige