IRONSOFTWAREHOME
VIDEOS

Wie man ein Inhaltsverzeichnis in C# | IronPDF hinzufügt

Curtis Chau
Curtis Chau
Updated: 19. Juli 2026

wkhtmltopdf war ein weit verbreitetes Tool zur Umwandlung von HTML-Dokumenten in PDF mit Qt 4.8 + QtWebKit. Trotz seiner Beliebtheit bei Entwicklern aufgrund seiner Befehlszeilenfunktionen und der kostenlosen Lizenzierung birgt das Projekt inzwischen kritische Sicherheitsrisiken, die nicht mehr ignoriert werden können. Das GitHub-Repository wurde am 2. Januar 2023 archiviert; die letzte upstream-Veröffentlichung ist 0.12.6 vom 11. Juni 2020; and CVE-2022-35583 (CVSS 9.8, SSRF) remains unpatched.

Dieses Handbuch bietet einen vollständigen Migrationspfad von wkhtmltopdf zu IronPDF mit schrittweisen Anleitungen, Codevergleichen und praktischen Beispielen für professionelle .NET-Entwickler, die dieses Sicherheitsrisiko aus ihren Anwendungen eliminieren müssen.

Kritische Sicherheitswarnung: CVE-2022-35583

wkhtmltopdf enthält eine kritische Sicherheitslücke, die nie behoben werden wird:

ProblemDetailStatus
CVE-2022-35583 (SSRF, CWE-918)KRITISCH (CVSS 9.8)UNGEPATCHT — von den Verantwortlichen angefochten
GitHub repo archivedNur-Lesen2. Januar 2023
Letzte Upstream-Veröffentlichung0.12.611. Juni 2020
Unterliegender MotorQt 4.8 + QtWebKit (Qt 4.8 EOL 2015)OBSOLETE
CSS-Grid-UnterstützungNoneGebrochen
Flexbox-UnterstützungTeilweiseGebrochen
ES6+ JavaScriptBeschränktGebrochen

Wie der SSRF-Angriff funktioniert

Die Sicherheitslücke "Server-Side Request Forgery" ermöglicht es Angreifern, auf interne Dienste zuzugreifen, Anmeldeinformationen zu stehlen, Ihr internes Netzwerk zu scannen und sensible Daten über manipuliertes HTML zu exfiltrieren:

<!-- Malicious HTML submitted to your PDF generator -->
<iframe src="http://169.254.169.254/latest/meta-data/iam/security-credentials/"></iframe>
<img src="http://internal-database:5432/admin"/>
HTML

Wenn wkhtmltopdf dieses HTML rendert, holt es diese URLs aus dem Netzwerkkontext Ihres Servers und umgeht dabei Firewalls und Sicherheitskontrollen.

Betroffene Wrapper-Bibliotheken

Jeder .NET-Wrapper bündelt oder startet die gleiche wkhtmltopdf-native-Binärdatei, sodass sie alle ihre CVE-Exposition erben, unabhängig davon, wie aktiv der Wrapper selbst ist:

Wrapper-BibliothekNeueste NuGetSicherheitsrisiko
DinkToPdf1.0.8 (April 2017) — aufgegebenErbt CVE-2022-35583
Rotativa.AspNetCore (webgio fork)1.4.0 (Nov 2023) — Wrapper aktualisiert, Binärdatei eingefrorenErbt CVE-2022-35583
TuesPechkin2.1.1 (Jan 2015) — aufgegebenErbt CVE-2022-35583
Haukcode.WkHtmlToPdfDotNet (formerly WkHtmlToPdf-DotNet)1.5.95 (Okt 2024) — Wrapper aktualisiert, Binärdatei eingefrorenErbt CVE-2022-35583
NReco.PdfGeneratorWrapper aktualisiert, bündelt wkhtmltopdfErbt CVE-2022-35583

Wenn Sie eine dieser Bibliotheken verwenden, ist Ihre Anwendung CVE-2022-35583 ausgesetzt, es sei denn, Sie bereinigen alle HTML-Eingaben.

##IronPDF vs. wkhtmltopdf: Funktionsvergleich

Das Verständnis der architektonischen Unterschiede hilft technischen Entscheidungsträgern, die Investition in die Migration zu bewerten:

FeaturewkhtmltopdfIronPDF
LizenzierungLGPLv3 (Frei)Kommerziell
Rendering EngineQt 4.8 + QtWebKit (Qt 4.8 EOL 2015)Aktueller Chromium-Engine
SicherheitsschwachstellenCVE-2022-35583 (CVSS 9.8) ungepatcht, umstrittenKeine kritischen CVEs gemeldet
Aktive WartungGitHub-Repo am 2. Januar 2023 archiviert; Letzte Veröffentlichung Juni 2020Aktive Pflege mit regelmäßigen Veröffentlichungen
Unterstützung für moderne WebstandardsEingeschränkt (Broken flexbox, kein CSS Grid)Unterstützt
Integration und UnterstützungBeschränkt auf Community-ForenUmfassende Dokumentation und engagierter Support
CSS Grid❌ Nicht unterstützt✅ Unterstützt
Flexbox⚠ Defekt✅ Unterstützt
ES6+ JavaScript❌ Nicht unterstützt✅ Unterstützt
Async/Await❌ Nicht unterstützt✅ Unterstützt
PDF-Bearbeitung❌ Nicht unterstützt✅ Unterstützt
Digitale Signaturen❌ Nicht unterstützt✅ Unterstützt
PDF/A-Konformität❌ Nicht unterstützt✅ Unterstützt

Schnellstart: wkhtmltopdf zu IronPDF Migration

Mit diesen grundlegenden Schritten kann die Migration sofort beginnen.

Schritt 1: Entfernen von wkhtmltopdf-Paketen und -Binärdateien

Entfernen Sie alle wkhtmltopdf-Wrapper-Pakete:

# Remove wkhtmltopdf wrapper (whichever you're using)
dotnet remove package Haukcode.WkHtmlToPdfDotNet
dotnet remove package DinkToPdf
dotnet remove package TuesPechkin
dotnet remove package Rotativa
dotnet remove package Rotativa.AspNetCore
dotnet remove package NReco.PdfGenerator

# Remove wkhtmltopdf binary from your deployment
# Delete wkhtmltopdf.exe, wkhtmltox.dll, etc.
SHELL

Schritt 2:IronPDF installieren

# Add IronPDF(secure, modern alternative)
dotnet add package IronPdf
SHELL

Schritt 3: Namespaces aktualisieren

Ersetzen Sie die wkhtmltopdf-Namespaces durch den IronPDF-Namespace:

// Before (wkhtmltopdf)
using Haukcode.WkHtmlToPdfDotNet;
using Haukcode.WkHtmlToPdfDotNet.Contracts;

// After (IronPDF)
using IronPdf;

Schritt 4: Lizenz initialisieren

Hinzufügen der Lizenzinitialisierung beim Start der Anwendung:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

Beispiele für die Code-Migration

Konvertierung von HTML in PDF

Der grundlegendste Vorgang offenbart den Komplexitätsunterschied zwischen diesen .NET-PDF-Ansätzen.

wkhtmltopdf-Ansatz:

// NuGet: Install-Package Haukcode.WkHtmlToPdfDotNet
using Haukcode.WkHtmlToPdfDotNet;
using Haukcode.WkHtmlToPdfDotNet.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());
        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
                Orientation = Orientation.Portrait,
                PaperSize = PaperKind.A4
            },
            Objects = {
                new ObjectSettings()
                {
                    HtmlContent = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>"
                }
            }
        };
        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("output.pdf", pdf);
    }
}

IronPDF-Ansatz:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML.</p>");
        pdf.SaveAs("output.pdf");
    }
}

wkhtmltopdf erfordert das Erstellen eines SynchronizedConverter mit PdfTools, das Konstruieren eines HtmlToPdfDocument mit GlobalSettings und Objects, das Setzen von Eigenschaften wie ColorMode, Orientation und PaperSize, das Aufrufen von converter.Convert(), um rohen Byte-Code zu erhalten und das manuelle Schreiben in eine Datei mit File.WriteAllBytes().

IronPDF eliminiert diese Zeremonie vollständig - erstellen Sie ein ChromePdfRenderer, rufen Sie RenderHtmlAsPdf() auf und verwenden Sie die integrierte SaveAs() Methode.

Für fortgeschrittene HTML-zu-PDF-Szenarien siehe den HTML-zu-PDF-Konvertierungsleitfaden.

Konvertierung von URLs zu PDF

Die URL-zu-PDF-Konvertierung weist ähnliche Komplexitätsmuster auf.

wkhtmltopdf-Ansatz:

// NuGet: Install-Package Haukcode.WkHtmlToPdfDotNet
using Haukcode.WkHtmlToPdfDotNet;
using Haukcode.WkHtmlToPdfDotNet.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());
        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
                Orientation = Orientation.Portrait,
                PaperSize = PaperKind.A4
            },
            Objects = {
                new ObjectSettings()
                {
                    Page = "https://www.example.com"
                }
            }
        };
        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("webpage.pdf", pdf);
    }
}

IronPDF-Ansatz:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
        pdf.SaveAs("webpage.pdf");
    }
}

wkhtmltopdf verwendet die Page Eigenschaft in ObjectSettings, um eine URL anzugeben, wobei dasselbe Dokumentkonstruktionsmuster erforderlich ist.IronPDF bietet eine dedizierte RenderUrlAsPdf() Methode, die den Zweck eindeutig ausdrückt.

In der URL zur PDF-Dokumentation finden Sie Informationen zur Authentifizierung und zu benutzerdefinierten Kopfzeilenoptionen.

Benutzerdefinierte Einstellungen: HTML-Dateien mit Seitenkonfiguration

Die Konfiguration von Ausrichtung, Rändern und Papiergröße erfordert unterschiedliche Ansätze.

wkhtmltopdf-Ansatz:

// NuGet: Install-Package Haukcode.WkHtmlToPdfDotNet
using Haukcode.WkHtmlToPdfDotNet;
using Haukcode.WkHtmlToPdfDotNet.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());
        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
                Orientation = Orientation.Landscape,
                PaperSize = PaperKind.A4,
                Margins = new MarginSettings() { Top = 10, Bottom = 10, Left = 10, Right = 10 }
            },
            Objects = {
                new ObjectSettings()
                {
                    Page = "input.html",
                    WebSettings = { DefaultEncoding = "utf-8" }
                }
            }
        };
        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("custom-output.pdf", pdf);
    }
}

IronPDF-Ansatz:

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
        renderer.RenderingOptions.MarginTop = 10;
        renderer.RenderingOptions.MarginBottom = 10;
        renderer.RenderingOptions.MarginLeft = 10;
        renderer.RenderingOptions.MarginRight = 10;
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        
        var pdf = renderer.RenderHtmlFileAsPdf("input.html");
        pdf.SaveAs("custom-output.pdf");
    }
}

wkhtmltopdf verschachtelt Einstellungen innerhalb von GlobalSettings und Objects, wobei MarginSettings als separates Objekt existiert.IronPDF bietet direkte RenderingOptions Eigenschaften mit klaren Namen wie PaperOrientation, MarginTop und PaperSize.

wkhtmltopdf API zu IronPDF Mapping-Referenz

Dieses Mapping beschleunigt die Migration, indem es direkte API-Entsprechungen aufzeigt:

CLI-zu-IronPDF-Zuordnung

wkhtmltopdf CLI-OptionIronPDF-Äquivalent
wkhtmltopdf input.html output.pdfrenderer.RenderHtmlFileAsPdf()
wkhtmltopdf URL output.pdfrenderer.RenderUrlAsPdf()
--page-size A4RenderingOptions.PaperSize = PdfPaperSize.A4
--page-size LetterRenderingOptions.PaperSize = PdfPaperSize.Letter
--orientation LandscapeRenderingOptions.PaperOrientation = Landscape
--margin-top 10mmRenderingOptions.MarginTop = 10
--margin-bottom 10mmRenderingOptions.MarginBottom = 10
--margin-left 10mmRenderingOptions.MarginLeft = 10
--margin-right 10mmRenderingOptions.MarginRight = 10
--header-html header.htmlRenderingOptions.HtmlHeader
--footer-center "[page]"{page} Platzhalter
--footer-center "[toPage]"{total-pages} Platzhalter
--enable-javascriptStandardmäßig aktiviert
--javascript-delay 500RenderingOptions.WaitFor.RenderDelay = 500
--dpi 300RenderingOptions.Dpi = 300
--grayscaleRenderingOptions.GrayScale = true

C# Wrapper API-Mapping

wkhtmltopdf WrapperIronPDF
SynchronizedConverterChromePdfRenderer
HtmlToPdfDocumentRenderingOptions
GlobalSettings.Outpdf.SaveAs()
GlobalSettings.PaperSizeRenderingOptions.PaperSize
GlobalSettings.OrientationRenderingOptions.PaperOrientation
GlobalSettings.MarginsRenderingOptions.Margin*
ObjectSettings.PageRenderHtmlFileAsPdf()
ObjectSettings.HtmlContentRenderHtmlAsPdf()
converter.Convert(doc)renderer.RenderHtmlAsPdf()

Migration der Platzhalter-Syntax

wkhtmltopdf PlatzhalterIronPDF Platzhalter
[page]{page}
[toPage]{total-pages}
[date]{date}
[time]{time}
[title]{html-title}
[url]{url}

Gängige Migrationsprobleme und Lösungen

Aufgabe 1: Syntax von Kopf-/Fußzeilen-Platzhaltern

wkhtmltopdf: Verwendet eckige Klammer-Syntax wie [page] und [toPage].

Lösung: Aktualisierung der Platzhalter für geschweifte Klammern in IronPDF:

// Before (wkhtmltopdf)
FooterSettings = { Left = "Page [page] of [toPage]" }

// After (IronPDF)
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:left;'>Page {page} of {total-pages}</div>",
    MaxHeight = 25
};

Ausgabe 2: JavaScript-Verzögerungskonfiguration

wkhtmltopdf: Verwendet JavaScriptDelay Eigenschaft mit eingeschränkter Zuverlässigkeit.

**Lösung:**IronPDF bietet mehrere Möglichkeiten:

renderer.RenderingOptions.EnableJavaScript = true;

// Option 1: Fixed delay
renderer.RenderingOptions.WaitFor.RenderDelay(500);

// Option 2: Wait for specific element (more reliable)
renderer.RenderingOptions.WaitFor.HtmlElementById("content-loaded");

// Option 3: Wait for JavaScript condition
renderer.RenderingOptions.WaitFor.JavaScript("window.renderComplete === true");

Ausgabe 3: Modernes CSS ohne Rendering

Symptom: CSS Grid- und Flexbox-Layouts werden in wkhtmltopdf falsch dargestellt.

Lösung: Die Chromium-Engine von IronPDF verarbeitet modernes CSS korrekt:

// This CSS now works with IronPDF
var html = @"
<style>
    .grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
    .flex { display: flex; justify-content: space-between; align-items: center; }
</style>
<div class='grid'>
    <div>Column 1</div>
    <div>Column 2</div>
    <div>Column 3</div>
</div>";

var pdf = renderer.RenderHtmlAsPdf(html);

Ausgabe 4: Synchrones vs. Asynchrones Rendering

wkhtmltopdf: Wrapper sind synchrone und Block-Threads.

**Lösung:**IronPDF unterstützt asynchrones Rendering:

public async Task<byte[]> GeneratePdfAsync(string html)
{
    var renderer = new ChromePdfRenderer();
    var pdf = await renderer.RenderHtmlAsPdfAsync(html);
    return pdf.BinaryData;
}

wkhtmltopdf Checkliste für die Migration

Vor der Migration anfallende Aufgaben

Überprüfen Sie Ihre Codebasis, um die Verwendung von wkhtmltopdf zu identifizieren:

# Find all wkhtmltopdf references
grep -r "Haukcode.WkHtmlToPdfDotNet\|WkHtmlToPdfDotNet\|DinkToPdf\|TuesPechkin\|Rotativa\|NReco.PdfGenerator" --include="*.cs" .
grep -r "wkhtmltopdf" --include="*.yml" --include="*.yaml" --include="Dockerfile" .
SHELL

Auffinden und Dokumentieren von wkhtmltopdf-Binärdateien zur Entfernung. Aktuelle Einstellungen des Dokuments (Papierformat, Ränder, Kopf- und Fußzeilen).

Aufgaben der Code-Aktualisierung

  1. Alle wkhtmltopdf WrapperNuGet-Pakete entfernen
  2. Entfernen von wkhtmltopdf-Binärdateien (wkhtmltopdf.exe, wkhtmltox.dll) 3.IronPDF NuGet-Paket installieren
  3. Aktualisieren Sie Namespace-Importe von Haukcode.WkHtmlToPdfDotNet (oder dem Wrapper, den Sie verwendet haben) zu IronPdf
  4. Ersetzen Sie SynchronizedConverter durch ChromePdfRenderer
  5. Konvertieren Sie HtmlToPdfDocument Muster in direkte Render-Methoden
  6. Aktualisieren Sie GlobalSettings Konfigurationen zu RenderingOptions
  7. Konvertieren Sie Randkonfigurationen von MarginSettings in einzelne Eigenschaften
  8. Aktualisieren Sie die Platzhalter-Syntax ([page]{page}, [toPage]{total-pages})
  9. IronPDF-Lizenzinitialisierung beim Start hinzufügen

Post-Migrationstests

Überprüfen Sie diese Aspekte nach der Migration:

  • Visueller Vergleich der PDF-Ausgabe (sollte mit moderner CSS-Unterstützung verbessert werden)
  • Überprüfung der modernen CSS-Darstellung (CSS Grid und Flexbox funktionieren jetzt)
  • Testen Sie JavaScript-lastige Seiten
  • Sicherheitsscan zur Bestätigung, dass keine wkhtmltopdf-Binärdateien mehr vorhanden sind
  • Lasttest für Leistungsvergleich

Sicherheitsüberprüfung

# Scan for any remaining wkhtmltopdf artifacts
find /var/www/ -name "*wkhtmlto*" 2>/dev/null
find /usr/local/bin/ -name "*wkhtmlto*" 2>/dev/null
docker images | grep wkhtmltopdf

# Check if any process is still using it
ps aux | grep wkhtmltopdf
SHELL

Die wichtigsten Vorteile der Migration zu IronPDF

Der Wechsel von wkhtmltopdf zu IronPDF bietet mehrere entscheidende Vorteile:

Sicherheit: CVE-2022-35583 und alle wkhtmltopdf-Schwachstellen wurden behoben.IronPDF hat keine bekannten CVEs und erhält regelmäßig Sicherheitsupdates.

**Moderne Rendering-Engine:**IronPDF nutzt die aktuelle Chromium-Engine und gewährleistet so volle Unterstützung für CSS3, CSS Grid, Flexbox und ES6+ JavaScript . Moderne Frameworks werden korrekt wiedergegeben.

Vereinfachte API: Direkte Rendering-Methoden ersetzen die bisherigen Dokumentkonstruktionsmuster. Eingebaute SaveAs() Methoden eliminieren die manuelle Behandlung von Bytes.

Erweiterte Funktionen: PDF-Manipulation, digitale Signaturen, PDF/A-Konformität, Wasserzeichen und Zusammenführungs-/Aufteilungsoperationen sind integrierte Funktionen, die wkhtmltopdf nicht bieten konnte.

Aktive Entwicklung: IronPDFs regelmäßige Updates verfolgen aktuelle .NET-Versionen, sodass moderne .NET- und C#-Sprachversionen unterstützt werden, sobald sie verfügbar sind.

Asynchrone Unterstützung: Verhindern Sie Thread-Blockierungen in stark ausgelasteten Webanwendungen durch native async/await-Unterstützung.

Hinweis:: DinkToPdf, NReco, Rotativa, TuesPechkin, und wkhtmltopdf sind eingetragene Marken ihrer jeweiligen Inhaber. Diese Website ist nicht verbunden mit, noch von, DinkToPdf, NReco, Rotativa, TuesPechkin oder wkhtmltopdf gesponsert oder unterstützt. Alle Produktnamen, Logos und Marken sind Eigentum ihrer jeweiligen Eigentümer. Vergleiche dienen nur zu Informationszwecken und spiegeln öffentlich zugängliche Informationen zum Zeitpunkt des Schreibens wider.
Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender Handbücher.

...
Weiterlesen

Verwandte Artikel

Key in blue circle

Holen Sie sich sofort Ihren kostenlosen 30-Tage-Testschlüssel.

Your trial license will be sent to your email address

Keine Einschränkungen. 100 % freigeschaltet. Keine Kreditkarte.

bullet_checkedIhr Testlizenzschlüssel wurde Ihnen per E-Mail gesendet.Keine Einschränkungen. 100 % freigeschaltet. Keine Kreditkarte.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Buchen Sie Ihre kostenlose Live-Demo
Booking Badge

Von Millionen von Ingenieur*innen weltweit vertraut

Kundenlogos von Iron Software
Erhalten Sie Ihre unverbindliche Beratung
Füllen Sie das Formular unten aus oder senden Sie eine E-Mail an sales@ironsoftware.com
Ihre Daten werden immer vertraulich behandelt.
Von Millionen von Ingenieur*innen weltweit vertraut
Kundenlogos von Iron Software
Erhalten Sie sofort Ihren kostenlosen 30-Tage-Testschlüssel.
Ihr Testlizenzschlüssel wurde Ihnen per E-Mail gesendet.