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 za pomocą 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?

iText— Niekompatybilne z .NET 8

iText (oryginalny port .NET z iText) nie był aktualizowany od 2018 roku. Jest przeznaczony tylko dla .NET Framework:

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

Ścieżką migracji jest iText, które posiada inne API i wymaga zgodności z AGPL (opublikowania całej aplikacji jako 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— Problemy z System.Drawing.Common na Linux

PDFSharp zależy od System.Drawing.Common, które Microsoft zdeprecjował dla platform innych niż Windows w .NET 6. W .NET 8, to powoduje błędy w czasie wykonywania podczas wdrażania na Linux lub 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 wsparcie międzyplatformowe jest wciąż niekompletne na początku 2026 roku. Dla wdrożeń tylko na Windows,PDFSharpdziała z .NET 8. Dla Linux, Docker lub wdrożeń w chmurze jest to niewiarygodne.

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 renderowaniem 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 konwertować na bajty za pomocą .BinaryData.

Licencjonowanie: Licencja wieczysta zaczyna się od $2,998 (Lite — 1 deweloper, 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 wymagana jest licencja komercyjna.

iText— Kompatybilne z .NET 8, Licencjonowane AGPL

iText (następca iText) wspiera .NET 8. Dodatek pdfHTML zapewnia konwersję z HTML do PDF z niestandardowym parserem — nie jest to silnik przeglądarki, więc nowoczesne funkcje CSS (Flexbox, Grid) nie renderują się poprawnie.

Licencjonowanie: AGPL dla zastosowań open source, licencja komercyjna (subskrypcyjna, ceny nie publikowane) dla zastosowań własnościowych.iTextprzeszedł 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.iTextużywa rozległej refleksji, która koliduje z przycinaniem.

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

BibliotekaStatus AOTPowód
IronPDFNiekompatybilneOsadza środowisko wykonawcze Chromium
iTextNiekompatybilneCiężka refleksja, dynamiczne generowanie kodu
QuestPDFCzęściowe (z TrimMode=partial)Użycie pewnej refleksji
PDFSharpNiekompatybilneZależność od System.Drawing.Common

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

Porównanie licencji

BibliotekaModelKosztWsparcie dla .NET 8
IronPDFWieczysta$2,998 (Lite) / $1,499 (Pro) / $2,999 (Enterprise)Pełna
iTextAGPL lub SubskrypcjaNie publikowane (szacowane na $15K–$210K/rocznie)Pełna
QuestPDFSpołecznościowa / KomercyjnaBezpłatna < $1M dochodu, potem komercyjnaPełna
PDFSharpMIT (bezpłatne)$0Tylko dla Windows (Linux niekompletny)
Aspose.PDFNa 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 platformowo-specyficznymi problemami (PDFSharp na Linux, Aspose z libgdiplus) mogą nie rozwiązać tych problemów w .NET 9, ponieważ deprecjacja podstawowej zależności jest trwała.

Przewodnik migracji

OdiTextdo 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.

Dla manipulacji PDF (scalanie, rozdzielanie, formy) na Windows:PDFSharppozostaje wykonalny, jeśli twoim celem wdrożeniowym jest tylko Windows.

UnikajiText(niekompatybilny), obwolut wkhtmltopdf (archiwizowane, CVEs) i wszelkich bibliotek zależnych od System.Drawing.Common dla wdrożeń międzyplatformowych.

Zwróć uwagęAspose, DinkToPdf, NReco, PDFSharp, PuppeteerSharp, QuestPDF, Rotativa, TuesPechkin,iTexti wkhtmltopdf są zarejestrowanymi znakami towarowymi ich właścicieli. Ta strona nie jest powiązana, wspierana ani sponsorowana przez Aspose Pty Ltd, CodeFlint, DinkToPdf, NReco, PuppeteerSharp, Rotativa, TuesPechkin, empira Software GmbH,iTextGroup ani wkhtmltopdf. Wszystkie nazwy produktów, logo i marki są własnością ich odpowiednich właścicieli. Porównania mają charakter wyłącznie informacyjny i odzwierciedlają informacje dostępne publicznie w momencie pisania.