Comment migrer de PuppeteerSharp à IronPDF en C#
La migration dePuppeteerSharpversIronPDFtransforme votre flux de travail de génération de PDF d'un outil d'automatisation de navigateur avec des dépendances de plus de 300 Mo à une bibliothèque PDF conçue à cet effet avec une gestion automatique de la mémoire. Ce guide fournit un chemin de migration complet, étape par étape, qui élimine les téléchargements de Chromium, résout les problèmes de fuites de mémoire et fournit 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.
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 :
-
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.
-
Fuites de mémoire sous charge nécessitant un recyclage manuel du navigateur. En cas de forte charge,PuppeteerSharpest connu pour avoir des fuites de mémoire. L'accumulation de mémoire par les instances du navigateur nécessite une intervention manuelle pour la gestion et le recyclage du processus.
-
Modèles asynchrones complexes avec gestion du cycle de vie du navigateur.
-
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.
-
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é).
- 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 entreIronPDFet PuppeteerSharp
| Aspect | PuppeteerSharp | IronPDF |
|---|---|---|
| Objectif principal | Automatisation des navigateurs | Génération PDF |
| Dépendance au chrome | téléchargement séparé de plus de 300 Mo | Moteur optimisé intégré |
| Complexité de l'API | Cycle de vie asynchrone du navigateur et de la page | Répliques synchrones |
| Initialisation | BrowserFetcher.DownloadAsync() + LaunchAsync |
new ChromePdfRenderer() |
| Gestion de la mémoire | Recyclage manuel du navigateur requis | Automatique |
| Mémoire sous charge | 500MB+ avec fuites | ~50MB stable |
| Départ à froid | 45+ secondes | ~20 secondes |
| Support PDF/A | Non disponible | Prise en charge |
| Accessibilité PDF/UA | Non disponible | Prise en charge |
| Édition de PDF | Non disponible | Fusionner, diviser, tamponner, éditer |
| Signatures numériques | Non disponible | Prise en charge |
| Sécurité des threads | Limité | Complet |
| Support professionnel | Communauté | Commercial avec SLA |
Support de la plateforme
|Bibliothèque| .NET Framework 4.7.2| .NET Core 3.1| .NET 6-8| .NET 10| | --------- | :---: | :---: | :---: | :---: ||IronPDF| Complet | Complet | Complet | Complet ||PuppeteerSharp| Limité | Complet | Complet | En attente | La prise en charge étendue d'IronPDF sur l'ensemble des plateformes .NET garantit que les développeurs peuvent l'exploiter dans divers environnements sans rencontrer de problèmes de compatibilité, ce qui constitue un choix flexible pour les applications .NET modernes jusqu'en 2025 et 2026.
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 PuppeteerSharp
dotnet remove package PuppeteerSharp
# Remove downloaded Chromium binaries (~300MB recovered)
# Delete the .local-chromium folder
# Add IronPDF
dotnet add package IronPdf
# Remove PuppeteerSharp
dotnet remove package PuppeteerSharp
# Remove downloaded Chromium binaries (~300MB recovered)
# Delete the .local-chromium folder
# Add IronPDF
dotnet add package IronPdf
Aucun BrowserFetcher.DownloadAsync() requis avec IronPDF - le moteur de rendu est intégré automatiquement.
Configuration de la licence
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' 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;
// Before: PuppeteerSharp
using PuppeteerSharp;
using PuppeteerSharp.Media;
using System.Threading.Tasks;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
' Before: PuppeteerSharp
Imports PuppeteerSharp
Imports PuppeteerSharp.Media
Imports System.Threading.Tasks
' After: IronPDF
Imports IronPdf
Imports IronPdf.Rendering
Mappages de l'API de base
| API PuppeteerSharp | API IronPDF | Notes |
|---|---|---|
new BrowserFetcher().DownloadAsync() |
Pas nécessaire | Pas de téléchargement de navigateur |
Puppeteer.LaunchAsync(options) |
Pas nécessaire | Pas de gestion de navigateur |
browser.NewPageAsync() |
Pas nécessaire | Pas 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écessaire | Nettoyage automatique |
await browser.CloseAsync() |
Pas nécessaire | Nettoyage automatique |
PdfOptions.Format |
RenderingOptions.PaperSize |
Taille du papier |
PdfOptions.Landscape |
RenderingOptions.PaperOrientation |
Orientation |
PdfOptions.MarginOptions |
RenderingOptions.MarginTop/Bottom/Left/Right |
Marges individuelles |
PdfOptions.PrintBackground |
RenderingOptions.PrintHtmlBackgrounds |
Impression de fond |
PdfOptions.HeaderTemplate |
RenderingOptions.HtmlHeader |
En-têtes HTML |
PdfOptions.FooterTemplate |
RenderingOptions.HtmlFooter |
Pieds de page HTML |
page.WaitForSelectorAsync() |
RenderingOptions.WaitFor.HtmlElementId |
Attendre 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");
}
}
// 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");
}
}
Imports PuppeteerSharp
Imports System.Threading.Tasks
Module Program
Async Function Main(args As String()) As Task
Dim browserFetcher = New BrowserFetcher()
Await browserFetcher.DownloadAsync()
Using browser = Await Puppeteer.LaunchAsync(New LaunchOptions With {
.Headless = True
})
Using page = Await browser.NewPageAsync()
Await page.SetContentAsync("<h1>Hello World</h1><p>This is a PDF document.</p>")
Await page.PdfAsync("output.pdf")
End Using
End Using
End Function
End Module
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");
}
}
// 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");
}
}
Imports IronPdf
Class Program
Shared Sub Main(args As String())
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF document.</p>")
pdf.SaveAs("output.pdf")
End Sub
End Class
Cet exemple illustre la différence architecturale fondamentale.PuppeteerSharpnécessite six opérations asynchrones : BrowserFetcher.DownloadAsync() (téléchargement Chromium de plus de 300 Mo), Puppeteer.LaunchAsync(), browser.NewPageAsync(), page.SetContentAsync() et page.PdfAsync(), Plus une élimination appropriée 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");
}
}
// 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");
}
}
Imports PuppeteerSharp
Imports System.Threading.Tasks
Module Program
Async Function Main(args As String()) As Task
Dim browserFetcher = New BrowserFetcher()
Await browserFetcher.DownloadAsync()
Using browser = Await Puppeteer.LaunchAsync(New LaunchOptions With {
.Headless = True
})
Using page = Await browser.NewPageAsync()
Await page.GoToAsync("https://www.example.com")
Await page.PdfAsync("webpage.pdf")
End Using
End Using
End Function
End Module
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");
}
}
// 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");
}
}
Imports IronPdf
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")
End Sub
End Class
PuppeteerSharp utilise GoToAsync() pour naviguer vers une URL suivie de PdfAsync().IronPDFfournit 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"
}
});
}
}
// 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"
}
});
}
}
Imports PuppeteerSharp
Imports PuppeteerSharp.Media
Imports System.Threading.Tasks
Module Program
Async Function Main(args As String()) As Task
Dim browserFetcher = New BrowserFetcher()
Await browserFetcher.DownloadAsync()
Await Using browser = Await Puppeteer.LaunchAsync(New LaunchOptions With {
.Headless = True
})
Await Using 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 With {
.Format = PaperFormat.A4,
.Landscape = True,
.MarginOptions = New MarginOptions With {
.Top = "20mm",
.Bottom = "20mm",
.Left = "20mm",
.Right = "20mm"
}
})
End Using
End Using
End Function
End Module
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");
}
}
// 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");
}
}
Imports IronPdf
Imports IronPdf.Rendering
Class Program
Shared Sub Main(args As String())
Dim 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
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>With landscape orientation and margins.</p>")
pdf.SaveAs("custom.pdf")
End Sub
End Class
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").IronPDFutilise des propriétés RenderingOptions avec des énumérations directes de format de papier, des énumérations d'orientation et des valeurs de marge numériques en millimètres.
Correspondances clés :
Format = PaperFormat.A4→PaperSize = PdfPaperSize.A4Landscape = true→PaperOrientation = PdfPaperOrientation.LandscapeMarginOptions.Top = "20mm"→MarginTop = 20(millimètres numériques)
Le problème de la fuite de mémoire
PuppeteerSharp est réputé pour l'accumulation de mémoire en cas de charge soutenue :
// ❌PuppeteerSharp- Memory grows with each operation
// Requires explicit browser recycling every N operations
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(); // Memory still accumulates!
}
// Must periodically: await browser.CloseAsync(); and re-launch
// ✅IronPDF- Stable memory, reuse renderer
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
}
// ❌PuppeteerSharp- Memory grows with each operation
// Requires explicit browser recycling every N operations
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(); // Memory still accumulates!
}
// Must periodically: await browser.CloseAsync(); and re-launch
// ✅IronPDF- Stable memory, reuse renderer
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
}
' ❌PuppeteerSharp- Memory grows with each operation
' Requires explicit browser recycling every N operations
For i As Integer = 0 To 999
Dim page = Await browser.NewPageAsync()
Await page.SetContentAsync($"<h1>Document {i}</h1>")
Await page.PdfAsync($"doc_{i}.pdf")
Await page.CloseAsync() ' Memory still accumulates!
Next
' Must periodically: Await browser.CloseAsync() and re-launch
' ✅IronPDF- Stable memory, reuse renderer
Dim renderer As New ChromePdfRenderer()
For i As Integer = 0 To 999
Dim pdf = renderer.RenderHtmlAsPdf($"<h1>Document {i}</h1>")
pdf.SaveAs($"doc_{i}.pdf")
' Memory managed automatically
Next
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;
}
}
// 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;
}
}
' Before (PuppeteerSharp - delete entire class)
Public Class PuppeteerBrowserPool
Private ReadOnly _browsers As ConcurrentBag(Of IBrowser)
Private ReadOnly _semaphore As SemaphoreSlim
Private _operationCount As Integer
' ... recycling logic ...
End Class
' After (IronPDF - simple reuse)
Public Class PdfService
Private ReadOnly _renderer As New ChromePdfRenderer()
Public Function Generate(html As String) As Byte()
Return _renderer.RenderHtmlAsPdf(html).BinaryData
End Function
End Class
Notes de migration essentielles
Conversion asynchrone vers synchrone
PuppeteerSharp nécessite l'utilisation d'async/await tout au long du processus ;IronPDFprend 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;
}
// 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;
}
Imports System.Threading.Tasks
Imports PuppeteerSharp
' PuppeteerSharp: Async required
Public Async Function GeneratePdfAsync(html As String) As Task(Of Byte())
Await (New BrowserFetcher()).DownloadAsync()
Await Using browser = Await Puppeteer.LaunchAsync(...)
Await Using page = Await browser.NewPageAsync()
Await page.SetContentAsync(html)
Return Await page.PdfDataAsync()
End Using
End Using
End Function
' IronPDF: Sync default
Public Function GeneratePdf(html As String) As Byte()
Dim renderer = New ChromePdfRenderer()
Return renderer.RenderHtmlAsPdf(html).BinaryData
End Function
' Or async when needed
Public Async Function GeneratePdfAsync(html As String) As Task(Of Byte())
Dim renderer = New ChromePdfRenderer()
Dim pdf = Await renderer.RenderHtmlAsPdfAsync(html)
Return pdf.BinaryData
End Function
Conversion de l'unité de marge
PuppeteerSharp utilise des unités de chaîne de caractères ;IronPDFutilise 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;
//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;
MarginOptions = New MarginOptions With {
.Top = "1in", ' 25.4mm
.Bottom = "0.75in", ' 19mm
.Left = "1cm", ' 10mm
.Right = "20px" ' ~7.5mm at 96dpi
}
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 PuppeteerSharp | IronPDFPlaceholder |
|---|---|
<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");
var pdf1 = renderer.RenderHtmlAsPdf(html1);
var pdf2 = renderer.RenderHtmlAsPdf(html2);
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
Dim pdf1 = renderer.RenderHtmlAsPdf(html1)
Dim pdf2 = renderer.RenderHtmlAsPdf(html2)
Dim 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);
var watermark = new TextStamper
{
Text = "CONFIDENTIAL",
FontSize = 48,
Opacity = 30,
Rotation = -45
};
pdf.ApplyStamp(watermark);
Dim watermark As New TextStamper With {
.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;
pdf.SecuritySettings.OwnerPassword = "admin";
pdf.SecuritySettings.UserPassword = "readonly";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
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);
var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);
Dim signature = New PdfSignature("certificate.pfx", "password")
pdf.Sign(signature)
Conformité PDF/A
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b)
Résumé de la comparaison des performances
| Métrique | PuppeteerSharp | IronPDF | Amélioration |
|---|---|---|---|
| Premier PDF (démarrage à froid) | 45s+ | ~20s | 55%+ plus rapide |
| PDF suivants | Variable | Cohérence | Prévisible |
| Utilisation de la mémoire | 500 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 navigateur | Les exigences sont les suivantes | Pas nécessaire | Zéro installation |
| Sécurité des fils | Limité | Complet | Concurrence fiable |
| Temps de génération du PDF | 45s | 20s | 55% 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 licenceIronPDFsur IronPDF
Modifications du paquet
- Supprimer le package NuGet
PuppeteerSharp - Supprimez le dossier
.local-chromiumpour récupérer environ 300 Mo d'espace disque. - Installez 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 - Remplacez
page.SetContentAsync()+page.PdfAsync()parRenderHtmlAsPdf() - Remplacez
page.GoToAsync()+page.PdfAsync()parRenderUrlAsPdf() - 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

