Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Anzeige
Lesedauer 4 Min.

Ratzfatz umgewandelt

Mit dem NuGet-Paket SimpleHtmlToPdf erstellen Sie PDF-Dateien jetzt noch einfacher.
© dotnetpro
Zur Erzeugung von PDF-Dateien in einer C#-Anwendung gibt es einige bekannte kommerzielle Varianten. Zu nennen wären IronPdf [1] und Aspose.PDF [2], aber auch Open-Source-Projekte wie DinkToPdf [3]. Zu Letzterem existiert nun eine verbesserte und vereinfachte Variante – Simple­HtmlToPdf [4].

Gemeinsame Grundlage für mehrere NuGet-Pakete

Sowohl DinkToPdf als auch SimpleHtmlTo­Pdf basieren auf wkhtmltopdf [5], einer Bibliothek, die in C++ geschrieben wurde. Dieses Befehlszeilentool nutzt die Qt-Bibliothek (insbesondere Qt WebKit), um HTML-Seiten zu rendern und in PDF-Dateien umzuwandeln. Da Qt ebenfalls in C++ entwickelt ist, war die Wahl dieser Sprache für die Entwicklung von wkhtmltopdf naheliegend.wkhtmltopdf selbst ist ein Open-Source-Befehlszeilenwerkzeug (LGPLv3), das HTML-Code in eine PDF-Datei umwandelt. Da Webentwickler mit HTML-Code vertraut sind, wird es ihnen leichtfallen, SimpleHtmlToPdf für die Erstellung von PDF-Dateien zu verwenden.

DinkToPdf

Das erste NuGet-Paket, das einen Wrapper für wkhtmltopdf enthielt und es so ermöglichte, diese Bibliothek in C#-Anwendungen zu verwenden, war DinkToPdf. Dieses Paket hatte jedoch den Nachteil, dass die benötigten DLL-Dateien der wkhtmltopdf-Bibliothek manuell nachzuinstallieren waren. Dazu musste man die DLL-Dateien herunterladen und dem Projekt hinzufügen sowie einen eigenen AssemblyLoadContext schreiben, damit die DLL-Dateien eingebunden werden können. Fehlten die DLL-Dateien, kam es zu einem Laufzeitfehler (siehe Bild 1). Dies musste in manchen Konstellationen beim Veröffentlichen einer Webseite beachtet werden.
Laufzeitfehler beim Fehlen der benötigten DLL-Dateien aus der wkhtmltopdf-Bibliothek (Bild 1) © Autor
Die Installation und die Verwendung von DinkToPdf wurden bereits in einem dotnetpro-Artikel beschrieben [6].

SimpleHtmlToPdf

Einen Schritt weiter geht nun das NuGet-Paket Simple­Html­ToPdf. Dieses ist ein leichtgewichtiger Wrapper für die wkhtmltopdf-Bibliothek und beinhaltet die DLL-Dateien der wkhtmltopdf-Bibliothek bereits, was bedeutet, dass diese nicht manuell nachinstalliert werden müssen.

Verwendung von ­SimpleHtmlToPdf

Hier eine kurze Beschreibung, wie man SimpleHtmlToPdf in ein Projekt einbindet und damit eine PDF-Datei erstellt.Zunächst installieren wir das NuGet-Paket über die Paket-Manager-Konsole:

dotnet add <span class="hljs-keyword">package</span> 
  <span class="hljs-title">SimpleHtmlToPdf</span> 
Danach registrieren wir den neuen Service in der Datei Program.cs:

<span class="hljs-selector-tag">builder</span><span class="hljs-selector-class">.Services</span><span class="hljs-selector-class">.AddSimpleHtmlToPdf</span>(); 
Nun stehen uns die Funktionen von SimpleHtmlToPdf über Dependency-Injection überall zur Verfügung; dazu verwenden wir das Interface IConverter. Listing 1 zeigt an einem einfachen Beispiel die nötigen Schritte.
Listing 1: Ein einfaches SimpleHtmlToPdf-Anwendungsbeispiel
public class ReportController(IConverter converter) : &lt;br/&gt;    Controller&lt;br/&gt;{&lt;br/&gt;  private readonly IConverter &lt;span class="hljs-attr"&gt;_converter&lt;/span&gt; = converter;&lt;br/&gt;  public IActionResult GetReport()&lt;br/&gt;  {&lt;br/&gt;    // Parameter für die PDF-Datei&lt;br/&gt;    var &lt;span class="hljs-attr"&gt;pdfDoc&lt;/span&gt; = new HtmlToPdfDocument()&lt;br/&gt;    {&lt;br/&gt;      &lt;span class="hljs-attr"&gt;GlobalSettings&lt;/span&gt; = {&lt;br/&gt;        &lt;span class="hljs-attr"&gt;ColorMode&lt;/span&gt; = ColorMode.Color,&lt;br/&gt;        &lt;span class="hljs-attr"&gt;Orientation&lt;/span&gt; = Orientation.Portrait,&lt;br/&gt;        &lt;span class="hljs-attr"&gt;PaperSize&lt;/span&gt; = PaperKind.A4Plus,&lt;br/&gt;      },&lt;br/&gt;      &lt;span class="hljs-attr"&gt;Objects&lt;/span&gt; = {&lt;br/&gt;        new ObjectSettings()&lt;br/&gt;        {&lt;br/&gt;          // HtmlContent erhält den HTML-Code, der &lt;span class="hljs-keyword"&gt;in&lt;/span&gt;&lt;br/&gt;          // eine PDF-Datei konvertiert werden soll&lt;br/&gt;          &lt;span class="hljs-attr"&gt;HtmlContent&lt;/span&gt; = GetHtmlCodeForReport(),&lt;br/&gt;          &lt;span class="hljs-attr"&gt;WebSettings&lt;/span&gt; = { &lt;span class="hljs-attr"&gt;DefaultEncoding&lt;/span&gt; = &lt;span class="hljs-string"&gt;"utf-8"&lt;/span&gt; },&lt;br/&gt;        },&lt;br/&gt;      }&lt;br/&gt;    };&lt;br/&gt;    // Konvertiert HTML-Code &lt;span class="hljs-keyword"&gt;in&lt;/span&gt; eine PDF-Datei &lt;span class="hljs-keyword"&gt;in&lt;/span&gt; &lt;br/&gt;    // Form von byte[]&lt;br/&gt;    byte[] &lt;span class="hljs-attr"&gt;pdfFile&lt;/span&gt; = _converter.Convert(pdfDoc);&lt;br/&gt;    return File(pdfFile, &lt;span class="hljs-string"&gt;"application/pdf"&lt;/span&gt;);&lt;br/&gt;  }&lt;br/&gt;  private static string GetHtmlCodeForReport()&lt;br/&gt;  {&lt;br/&gt;    var &lt;span class="hljs-attr"&gt;reportHtml&lt;/span&gt; = &lt;span class="hljs-string"&gt;"&amp;lt;html&amp;gt;&amp;lt;body&amp;gt;........&amp;lt;/body&amp;gt;&lt;/span&gt;&lt;br/&gt;&lt;span class="hljs-string"&gt;      &amp;lt;/html&amp;gt;"&lt;/span&gt;;&lt;br/&gt;    return reportHtml;&lt;br/&gt;  }&lt;br/&gt;} 
Zunächst binden wir mit Dependency-Injection den Service von SimpleHtmlToPdf in unseren Controller ein. In der Action GetReport() erstellen wir ein neues Objekt vom Typ HtmlToPdfDocument. Unter GlobalSettings können wir verschiedene Einstellungen für das PDF-Dokument festlegen, etwa Farbe oder Schwarz/Weiß, Ausrichtung, Ränder, Papiergröße und anderes mehr. Unter ObjectSettings übergeben wie den HTML-Code, der als PDF-Datei dargestellt werden soll. Die Erstellung des HTML-Codes haben wir in die Methode GetHtmlCodeForReport() ausgelagert. Hier kann auch eigener CSS-Code mitgegeben werden, und es existieren Einstellungen für Fußzeile, Paginierung und anderes. Schließlich erstellt die Methode converter.Convert(pdfDoc) eine PDF-Datei und gibt diese als Byte-Array zurück. In unserem Beispiel zeigen wir die PDF-Datei direkt im Browser an; alternativ könnte man die PDF-Datei auch in einer Datenbank speichern oder als Anhang mit einer E-Mail versenden.Wie gesagt: Dies ist nur ein einfaches Beispiel. In der Realität würde man beispielsweise die Erstellung eines Objekts vom Typ HtmlToPdfDocument in eine statische Klasse auslagern und in der Action nur noch den HTML-Code an die Variable HtmlContent übergeben.

Umstellung von DinkToPdf auf SimpleHtmlToPdf

Wer bereits mit DinkToPdf gearbeitet hat, dem fällt auf, dass die Syntax der Methodenaufrufe in SimpleHtmlToPdf sehr ähnlich ist. Und in der Tat bezieht sich der Entwickler von SimpleHtmlToPdf explizit auf die Bibliothek von DinkToPdf, die den initialen Code bereitgestellt hat [7]. Das bringt für uns den Vorteil einer einfachen Umstellung von DinkToPdf auf SimpleHtmlToPdf. Die Schritte dazu sind folgende:
  • NuGet-Paket DinkToPdf deinstallieren.
  • NuGet-Paket SimpleHtmlToPdf installieren.
  • In der Datei Program.cs Einträge von DinkToPdf entfernen und SimpleHtmlToPdf als Service hinzufügen.
  • Nicht mehr benötigte DLL-Dateien von wkhtmltopdf und den eigenen AssemblyLoadContext löschen.
Der Kompilierprozess zeigt uns anhand der Fehlerliste, in welchen Dateien wir die Namespaces anpassen müssen – fertig.Wer dies probieren möchte, kann das Quellcode-Beispiel zum Artikel, in dem DinkToPdf zur Erstellung von PDF-Dateien verwendet wurde, unter [8] herunterladen und die oben beschriebenen Schritte durchgehen.

Fazit

Entwickler, die in ihren Webanwendungen PDF-Dateien erstellen möchten, sollten SimpleHtmlToPdf eine Chance geben. Wer bereits DinkToPdf in seinen Projekten verwendet hat, kann eine Umstellung auf SimpleHtmlToPdf in Betracht ziehen und auf diese Weise seinen Code verschlanken.

Fussnoten

  1. IronPdf, http://www.dotnetpro.de/SL2506-07SimpleHtmlToPdf1
  2. Aspose.PDF, https://docs.aspose.com/pdf/net/
  3. DinkToPdf, https://github.com/rdvojmoc/DinkToPdf
  4. SimpleHtmlToPdf, http://www.dotnetpro.de/SL2506-07SimpleHtmlToPdf2
  5. wkhtmltopdf, https://wkhtmltopdf.org
  6. Christian Kiefer, Aus HTML mach PDF, dotnetpro 7/2024, Seite 136 ff., http://www.dotnetpro.de/A2407DinkToPdf
  7. SimpleHtmlToPdf, Acknowledgments, http://www.dotnetpro.de/SL2506-07SimpleHtmlToPdf3
  8. Beispielprojekt „Create PDF-files on websites“ auf GitHub, http://www.dotnetpro.de/SL2506-07SimpleHtmlToPdf4

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