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

Contacts guaranteed: Die Partnerunternehmen auf der DWX 2025 - Konferenz
Über 30 führende Unternehmen, unzählige Impulse: Auf der DWX 2025 in Mannheim zeigten unsere Partner, was Tech heute kann – und morgen möglich macht.
2 Minuten
10. Jul 2025
KI lässt Entwickler ihre Leidenschaft zum Programmieren neu entdecken - Motivation
Softwareentwicklung ist gleich Spaßfreie Zone? Das muss nicht sein: Der Beitrag beleuchtet, wie Teams ihren Kopf wieder freibekommen und ihre Freude am Entwickeln neu entdecken.
5 Minuten
10. Jul 2025
Miscellaneous

Das könnte Dich auch interessieren

C# 7: Der richtige Einsatz von ref - Programmiersprache
Die neue Version von C# unterstützt nun Referenzen mittels des Schlüsselwortes ref. Damit lassen sich etwa schnelle Zugriffe auf Arrays programmieren, die noch dazu sicher sind.
3 Minuten
25. Apr 2017
LogTape: Logging-Ansatz für JavaScript-Bibliotheken
LogTape bietet Logging in JavaScript-Bibliotheken.
2 Minuten
23. Jun 2025
C#: async und await im Detail erklärt - Patrick Smacchia
.NET bietet Hunderte von asynchronen Methoden für alle Arten von E/A-Aufgaben, einschließlich Netzwerkzugriff, Datenbankzugriff, JSON-XML-Binärdateizugriff, Datenkomprimierung und mehr. Patrick Smacchia erklärt das Konzept ausführlich anhand von Beispielen.
2 Minuten
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige