IRONSOFTWAREHOME
VIDÉOS

Comment rendre des images stockées dans Azure Blob Storage en C#

Curtis Chau
Curtis Chau
Updated: 19 juillet 2026

Migrer dePuppeteerSharpà IronPDF déplace votre flux de travail de génération de PDF d'un outil d'automatisation de navigateur avec une dépendance à Chromium de plus de 300 Mo à une bibliothèque PDF spécialement conçue avec gestion automatique de la mémoire. Ce guide fournit un chemin de migration étape par étape qui élimine le téléchargement de Chromium au moment de l'exécution, résout la croissance de la mémoire signalée sous charge, et ajoute des capacités complètes de manipulation de PDF.

Pourquoi migrer dePuppeteerSharpà IronPDF

Comprendre PuppeteerSharp

PuppeteerSharp est un portage .NET de Puppeteer de Google, qui apporte des fonctionnalités d'automatisation de navigateur en C#. Elle génère des PDF à l'aide de la fonctionnalité intégrée d'impression au format PDF de Chrome, de la même manière qu'en appuyant sur Ctrl+P dans un navigateur. La traduction doit rester professionnelle et préserver l'exactitude technique tout en expliquant les caractéristiques et les avantages de ces outils de développement.

PuppeteerSharp a été conçu pour les tests web et le scraping, et non pour la génération de documents. Bien que possible, l'utilisation dePuppeteerSharppour la génération de PDF pose d'importants problèmes de production.

Le problème de l'automatisation des navigateurs

PuppeteerSharp a été conçu pour l'automatisation des navigateurs et non pour la génération de documents. Cela pose des problèmes fondamentaux lorsqu'il s'agit de l'utiliser pour des PDF :

  1. 300MB+ Chromium downloads requis avant la première utilisation. L'inconvénient majeur dePuppeteerSharpest sa taille de déploiement importante, principalement due au binaire Chromium qu'il intègre. Cette taille substantielle peut gonfler les images Docker et causer des problèmes de démarrage à froid dans les environnements sans serveur.

  2. Croissance de la mémoire signalée sous charge nécessitant un recyclage manuel du navigateur. Sous charge soutenue, les utilisateurs dePuppeteerSharpont signalé une accumulation de mémoire à travers les instances de navigateur, généralement résolue par un recyclage manuel des processus.

  3. Modèles asynchrones complexes avec gestion du cycle de vie du navigateur.

  4. Sortie au format PDF (équivalent à Ctrl+P, pas à la capture d'écran). Les mises en page peuvent être modifiées, les arrière-plans peuvent être omis par défaut et la sortie est paginée pour l'impression au lieu de correspondre à la fenêtre du navigateur.

  5. Aucun support PDF/A ou PDF/UA pour des raisons de conformité.PuppeteerSharpne peut pas produire de documents conformes aux normes PDF/A (archivage) ou PDF/UA (accessibilité).

  6. Pas de manipulation de PDF - génération uniquement, pas de fusion/séparation/modification. Bien quePuppeteerSharpsoit efficace pour générer des PDF, il ne dispose pas de capacités de manipulation supplémentaires telles que la fusion, la division, la sécurisation ou l'édition de PDF.

Comparaison entre IronPDF et PuppeteerSharp

AspectPuppeteerSharpIronPDF
Objectif principalAutomatisation des navigateursGénération PDF
Dépendance au chrometéléchargement séparé de plus de 300 MoMoteur optimisé intégré
Complexité de l'APICycle de vie asynchrone du navigateur et de la pageRépliques synchrones
InitialisationBrowserFetcher.DownloadAsync() + LaunchAsyncnew ChromePdfRenderer()
Gestion de la mémoireRecyclage manuel du navigateurAutomatique
Mémoire sous chargeCroissance signalée sur des charges de travail importantesStable lors des exécutions soutenues
Support PDF/ANon disponiblePrise en charge
Accessibilité PDF/UANon disponiblePrise en charge
Édition de PDFNon disponibleFusionner, diviser, tamponner, éditer
Signatures numériquesNon disponiblePrise en charge
Sécurité des threadsLimité (selon les conseils en amont)Complet
LicenceMIT (logiciel libre)Licence commerciale

Support de la plateforme

Bibliothèque.NET Framework 4.7.2.NET Core 3.1.NET 6-8.NET 10
IronPDFCompletCompletCompletComplet
PuppeteerSharpvia netstandard2.0CompletCompletComplet

Le support d'IronPDF pour les cibles .NET modernes signifie qu'il s'intègre à la plupart des applications existantes sans friction de compatibilité.


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

# Remove PuppeteerSharp
dotnet remove package PuppeteerSharp

# Remove downloaded Chromium binaries (~300MB recovered)
# Delete the .local-chromium folder

# Add IronPDF
dotnet add package IronPdf
SHELL

Pas de BrowserFetcher.DownloadAsync() requis avec IronPDF - le moteur de rendu est inclus automatiquement.

Configuration de la licence

// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

Référence API complète

Modifications de l'espace de nommage

// Before: PuppeteerSharp
using PuppeteerSharp;
using PuppeteerSharp.Media;
using System.Threading.Tasks;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;

Mappages de l'API de base

API PuppeteerSharpAPI IronPDFNotes
new BrowserFetcher().DownloadAsync()Pas nécessairePas de téléchargement de navigateur
Puppeteer.LaunchAsync(options)Pas nécessairePas de gestion de navigateur
browser.NewPageAsync()Pas nécessairePas de contexte de page
page.GoToAsync(url)renderer.RenderUrlAsPdf(url)Rendu direct
page.SetContentAsync(html)renderer.RenderHtmlAsPdf(html)Rendu direct
page.PdfAsync(path)pdf.SaveAs(path)Après le rendu
await page.CloseAsync()Pas nécessaireNettoyage automatique
await browser.CloseAsync()Pas nécessaireNettoyage automatique
PdfOptions.FormatRenderingOptions.PaperSizeTaille du papier
PdfOptions.LandscapeRenderingOptions.PaperOrientationOrientation
PdfOptions.MarginOptionsRenderingOptions.MarginTop/Bottom/Left/RightMarges individuelles
PdfOptions.PrintBackgroundRenderingOptions.PrintHtmlBackgroundsImpression de fond
PdfOptions.HeaderTemplateRenderingOptions.HtmlHeaderEn-têtes HTML
PdfOptions.FooterTemplateRenderingOptions.HtmlFooterPieds de page HTML
page.WaitForSelectorAsync()RenderingOptions.WaitFor.HtmlElementIdAttendre l'élément

Exemples de migration de code

Exemple 1 : Conversion de base de HTML en PDF

Avant (PuppeteerSharp):

// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var browserFetcher = new BrowserFetcher();
        await browserFetcher.DownloadAsync();
        
        await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
        {
            Headless = true
        });
        
        await using var page = await browser.NewPageAsync();
        await page.SetContentAsync("<h1>Hello World</h1><p>This is a PDF document.</p>");
        await page.PdfAsync("output.pdf");
    }
}

Après (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF document.</p>");
        pdf.SaveAs("output.pdf");
    }
}

Cet exemple illustre la différence architecturale fondamentale.PuppeteerSharpnécessite six opérations asynchrones : BrowserFetcher.DownloadAsync() (téléchargement de Chromium de plus de 300 Mo), Puppeteer.LaunchAsync(), browser.NewPageAsync(), page.SetContentAsync(), et page.PdfAsync(), plus une suppression correcte avec await using.

IronPDF élimine toute cette complexité : créez un ChromePdfRenderer, appelez RenderHtmlAsPdf(), et SaveAs(). Pas de modèles asynchrones, pas de cycle de vie du navigateur, pas de téléchargement de Chromium. L'approche d'IronPDF offre une syntaxe plus propre et une meilleure intégration avec les applications .NET modernes. Consultez la documentation HTML vers PDF pour des exemples complets.

Exemple 2 : Conversion d'une URL en PDF

Avant (PuppeteerSharp):

// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var browserFetcher = new BrowserFetcher();
        await browserFetcher.DownloadAsync();
        
        await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
        {
            Headless = true
        });
        
        await using var page = await browser.NewPageAsync();
        await page.GoToAsync("https://www.example.com");
        await page.PdfAsync("webpage.pdf");
    }
}

Après (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
        pdf.SaveAs("webpage.pdf");
    }
}

PuppeteerSharp utilise GoToAsync() pour naviguer vers une URL suivi de PdfAsync().IronPDF fournit une seule méthode RenderUrlAsPdf() qui gère la navigation et la génération de PDF en un seul appel. Pour en savoir plus, consultez nos tutoriels.

Exemple 3 : Paramètres de page personnalisés avec marges

Avant (PuppeteerSharp):

// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using PuppeteerSharp.Media;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var browserFetcher = new BrowserFetcher();
        await browserFetcher.DownloadAsync();
        
        await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
        {
            Headless = true
        });
        
        await using var page = await browser.NewPageAsync();
        await page.SetContentAsync("<h1>Custom PDF</h1><p>With landscape orientation and margins.</p>");
        
        await page.PdfAsync("custom.pdf", new PdfOptions
        {
            Format = PaperFormat.A4,
            Landscape = true,
            MarginOptions = new MarginOptions
            {
                Top = "20mm",
                Bottom = "20mm",
                Left = "20mm",
                Right = "20mm"
            }
        });
    }
}

Après (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
        renderer.RenderingOptions.MarginTop = 20;
        renderer.RenderingOptions.MarginBottom = 20;
        renderer.RenderingOptions.MarginLeft = 20;
        renderer.RenderingOptions.MarginRight = 20;
        
        var pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>With landscape orientation and margins.</p>");
        pdf.SaveAs("custom.pdf");
    }
}

Cet exemple montre comment les options PDF sont réparties entre les deux bibliothèques.PuppeteerSharputilise PdfOptions avec Format, Landscape, et MarginOptions contenant des valeurs de chaîne ("20mm").IronPDF utilise des propriétés RenderingOptions avec des énumérations de taille de papier, d'orientation et des valeurs numériques de marge en millimètres.

Correspondances clés :

  • Format = PaperFormat.A4PaperSize = PdfPaperSize.A4
  • Landscape = truePaperOrientation = PdfPaperOrientation.Landscape
  • MarginOptions.Top = "20mm"MarginTop = 20 (millimètres numériques)

Croissance de la mémoire sous charge soutenue

Les utilisateurs ont signalé une accumulation de mémoire avecPuppeteerSharpsous charge soutenue, généralement atténuée par un recyclage manuel du navigateur :

//PuppeteerSharp- memory growth typically requires periodic recycling
for (int i = 0; i < 1000; i++)
{
    var page = await browser.NewPageAsync();
    await page.SetContentAsync($"<h1>Document {i}</h1>");
    await page.PdfAsync($"doc_{i}.pdf");
    await page.CloseAsync();
}
// Recommended: await browser.CloseAsync(); and re-launch every N operations

//IronPDF- reuse a single renderer across operations
var renderer = new ChromePdfRenderer();
for (int i = 0; i < 1000; i++)
{
    var pdf = renderer.RenderHtmlAsPdf($"<h1>Document {i}</h1>");
    pdf.SaveAs($"doc_{i}.pdf");
    // Memory managed automatically
}
C#

IronPDF élimine le besoin d'une infrastructure de mise en commun des navigateurs que nécessitePuppeteerSharp:

// Before (PuppeteerSharp - delete entire class)
public class PuppeteerBrowserPool
{
    private readonly ConcurrentBag<IBrowser> _browsers;
    private readonly SemaphoreSlim _semaphore;
    private int _operationCount;
    // ... recycling logic ...
}

// After (IronPDF - simple reuse)
public class PdfService
{
    private readonly ChromePdfRenderer _renderer = new();

    public byte[] Generate(string html)
    {
        return _renderer.RenderHtmlAsPdf(html).BinaryData;
    }
}

##Notesde migration essentielles

Conversion asynchrone vers synchrone

PuppeteerSharp nécessite l'utilisation d'async/await tout au long du processus ;IronPDF prend en charge les opérations synchrones :

// PuppeteerSharp: Async required
public async Task<byte[]> GeneratePdfAsync(string html)
{
    await new BrowserFetcher().DownloadAsync();
    await using var browser = await Puppeteer.LaunchAsync(...);
    await using var page = await browser.NewPageAsync();
    await page.SetContentAsync(html);
    return await page.PdfDataAsync();
}

// IronPDF: Sync default
public byte[] GeneratePdf(string html)
{
    var renderer = new ChromePdfRenderer();
    return renderer.RenderHtmlAsPdf(html).BinaryData;
}

// Or async when needed
public async Task<byte[]> GeneratePdfAsync(string html)
{
    var renderer = new ChromePdfRenderer();
    var pdf = await renderer.RenderHtmlAsPdfAsync(html);
    return pdf.BinaryData;
}

Conversion de l'unité de marge

PuppeteerSharp utilise des unités de chaîne de caractères ;IronPDF utilise des millimètres numériques :

//PuppeteerSharp- string units
MarginOptions = new MarginOptions
{
    Top = "1in",      // 25.4mm
    Bottom = "0.75in", // 19mm
    Left = "1cm",     // 10mm
    Right = "20px"    // ~7.5mm at 96dpi
}

//IronPDF- numeric millimeters
renderer.RenderingOptions.MarginTop = 25;    // mm
renderer.RenderingOptions.MarginBottom = 19;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 8;

Conversion de l'en-tête et du pied de page

Classe PuppeteerSharpIronPDF Placeholder
<span class='pageNumber'>{page}
<span class='totalPages'>{total-pages}
<span class='date'>{date}
<span class='title'>{html-title}

Nouvelles capacités après la migration

Après avoir migré vers IronPDF, vous bénéficiez de fonctionnalités quePuppeteerSharpne peut pas vous offrir :

Fusion de fichiers PDF

var pdf1 = renderer.RenderHtmlAsPdf(html1);
var pdf2 = renderer.RenderHtmlAsPdf(html2);
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");

Marques de fond

var watermark = new TextStamper
{
    Text = "CONFIDENTIAL",
    FontSize = 48,
    Opacity = 30,
    Rotation = -45
};
pdf.ApplyStamp(watermark);

Protection par mot de passe

pdf.SecuritySettings.OwnerPassword = "admin";
pdf.SecuritySettings.UserPassword = "readonly";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;

Signatures numériques

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

Conformité PDF/A

pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);

Résumé de la comparaison des performances

MétriquePuppeteerSharpIronPDFAmélioration
Premier PDF (démarrage à froid)45s+~20s55%+ plus rapide
PDF suivantsVariableCohérencePrévisible
Utilisation de la mémoire500 Mo et plus (croissance)~50MB (stable)90% de mémoire en moins
Espace disque (Chromium)300MB+0Éliminer les téléchargements
Télécharger le navigateurLes exigences sont les suivantesPas nécessaireZéro installation
Sécurité des filsLimitéCompletConcurrence fiable
Temps de génération du PDF45s20s55% plus rapide

Liste de contrôle de la migration

Pré-migration

  • Identifier toutes les utilisations dePuppeteerSharpdans le code source
  • Valeurs des marges du document (convertir les chaînes de caractères en millimètres)
  • Notez la syntaxe des espaces réservés d'en-tête/pied de page pour la conversion
  • Supprimer l'infrastructure de mise en commun/recyclage des navigateurs
  • Obtenez votre clé de licence IronPDF sur IronPDF

Modifications du paquet

  • Supprimer le package NuGet PuppeteerSharp
  • Supprimer le dossier .local-chromium pour récupérer environ 300 Mo d'espace disque
  • Installer le package NuGet IronPdf : dotnet add package IronPdf

Modifications du code

  • Mettre à jour les importations d'espace de noms
  • Supprimer les appels BrowserFetcher.DownloadAsync()
  • Supprimer Puppeteer.LaunchAsync() et la gestion du navigateur
  • Remplacer page.SetContentAsync() + page.PdfAsync() par RenderHtmlAsPdf()
  • Remplacer page.GoToAsync() + page.PdfAsync() par RenderUrlAsPdf()
  • Convertir les chaînes de marge en valeurs en millimètres
  • Convertir la syntaxe des espaces réservés d'en-tête/de pied de page
  • Supprimer tout le code de suppression du navigateur/de la page
  • Supprimer l'infrastructure de mise en commun des navigateurs
  • Ajouter l'initialisation de la licence au démarrage de l'application

Après la migration

  • Comparaison visuelle des fichiers PDF générés
  • Test de charge pour la stabilité de la mémoire (doit rester stable sans recyclage)
  • Vérifier l'affichage de l'en-tête et du pied de page avec les numéros de page
  • Ajouter de nouvelles fonctionnalités (sécurité, filigranes, fusion) selon les besoins

Veuillez noter: PuppeteerSharp est une marque déposée de son propriétaire respectif. Ce site n'est pas affilié, approuvé ou sponsorisé par PuppeteerSharp. 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