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")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")TuesPechkin / NReco — niezgodność architektury:
System.BadImageFormatException: Nie można załadować pliku lub zestawuBłę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 platformusing PdfSharp.Pdf;
using PdfSharp.Drawing;
var document = new PdfDocument();
// PlatformNotSupportedException on Linux:
// System.Drawing.Common is not supported on this platformImports PdfSharp.Pdf
Imports PdfSharp.Drawing
Dim document As New PdfDocument()
' PlatformNotSupportedException on Linux:
' System.Drawing.Common is not supported on this platformPDFSharp 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()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")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 NamespaceUwaga 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>:
| Biblioteka | Status AOT | Powód |
|---|---|---|
| IronPDF | Niekompatybilne | Osadza środowisko wykonawcze Chromium |
| iText | Niekompatybilne | Ciężka refleksja, dynamiczne generowanie kodu |
| QuestPDF | Częściowe (z TrimMode=partial) | Użycie pewnej refleksji |
| PDFSharp | Niekompatybilne | Zależ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
| Biblioteka | Model | Koszt | Wsparcie dla .NET 8 |
|---|---|---|---|
| IronPDF | Wieczysta | $2,998 (Lite) / $1,499 (Pro) / $2,999 (Enterprise) | Pełna |
| iText | 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 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")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.BinaryDataPowierzchnia 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.
