PORóWNANIE

Wybór biblioteki do generowania dokumentów dla .NET 8

W .NET 8 wprowadzono zmiany w środowisku uruchomieniowym, które powodują brak zgodności z wieloma tradycyjnymi bibliotekami PDF. System.Drawing.Common jest przestarzały na platformach innych niż Windows, Native AOT nakłada nowe ograniczenia na biblioteki intensywnie wykorzystujące refleksję, a model wdrażania oparty na kontenerach ujawnia problemy z zależnościami, które nie pojawiały się na komputerach programistycznych z systemem Windows. Biblioteki, które działały w .NET Framework lub nawet .NET 6, mogą nie działać z błędami NU1202, DllNotFoundException, lub PlatformNotSupportedException w .NET 8.

W tym artykułe opisano, które biblioteki PDF działają z platformą .NET 8, przedstawiono konkretne błędy, które mogą wystąpić w przypadku bibliotek niezgodnych, oraz podano konfiguracje wdrożeniowe dla Docker i Azure Functions.

Szybki start: Generowanie pliku PDF z HTML w .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

Zainstaluj przez NuGet: Install-Package IronPdf. Celuje w net8.0 bez dodatkowej konfiguracji. Wdrażane na systemach Windows, Linux, macOS, Docker i Azure bez konfiguracji specyficznej dla platformy.

Dłączego starsze biblioteki PDF nie działają w .NET 8?

iTextSharp — Niekompatybilny z .NET 8

iTextSharp (oryginalny port iText dla .NET) nie był aktualizowany od 2018 roku. Jest przeznaczony wyłącznie dla platformy .NET Framework:

Błąd NU1202: Pakiet iTextSharp 5.5.13 nie jest zgodny z net8.0

Ścieżką migracji jest iText 7, który ma inne API i wymaga zgodności z licencją AGPL (udostępnienie całej aplikacji na licencji open source) lub licencji komercyjnej. Ceny nie są podane — dane zewnętrzne sugerują, że wynoszą one od 15 000 do 210 000 dolarów rocznie.

Nadrzędki wkhtmltopdf — błędy ładowania bibliotek DLL w środowisku .NET 8

Owijki C# wokół wkhtmltopdf (DinkToPdf, Rotativa, NReco.PdfGenerator) kończą się niepowodzeniem z powodu błędów specyficznych dla platformy, które są unikalne dla modelu wdrażania .NET 8:

DinkToPdf — nie znaleziono biblioteki natywnej:

System.DllNotFoundException: Nie można załadować DLL 'libwkhtmltox'

Rotativa.AspNetCore — wymaga ręcznej konfiguracji ścieżki pliku binarnego, co koliduje z wdrożeniem opartym na kontenerach w .NET 8:

// 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 — niezgodność architektury:

System.BadImageFormatException: Nie można załadować pliku lub zestawu

Błędy te odzwierciedlają głębszy problem: wkhtmltopdf zostało zarchiwizowane w lipcu 2024 r. z niezałatanymi lukami CVE. Natywna architektura binarna powstała przed wprowadzeniem ulepszeń w wykrywaniu platformy w .NET 8. Nie ma rozwiązania — pozostaje jedynie migracja do innej biblioteki.

PdfSharp— Błędy System.Drawing.Common w systemie Linux

PdfSharp korzysta z biblioteki System.Drawing.Common, którą firma Microsoft wycofała dla platform innych niż Windows w .NET 6. W .NET 8 powoduje to błędy uruchomieniowe podczas wdrażania na systemie Linux lub w środowisku 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 pracuje nad usunięciem tej zależności, ale na początku 2026 r. obsługa wielu platform pozostaje niekompletna. W przypadku wdrożeń wyłącznie w systemie WindowsPdfSharpdziała z .NET 8. W przypadku wdrożeń w systemie Linux, Docker lub w chmurze jest to rozwiązanie zawodne.

Jakie biblioteki PDF działają z platformą .NET 8?

IronPDF— pełna obsługa .NET 8, wielopłatformowość

IronPDF celuje w net8.0 natywnie z wbudowanym silnikiem renderowania Chromium. Brak zależności od System.Drawing.Common, brak zarządzania plikami binarnymi, brak konfiguracji specyficznej dla platformy.

Minimalna integracja API (główny wzorzec .NET 8):

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

Dla zespołów używających wzorca kontrolera, ten sam kod działa wewnątrz akcji kontrolera — RenderHtmlAsPdf zwraca PdfDocument, który można przekonwertować na bajty za pomocą .BinaryData.

Licencjonowanie: Licencja wieczysta od 749 USD (Lite — 1 programista, 1 projekt). Professional: 1499 USD (10 programistów). Enterprise: 2999 USD (bez ograniczeń). Opublikowano na ironpdf.com.

QuestPDF— zgodny z .NET 8, bez HTML

QuestPDF współpracuje z platformą .NET 8 bez zależności od platformy. Jego płynny interfejs API w języku C# tworzy dokumenty programowo — bez parsera HTML, silnika CSS ani silnika przeglądarki:

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 nie konwertuje plików HTML. Jeśli w Twoim środowisku pracy wykorzystujesz szablony HTML (widoki Razor, eksporty pulpitów nawigacyjnych, archiwizacja treści internetowych), potrzebujesz innej biblioteki. Licencja społecznościowa obejmuje firmy z przychodami rocznymi poniżej 1 mln USD; powyżej tego wymagańa jest licencja komercyjna.

iText 7— Zgodny z .NET 8, Licencjonowany na AGPL

iText 7 (następca iTextSharp) wspiera .NET 8. Dodatek pdfHTML zapewnia konwersję HTML do PDF z niestandardowym parserem — nie silnik przeglądarkowy, więc nowoczesne funkcje CSS (Flexbox, Grid) nie są renderowane poprawnie.

Licencjonowanie: AGPL dla zastosowań open source, licencja komercyjna (subskrypcyjna, ceny nie publikowane) dla zastosowań własnościowych. iText przeszedł na licencjonowanie komercyjne oparte na subskrypcji w 2024 roku.

Wdrażanie Docker

Standardowy obraz Debian (zalecany)

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"]

Obraz Alpine (mniejszy rozmiar)

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"]

Obraz Debian nie wymaga dodatkowych pakietów. Obraz Alpine jest mniejszy, ale wymaga instalacji bibliotek Chromium. Dla większości wdrożeń standardowy obraz Debian jest prostszy i bardziej niezawodny.

Azure Functions (izolowany model roboczy)

.NET 8 Azure Functions używają izolowanego modelu roboczego.IronPDFwspółpracuje z tym modelem do generowania PDF na żądanie:

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

Uwaga dotycząca wdrożenia: Binarny ChromiumIronPDFdodaje ~200MB do pakietu wdrożeniowego. Plan konsumpcji Azure Functions ma limit rozmiaru wdrożenia 1,5 GB — zweryfikuj całkowity rozmiar pakietu. Dla planów Premium lub Dedykowanych ten limit nie obowiązuje. Opóźnienie zimnego startu przy pierwszym generowaniu PDF wynosi 2–5 sekund, ponieważ Chromium się inicjalizuje.

Zgodność z Native AOT

.NET 8 rozszerzyło wsparcie dla Native AOT, ale biblioteki PDF napotykają fundamentalne ograniczenia. Biblioteki oparte na Chromium (IronPDF, Puppeteer Sharp) nie mogą być kompilowane AOT, ponieważ osadzają lub uruchamiają procesy przeglądarki.iText 7używa intensywnego odbicia, co koliduje z przycinaniem.

Aktualny status z <PublishAot>true</PublishAot>:

Biblioteka Status AOT Powód
IronPDF Niekompatybilne Osadza środowisko wykonawcze Chromium
iText 7 Niekompatybilne Ciężka refleksja, dynamiczne generowanie kodu
QuestPDF Częściowy (z TrimMode=partial) Użycie pewnej refleksji
PdfSharp Niekompatybilne Zależność od System.Drawing.Common

Jeśli Native AOT jest wymaganiem bezwzględnym,QuestPDFz TrimMode=partial jest najbliższą opcją — ale tylko do programistycznego generowania dokumentów, nie konwersji HTML. Dla scenariuszy HTML do PDF, AOT nie jest obecnie wykonalny z żadną biblioteką.

Porównanie licencji

Biblioteka Model Koszt Wsparcie dla .NET 8
IronPDF Wieczysta $749 (Lite) / $1,499 (Pro) / $2,999 (Enterprise) Pełna
iText 7 AGPL lub Subskrypcja Nie publikowane (szacowane na $15K–$210K/rocznie) Pełna
QuestPDF Społecznościowa / Komercyjna Bezpłatna < $1M dochodu, potem komercyjna Pełna
PdfSharp MIT (bezpłatne) $0 Tylko dla Windows (Linux niekompletny)
Aspose.PDF Na programistę ~$999+ Pełne (problemy z pamięcią w Linux)

Kompatybilność z .NET 9

.NET 9 (wydany w listopadzie 2025) kontynuuje wzorce ustalone w .NET 8. Biblioteki, które działają z .NET 8, ogólnie działają z .NET 9 bez zmian. Kluczowe dodatki w .NET 9 związane z generowaniem PDF to ulepszenie wydajności ARM64 (korzystne dla renderowania opartego na Chromium na Apple Silicon i AWS Graviton) oraz kontynuacja ulepszeń Native AOT (choć fundamentalne ograniczenia dla bibliotek PDF pozostają).

Jeśli docelowym systemem jest .NET 9 lub planujesz aktualizację, wybór biblioteki, która w pełni wspiera wdrożenia międzyplatformowe w .NET 8, jest najbezpieczniejszą ścieżką. Biblioteki z problemami specyficznymi dla platform (PdfSharp w Linux, Aspose z libgdiplus) raczej nie rozwiążą tych problemów w .NET 9, ponieważ podstawowe wycofanie zależności jest trwałe.

Przewodnik migracji

Z iTextSharp do 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

Z wkhtmltopdf Wrappers do 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

Powierzchnia API jest prostsza w obu przypadkach. Głównym kosztem migracji jest testowanie istniejących szablonów HTML z nowym silnikiem renderowania, aby zweryfikować, czy wynik odpowiada oczekiwaniom.

Rekomendacja

Dla projektów .NET 8 wymagających konwersji HTML do PDF:IronPDFzapewnia wbudowane renderowanie Chromium, które działa międzyplatformowo bez konfiguracji. Obsługuje wdrożenia Docker, Azure Functions i kontenery Linux bezpośrednio.

Dla projektów .NET 8 budujących dokumenty programistycznie z danych: Fluent APIQuestPDFjest dobrze zaprojektowane i zgodne z .NET 8, a Licencja Społecznościowa obejmuje większość startupów i małych zespołów.

Do manipulacji PDF (łączenie, dzielenie, formularze) na Windows:PdfSharppozostaje wykonalny, jeśli docelowym systemem wdrożenia jest tylko Windows.

Unikaj iTextSharp (niekompatybilne), opakowań wkhtmltopdf (zarchiwizowane, CVE) oraz jakiejkolwiek biblioteki zależnej od System.Drawing.Common do wdrożenia międzyplatformowego.