Comment migrer de Rotativa à IronPDF en C#
La migration de RotativaversIronPDFpermet de remédier aux failles de sécurité critiques tout en modernisant votre flux de production de PDF. Ce guide fournit un chemin de migration complet, étape par étape, qui élimine la dépendance wkhtmltopdf abandonnée, permet la prise en charge de CSS et JavaScript modernes et offre une compatibilité multiplateforme au-delà d'ASP.NET MVC.
Pourquoi migrer de Rotativaà IronPDF
Comprendre Rotativa
Rotativa est depuis longtemps un choix populaire parmi les développeurs pour générer des PDF en C#. Il utilise l'outil wkhtmltopdf pour convertir le contenu HTML au format PDF. Rotativaest une bibliothèque open-source spécialement conçue pour les applications ASP.NET MVC. Cependant, bien qu'elle ait attiré un public important, la dépendance de Rotativaà l'égard d'une pile technologique dépassée présente des défis qui ne sont pas forcément évidents pour tous les développeurs.
À la base, Rotativaoffre un moyen simple d'intégrer la génération de PDF dans les projets ASP.NET MVC, en tirant parti de wkhtmltopdf pour ses fonctionnalités backend.
Avis de sécurité critique
Rotativa intègre wkhtmltopdf, qui présente des VULNÉRABILITÉS DE SÉCURITÉ CRITIQUES NON PRÉVUES.
| Attribut | Valeur |
|---|---|
| CVE ID | CVE-2022-35583 |
| Sévérité | CRITIQUE (9,8/10) |
| Vecteur d'attaque | Réseau |
| Statut | NE SERA JAMAIS CORRIGÉ |
| Affectés | TOUTES les versions de Rotativa |
wkhtmltopdf a été officiellement abandonné en décembre 2022. Les mainteneurs ont explicitement déclaré qu'ils ne corrigeraient PAS les vulnérabilités de sécurité. Chaque application utilisant Rotativaest exposée en permanence.
Comment fonctionne l'attaque
<iframe src="http://169.254.169.254/latest/meta-data/iam/security-credentials/"></iframe>
<img src="http://internal-database:5432/admin" />
<iframe src="http://169.254.169.254/latest/meta-data/iam/security-credentials/"></iframe>
<img src="http://internal-database:5432/admin" />
Impact:
- Accéder aux points d'extrémité des métadonnées du nuage AWS/Azure/GCP
- Voler des données et des identifiants d'API internes
- Balayage des ports des réseaux internes
- Exfiltrer une configuration sensible
La crise technologique
Rotativa intègre wkhtmltopdf, qui utilise :
- Qt WebKit 4.8 (depuis 2012)
- Pas de prise en charge de Flexbox
- Pas de prise en charge de la grille CSS
- Exécution JavaScript interrompue
- Pas de prise en charge d'ES6
Comparaison Rotativavs IronPDF
| Fonction | Rotativa | IronPDF |
|---|---|---|
| Compatibilité des projets | ASP.NET MVC uniquement | Tout type de projet .NET (MVC, Razor Pages, Blazor, etc.) |
| Maintenance | Abandonné | Maintenu activement |
| Sécurité | Vulnérabilité due aux dépendances wkhtmltopdf (CVE-2022-35583) | Mises à jour régulières et correctifs de sécurité |
| Rendu HTML | WebKit dépassé | Chromium moderne |
| CSS3 | Partiel | Prise en charge |
| Flexbox/Grid | Non pris en charge | Prise en charge |
| JavaScript | Peu fiable | ES6+ complet |
| Pages Razor | Non pris en charge | Prise en charge |
| Blazor | Non pris en charge | Prise en charge |
| Manipulation de PDF | Non disponible | Complet |
| Signatures numériques | Non disponible | Complet |
| Conformité PDF/A | Non disponible | Complet |
| Async/Await | Synchrone uniquement | Complet async |
| Open Source | Oui, licence MIT | Non, licence commerciale |
Pour les équipes qui prévoient l'adoption de .NET 10 et C# 14 d'ici 2025 et 2026,IronPDFoffre un rendu moderne de Chromium et une prise en charge multiplateforme que Rotativane peut pas proposer.
Avant de commencer
Prérequis
- Environnement .NET : .NET Framework 4.6.2+ ou .NET Core 3.1+ / .NET 5/6/7/8/9+
- Accès à NuGet : possibilité d'installer des packages NuGet
- Licence IronPDF : Obtenez votre clé de licence sur IronPDF
Modifications du paquet NuGet
# Remove Rotativa
dotnet remove package Rotativa
dotnet remove package Rotativa.AspNetCore
# Install IronPDF
dotnet add package IronPdf
# Remove Rotativa
dotnet remove package Rotativa
dotnet remove package Rotativa.AspNetCore
# Install IronPDF
dotnet add package IronPdf
Supprimer les binaires de wkhtmltopdf
Supprimez ces fichiers de votre projet :
wkhtmltopdf.exewkhtmltox.dll- Tous les dossiers
Rotativa/
Ces outils sont à l'origine de la CVE-2022-35583.IronPDFne nécessite pas de binaires natifs.
Configuration de la licence
// Add in Program.cs or Startup.cs
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add in Program.cs or Startup.cs
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add in Program.vb or Startup.vb
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Référence API complète
Modifications de l'espace de nommage
// Before: Rotativa
using Rotativa;
using Rotativa.Options;
using Rotativa.AspNetCore;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
// Before: Rotativa
using Rotativa;
using Rotativa.Options;
using Rotativa.AspNetCore;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
' Before: Rotativa
Imports Rotativa
Imports Rotativa.Options
Imports Rotativa.AspNetCore
' After: IronPDF
Imports IronPdf
Imports IronPdf.Rendering
Mappages de classes de base
| Classe Rotativa | Équivalent d'IronPDF |
|---|---|
ViewAsPdf |
ChromePdfRenderer |
ActionAsPdf |
ChromePdfRenderer.RenderUrlAsPdf() |
UrlAsPdf |
ChromePdfRenderer.RenderUrlAsPdf() |
Orientation énumération |
PdfPaperOrientation énumération |
Size énumération |
PdfPaperSize énumération |
Conversion de l'espace réservé de la page
| Placeholder Rotativa | IronPDFPlaceholder |
|---|---|
[page] |
{page} |
[topage] |
{total-pages} |
[date] |
{date} |
[time] |
{time} |
[title] |
{html-title} |
[sitepage] |
{url} |
Exemples de migration de code
Exemple 1 : Conversion HTML vers PDF
Avant (Rotativa):
// NuGet: Install-Package Rotativa.Core
using Microsoft.AspNetCore.Mvc;
using Rotativa.AspNetCore;
using System.Threading.Tasks;
namespace RotativaExample
{
public class PdfController : Controller
{
public async Task<IActionResult> GeneratePdf()
{
var htmlContent = "<h1>Hello World</h1><p>This is a PDF document.</p>";
// Rotativarequires returning a ViewAsPdf result from MVC controller
return new ViewAsPdf()
{
ViewName = "PdfView",
PageSize = Rotativa.AspNetCore.Options.Size.A4
};
}
}
}
// NuGet: Install-Package Rotativa.Core
using Microsoft.AspNetCore.Mvc;
using Rotativa.AspNetCore;
using System.Threading.Tasks;
namespace RotativaExample
{
public class PdfController : Controller
{
public async Task<IActionResult> GeneratePdf()
{
var htmlContent = "<h1>Hello World</h1><p>This is a PDF document.</p>";
// Rotativarequires returning a ViewAsPdf result from MVC controller
return new ViewAsPdf()
{
ViewName = "PdfView",
PageSize = Rotativa.AspNetCore.Options.Size.A4
};
}
}
}
Imports Microsoft.AspNetCore.Mvc
Imports Rotativa.AspNetCore
Imports System.Threading.Tasks
Namespace RotativaExample
Public Class PdfController
Inherits Controller
Public Async Function GeneratePdf() As Task(Of IActionResult)
Dim htmlContent As String = "<h1>Hello World</h1><p>This is a PDF document.</p>"
' Rotativa requires returning a ViewAsPdf result from MVC controller
Return New ViewAsPdf() With {
.ViewName = "PdfView",
.PageSize = Rotativa.AspNetCore.Options.Size.A4
}
End Function
End Class
End Namespace
Après (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
namespace IronPdfExample
{
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
var htmlContent = "<h1>Hello World</h1><p>This is a PDF document.</p>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF generated successfully!");
}
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
namespace IronPdfExample
{
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
var htmlContent = "<h1>Hello World</h1><p>This is a PDF document.</p>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF generated successfully!");
}
}
}
Imports IronPdf
Imports System
Namespace IronPdfExample
Class Program
Shared Sub Main(ByVal args As String())
Dim renderer = New ChromePdfRenderer()
Dim htmlContent = "<h1>Hello World</h1><p>This is a PDF document.</p>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("output.pdf")
Console.WriteLine("PDF generated successfully!")
End Sub
End Class
End Namespace
Cet exemple illustre la différence architecturale fondamentale. Rotativaexige de renvoyer un résultat ViewAsPdf à partir d'une action de contrôleur MVC, vous liant ainsi au framework ASP.NET MVC. Le modèle ne fonctionne que dans le pipeline de requêtes MVC et nécessite une vue Razor pour le rendu.
IronPDF fonctionne partout : applications de console, API web, Blazor, Razor Pages, ou tout type de projet .NET. Vous appelez RenderHtmlAsPdf() avec une chaîne HTML et enregistrez le résultat. Aucun contrôleur MVC n'est requis, aucune dépendance à l'égard de la vue. Consultez la documentation HTML vers PDF pour des exemples complets.
Exemple 2 : Conversion d'une URL en PDF
Avant (Rotativa):
// NuGet: Install-Package Rotativa.Core
using Microsoft.AspNetCore.Mvc;
using Rotativa.AspNetCore;
using System.Threading.Tasks;
namespace RotativaExample
{
public class UrlPdfController : Controller
{
public async Task<IActionResult> ConvertUrlToPdf()
{
// Rotativaworks within MVC framework and returns ActionResult
return new UrlAsPdf("https://www.example.com")
{
FileName = "webpage.pdf",
PageSize = Rotativa.AspNetCore.Options.Size.A4,
PageOrientation = Rotativa.AspNetCore.Options.Orientation.Portrait
};
}
}
}
// NuGet: Install-Package Rotativa.Core
using Microsoft.AspNetCore.Mvc;
using Rotativa.AspNetCore;
using System.Threading.Tasks;
namespace RotativaExample
{
public class UrlPdfController : Controller
{
public async Task<IActionResult> ConvertUrlToPdf()
{
// Rotativaworks within MVC framework and returns ActionResult
return new UrlAsPdf("https://www.example.com")
{
FileName = "webpage.pdf",
PageSize = Rotativa.AspNetCore.Options.Size.A4,
PageOrientation = Rotativa.AspNetCore.Options.Orientation.Portrait
};
}
}
}
Imports Microsoft.AspNetCore.Mvc
Imports Rotativa.AspNetCore
Imports System.Threading.Tasks
Namespace RotativaExample
Public Class UrlPdfController
Inherits Controller
Public Async Function ConvertUrlToPdf() As Task(Of IActionResult)
' Rotativa works within MVC framework and returns ActionResult
Return New UrlAsPdf("https://www.example.com") With {
.FileName = "webpage.pdf",
.PageSize = Rotativa.AspNetCore.Options.Size.A4,
.PageOrientation = Rotativa.AspNetCore.Options.Orientation.Portrait
}
End Function
End Class
End Namespace
Après (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
namespace IronPdfExample
{
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("webpage.pdf");
Console.WriteLine("URL converted to PDF successfully!");
}
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
namespace IronPdfExample
{
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("webpage.pdf");
Console.WriteLine("URL converted to PDF successfully!");
}
}
}
Imports IronPdf
Imports System
Namespace IronPdfExample
Class Program
Shared Sub Main(ByVal args As String())
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://www.example.com")
pdf.SaveAs("webpage.pdf")
Console.WriteLine("URL converted to PDF successfully!")
End Sub
End Class
End Namespace
La classe UrlAsPdf de Rotativaexige de renvoyer un ActionResult depuis un contrôleur MVC. La méthode RenderUrlAsPdf() d'IronPDF peut être appelée depuis n'importe quel contexte et renvoie directement un objet PdfDocument. Le rendu de l'URL utilise le moteur moderne Chromium au lieu du moteur WebKit vulnérable et obsolète de wkhtmltopdf. Pour en savoir plus, consultez nos tutoriels.
Exemple 3 : En-têtes et pieds de page avec numéros de page
Avant (Rotativa):
// NuGet: Install-Package Rotativa.Core
using Microsoft.AspNetCore.Mvc;
using Rotativa.AspNetCore;
using Rotativa.AspNetCore.Options;
using System.Threading.Tasks;
namespace RotativaExample
{
public class HeaderFooterController : Controller
{
public async Task<IActionResult> GeneratePdfWithHeaderFooter()
{
return new ViewAsPdf("Report")
{
PageSize = Size.A4,
PageMargins = new Margins(20, 10, 20, 10),
CustomSwitches = "--header-center \"Page Header\" --footer-center \"Page [page] of [toPage]\""
};
}
}
}
// NuGet: Install-Package Rotativa.Core
using Microsoft.AspNetCore.Mvc;
using Rotativa.AspNetCore;
using Rotativa.AspNetCore.Options;
using System.Threading.Tasks;
namespace RotativaExample
{
public class HeaderFooterController : Controller
{
public async Task<IActionResult> GeneratePdfWithHeaderFooter()
{
return new ViewAsPdf("Report")
{
PageSize = Size.A4,
PageMargins = new Margins(20, 10, 20, 10),
CustomSwitches = "--header-center \"Page Header\" --footer-center \"Page [page] of [toPage]\""
};
}
}
}
Imports Microsoft.AspNetCore.Mvc
Imports Rotativa.AspNetCore
Imports Rotativa.AspNetCore.Options
Imports System.Threading.Tasks
Namespace RotativaExample
Public Class HeaderFooterController
Inherits Controller
Public Async Function GeneratePdfWithHeaderFooter() As Task(Of IActionResult)
Return New ViewAsPdf("Report") With {
.PageSize = Size.A4,
.PageMargins = New Margins(20, 10, 20, 10),
.CustomSwitches = "--header-center ""Page Header"" --footer-center ""Page [page] of [toPage]"""
}
End Function
End Class
End Namespace
Après (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
namespace IronPdfExample
{
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
{
CenterText = "Page Header",
DrawDividerLine = true
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
{
CenterText = "Page {page} of {total-pages}",
DrawDividerLine = true
};
var htmlContent = "<h1>Report Title</h1><p>Report content goes here.</p>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("report.pdf");
Console.WriteLine("PDF with headers and footers created successfully!");
}
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
namespace IronPdfExample
{
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
{
CenterText = "Page Header",
DrawDividerLine = true
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
{
CenterText = "Page {page} of {total-pages}",
DrawDividerLine = true
};
var htmlContent = "<h1>Report Title</h1><p>Report content goes here.</p>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("report.pdf");
Console.WriteLine("PDF with headers and footers created successfully!");
}
}
}
Imports IronPdf
Imports IronPdf.Rendering
Imports System
Namespace IronPdfExample
Class Program
Shared Sub Main(ByVal args As String())
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.TextHeader = New TextHeaderFooter() With {
.CenterText = "Page Header",
.DrawDividerLine = True
}
renderer.RenderingOptions.TextFooter = New TextHeaderFooter() With {
.CenterText = "Page {page} of {total-pages}",
.DrawDividerLine = True
}
Dim htmlContent = "<h1>Report Title</h1><p>Report content goes here.</p>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("report.pdf")
Console.WriteLine("PDF with headers and footers created successfully!")
End Sub
End Class
End Namespace
Rotativa utilise CustomSwitches pour transmettre des arguments de ligne de commande à wkhtmltopdf, y compris la configuration d'en-tête et de pied de page avec des espaces réservés comme [page] et [toPage]. Cette approche basée sur les chaînes de caractères est sujette aux erreurs et difficile à valider au moment de la compilation.
IronPDF utilise des objets fortement typés TextHeaderFooter avec des propriétés comme CenterText et DrawDividerLine. La syntaxe de l'espace réservé passe de [page] à {page} et de [toPage] à {total-pages}. Les propriétés typées offrent un système IntelliSense, une vérification au moment de la compilation et aucun risque de fautes de frappe.
Le problème de l'architecture MVC uniquement
Rotativa a été conçu pour ASP.NET MVC 5 et les versions antérieures :
// ❌ Rotativa- Only works with classic MVC pattern
public class InvoiceController : Controller
{
public ActionResult InvoicePdf(int id)
{
var model = GetInvoice(id);
return new ViewAsPdf("Invoice", model); // Tied to MVC Views
}
}
// Problems:
// - No Razor Pages support
// - No Blazor support
// - No minimal APIs support
// - No ASP.NET Core native integration
// ❌ Rotativa- Only works with classic MVC pattern
public class InvoiceController : Controller
{
public ActionResult InvoicePdf(int id)
{
var model = GetInvoice(id);
return new ViewAsPdf("Invoice", model); // Tied to MVC Views
}
}
// Problems:
// - No Razor Pages support
// - No Blazor support
// - No minimal APIs support
// - No ASP.NET Core native integration
Imports System.Web.Mvc
Public Class InvoiceController
Inherits Controller
Public Function InvoicePdf(id As Integer) As ActionResult
Dim model = GetInvoice(id)
Return New ViewAsPdf("Invoice", model) ' Tied to MVC Views
End Function
End Class
' Problems:
' - No Razor Pages support
' - No Blazor support
' - No minimal APIs support
' - No ASP.NET Core native integration
IronPDF sépare le rendu des vues de la génération de PDF, qui est en fait plus flexible - vous pouvez rendre n'importe quel HTML, pas seulement les vues MVC.
Migration de modèles asynchrones
Rotativa bloque le fil ;IronPDFprend en charge l'intégralité des fonctions async/await :
// ❌ Rotativa- Blocks the thread
public ActionResult GeneratePdf()
{
return new ViewAsPdf("Report");
// This blocks the request thread until PDF is complete
// Poor scalability under load
}
// ✅IronPDF- Complet asyncsupport
public async Task<IActionResult> GeneratePdf()
{
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return File(pdf.BinaryData, "application/pdf");
// Non-blocking, better scalability
}
// ❌ Rotativa- Blocks the thread
public ActionResult GeneratePdf()
{
return new ViewAsPdf("Report");
// This blocks the request thread until PDF is complete
// Poor scalability under load
}
// ✅IronPDF- Complet asyncsupport
public async Task<IActionResult> GeneratePdf()
{
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return File(pdf.BinaryData, "application/pdf");
// Non-blocking, better scalability
}
Imports System.Threading.Tasks
Imports Microsoft.AspNetCore.Mvc
' ❌ Rotativa- Blocks the thread
Public Function GeneratePdf() As ActionResult
Return New ViewAsPdf("Report")
' This blocks the request thread until PDF is complete
' Poor scalability under load
End Function
' ✅IronPDF- Complete async support
Public Async Function GeneratePdf() As Task(Of IActionResult)
Dim renderer As New ChromePdfRenderer()
Dim pdf = Await renderer.RenderHtmlAsPdfAsync(html)
Return File(pdf.BinaryData, "application/pdf")
' Non-blocking, better scalability
End Function
Nouvelles capacités après la migration
Après avoir migré vers IronPDF, vous bénéficiez de fonctionnalités que Rotativane peut pas vous offrir :
Fusion de fichiers PDF
var merged = PdfDocument.Merge(pdf1, pdf2, pdf3);
merged.SaveAs("complete.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2, pdf3);
merged.SaveAs("complete.pdf");
Dim merged = PdfDocument.Merge(pdf1, pdf2, pdf3)
merged.SaveAs("complete.pdf")
Signatures numériques
var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);
var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);
Dim signature = New PdfSignature("certificate.pfx", "password")
pdf.Sign(signature)
Protection par mot de passe
pdf.SecuritySettings.UserPassword = "secret";
pdf.SecuritySettings.UserPassword = "secret";
pdf.SecuritySettings.UserPassword = "secret"
Marques de fond
pdf.ApplyWatermark("<h1 style='color:red; opacity:0.3;'>DRAFT</h1>");
pdf.ApplyWatermark("<h1 style='color:red; opacity:0.3;'>DRAFT</h1>");
IRON VB CONVERTER ERROR developers@ironsoftware.com
Conformité de l'archivage du PDF/A
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b)
Support CSS moderne
// This now works (broke in Rotativa)
var html = @"
<div style='display: flex; justify-content: space-between;'>
<div>Left</div>
<div>Right</div>
</div>
<div style='display: grid; grid-template-columns: 1fr 1fr 1fr;'>
<div>Col 1</div><div>Col 2</div><div>Col 3</div>
</div>";
var pdf = renderer.RenderHtmlAsPdf(html); // Works!
// This now works (broke in Rotativa)
var html = @"
<div style='display: flex; justify-content: space-between;'>
<div>Left</div>
<div>Right</div>
</div>
<div style='display: grid; grid-template-columns: 1fr 1fr 1fr;'>
<div>Col 1</div><div>Col 2</div><div>Col 3</div>
</div>";
var pdf = renderer.RenderHtmlAsPdf(html); // Works!
' This now works (broke in Rotativa)
Dim html As String = "
<div style='display: flex; justify-content: space-between;'>
<div>Left</div>
<div>Right</div>
</div>
<div style='display: grid; grid-template-columns: 1fr 1fr 1fr;'>
<div>Col 1</div><div>Col 2</div><div>Col 3</div>
</div>"
Dim pdf = renderer.RenderHtmlAsPdf(html) ' Works!
Liste de contrôle de la migration
Pré-migration
- Identifier toutes les utilisations de Rotativadans le code source
- Document CustomSwitches utilisé pour la conversion en RenderingOptions
- Notez la syntaxe des espaces réservés d'en-tête/pied de page pour la conversion (
[page]→{page}) - Obtenez votre clé de licenceIronPDFsur IronPDF
Modifications du paquet
- Supprimer les packages NuGet
RotativaetRotativa.AspNetCore - Supprimer les fichiers binaires wkhtmltopdf (
wkhtmltopdf.exe,wkhtmltox.dll) - Installer le package NuGet
IronPdf
Modifications du code
- Mise à jour des importations d'espace de noms (
using Rotativa;→using IronPdf;) - Remplacez
ViewAsPdfparChromePdfRenderer+RenderHtmlAsPdf() - Remplacez
UrlAsPdfparRenderUrlAsPdf() - Convertir les propriétés de
CustomSwitchesenRenderingOptions - Mise à jour de la syntaxe des espaces réservés (
[page]→{page},[topage]→{total-pages}) - Remplacez
PageMarginsparMarginTop/MarginBottom/MarginLeft/MarginRightindividuels - Adopter un modèle asynchrone lorsque cela s'avère nécessaire
- Ajouter l'initialisation de la licence au démarrage de l'application
Après la migration
- Vérifiez que la génération de PDF fonctionne correctement.
- Comparer la qualité de sortie des PDF (Chromium rend plus précisément)
- Vérifier les améliorations du rendu CSS (Flexbox/Grid fonctionnent désormais)
- Test d'exécution JavaScript (désormais fiable avec Chromium)
- Vérifier que l'analyse de sécurité est réussie (plus aucun signalement CVE-2022-35583)
- Mettez à jour la configuration Docker pour supprimer l'installation de wkhtmltopdf

