VERGLEICH

Auswahl einer Dokumentenerstellungsbibliothek für .NET 8

mit .NET 8 wurden Laufzeitänderungen eingeführt, die die Kompatibilität mit vielen herkömmlichen PDF-Bibliotheken aufheben. System.Drawing.Common ist auf Nicht-Windows-Plattformen veraltet, Native AOT stellt neue Anforderungen an reflexionslastige Bibliotheken und das Container-First-Deployment-Modell bringt Abhängigkeitsprobleme mit sich, die auf Windows-Entwicklungsmaschinen nicht auftraten. Bibliotheken, die in .NET Framework oder sogar .NET 6 funktionierten, können in .NET 8 mit den Fehlern NU1202, DllNotFoundException oder PlatformNotSupportedException fehlschlagen.

Dieser Artikel dokumentiert, welche PDF-Bibliotheken mit .NET 8 funktionieren, zeigt die spezifischen Fehler auf, die bei inkompatiblen Bibliotheken auftreten, und bietet Bereitstellungskonfigurationen für Docker und Azure Functions.

Schnellstart: Erzeugen von PDF aus HTML in .NET 8

using IronPdf;

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;

var pdf = renderer.RenderHtmlAsPdf(@"
    <html>
    <head><style>
        body { font-family: 'Segoe UI', sans-serif; padding: 40px; }
        h1 { color: #2563eb; }
        table { width: 100%; border-collapse: collapse; margin-top: 20px; }
        th { background: #2563eb; color: white; padding: 12px; text-align: left; }
        td { padding: 10px; border-bottom: 1px solid #e5e7eb; }
    </style></head>
    <body>
        <h1>Q4 Report</h1>
        <table>
            <tr><th>Metric</th><th>Value</th><th>Change</th></tr>
            <tr><td>Revenue</td><td>$1.2M</td><td>+12%</td></tr>
            <tr><td>Users</td><td>45,230</td><td>+23%</td></tr>
        </table>
    </body></html>");

pdf.SaveAs("report.pdf");
using IronPdf;

var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4;

var pdf = renderer.RenderHtmlAsPdf(@"
    <html>
    <head><style>
        body { font-family: 'Segoe UI', sans-serif; padding: 40px; }
        h1 { color: #2563eb; }
        table { width: 100%; border-collapse: collapse; margin-top: 20px; }
        th { background: #2563eb; color: white; padding: 12px; text-align: left; }
        td { padding: 10px; border-bottom: 1px solid #e5e7eb; }
    </style></head>
    <body>
        <h1>Q4 Report</h1>
        <table>
            <tr><th>Metric</th><th>Value</th><th>Change</th></tr>
            <tr><td>Revenue</td><td>$1.2M</td><td>+12%</td></tr>
            <tr><td>Users</td><td>45,230</td><td>+23%</td></tr>
        </table>
    </body></html>");

pdf.SaveAs("report.pdf");
Imports IronPdf

Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = IronPdf.Rendering.PdfPaperSize.A4

Dim pdf = renderer.RenderHtmlAsPdf("
    <html>
    <head><style>
        body { font-family: 'Segoe UI', sans-serif; padding: 40px; }
        h1 { color: #2563eb; }
        table { width: 100%; border-collapse: collapse; margin-top: 20px; }
        th { background: #2563eb; color: white; padding: 12px; text-align: left; }
        td { padding: 10px; border-bottom: 1px solid #e5e7eb; }
    </style></head>
    <body>
        <h1>Q4 Report</h1>
        <table>
            <tr><th>Metric</th><th>Value</th><th>Change</th></tr>
            <tr><td>Revenue</td><td>$1.2M</td><td>+12%</td></tr>
            <tr><td>Users</td><td>45,230</td><td>+23%</td></tr>
        </table>
    </body></html>")

pdf.SaveAs("report.pdf")
$vbLabelText   $csharpLabel

Installation über NuGet: Install-Package IronPdf. Ziel ist net8.0 ohne zusätzliche Konfiguration. Kann auf Windows, Linux, macOS, Docker und Azure ohne plattformspezifisches Setup bereitgestellt werden.

Warum scheitern ältere PDF-Bibliotheken in .NET 8?

iTextSharp - Nicht kompatibel mit .NET 8

iTextSharp (die ursprüngliche .NET-Portierung von iText) ist seit 2018 nicht mehr aktualisiert worden. Es zielt nur auf .NET Framework ab:

fehler NU1202: Das Paket iTextSharp 5.5.13 ist nicht kompatibel mit net8.0

Der Migrationspfad ist iText 7, das eine andere API hat und entweder AGPL-Konformität (Open-Source Ihrer gesamten Anwendung) oder eine kommerzielle Lizenzierung erfordert. Die Preise werden nicht veröffentlicht - Daten von Drittanbietern deuten auf $15.000-$210.000/Jahr hin.

wkhtmltopdf Wrappers - DLL-Ladefehler unter .NET 8

C#-Wrapper um wkhtmltopdf (DinkToPdf, Rotativa, NReco.PdfGenerator) schlagen mit plattformspezifischen Fehlern fehl, die nur im .NET 8-Bereitstellungsmodell auftreten:

DinkToPdf - native Bibliothek nicht gefunden:

System.DllNotFoundException: DLL 'libwkhtmltox' kann nicht geladen werden

Rotativa.AspNetCore - erfordert eine manuelle Konfiguration des Binärpfads, die mit der Container-First-Bereitstellung von .NET 8 in Konflikt steht:

// This pattern requires deploying wkhtmltopdf binaries alongside your app
// and breaks in Docker containers without explicit path configuration
RotativaConfiguration.Setup(env.WebRootPath, "wkhtmltopdf");
// This pattern requires deploying wkhtmltopdf binaries alongside your app
// and breaks in Docker containers without explicit path configuration
RotativaConfiguration.Setup(env.WebRootPath, "wkhtmltopdf");
' This pattern requires deploying wkhtmltopdf binaries alongside your app
' and breaks in Docker containers without explicit path configuration
RotativaConfiguration.Setup(env.WebRootPath, "wkhtmltopdf")
$vbLabelText   $csharpLabel

TuesPechkin / NReco - Unstimmigkeiten in der Architektur:

System.BadImageFormatException: Datei oder Baugruppe konnte nicht geladen werden

Diese Fehler spiegeln ein tiefer liegendes Problem wider: wkhtmltopdf wurde im Juli 2024 archiviert mit ungepatchten CVEs. Die native Binärarchitektur ist älter als die Verbesserungen der Plattformerkennung von .NET 8. Es gibt keinen Fix - nur die Migration zu einer anderen Bibliothek.

PdfSharp - System.Drawing.Common Failures unter Linux

PdfSharp hängt von System.Drawing.Common ab, das Microsoft in .NET 6 für Nicht-Windows-Plattformen abgelehnt hat. In .NET 8 führt dies zu Laufzeitfehlern bei der Bereitstellung unter Linux oder Docker:

using PdfSharp.Pdf;
using PdfSharp.Drawing;

var document = new PdfDocument();
// PlatformNotSupportedException on Linux:
// System.Drawing.Common is not supported on this platform
using PdfSharp.Pdf;
using PdfSharp.Drawing;

var document = new PdfDocument();
// PlatformNotSupportedException on Linux:
// System.Drawing.Common is not supported on this platform
Imports PdfSharp.Pdf
Imports PdfSharp.Drawing

Dim document As New PdfDocument()
' PlatformNotSupportedException on Linux:
' System.Drawing.Common is not supported on this platform
$vbLabelText   $csharpLabel

PdfSharp 6.x hat an der Beseitigung dieser Abhängigkeit gearbeitet, aber die plattformübergreifende Unterstützung bleibt bis Anfang 2026 unvollständig. Bei reinen Windows-Bereitstellungen arbeitet PdfSharp mit .NET 8. Für Linux-, Docker- oder Cloud-Bereitstellungen ist es unzuverlässig.

Welche PDF-Bibliotheken funktionieren mit .NET 8?

IronPDF- Volle Unterstützung für .NET 8, plattformübergreifend

IronPDF zielt auf net8.0 mit eingebettetem Chromium-Rendering. Keine System.Drawing.Common-Abhängigkeit, keine native Binärverwaltung, keine plattformspezifische Konfiguration.

Minimale API-Integration (das primäre .NET 8-Muster):

using IronPdf;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/invoice/{id}/pdf", async (int id, InvoiceService service) =>
{
    var invoice = await service.GetInvoiceAsync(id);
    var renderer = new ChromePdfRenderer();

    var pdf = renderer.RenderHtmlAsPdf(invoice.ToHtml());

    return Results.File(pdf.BinaryData, "application/pdf", $"invoice-{id}.pdf");
});

app.Run();
using IronPdf;

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/invoice/{id}/pdf", async (int id, InvoiceService service) =>
{
    var invoice = await service.GetInvoiceAsync(id);
    var renderer = new ChromePdfRenderer();

    var pdf = renderer.RenderHtmlAsPdf(invoice.ToHtml());

    return Results.File(pdf.BinaryData, "application/pdf", $"invoice-{id}.pdf");
});

app.Run();
Imports IronPdf

Dim builder = WebApplication.CreateBuilder(args)
Dim app = builder.Build()

app.MapGet("/invoice/{id}/pdf", Async Function(id As Integer, service As InvoiceService) 
    Dim invoice = Await service.GetInvoiceAsync(id)
    Dim renderer = New ChromePdfRenderer()

    Dim pdf = renderer.RenderHtmlAsPdf(invoice.ToHtml())

    Return Results.File(pdf.BinaryData, "application/pdf", $"invoice-{id}.pdf")
End Function)

app.Run()
$vbLabelText   $csharpLabel

Für Teams, die das Controller-Muster verwenden, funktioniert derselbe Code innerhalb einer Controller-Aktion - RenderHtmlAsPdf gibt ein PdfDocument zurück, das mit .BinaryData in Bytes umgewandelt werden kann.

Lizenzierung: Unbefristete Lizenz ab $749 (Lite - 1 Entwickler, 1 Projekt). Professional: 1.499 $ (10 Entwickler). Enterprise: $2.999 (unbegrenzt). Veröffentlicht auf ironPdf.com.

QuestPDF - .NET 8-kompatibel, kein HTML

QuestPDF arbeitet mit .NET 8 ohne Plattformabhängigkeiten. Die fließende C#-API erstellt Dokumente programmatisch - kein HTML-Parser, keine CSS-Engine, keine Browser-Engine:

using QuestPDF.Fluent;
using QuestPDF.Infrastructure;

QuestPDF.Settings.License = LicenseType.Community; // Free under $1M revenue

Document.Create(container =>
{
    container.Page(page =>
    {
        page.Size(PageSizes.A4);
        page.Margin(2, Unit.Centimetre);
        page.Content().Column(col =>
        {
            col.Item().Text("Q4 Report").FontSize(24).Bold();
            col.Item().Table(table =>
            {
                table.ColumnsDefinition(c => { c.RelativeColumn(2); c.RelativeColumn(1); c.RelativeColumn(1); });
                table.Header(h =>
                {
                    h.Cell().Text("Metric").Bold();
                    h.Cell().Text("Value").Bold();
                    h.Cell().Text("Change").Bold();
                });
                table.Cell().Text("Revenue"); table.Cell().Text("$1.2M"); table.Cell().Text("+12%");
                table.Cell().Text("Users"); table.Cell().Text("45,230"); table.Cell().Text("+23%");
            });
        });
    });
}).GeneratePdf("report.pdf");
using QuestPDF.Fluent;
using QuestPDF.Infrastructure;

QuestPDF.Settings.License = LicenseType.Community; // Free under $1M revenue

Document.Create(container =>
{
    container.Page(page =>
    {
        page.Size(PageSizes.A4);
        page.Margin(2, Unit.Centimetre);
        page.Content().Column(col =>
        {
            col.Item().Text("Q4 Report").FontSize(24).Bold();
            col.Item().Table(table =>
            {
                table.ColumnsDefinition(c => { c.RelativeColumn(2); c.RelativeColumn(1); c.RelativeColumn(1); });
                table.Header(h =>
                {
                    h.Cell().Text("Metric").Bold();
                    h.Cell().Text("Value").Bold();
                    h.Cell().Text("Change").Bold();
                });
                table.Cell().Text("Revenue"); table.Cell().Text("$1.2M"); table.Cell().Text("+12%");
                table.Cell().Text("Users"); table.Cell().Text("45,230"); table.Cell().Text("+23%");
            });
        });
    });
}).GeneratePdf("report.pdf");
Imports QuestPDF.Fluent
Imports QuestPDF.Infrastructure

QuestPDF.Settings.License = LicenseType.Community ' Free under $1M revenue

Document.Create(Sub(container)
    container.Page(Sub(page)
        page.Size(PageSizes.A4)
        page.Margin(2, Unit.Centimetre)
        page.Content().Column(Sub(col)
            col.Item().Text("Q4 Report").FontSize(24).Bold()
            col.Item().Table(Sub(table)
                table.ColumnsDefinition(Sub(c)
                    c.RelativeColumn(2)
                    c.RelativeColumn(1)
                    c.RelativeColumn(1)
                End Sub)
                table.Header(Sub(h)
                    h.Cell().Text("Metric").Bold()
                    h.Cell().Text("Value").Bold()
                    h.Cell().Text("Change").Bold()
                End Sub)
                table.Cell().Text("Revenue")
                table.Cell().Text("$1.2M")
                table.Cell().Text("+12%")
                table.Cell().Text("Users")
                table.Cell().Text("45,230")
                table.Cell().Text("+23%")
            End Sub)
        End Sub)
    End Sub)
End Sub).GeneratePdf("report.pdf")
$vbLabelText   $csharpLabel

QuestPDF konvertiert kein HTML. Wenn Ihr Arbeitsablauf HTML-Vorlagen verwendet (Razor-Ansichten, Dashboard-Exporte, Archivierung von Webinhalten), benötigen Sie eine andere Bibliothek. Die Community-Lizenz gilt für Unternehmen mit einem Jahresumsatz von weniger als 1 Million US-Dollar; darüber hinaus ist eine kommerzielle Lizenzierung erforderlich.

iText 7 - .NET 8-kompatibel, AGPL-lizenziert

iText 7 (der Nachfolger von iTextSharp) unterstützt .NET 8. Das pdfHTML-Add-on bietet eine HTML-zu-PDF-Konvertierung mit einem benutzerdefinierten Parser - nicht mit einer Browser-Engine, sodass moderne CSS-Funktionen (Flexbox, Grid) nicht korrekt dargestellt werden.

Lizenzierung: AGPL für Open-Source-Nutzung, kommerzielle Lizenzierung (Abonnement, Preise nicht veröffentlicht) für proprietäre Anwendungen. iText wird 2024 auf eine kommerzielle Lizenzierung auf Abonnementbasis umgestellt.

Docker-Bereitstellung

Standard-Debian-Abbild (empfohlen)

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY ["MyApp.csproj", "."]
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o /app/publish

FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app

#IronPDFworks without additional apt-get installs
# Chromium dependencies are handled internally

COPY --from=build /app/publish .

ENV DOTNET_RUNNING_IN_CONTAINER=true
EXPOSE 8080
ENTRYPOINT ["dotnet", "MyApp.dll"]

Alpine Image (Kleinerer Fußabdruck)

FROM mcr.microsoft.com/dotnet/sdk:8.0-alpine AS build
WORKDIR /src
COPY ["MyApp.csproj", "."]
RUN dotnet restore
COPY . .
RUN dotnet publish -c Release -o /app/publish

FROM mcr.microsoft.com/dotnet/aspnet:8.0-alpine
WORKDIR /app

# Alpine requires explicit Chromium dependencies
RUN apk add --no-cache chromium nss freetype harfbuzz ca-certificates ttf-freefont

COPY --from=build /app/publish .
ENTRYPOINT ["dotnet", "MyApp.dll"]

Das Debian-Image erfordert keine zusätzlichen Pakete. Das Alpine-Image ist kleiner, erfordert aber eine explizite Installation der Chromium-Bibliothek. Für die meisten Einsätze ist das Standard-Debian-Image einfacher und zuverlässiger.

Azure-Funktionen (Isolated Worker)

.NET 8 Azure Functions verwenden das isolierte Worker-Modell.IronPDFarbeitet mit diesem Modell für die On-Demand-PDF-Generierung:

using IronPdf;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;

namespace MyApp.Functions;

public class PdfFunctions
{
    [Function("GenerateInvoice")]
    public async Task<HttpResponseData> GenerateInvoice(
        [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req)
    {
        var invoice = await req.ReadFromJsonAsync<InvoiceRequest>();

        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(BuildInvoiceHtml(invoice));

        var response = req.CreateResponse(System.Net.HttpStatusCode.OK);
        response.Headers.Add("Content-Type", "application/pdf");
        response.Headers.Add("Content-Disposition",
            $"attachment; filename=invoice-{invoice.Id}.pdf");
        await response.Body.WriteAsync(pdf.BinaryData);

        return response;
    }

    private string BuildInvoiceHtml(InvoiceRequest invoice)
    {
        return $@"<html><body>
            <h1>Invoice #{invoice.Id}</h1>
            <p>Amount: ${invoice.Amount:F2}</p>
        </body></html>";
    }
}

public record InvoiceRequest(string Id, decimal Amount);
using IronPdf;
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;

namespace MyApp.Functions;

public class PdfFunctions
{
    [Function("GenerateInvoice")]
    public async Task<HttpResponseData> GenerateInvoice(
        [HttpTrigger(AuthorizationLevel.Function, "post")] HttpRequestData req)
    {
        var invoice = await req.ReadFromJsonAsync<InvoiceRequest>();

        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(BuildInvoiceHtml(invoice));

        var response = req.CreateResponse(System.Net.HttpStatusCode.OK);
        response.Headers.Add("Content-Type", "application/pdf");
        response.Headers.Add("Content-Disposition",
            $"attachment; filename=invoice-{invoice.Id}.pdf");
        await response.Body.WriteAsync(pdf.BinaryData);

        return response;
    }

    private string BuildInvoiceHtml(InvoiceRequest invoice)
    {
        return $@"<html><body>
            <h1>Invoice #{invoice.Id}</h1>
            <p>Amount: ${invoice.Amount:F2}</p>
        </body></html>";
    }
}

public record InvoiceRequest(string Id, decimal Amount);
Imports IronPdf
Imports Microsoft.Azure.Functions.Worker
Imports Microsoft.Azure.Functions.Worker.Http

Namespace MyApp.Functions

    Public Class PdfFunctions

        <Function("GenerateInvoice")>
        Public Async Function GenerateInvoice(
            <HttpTrigger(AuthorizationLevel.Function, "post")> req As HttpRequestData) As Task(Of HttpResponseData)

            Dim invoice = Await req.ReadFromJsonAsync(Of InvoiceRequest)()

            Dim renderer = New ChromePdfRenderer()
            Dim pdf = renderer.RenderHtmlAsPdf(BuildInvoiceHtml(invoice))

            Dim response = req.CreateResponse(System.Net.HttpStatusCode.OK)
            response.Headers.Add("Content-Type", "application/pdf")
            response.Headers.Add("Content-Disposition", $"attachment; filename=invoice-{invoice.Id}.pdf")
            Await response.Body.WriteAsync(pdf.BinaryData)

            Return response
        End Function

        Private Function BuildInvoiceHtml(invoice As InvoiceRequest) As String
            Return $"<html><body>
            <h1>Invoice #{invoice.Id}</h1>
            <p>Amount: ${invoice.Amount:F2}</p>
        </body></html>"
        End Function

    End Class

    Public Class InvoiceRequest
        Public Property Id As String
        Public Property Amount As Decimal

        Public Sub New(id As String, amount As Decimal)
            Me.Id = id
            Me.Amount = amount
        End Sub
    End Class

End Namespace
$vbLabelText   $csharpLabel

Berücksichtigung der Bereitstellung: Die Chromium-Binärdatei vonIronPDFfügt dem Bereitstellungspaket ~200 MB hinzu. Der Azure Functions-Verbrauchsplan hat eine Größenbeschränkung von 1,5 GB für die Bereitstellung - überprüfen Sie die Gesamtgröße Ihres Pakets. Für Premium- oder Dedicated-Tarife gilt diese Begrenzung nicht. Die Kaltstart-Latenzzeit für die erste PDF-Generierung beträgt 2-5 Sekunden, wenn Chromium initialisiert wird.

Native AOT-Kompatibilität

mit .NET 8 wurde die native AOT-Unterstützung erweitert, aber PDF-Bibliotheken unterliegen grundlegenden Beschränkungen. Chromium-basierte Bibliotheken (IronPDF, Puppeteer Sharp) können AOT nicht kompilieren, da sie Browserprozesse einbetten oder erzeugen. iText 7 verwendet umfangreiche Reflexionen, die mit dem Trimmen in Konflikt stehen.

Aktueller Stand mit <PublishAot>true</PublishAot>:

Bibliothek AOT-Status Grund
IronPDF Nicht kompatibel Einbettung der Chromium-Laufzeitumgebung
iText 7 Nicht kompatibel Starke Reflexion, dynamische Codegenerierung
QuestPDF Teilweise (mit TrimMode=partial) Einige Überlegungen zur Verwendung
PdfSharp Nicht kompatibel System.Drawing.Common-Abhängigkeit

Wenn Native AOT eine harte Anforderung ist, ist QuestPDF mit TrimMode=partial die nächstliegende Option - allerdings nur für die programmatische Dokumentenerzeugung, nicht für die HTML-Konvertierung. Für HTML-zu-PDF-Szenarien ist AOT derzeit mit keiner Bibliothek realisierbar.

Vergleich der Lizenzen

Bibliothek Modell Kosten .NET 8-Unterstützung
IronPDF Immerwährende 749 € (Lite) / 1.499 € (Pro) / 2.999 € (Enterprise) Voll
iText 7 AGPL oder Abonnement Nicht veröffentlicht ($15K-$210K/Jahr geschätzt) Voll
QuestPDF Gemeinschaft / Kommerziell Kostenlos <$1M Umsatz, dann kommerziell Voll
PdfSharp MIT (kostenlos) $0 Nur Windows (Linux unvollständig)
Aspose.PDF Pro-Entwickler ~$999+ Vollständig (Linux-Speicherprobleme)

.NET 9 Vorwärtskompatibilität

.NET 9 (veröffentlicht im November 2025) führt die in .NET 8 etablierten Muster fort. Bibliotheken, die mit .NET 8 funktionieren, funktionieren im Allgemeinen ohne Änderungen mit .NET 9. Die wichtigsten Ergänzungen von .NET 9, die für die PDF-Erzeugung relevant sind, sind die verbesserte ARM64-Leistung (Vorteile des Chromium-basierten Renderings auf Apple Silicon und AWS Graviton) und weitere Verbesserungen von Native AOT (obwohl die grundlegenden Einschränkungen für PDF-Bibliotheken bestehen bleiben).

Wenn Sie auf .NET 9 abzielen oder ein Upgrade planen, ist die Auswahl einer Bibliothek, die die plattformübergreifende Bereitstellung von .NET 8 vollständig unterstützt, der sicherste Weg. Bei Bibliotheken mit plattformspezifischen Problemen (PdfSharp unter Linux, Aspose mit libgdiplus) ist es unwahrscheinlich, dass diese Probleme in .NET 9 gelöst werden, da die zugrundeliegenden Abhängigkeiten dauerhaft veraltet sind.

Migrationsanleitung

Von iTextSharp zu IronPDF

// Before (iTextSharp — doesn't compile against net8.0)
using iTextSharp.text;
using iTextSharp.text.pdf;

var doc = new Document();
PdfWriter.GetInstance(doc, new FileStream("output.pdf", FileMode.Create));
doc.Open();
doc.Add(new Paragraph("Hello World"));
doc.Close();

// After (IronPDF — targets net8.0)
using IronPdf;

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<p>Hello World</p>");
pdf.SaveAs("output.pdf");
// Before (iTextSharp — doesn't compile against net8.0)
using iTextSharp.text;
using iTextSharp.text.pdf;

var doc = new Document();
PdfWriter.GetInstance(doc, new FileStream("output.pdf", FileMode.Create));
doc.Open();
doc.Add(new Paragraph("Hello World"));
doc.Close();

// After (IronPDF — targets net8.0)
using IronPdf;

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<p>Hello World</p>");
pdf.SaveAs("output.pdf");
Imports iTextSharp.text
Imports iTextSharp.text.pdf
Imports IronPdf
Imports System.IO

' Before (iTextSharp — doesn't compile against net8.0)
Dim doc As New Document()
PdfWriter.GetInstance(doc, New FileStream("output.pdf", FileMode.Create))
doc.Open()
doc.Add(New Paragraph("Hello World"))
doc.Close()

' After (IronPDF — targets net8.0)
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<p>Hello World</p>")
pdf.SaveAs("output.pdf")
$vbLabelText   $csharpLabel

Von wkhtmltopdf Wrappers zu IronPDF

// Before (DinkToPdf — DllNotFoundException on .NET 8)
var converter = new SynchronizedConverter(new PdfTools());
var doc = new HtmlToPdfDocument
{
    Objects = { new ObjectSettings { HtmlContent = html } }
};
var bytes = converter.Convert(doc);

// After (IronPDF — native .NET 8 support)
using IronPdf;

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
var bytes = pdf.BinaryData;
// Before (DinkToPdf — DllNotFoundException on .NET 8)
var converter = new SynchronizedConverter(new PdfTools());
var doc = new HtmlToPdfDocument
{
    Objects = { new ObjectSettings { HtmlContent = html } }
};
var bytes = converter.Convert(doc);

// After (IronPDF — native .NET 8 support)
using IronPdf;

var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
var bytes = pdf.BinaryData;
Imports IronPdf

' Before (DinkToPdf — DllNotFoundException on .NET 8)
Dim converter = New SynchronizedConverter(New PdfTools())
Dim doc = New HtmlToPdfDocument With {
    .Objects = {New ObjectSettings With {.HtmlContent = html}}
}
Dim bytes = converter.Convert(doc)

' After (IronPDF — native .NET 8 support)
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
bytes = pdf.BinaryData
$vbLabelText   $csharpLabel

Die API-Oberfläche ist in beiden Fällen einfacher. Die Hauptkosten für die Migration bestehen darin, Ihre vorhandenen HTML-Vorlagen mit dem neuen Renderer zu testen, um zu überprüfen, ob die Ausgabe den Erwartungen entspricht.

Die Empfehlung

Für .NET 8-Projekte, die eine HTML-zu-PDF-Konvertierung erfordern:IronPDFbietet eingebettetes Chromium-Rendering, das plattformübergreifend ohne Konfiguration funktioniert. Die Software beherrscht Docker Deployment, Azure Functions und Linux-Container von Haus aus.

Für .NET 8-Projekte, die Dokumente programmatisch aus Daten erstellen: Die fließende API von QuestPDF ist gut durchdacht und mit .NET 8 kompatibel, wobei die Community License die meisten Startups und kleinen Teams abdeckt.

Für die PDF-Bearbeitung (Zusammenführen, Teilen, Formulare) unter Windows: PdfSharp bleibt praktikabel, wenn Ihr Einsatzziel nur Windows ist.

Vermeiden Sie iTextSharp (nicht kompatibel), wkhtmltopdf-Wrapper (archiviert, CVEs) und alle Bibliotheken, die auf System.Drawing.Common für den plattformübergreifenden Einsatz angewiesen sind.