Passer au contenu du pied de page
GUIDES DE MIGRATION

Comment migrer de Playwright à IronPDF en C#

La migration de Playwrightfor .NET versIronPDFtransforme votre flux de travail de génération de PDF d'un outil d'automatisation de navigateur centré sur les tests à une bibliothèque PDF conçue à cet effet. Ce guide propose un chemin de migration complet, étape par étape, qui élimine les schémas asynchrones complexes, la gestion du cycle de vie des navigateurs et les téléchargements de plus de 400 Mo dans les navigateurs, tout en offrant de meilleures performances et des fonctionnalités PDF professionnelles.

Pourquoi migrer de Playwrightà IronPDF

Comprendre Playwrightfor .NET

Playwright for .NET est le framework de test de bout en bout de Microsoft, et non une bibliothèque de génération de documents. Il a été conçu spécifiquement pour les tests automatisés sur les navigateurs Chromium, Firefox et WebKit. Playwrightexcelle dans les tests de scénarios : cliquer sur des boutons, remplir des formulaires, intercepter des requêtes réseau, prendre des captures d'écran et valider la compatibilité entre navigateurs.

Compréhension essentielle : Playwrightest un outil de test détourné pour la génération de PDF. La création de PDF est un simple effet secondaire de la fonction d'impression du navigateur (Ctrl+P), et non un objectif de conception principal. Cela crée des inadéquations architecturales fondamentales :

  • Architecture axée sur les tests : conçue pour les tests interactifs dans un navigateur, et non pour la production de documents sans interface graphique.
  • Surcharge liée à la gestion de plusieurs navigateurs : téléchargement de plus de 400 Mo de fichiers binaires (Chromium, Firefox, WebKit) même pour la seule génération de PDF.
  • API axée sur les tests : modèles asynchrones complexes conçus pour les flux de travail d'automatisation des tests, et non pour la génération de documentation
  • Absence de fonctionnalités du document : conformité PDF/A, signatures numériques, filigrane, fusion, contrôles de sécurité.

Le problème du cadre de test

Playwright a été conçu pour les tests de bout en bout, 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. 400MB+ téléchargements du navigateur requis avant la première utilisation. La configuration par défaut de Playwrightimplique le téléchargement de plusieurs navigateurs, ce qui peut être un facteur à prendre en compte dans les environnements soumis à des contraintes strictes en matière de ressources.

  2. Modèles asynchrones complexes avec contextes de navigation et gestion des pages. Les développeurs doivent se familiariser avec les contextes de navigation et la gestion des pages, ainsi qu'avec les bonnes pratiques d'élimination.

  3. Testing-first architecture non optimisée pour la génération de documents.

  4. Limitations de l'impression au format PDF équivalent à l'impression Ctrl+P du navigateur. Les mises en page peuvent être refondues, les arrière-plans peuvent être omis par défaut et la sortie est paginée pour l'impression.

  5. Aucun support PDF/A ou PDF/UA pour la conformité à l'accessibilité. Playwrightne peut pas produire de documents conformes aux normes PDF/A (archivage) ou PDF/UA (accessibilité). Pour répondre aux exigences de la section 508, des directives européennes sur l'accessibilité ou des exigences d'archivage à long terme, vous aurez besoin d'une bibliothèque PDF dédiée.

  6. Opérations gourmandes en ressources nécessitant des instances complètes de navigateur.

Problème de configuration du cadre de test

Playwright nécessite une configuration poussée axée sur les tests, que les ingénieurs QA comprennent, mais dont les développeurs de documents ne devraient pas avoir besoin :

Installation du navigateur requise :

# Manual installation step required before first use
playwright install  # Downloads 400MB+ of browser binaries
# Or programmatically:
playwright install chromium  # Still 100MB+ for single browser
# Manual installation step required before first use
playwright install  # Downloads 400MB+ of browser binaries
# Or programmatically:
playwright install chromium  # Still 100MB+ for single browser
SHELL

Configuration de lancement du navigateur :

// Testing-focused launch options for PDF generation
using var playwright = await Playwright.CreateAsync();
var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions
{
    Headless = true,  // Required for server environments
    Args = new[] { "--disable-gpu", "--no-sandbox" } // Linux/Docker configs
});
// Testing-focused launch options for PDF generation
using var playwright = await Playwright.CreateAsync();
var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions
{
    Headless = true,  // Required for server environments
    Args = new[] { "--disable-gpu", "--no-sandbox" } // Linux/Docker configs
});
' Testing-focused launch options for PDF generation
Using playwright = Await Playwright.CreateAsync()
    Dim browser = Await playwright.Chromium.LaunchAsync(New BrowserTypeLaunchOptions With {
        .Headless = True,  ' Required for server environments
        .Args = New String() { "--disable-gpu", "--no-sandbox" } ' Linux/Docker configs
    })
End Using
$vbLabelText   $csharpLabel

Options de configuration spécifiques aux tests :

  • Headless: Le mode sans interface graphique doit être configuré pour la production (par défaut, il est activé pour les tests).
  • SlowMo: Délais de test (sans incidence sur la génération de PDF)
  • Devtools: Configuration des outils de test (non nécessaire pour les documents)
  • ExecutablePath: Chemins de navigateur personnalisés pour les environnements de test
  • Proxy: Interception réseau à des fins de test (surcharge inutile)
  • DownloadsPath: Gestion des artefacts de test
  • TracesDir: Traces d'exécution des tests

Gestion du contexte du navigateur :

// Complex context lifecycle from testing paradigm
var context = await browser.NewContextAsync(new BrowserNewContextOptions
{
    ViewportSize = new ViewportSize { Width = 1920, Height = 1080 },
    UserAgent = "custom-user-agent",
    Locale = "en-US",
    TimezoneId = "America/New_York"
});
var page = await context.NewPageAsync();
// ... generate PDF ...
await context.CloseAsync();  // Manual cleanup required
await browser.CloseAsync();  // Manual cleanup required
// Complex context lifecycle from testing paradigm
var context = await browser.NewContextAsync(new BrowserNewContextOptions
{
    ViewportSize = new ViewportSize { Width = 1920, Height = 1080 },
    UserAgent = "custom-user-agent",
    Locale = "en-US",
    TimezoneId = "America/New_York"
});
var page = await context.NewPageAsync();
// ... generate PDF ...
await context.CloseAsync();  // Manual cleanup required
await browser.CloseAsync();  // Manual cleanup required
' Complex context lifecycle from testing paradigm
Dim context = Await browser.NewContextAsync(New BrowserNewContextOptions With {
    .ViewportSize = New ViewportSize With {.Width = 1920, .Height = 1080},
    .UserAgent = "custom-user-agent",
    .Locale = "en-US",
    .TimezoneId = "America/New_York"
})
Dim page = Await context.NewPageAsync()
' ... generate PDF ...
Await context.CloseAsync()  ' Manual cleanup required
Await browser.CloseAsync()  ' Manual cleanup required
$vbLabelText   $csharpLabel

Complexité multi-navigateurs :

// Playwrightdownloads multiple browsers by default
await playwright.Chromium.LaunchAsync();  // For Chrome testing
await playwright.Firefox.LaunchAsync();   // For Firefox testing
await playwright.Webkit.LaunchAsync();    // For Safari testing
// All downloaded but only Chromium needed for PDF generation
// Playwrightdownloads multiple browsers by default
await playwright.Chromium.LaunchAsync();  // For Chrome testing
await playwright.Firefox.LaunchAsync();   // For Firefox testing
await playwright.Webkit.LaunchAsync();    // For Safari testing
// All downloaded but only Chromium needed for PDF generation
' Playwright downloads multiple browsers by default
Await playwright.Chromium.LaunchAsync()  ' For Chrome testing
Await playwright.Firefox.LaunchAsync()   ' For Firefox testing
Await playwright.Webkit.LaunchAsync()    ' For Safari testing
' All downloaded but only Chromium needed for PDF generation
$vbLabelText   $csharpLabel

IronPDF: Aucune configuration, aucune installation

// No installation, no configuration, no lifecycle management
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// No installation, no configuration, no lifecycle management
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
' No installation, no configuration, no lifecycle management
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
$vbLabelText   $csharpLabel

Véritable solution plug-and-play :IronPDFélimine toute la surcharge liée aux frameworks de test. Aucune commande d'installation de navigateur, aucune configuration sans interface graphique, aucune gestion de contexte : il suffit d'instancier et de rendre. Conçu spécifiquement pour la génération de documents, et non adapté à partir d'outils de test.

Comparaison des performances de Playwrightvs IronPDF

Métrique Playwright IronPDF
Objectif principal Cadre de test E2E Génération de documents PDF
Philosophie de conception Outil de test avec fonctionnalité PDF Bibliothèque PDF spécialement conçue à cet effet
Installation requise playwright install (Téléchargement de plus de 400 Mo) Aucun - installation instantanée
Configuration requise Mode sans interface graphique, options de lancement du navigateur, contextes Configuration zéro
Téléchargement du navigateur 400 Mo+ (Chromium, Firefox, WebKit) Moteur optimisé intégré
Complexité de l'installation Configuration d'installation et de lancement en ligne de commande Prêt à l'emploi
Premier rendu (Cold Start) 4.5 secondes 2.8 secondes
Rendu ultérieur 3.8-4.1 secondes 0.8-1,2 secondes
Mémoire par conversion 280-420MB 80-120MB
Complexité de l'API Cycle de vie complexe asynchrone du navigateur/contexte/page Des phrases simples et synchrones
Initialisation CreateAsync() + LaunchAsync() + NewPageAsync() new ChromePdfRenderer()
Support PDF/A Pas disponible Soutenu
Accessibilité PDF/UA Pas disponible Soutenu
Signatures numériques Pas disponible Soutenu
Édition de PDF Pas disponible Fusionner, diviser, estampiller, modifier
Support professionnel Communauté Commercial avec SLA

IronPDF a été conçu en mettant l'accent sur la génération de fichiers PDF. Contrairement à Playwright, centré sur les tests,IronPDFoffre une variété de fonctionnalités API centrées sur les documents. Il s'appuie sur une seule instance optimisée de Chromium, favorisant l'efficacité et offrant des opérations synchrones et asynchrones. Il en résulte un modèle mental et un flux de travail plus simples pour les développeurs qui ont besoin de fonctionnalités PDF.

Pour les équipes qui prévoient d'adopter .NET 10 et C# 14 d'ici 2025 et 2026,IronPDFfournit une solution PDF spécialement conçue qui élimine les frais généraux liés à l'automatisation des navigateurs tout en offrant de meilleures performances et des fonctionnalités de document professionnelles.

En résumé

Playwright est le framework de test de Microsoft conçu pour les ingénieurs QA exécutant des tests automatisés multiplateformes. Son utilisation pour la génération de PDF constitue une inadéquation architecturale qui nécessite des connaissances approfondies en matière de tests :

  • Installation manuelle du navigateur (playwright install)
  • Configuration en mode sans interface graphique pour la production
  • Gestion des options de lancement du navigateur
  • Configuration du cycle de vie du contexte
  • Téléchargements multi-navigateurs (plus de 400 Mo) alors qu'un seul est nécessaire
  • Modèles async/await complexes issus du paradigme de test

IronPDF est une bibliothèque de génération de documents conçue pour les développeurs créant des flux de travail PDF. C'est vraiment prêt à l'emploi :

  • Aucune installation requise — fonctionne immédiatement
  • Configuration nulle — valeurs par défaut intelligentes
  • Aucun téléchargement de navigateur requis — moteur optimisé inclus
  • API simple : aucun concept de test à apprendre
  • Gestion automatique des ressources – aucune complexité liée au cycle de vie

Si vous devez tester des applications web sur différents navigateurs, utilisez Playwright. Si vous avez besoin de générer des documents PDF, utilisez IronPDF. N'adaptez pas un cadre de test à la génération de documents ; utilisez l'outil conçu spécifiquement pour cette tâche.


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 Playwright
dotnet remove package Microsoft.Playwright

# Remove browser binaries (reclaim ~400MB disk space)
# Delete the .playwright folder in your project or user directory

# Add IronPDF
dotnet add package IronPdf
# Remove Playwright
dotnet remove package Microsoft.Playwright

# Remove browser binaries (reclaim ~400MB disk space)
# Delete the .playwright folder in your project or user directory

# Add IronPDF
dotnet add package IronPdf
SHELL

Aucun playwright install 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"
$vbLabelText   $csharpLabel

Référence API complète

Modifications de l'espace de nommage

// Before: Playwright
using Microsoft.Playwright;
using System.Threading.Tasks;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
// Before: Playwright
using Microsoft.Playwright;
using System.Threading.Tasks;

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
' Before: Playwright
Imports Microsoft.Playwright
Imports System.Threading.Tasks

' After: IronPDF
Imports IronPdf
Imports IronPdf.Rendering
$vbLabelText   $csharpLabel

Mappages de l'API de base

API Playwright API IronPDF
Playwright.CreateAsync() new ChromePdfRenderer()
playwright.Chromium.LaunchAsync() Pas nécessaire
browser.NewPageAsync() Pas nécessaire
page.GotoAsync(url) renderer.RenderUrlAsPdf(url)
page.SetContentAsync(html) + page.PdfAsync() renderer.RenderHtmlAsPdf(html)
page.CloseAsync() Pas nécessaire
browser.CloseAsync() Pas nécessaire
PagePdfOptions.Format RenderingOptions.PaperSize
PagePdfOptions.Margin RenderingOptions.MarginTop/Bottom/Left/Right
PagePdfOptions.DisplayHeaderFooter TextFooter
PagePdfOptions.HeaderTemplate RenderingOptions.HtmlHeader
PagePdfOptions.FooterTemplate RenderingOptions.HtmlFooter
<span class='pageNumber'> {page}

Exemples de migration de code

Exemple 1 : Conversion d'une chaîne HTML en fichier PDF

Avant (Playwright):

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

class Program
{
    static async Task Main(string[] args)
    {
        var playwright = await Playwright.CreateAsync();
        var browser = await playwright.Chromium.LaunchAsync();
        var page = await browser.NewPageAsync();

        string html = "<h1>Hello World</h1><p>This is a test PDF.</p>";
        await page.SetContentAsync(html);
        await page.PdfAsync(new PagePdfOptions { Path = "output.pdf" });

        await browser.CloseAsync();
    }
}
// NuGet: Install-Package Microsoft.Playwright
using Microsoft.Playwright;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var playwright = await Playwright.CreateAsync();
        var browser = await playwright.Chromium.LaunchAsync();
        var page = await browser.NewPageAsync();

        string html = "<h1>Hello World</h1><p>This is a test PDF.</p>";
        await page.SetContentAsync(html);
        await page.PdfAsync(new PagePdfOptions { Path = "output.pdf" });

        await browser.CloseAsync();
    }
}
Imports Microsoft.Playwright
Imports System.Threading.Tasks

Module Program
    Async Function Main(args As String()) As Task
        Dim playwright = Await Playwright.CreateAsync()
        Dim browser = Await playwright.Chromium.LaunchAsync()
        Dim page = Await browser.NewPageAsync()

        Dim html As String = "<h1>Hello World</h1><p>This is a test PDF.</p>"
        Await page.SetContentAsync(html)
        Await page.PdfAsync(New PagePdfOptions With {.Path = "output.pdf"})

        Await browser.CloseAsync()
    End Function
End Module
$vbLabelText   $csharpLabel

Après (IronPDF):

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        string html = "<h1>Hello World</h1><p>This is a test PDF.</p>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main(string[] args)
    {
        var renderer = new ChromePdfRenderer();

        string html = "<h1>Hello World</h1><p>This is a test PDF.</p>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf

Class Program
    Shared Sub Main(ByVal args As String())
        Dim renderer = New ChromePdfRenderer()

        Dim html As String = "<h1>Hello World</h1><p>This is a test PDF.</p>"
        Dim pdf = renderer.RenderHtmlAsPdf(html)
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

Cet exemple illustre la différence architecturale fondamentale. Playwrightnécessite cinq opérations asynchrones : Playwright.CreateAsync(), Chromium.LaunchAsync(), NewPageAsync(), SetContentAsync() et PdfAsync(), Plus un nettoyage explicite du navigateur avec CloseAsync().

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 code de nettoyage. 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 (Playwright):

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

class Program
{
    static async Task Main(string[] args)
    {
        var playwright = await Playwright.CreateAsync();
        var browser = await playwright.Chromium.LaunchAsync();
        var page = await browser.NewPageAsync();

        await page.GotoAsync("https://www.example.com");
        await page.PdfAsync(new PagePdfOptions 
        { 
            Path = "webpage.pdf",
            Format = "A4"
        });

        await browser.CloseAsync();
    }
}
// NuGet: Install-Package Microsoft.Playwright
using Microsoft.Playwright;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var playwright = await Playwright.CreateAsync();
        var browser = await playwright.Chromium.LaunchAsync();
        var page = await browser.NewPageAsync();

        await page.GotoAsync("https://www.example.com");
        await page.PdfAsync(new PagePdfOptions 
        { 
            Path = "webpage.pdf",
            Format = "A4"
        });

        await browser.CloseAsync();
    }
}
Imports Microsoft.Playwright
Imports System.Threading.Tasks

Module Program
    Async Function Main(args As String()) As Task
        Dim playwright = Await Playwright.CreateAsync()
        Dim browser = Await playwright.Chromium.LaunchAsync()
        Dim page = Await browser.NewPageAsync()

        Await page.GotoAsync("https://www.example.com")
        Await page.PdfAsync(New PagePdfOptions With {
            .Path = "webpage.pdf",
            .Format = "A4"
        })

        Await browser.CloseAsync()
    End Function
End Module
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

Le dramaturge 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. Notez que Playwrightexige de spécifier le Format dans PagePdfOptions, tandisIronPDFutilise RenderingOptions.PaperSize pour la configuration du format de papier. Pour en savoir plus, consultez nos tutoriels.

Exemple 3 : Taille de page personnalisée avec marges

Avant (Playwright):

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

class Program
{
    static async Task Main()
    {
        using var playwright = await Playwright.CreateAsync();
        await using var browser = await playwright.Chromium.LaunchAsync();
        var page = await browser.NewPageAsync();
        await page.SetContentAsync("<h1>Custom PDF</h1><p>Letter size with margins</p>");
        await page.PdfAsync(new PagePdfOptions 
        { 
            Path = "custom.pdf",
            Format = "Letter",
            Margin = new Margin { Top = "1in", Bottom = "1in", Left = "0.5in", Right = "0.5in" }
        });
    }
}
// NuGet: Install-Package Microsoft.Playwright
using Microsoft.Playwright;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var playwright = await Playwright.CreateAsync();
        await using var browser = await playwright.Chromium.LaunchAsync();
        var page = await browser.NewPageAsync();
        await page.SetContentAsync("<h1>Custom PDF</h1><p>Letter size with margins</p>");
        await page.PdfAsync(new PagePdfOptions 
        { 
            Path = "custom.pdf",
            Format = "Letter",
            Margin = new Margin { Top = "1in", Bottom = "1in", Left = "0.5in", Right = "0.5in" }
        });
    }
}
Imports Microsoft.Playwright
Imports System.Threading.Tasks

Module Program
    Async Function Main() As Task
        Using playwright = Await Playwright.CreateAsync()
            Await Using browser = Await playwright.Chromium.LaunchAsync()
                Dim page = Await browser.NewPageAsync()
                Await page.SetContentAsync("<h1>Custom PDF</h1><p>Letter size with margins</p>")
                Await page.PdfAsync(New PagePdfOptions With {
                    .Path = "custom.pdf",
                    .Format = "Letter",
                    .Margin = New Margin With {
                        .Top = "1in",
                        .Bottom = "1in",
                        .Left = "0.5in",
                        .Right = "0.5in"
                    }
                })
            End Using
        End Using
    End Function
End Module
$vbLabelText   $csharpLabel

Après (IronPDF):

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

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;
        renderer.RenderingOptions.MarginTop = 25;
        renderer.RenderingOptions.MarginBottom = 25;
        renderer.RenderingOptions.MarginLeft = 12;
        renderer.RenderingOptions.MarginRight = 12;
        var pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>Letter size with margins</p>");
        pdf.SaveAs("custom.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter;
        renderer.RenderingOptions.MarginTop = 25;
        renderer.RenderingOptions.MarginBottom = 25;
        renderer.RenderingOptions.MarginLeft = 12;
        renderer.RenderingOptions.MarginRight = 12;
        var pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>Letter size with margins</p>");
        pdf.SaveAs("custom.pdf");
    }
}
Imports IronPdf
Imports IronPdf.Rendering

Class Program
    Shared Sub Main()
        Dim renderer As New ChromePdfRenderer()
        renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter
        renderer.RenderingOptions.MarginTop = 25
        renderer.RenderingOptions.MarginBottom = 25
        renderer.RenderingOptions.MarginLeft = 12
        renderer.RenderingOptions.MarginRight = 12
        Dim pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>Letter size with margins</p>")
        pdf.SaveAs("custom.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

Playwright utilise des valeurs de marge basées sur des chaînes de caractères ("1in", "0.5in") tandisIronPDFutilise des valeurs numériques en millimètres. La conversion est la suivante : 1 pouce = 25,4 mm, donc "1in" devient 25 et "0.5in" devient approximativement 12. Le Format = "Letter" du dramaturge correspond au PaperSize = PdfPaperSize.Letter d'IronPDF.

Exemple 4 : En-têtes, pieds de page et paramètres personnalisés

Avant (Playwright):

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

class Program
{
    static async Task Main(string[] args)
    {
        var playwright = await Playwright.CreateAsync();
        var browser = await playwright.Chromium.LaunchAsync();
        var page = await browser.NewPageAsync();

        string html = "<h1>Custom PDF</h1><p>With margins and headers.</p>";
        await page.SetContentAsync(html);

        await page.PdfAsync(new PagePdfOptions
        {
            Path = "custom.pdf",
            Format = "A4",
            Margin = new Margin { Top = "1cm", Bottom = "1cm", Left = "1cm", Right = "1cm" },
            DisplayHeaderFooter = true,
            HeaderTemplate = "<div style='font-size:10px; text-align:center;'>Header</div>",
            FooterTemplate = "<div style='font-size:10px; text-align:center;'>Page <span class='pageNumber'></span></div>"
        });

        await browser.CloseAsync();
    }
}
// NuGet: Install-Package Microsoft.Playwright
using Microsoft.Playwright;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        var playwright = await Playwright.CreateAsync();
        var browser = await playwright.Chromium.LaunchAsync();
        var page = await browser.NewPageAsync();

        string html = "<h1>Custom PDF</h1><p>With margins and headers.</p>";
        await page.SetContentAsync(html);

        await page.PdfAsync(new PagePdfOptions
        {
            Path = "custom.pdf",
            Format = "A4",
            Margin = new Margin { Top = "1cm", Bottom = "1cm", Left = "1cm", Right = "1cm" },
            DisplayHeaderFooter = true,
            HeaderTemplate = "<div style='font-size:10px; text-align:center;'>Header</div>",
            FooterTemplate = "<div style='font-size:10px; text-align:center;'>Page <span class='pageNumber'></span></div>"
        });

        await browser.CloseAsync();
    }
}
Imports Microsoft.Playwright
Imports System.Threading.Tasks

Module Program
    Async Function Main(args As String()) As Task
        Dim playwright = Await Playwright.CreateAsync()
        Dim browser = Await playwright.Chromium.LaunchAsync()
        Dim page = Await browser.NewPageAsync()

        Dim html As String = "<h1>Custom PDF</h1><p>With margins and headers.</p>"
        Await page.SetContentAsync(html)

        Await page.PdfAsync(New PagePdfOptions With {
            .Path = "custom.pdf",
            .Format = "A4",
            .Margin = New Margin With {.Top = "1cm", .Bottom = "1cm", .Left = "1cm", .Right = "1cm"},
            .DisplayHeaderFooter = True,
            .HeaderTemplate = "<div style='font-size:10px; text-align:center;'>Header</div>",
            .FooterTemplate = "<div style='font-size:10px; text-align:center;'>Page <span class='pageNumber'></span></div>"
        })

        Await browser.CloseAsync()
    End Function
End Module
$vbLabelText   $csharpLabel

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.MarginTop = 10;
        renderer.RenderingOptions.MarginBottom = 10;
        renderer.RenderingOptions.MarginLeft = 10;
        renderer.RenderingOptions.MarginRight = 10;
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.TextHeader.CenterText = "Header";
        renderer.RenderingOptions.TextFooter.CenterText = "Page {page}";

        string html = "<h1>Custom PDF</h1><p>With margins and headers.</p>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        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.MarginTop = 10;
        renderer.RenderingOptions.MarginBottom = 10;
        renderer.RenderingOptions.MarginLeft = 10;
        renderer.RenderingOptions.MarginRight = 10;
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.TextHeader.CenterText = "Header";
        renderer.RenderingOptions.TextFooter.CenterText = "Page {page}";

        string html = "<h1>Custom PDF</h1><p>With margins and headers.</p>";
        var pdf = renderer.RenderHtmlAsPdf(html);
        pdf.SaveAs("custom.pdf");
    }
}
Imports IronPdf
Imports IronPdf.Rendering

Class Program
    Shared Sub Main(args As String())
        Dim renderer = New ChromePdfRenderer()

        renderer.RenderingOptions.MarginTop = 10
        renderer.RenderingOptions.MarginBottom = 10
        renderer.RenderingOptions.MarginLeft = 10
        renderer.RenderingOptions.MarginRight = 10
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
        renderer.RenderingOptions.TextHeader.CenterText = "Header"
        renderer.RenderingOptions.TextFooter.CenterText = "Page {page}"

        Dim html As String = "<h1>Custom PDF</h1><p>With margins and headers.</p>"
        Dim pdf = renderer.RenderHtmlAsPdf(html)
        pdf.SaveAs("custom.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

Cet exemple illustre la différence de syntaxe entre les espaces réservés de l'en-tête et du pied de page. Playwrightutilise des espaces réservés basés sur les classes HTML (<span class='pageNumber'></span>), tandisIronPDFutilise des espaces réservés entre accolades ({page}). Notez que Playwrightnécessite DisplayHeaderFooter = true pour activer les en-têtes/pieds de page, tandisIronPDFles active automatiquement lorsque vous définissez le contenu de l'en-tête/pied de page.


Notes de migration essentielles

Conversion asynchrone vers synchrone

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

// Playwright: Async required
public async Task<byte[]> GeneratePdfAsync(string html)
{
    using var playwright = await Playwright.CreateAsync();
    await using var browser = await playwright.Chromium.LaunchAsync();
    var page = await browser.NewPageAsync();
    await page.SetContentAsync(html);
    return await page.PdfAsync();
}

// IronPDF: Sync is simpler
public byte[] GeneratePdf(string html)
{
    var renderer = new ChromePdfRenderer();
    return renderer.RenderHtmlAsPdf(html).BinaryData;
}
// Playwright: Async required
public async Task<byte[]> GeneratePdfAsync(string html)
{
    using var playwright = await Playwright.CreateAsync();
    await using var browser = await playwright.Chromium.LaunchAsync();
    var page = await browser.NewPageAsync();
    await page.SetContentAsync(html);
    return await page.PdfAsync();
}

// IronPDF: Sync is simpler
public byte[] GeneratePdf(string html)
{
    var renderer = new ChromePdfRenderer();
    return renderer.RenderHtmlAsPdf(html).BinaryData;
}
Imports System.Threading.Tasks
Imports Microsoft.Playwright

Public Class PdfGenerator
    ' Playwright: Async required
    Public Async Function GeneratePdfAsync(html As String) As Task(Of Byte())
        Using playwright = Await Playwright.CreateAsync()
            Await Using browser = Await playwright.Chromium.LaunchAsync()
                Dim page = Await browser.NewPageAsync()
                Await page.SetContentAsync(html)
                Return Await page.PdfAsync()
            End Using
        End Using
    End Function

    ' IronPDF: Sync is simpler
    Public Function GeneratePdf(html As String) As Byte()
        Dim renderer = New ChromePdfRenderer()
        Return renderer.RenderHtmlAsPdf(html).BinaryData
    End Function
End Class
$vbLabelText   $csharpLabel

Conversion de l'unité de marge

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

Playwright IronPDF(mm)
"1in" 25
"0.5in" 12
"1cm" 10

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

Cours de dramaturgie IronPDFPlaceholder
<span class='pageNumber'> {page}
<span class='totalPages'> {total-pages}
<span class='date'> {date}
<span class='title'> {html-title}

Élimination du cycle de vie du navigateur

Supprimez tout le code de gestion du navigateur :

// Playwright: Explicit cleanup required
await page.CloseAsync();
await browser.CloseAsync();
playwright.Dispose();

// IronPDF: No disposal needed - just use the renderer
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Playwright: Explicit cleanup required
await page.CloseAsync();
await browser.CloseAsync();
playwright.Dispose();

// IronPDF: No disposal needed - just use the renderer
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
' Playwright: Explicit cleanup required
Await page.CloseAsync()
Await browser.CloseAsync()
playwright.Dispose()

' IronPDF: No disposal needed - just use the renderer
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
$vbLabelText   $csharpLabel

Nouvelles capacités après la migration

Après avoir migré vers IronPDF, vous bénéficiez de fonctionnalités que Playwrightne 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")
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

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)
$vbLabelText   $csharpLabel

Conformité PDF/A

pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b)
$vbLabelText   $csharpLabel

Liste de contrôle de la migration

Pré-migration

  • Identifier tous les codes de génération de PDF Playwright
  • Valeurs des marges du document (convertir les pouces/cm en millimètres)
  • Notez la syntaxe des espaces réservés d'en-tête/pied de page pour la conversion
  • Obtenez votre clé de licenceIronPDFsur IronPDF

Modifications du paquet

  • Supprimer le package NuGet Microsoft.Playwright Supprimez le dossier .playwright pour récupérer environ 400 Mo d'espace disque.
  • Installez le package NuGet IronPdf : dotnet add package IronPdf

Modifications du code

  • Mettre à jour les importations d'espace de noms
  • Remplacez le cycle de vie asynchrone du navigateur par ChromePdfRenderer
  • Convertir page.SetContentAsync() + page.PdfAsync() en RenderHtmlAsPdf()
  • Convertir page.GotoAsync() + page.PdfAsync() en 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
  • 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
  • Vérifier l'affichage de l'en-tête et du pied de page avec les numéros de page
  • Vérifier la précision des marges et du format de page
  • Ajouter de nouvelles fonctionnalités (sécurité, filigranes, fusion) selon les besoins

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 ...

Lire la suite

Équipe de soutien Iron

Nous sommes en ligne 24 heures sur 24, 5 jours sur 7.
Chat
Email
Appelez-moi