IRONSOFTWAREHOME
VIDÉOS

Comment visualiser des fichiers PDF dans .NET Maui

Curtis Chau
Curtis Chau
Updated: 19 juillet 2026

La migration de Rotativavers IronPDF permet 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 en 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.

En son cœur, Rotativafournit 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.

AttributValeur
CVE IDCVE-2022-35583
SévéritéCRITIQUE (9,8/10)
Vecteur d'attaqueRéseau
StatutPas de version fixe (binaire wkhtmltopdf archivé)
AffectésToutes les versions de Rotativaregroupant wkhtmltopdf 0.12.6

Le dépôt GitHub wkhtmltopdf a été archivé (lecture seule) le 2 janvier 2023. La page de statut du mainteneur note que le projet dépend de Qt 4 (non pris en charge depuis 2015) et d'une branche WebKit de 2012, et met explicitement en garde contre son utilisation avec du HTML non fiable. CVE-2022-35583n'a pas de version corrigée, donc toute application utilisant Rotativaest exposée sauf si les entrées HTML sont entièrement assainies en amont.

Comment fonctionne l'attaque

<!-- Attacker submits this content via your MVC model -->
<iframe src="http://169.254.169.254/latest/meta-data/iam/security-credentials/"></iframe>
<img src="http://internal-database:5432/admin" />
HTML

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

FonctionRotativaIronPDF
Compatibilité des projetsASP.NET MVC uniquementTout type de projet .NET (MVC, Razor Pages, Blazor, etc.)
MaintenanceAbandonné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 HTMLWebKit dépasséChrome moderne
CSS3PartielPrise en charge
Flexbox/GridNon pris en chargePrise en charge
JavaScriptPeu fiableES6+ complet
Pages RazorNon pris en chargePrise en charge
BlazorNon pris en chargePrise en charge
Manipulation de PDFNon disponibleComplet
Signatures numériquesNon disponibleComplet
Conformité PDF/ANon disponibleComplet
Async/AwaitSynchrone uniquementComplet async
Open SourceOui, licence MITNon, licence commerciale

Pour les équipes ciblant les versions actuelles de .NET,IronPDF offre un rendu moderne par Chromium et une prise en charge multiplateforme que Rotativane peut offrir.


Avant de commencer

Prérequis

  1. Environnement .NET : .NET Framework 4.6.2+ ou .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. Accès à NuGet : possibilité d'installer des packages NuGet
  3. Licence IronPDF : Obtenez votre clé de licence sur IronPDF

Modifications du paquet NuGet

Le package original Rotativa cible le classique ASP.NET MVC 5 (dernière version v1.7.3, 29/09/2017). Le fork communautaire Rotativa.AspNetCore (webgio) a atteint v1.4.0 le 06/11/2024 et prend en charge .NET Core 3.1 jusqu'à .NET 8 — mais les deux packages livrent toujours le binaire wkhtmltopdf 0.12.6 (dernière version en amont juin 2020).

# Remove Rotativa
dotnet remove package Rotativa
dotnet remove package Rotativa.AspNetCore

# Install IronPDF
dotnet add package IronPdf
SHELL

Supprimer les binaires de wkhtmltopdf

Supprimez ces fichiers de votre projet :

  • wkhtmltopdf.exe
  • wkhtmltox.dll
  • Tous les dossiers Rotativa/

Ces outils sont à l'origine de la CVE-2022-35583.IronPDF ne nécessite pas de binaires natifs.

Configuration de la licence

// Add in Program.cs or Startup.cs
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;

Mappages de classes de base

Classe RotativaÉquivalent d'IronPDF
ViewAsPdfChromePdfRenderer
ActionAsPdfChromePdfRenderer.RenderUrlAsPdf()
UrlAsPdfChromePdfRenderer.RenderUrlAsPdf()
Orientation enumPdfPaperOrientation enum
Size enumPdfPaperSize enum

Conversion de l'espace réservé de la page

Placeholder RotativaIronPDF Placeholder
[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.AspNetCore
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
            };
        }
    }
}
C#

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!");
        }
    }
}

Cet exemple illustre la différence architecturale fondamentale. Rotativanécessite de retourner un résultat ViewAsPdf depuis une action du contrôleur MVC, vous liant 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 sauvegardez 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.AspNetCore
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
            };
        }
    }
}
C#

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!");
        }
    }
}

La classe UrlAsPdf de Rotativanécessite de retourner un ActionResult depuis un contrôleur MVC. La méthode RenderUrlAsPdf() d'IronPDF peut être appelée depuis n'importe quel contexte et retourne 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.AspNetCore
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,
                // Margins(top, right, bottom, left)
                PageMargins = new Margins(20, 10, 20, 10),
                CustomSwitches = "--header-center \"Page Header\" --footer-center \"Page [page] of [topage]\""
            };
        }
    }
}

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!");
        }
    }
}

Rotativa utilise CustomSwitches pour passer des arguments en 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 TextHeaderFooter fortement typés avec des propriétés comme CenterText et DrawDividerLine. La syntaxe des espaces réservés change 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

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 ;IronPDF prend 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
}

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");

Signatures numériques

var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);

Protection par mot de passe

pdf.SecuritySettings.UserPassword = "secret";

Marques de fond

pdf.ApplyWatermark("<h1 style='color:red; opacity:0.3;'>DRAFT</h1>");

Conformité de l'archivage du PDF/A

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!

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 pour la conversion ([page]{page})
  • Obtenez votre clé de licence IronPDF sur IronPDF

Modifications du paquet

  • Supprimez les packages NuGet Rotativa et Rotativa.AspNetCore
  • Supprimez les binaires wkhtmltopdf (wkhtmltopdf.exe, wkhtmltox.dll)
  • Installez le package NuGet IronPdf

Modifications du code

  • Mettez à jour les importations de namespace (using Rotativa;using IronPdf;)
  • Remplacez ViewAsPdf par ChromePdfRenderer + RenderHtmlAsPdf()
  • Remplacez UrlAsPdf par RenderUrlAsPdf()
  • Convertissez CustomSwitches en propriétés RenderingOptions
  • Mettez à jour la syntaxe des espaces réservés ([page]{page}, [topage]{total-pages})
  • Remplacez PageMargins par des MarginRight individuels
  • 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

Veuillez noter: Rotativa et wkhtmltopdf sont des marques déposées de leurs propriétaires respectifs. Ce site n'est pas affilié à, approuvé par, ou sponsorisé par Rotativaou wkhtmltopdf. Tous les noms de produits, logos et marques sont la propriété de leurs propriétaires respectifs. Les comparaisons sont à titre informatif uniquement et reflètent les informations publiquement disponibles au moment de l'écriture.
Curtis Chau
Rédacteur technique

Curtis Chau détient un baccalauréat en informatique (Université de Carleton) et se spécialise dans le développement front-end avec expertise en Node.js, TypeScript, JavaScript et React. Passionné par la création d'interfaces utilisateur intuitives et esthétiquement plaisantes, Curtis aime travailler avec des frameworks modernes et créer des manuels bien structurés et visuellement attrayants.

...
Lire la suite

Articles connexes

Key in blue circle

Obtenez votre clé d'essai de 30 jours instantanément.

Your trial license will be sent to your email address

Aucune restriction. 100 % débloqué. Pas de carte bancaire.

bullet_checkedAucune carte de crédit ou création de compte requiseAucune restriction. 100 % débloqué. Pas de carte bancaire.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Réservez votre Démonstration en direct gratuite
Booking Badge

De confiance par des millions d'ingénieurs dans le monde entier

Logos des clients d'Iron Software
Obtenez Votre Consultation sans Engagement
Remplissez le formulaire ci-dessous ou envoyez un email à sales@ironsoftware.com
Vos informations seront toujours gardées confidentielles.
De confiance par des millions d'ingénieurs dans le monde entier
Logos des clients d'Iron Software
Obtenez votre clé d'essai 30 jours gratuitement.
Aucune carte de crédit ou création de compte requise