Choisir une bibliothèque de génération de documents pour .NET 8
.NET 8 a introduit des changements au niveau de l'exécution qui rompent la compatibilité avec de nombreuses bibliothèques PDF traditionnelles. System.Drawing.Common est obsolète sur les plateformes non Windows, Native AOT impose de nouvelles contraintes sur les bibliothèques à forte réflexion, et le modèle de déploiement "container-first" expose des problèmes de dépendance qui n'apparaissaient pas sur les machines de développement Windows. Les bibliothèques qui fonctionnaient dans .NET Framework ou même .NET 6 peuvent échouer avec des erreurs NU1202, DllNotFoundException, ou PlatformNotSupportedException dans .NET 8.
Cet article indique quelles bibliothèques PDF fonctionnent avec .NET 8, montre les erreurs spécifiques que vous rencontrerez avec des bibliothèques incompatibles et fournit des configurations de déploiement pour Docker et Azure Functions.
Démarrage rapide : Générer un PDF à partir de HTML en .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")
Installation via NuGet : Install-Package IronPdf. Cible net8.0 sans configuration supplémentaire. Déploiement sur Windows, Linux, macOS, Docker et Azure sans configuration spécifique à la plateforme.
Pourquoi les anciennes bibliothèques PDF échouent-elles dans .NET 8?
iTextSharp - Non compatible avec .NET 8
iTextSharp (le portage .NET original d'iText) n'a pas été mis à jour depuis 2018. Il cible uniquement le .NET Framework :
erreur NU1202 : Le paquet iTextSharp 5.5.13 n'est pas compatible avec net8.0
Le chemin de migration est iText 7, qui a une API différente et nécessite soit la conformité AGPL (open-source de l'ensemble de l'application), soit une licence commerciale. Le prix n'est pas publié - des données de tiers suggèrent 15 000 à 210 000 dollars par an.
wkhtmltopdf Wrappers - DLL Loading Failures on .NET 8 (en anglais)
Les wrappers C# autour de wkhtmltopdf (DinkToPdf, Rotativa, NReco.PdfGenerator) échouent avec des erreurs spécifiques à la plateforme qui sont propres au modèle de déploiement de .NET 8 :
DinkToPdf - bibliothèque native non trouvée :
System.DllNotFoundException : Impossible de charger la DLL 'libwkhtmltox'
Rotativa.AspNetCore - nécessite une configuration manuelle du chemin binaire qui entre en conflit avec le déploiement en conteneur de .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 - inadéquation de l'architecture :
System.BadImageFormatException : Impossible de charger le fichier ou l'assemblage
Ces erreurs reflètent un problème plus profond : wkhtmltopdf a été archivé en juillet 2024 avec des CVE non corrigées. L'architecture binaire native est antérieure aux améliorations de la détection de plateforme de .NET 8. Il n'y a pas de solution - seulement une migration vers une autre bibliothèque.
PdfSharp - System.Drawing.Common Failures on Linux (en anglais)
PdfSharp dépend de System.Drawing.Common, que Microsoft a déprécié pour les plateformes non Windows dans .NET 6. Dans .NET 8, cela produit des échecs d'exécution lors du déploiement sur Linux ou 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
PdfSharp 6.x s'efforce de supprimer cette dépendance, mais la prise en charge multiplateforme reste incomplète au début de l'année 2026. Pour les déploiements sous Windows uniquement, PdfSharp fonctionne avec .NET 8. Pour Linux, Docker ou les déploiements dans le nuage, il n'est pas fiable.
Quelles sont les bibliothèques PDF compatibles avec .NET 8?
IronPDF- Prise en charge complète de .NET 8, multiplateforme
IronPDF cible net8.0 nativement avec un rendu Chromium intégré. Pas de dépendance System.Drawing.Common, pas de gestion native des binaires, pas de configuration spécifique à la plateforme.
Intégration minimale des API (le principal modèle de .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()
Pour les équipes utilisant le modèle de contrôleur, le même code fonctionne à l'intérieur d'une action de contrôleur - RenderHtmlAsPdf renvoie un PdfDocument que vous pouvez convertir en octets avec .BinaryData.
Licence: Licence perpétuelle à partir de 749 $ (Lite - 1 développeur, 1 projet). Professionnel : 1 499 $ (10 développeurs). Enterprise : 2 999 $ (Unlimited). Publié sur ironpdf.com.
QuestPDF - Compatible .NET 8, Pas de HTML
QuestPDF fonctionne avec .NET 8 sans dépendance de plateforme. Son API C# fluide construit des documents de manière programmatique - pas d'analyseur HTML, pas de moteur CSS, pas de moteur de navigateur :
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 ne convertit pas le HTML. Si votre flux de travail utilise des modèles HTML (vues Razor, exportation de tableaux de bord, archivage de contenu web), vous avez besoin d'une autre bibliothèque. La licence communautaire couvre les entreprises dont le chiffre d'affaires annuel est inférieur à 1 million de dollars ; la traduction doit rester professionnelle, en préservant l'exactitude technique tout en expliquant les caractéristiques et les avantages de ces outils de développement.
iText 7 - Compatible .NET 8, Licence AGPL
iText 7 (le successeur de iTextSharp) prend en charge .NET 8. Le module complémentaire pdfHTML assure la conversion HTML-PDF à l'aide d'un analyseur personnalisé - et non d'un moteur de navigateur, de sorte que les fonctionnalités CSS modernes (Flexbox, Grid) ne s'affichent pas correctement.
Licence : AGPL pour l'utilisation de logiciels libres, licence commerciale (abonnement, prix non publié) pour les applications propriétaires. iText est passé aux licences commerciales par abonnement en 2024.
Déploiement de Docker
Image Debian standard (recommandée)
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"]
Image alpine (plus petite empreinte)
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"]
L'image Debian ne nécessite aucun paquet supplémentaire. L'image Alpine est plus petite mais nécessite l'installation explicite de la bibliothèque Chromium. Pour la plupart des déploiements, l'image Debian standard est plus simple et plus fiable.
Azure Functions (Isolated Worker)
les fonctions Azure .NET 8 utilisent le modèle de travailleur isolé. IronPdf travaille avec ce modèle pour la génération de PDF à la demande :
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
Prise en compte du déploiement: Le binaire Chromium d'IronPDF ajoute ~200MB au package de déploiement. Le plan de consommation Azure Functions a une limite de taille de déploiement de 1,5 Go - vérifiez la taille totale de votre package. Pour les plans Premium ou Dedicated, cette limite ne s'applique pas. La latence de démarrage à froid pour la première génération de PDF est de 2 à 5 secondes lors de l'initialisation de Chromium.
Compatibilité native avec AOT
.NET 8 a étendu la prise en charge de l'AOT native, mais les bibliothèques PDF sont confrontées à des contraintes fondamentales. Les bibliothèques basées sur Chromium (IronPDF, Puppeteer Sharp) ne peuvent pas compiler l'AOT car elles intègrent ou génèrent des processus de navigation. iText 7 utilise une réflexion poussée qui entre en conflit avec l'élagage.
Statut actuel avec <PublishAot>true</PublishAot> :
| Bibliothèque | Statut de l'AOT | Raison |
|---|---|---|
| IronPDF | Non compatible | Embarque le moteur d'exécution Chromium |
| iText 7 | Non compatible | Réflexion poussée, génération de code dynamique |
| QuestPDF | Partiel (avec TrimMode=partial) |
Quelques exemples d'utilisation |
| PdfSharp | Non compatible | Dépendance System.Drawing.Common |
Si l'AOT natif est une exigence absolue, QuestPDF avec TrimMode=partial est l'option la plus proche - mais uniquement pour la génération programmatique de documents, pas pour la conversion HTML. Pour les scénarios HTML vers PDF, AOT n'est actuellement viable avec aucune bibliothèque.
Comparaison des licences
| Bibliothèque | Modèle | Coût | prise en charge de .NET 8 |
|---|---|---|---|
| IronPDF | Perpétuel | 749 $ (Lite) / 1 499 $ (Pro) / 2 999 $ (Enterprise) | Complet |
| iText 7 | AGPL ou abonnement | Non publié ($15K-$210K/an est.) | Complet |
| QuestPDF | Communauté / Commercial | Gratuit <1M$ de revenus, puis commercial | Complet |
| PdfSharp | MIT (gratuit) | $0 | Windows uniquement (Linux incomplet) |
| Aspose.PDF | Par développeur | ~$999+ | Complet (problèmes de mémoire sous Linux) |
Compatibilité ascendante de .NET 9
.NET 9 (publié en novembre 2025) poursuit les modèles établis dans .NET 8. Les bibliothèques qui fonctionnent avec .NET 8 fonctionnent généralement avec .NET 9 sans changement. Les principaux ajouts de .NET 9 concernant la génération de PDF sont l'amélioration des performances ARM64 (avantages du rendu basé sur Chromium sur Apple Silicon et AWS Graviton) et la poursuite des améliorations de Native AOT (bien que les contraintes fondamentales pour les bibliothèques PDF restent inchangées).
Si vous visez .NET 9 ou prévoyez une mise à niveau, le choix d'une bibliothèque prenant entièrement en charge le déploiement multiplateforme de .NET 8 est la voie la plus sûre. Les bibliothèques présentant des problèmes spécifiques à une plateforme (PdfSharp sur Linux, Aspose avec libgdiplus) ont peu de chances de résoudre ces problèmes dans .NET 9 car la dépréciation de la dépendance sous-jacente est permanente.
Guide de migration
De iTextSharp à 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")
Du wkhtmltopdf Wrappers à 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
La surface de l'API est plus simple dans les deux cas. Le principal coût de migration consiste à tester vos modèles HTML existants avec le nouveau moteur de rendu afin de vérifier que le résultat correspond aux attentes.
La recommandation
Pour les projets .NET 8 nécessitant une conversion HTML-PDF :IronPDFfournit un rendu Chromium intégré qui fonctionne sur toutes les plateformes sans configuration. Il gère le déploiement Docker, Azure Functions et les conteneurs Linux dès le départ.
Pour les projets .NET 8, créer des documents de manière programmatique à partir de données : L'API fluide de QuestPDF est bien conçue et compatible avec .NET 8, la Community License couvrant la plupart des startups et des petites équipes.
Pour la manipulation de PDF (fusion, division, formulaires) sous Windows : PdfSharp reste viable si votre cible de déploiement est uniquement Windows.
Évitez iTextSharp (non compatible), les wrappers wkhtmltopdf (archivés, CVEs), et toute bibliothèque dépendant de System.Drawing.Common pour un déploiement multiplateforme.