Saltar al pie de página
GUíAS DE MIGRACIóN

Cómo migrar de Playwright a IronPDF en C#

La migración de Playwright for .NET aIronPDFtransforma su flujo de trabajo de generación de PDF de una herramienta de automatización del navegador centrada en las pruebas a una biblioteca de PDF creada específicamente. Esta guía proporciona una ruta de migración completa, paso a paso, que elimina los complejos patrones async, la gestión del ciclo de vida del navegador y las descargas del navegador de más de 400 MB, a la vez que proporciona un mejor rendimiento y funciones PDF profesionales.

Por qué migrar de Playwright a IronPDF

Entender Playwright for .NET

Playwright for .NET es el framework de pruebas integral de Microsoft, NO una biblioteca de generación de documentos. Fue desarrollado desde cero para realizar pruebas automatizadas en los navegadores Chromium, Firefox y WebKit. Playwright se destaca en probar escenarios: hacer clic en botones, completar formularios, interceptar solicitudes de red, tomar capturas de pantalla y validar la compatibilidad entre navegadores.

Comprensión crítica: Playwright es una herramienta de prueba que se está reutilizando para la generación de PDF. La creación de PDF es simplemente un efecto secundario de la función de impresión del navegador (Ctrl+P), no un objetivo principal del diseño. Esto crea desajustes arquitectónicos fundamentales:

  • Arquitectura de prueba primero: diseñada para pruebas de navegador interactivas, no para producción de documentos sin interfaz gráfica.
  • Carga de múltiples navegadores: descarga más de 400 MB de archivos binarios del navegador (Chromium, Firefox, WebKit) incluso cuando solo necesita la generación de PDF
  • API centrada en pruebas: patrones asincrónicos complejos diseñados para flujos de trabajo de automatización de pruebas, no para la generación de documentos
  • Sin funciones del documento: falta compatibilidad con PDF/A, firmas digitales, marcas de agua, fusión y controles de seguridad.

El problema del marco de pruebas

Playwright se diseñó para realizar pruebas de extremo a extremo, no para generar documentos. Esto plantea problemas fundamentales cuando se utiliza para PDF:

  1. se requieren descargas de navegador de más de 400 MB antes del primer uso. La configuración por defecto de Playwright implica la descarga de varios navegadores, lo que puede ser una consideración para entornos con estrictas limitaciones de recursos.

  2. Patrones asíncronos complejos con contextos de navegador y gestión de páginas. Los desarrolladores deben familiarizarse con los contextos del navegador y la gestión de páginas, así como con las prácticas de eliminación adecuadas.

  3. Arquitectura de pruebas no optimizada para la generación de documentos.

  4. Limitaciones de impresión a PDF equivalentes a la impresión con Ctrl+P del navegador. Los diseños pueden refluir, los fondos pueden omitirse por defecto y la salida está paginada para la impresión.

  5. No es compatible con PDF/A ni PDF/UA por motivos de accesibilidad. Playwright no puede producir documentos compatibles con PDF/A (archivo) o PDF/UA (accesibilidad). Para la Sección 508, las directivas de accesibilidad de la UE o los requisitos de archivado a largo plazo, necesitará una biblioteca PDF específica.

  6. Operaciones con muchos recursos que requieren instancias completas del navegador.

El problema de configuración del marco de pruebas

Playwright requiere una amplia configuración centrada en pruebas que los ingenieros de control de calidad comprenden, pero que los desarrolladores de documentos no deberían necesitar:

Se requiere instalación del navegador:

# 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

Configuración de inicio del navegador:

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

Opciones de configuración específicas de la prueba:

  • Headless: Se debe configurar el modo sin cabeza para producción (el valor predeterminado es el modo con cabeza para prueba)
  • SlowMo: Retrasos en el tiempo de prueba (irrelevante para la generación de PDF)
  • Devtools: Configuración de herramientas de prueba (no es necesario para los documentos)
  • ExecutablePath: Rutas de navegador personalizadas para entornos de prueba
  • Proxy: Interceptación de red para pruebas (sobrecarga innecesaria)
  • DownloadsPath: Gestión de artefactos de prueba
  • TracesDir: Rastreos de ejecución de pruebas

Gestión del contexto del navegador:

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

Complejidad de múltiples navegadores:

// 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
// 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
' 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: configuración cero, instalación cero

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

Plug and play real:IronPDFelimina toda la sobrecarga del marco de prueba. Sin comandos de instalación del navegador, sin configuración headless, sin gestión de contexto: solo instanciar y renderizar. Creado específicamente para la generación de documentos, no adaptado de herramientas de prueba.

Comparación del rendimiento de Playwright frente a IronPDF

Métrica Playwright IronPDF
Finalidad principal Marco de pruebas E2E Generación de documentos PDF
Filosofía del diseño Herramienta de prueba con función de lado PDF Biblioteca PDF especialmente diseñada
Requiere instalación playwright install (más de 400 MB de descarga) Ninguno - configuración instantánea
Configuración requerida Modo sin cabeza, opciones de inicio del navegador, contextos Configuración cero
Descarga del navegador Más de 400 MB (Chromium, Firefox, WebKit) Motor integrado optimizado
Complejidad de configuración Configuración de instalación y lanzamiento desde la línea de comandos Conectar y usar
Primer renderizado (arranque en frío) 4.5 segundos 2.8 segundos
Traducciones posteriores 3.8-4.1 segundos 0.8-1.2 segundos
Memoria por conversión 280-420 MB 80-120 MB
Complejidad de la API Ciclo de vida asincrónico complejo de navegador/contexto/página Frases sencillas sincrónicas de una sola línea
Inicialización CreateAsync() + LaunchAsync() + NewPageAsync() new ChromePdfRenderer()
Soporte PDF/A No disponible Apoyado
Accesibilidad PDF/UA No disponible Apoyado
Firmas digitales No disponible Apoyado
Edición de PDF No disponible Fusionar, dividir, estampar, editar
Soporte profesional Comunidad Comercial con SLA

IronPDF se creó centrándose en la generación de PDF. A diferencia de Playwright, centrado en las pruebas,IronPDFofrece diversas funciones de API centradas en los documentos. Se basa en una única instancia optimizada de Chromium, que favorece la eficiencia y ofrece operaciones síncronas y asíncronas. El resultado es un modelo mental y un flujo de trabajo más sencillos para los desarrolladores que requieren funcionalidades PDF.

Para los equipos que planifican la adopción de .NET 10 y C# 14 hasta 2025 y 2026,IronPDFofrece una solución de PDF diseñada específicamente que elimina la sobrecarga de automatización del navegador y, al mismo tiempo, ofrece un mejor rendimiento y funciones de documentos profesionales.

El resultado final

Playwright es el marco de pruebas de Microsoft diseñado para ingenieros de control de calidad que ejecutan pruebas automatizadas en varios navegadores. Su uso para la generación de PDF supone una discordancia arquitectónica que requiere amplios conocimientos específicos de pruebas:

  • Instalación manual del navegador (playwright install)
  • Configuración del modo sin cabeza para producción
  • Gestión de opciones de inicio del navegador
  • Configuración del ciclo de vida del contexto
  • Descargas multinavegador (400 MB+) cuando solo se necesita uno
  • Patrones complejos async/await del paradigma de prueba

IronPDF es una biblioteca de generación de documentos diseñada para desarrolladores que crean flujos de trabajo PDF. Es realmente plug-and-play:

  • Instalación cero: funciona inmediatamente
  • Configuración cero: valores predeterminados inteligentes
  • Cero descargas de navegador: motor optimizado incluido
  • API simple: no es necesario probar conceptos para aprender
  • Gestión automática de recursos: sin complejidad en el ciclo de vida

Si necesita probar aplicaciones web en distintos navegadores, utilice Playwright. Si necesita generar documentos PDF, utilice IronPDF. No adapte un marco de prueba para la generación de documentos: utilice la herramienta creada específicamente para el trabajo.


Antes de empezar

Prerrequisitos

  1. Entorno .NET : .NET Framework 4.6.2+ o .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. Acceso a NuGet : Capacidad para instalar paquetes NuGet
  3. Licencia deIronPDF: Obtenga su clave de licencia en IronPDF

Cambios en el paquete 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

No se requiere playwright install con IronPDF : el motor de renderizado se incluye automáticamente.

Configuración de licencias

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

Referencia completa de la API

Cambios en el espacio de nombres

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

Mapeos de API principales

API de Playwright API de IronPDF
Playwright.CreateAsync() new ChromePdfRenderer()
playwright.Chromium.LaunchAsync() No es necesario
browser.NewPageAsync() No es necesario
page.GotoAsync(url) renderer.RenderUrlAsPdf(url)
page.SetContentAsync(html) + page.PdfAsync() renderer.RenderHtmlAsPdf(html)
page.CloseAsync() No es necesario
browser.CloseAsync() No es necesario
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}

Ejemplos de migración de código

Ejemplo 1: Conversión de cadenas HTML a PDF

Antes (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

Despué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

Este ejemplo demuestra la diferencia arquitectónica fundamental. Playwright requiere cinco operaciones asincrónicas: Playwright.CreateAsync(), Chromium.LaunchAsync(), NewPageAsync(), SetContentAsync() y PdfAsync(), además de una limpieza explícita del navegador con CloseAsync().

IronPDF elimina toda esta complejidad: crea un ChromePdfRenderer, llama a RenderHtmlAsPdf() y SaveAs(). Sin patrones async, sin ciclo de vida del navegador, sin código de limpieza. El enfoque deIronPDFofrece una sintaxis más limpia y una mejor integración con las aplicaciones .NET modernas. Consulte la documentación HTML a PDF para ver ejemplos completos.

Ejemplo 2: Conversión de URL a PDF

Antes (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

Despué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

Playwright usa GotoAsync() para navegar a una URL seguido de PdfAsync().IronPDFproporciona un único método RenderUrlAsPdf() que maneja la navegación y la generación de PDF en una sola llamada. Tenga en cuenta que Playwright requiere especificar Format en PagePdfOptions, mientras queIronPDFusa RenderingOptions.PaperSize para la configuración del tamaño del papel. Más información en nuestros tutoriales.

Ejemplo 3: Tamaño de página personalizado con márgenes

Antes (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

Despué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 utiliza valores de margen basados ​​en cadenas ("1in", "0.5in") mientras queIronPDFutiliza valores numéricos en milímetros. La conversión es: 1 pulgada = 25,4 mm, por lo que "1in" se convierte en 25 y "0.5in" se convierte aproximadamente en 12. El Format = "Letter" del Playwright se corresponde con el PaperSize = PdfPaperSize.Letter de IronPDF.

Ejemplo 4: Encabezados, pies de página y configuración personalizada

Antes (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

Despué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

Este ejemplo muestra la diferencia de sintaxis entre los marcadores de posición de encabezado y pie de página. Playwright utiliza marcadores de posición basados ​​en clases HTML (<span class='pageNumber'></span>), mientras queIronPDFutiliza marcadores de posición entre llaves ({page}). Tenga en cuenta que Playwright requiere DisplayHeaderFooter = true para habilitar encabezados y pies de página, mientras queIronPDFlos habilita automáticamente cuando configura el contenido del encabezado y pie de página.


Notas de migración críticas

Conversión de Async a Sync

Playwright requiere async/await en todo momento;IronPDFadmite operaciones síncronas:

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

Conversión de unidades de margen

Playwright utiliza unidades de cadena;IronPDFutiliza milímetros numéricos:

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

Conversión de marcadores de posición de encabezado/pie

Clase de dramaturgia Marcador de posición IronPDF
<span class='pageNumber'> {page}
<span class='totalPages'> {total-pages}
<span class='date'> {date}
<span class='title'> {html-title}

Eliminación del ciclo de vida del navegador

Elimine todo el código de gestión del navegador:

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

Nuevas capacidades tras la migración

Tras migrar a IronPDF, obtendrá funciones que Playwright no puede ofrecer:

Fusión de 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

Marcas de agua

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

Protección con contraseña

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

Firmas digitales

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

Cumplimiento de PDF/A

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

Lista de comprobación de la migración

Pre-Migración

  • Identificar todos los códigos de generación de PDF de Playwright
  • Valores de márgenes del documento (convertir pulgadas/cm a milímetros)
  • Nota sobre la sintaxis de marcador de posición de encabezado/pie de página para la conversión
  • Obtenga la clave de licencia deIronPDFen IronPDF

Cambios en el paquete

  • Eliminar el paquete NuGet Microsoft.Playwright
  • Eliminar la carpeta .playwright para recuperar ~400 MB de espacio en disco
  • Instalar IronPdf el paquete NuGet : dotnet add package IronPdf

Cambios de código

  • Actualizar las importaciones de espacios de nombres
  • Reemplace el ciclo de vida del navegador asíncrono con ChromePdfRenderer
  • Convertir page.SetContentAsync() + page.PdfAsync() a RenderHtmlAsPdf()
  • Convertir page.GotoAsync() + page.PdfAsync() a RenderUrlAsPdf()
  • Convertir cadenas de margen a valores milimétricos
  • Convertir la sintaxis de marcador de posición de encabezado/pie de página
  • Eliminar todo el código de eliminación de páginas/navegadores
  • Agregar inicialización de licencia al iniciar la aplicación

Posmigración

  • Comparación visual de la salida PDF
  • Verificar la representación del encabezado/pie de página con números de página
  • Pruebe la precisión del margen y del tamaño de la página
  • Agregue nuevas capacidades (seguridad, marcas de agua, fusión) según sea necesario

Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien ...

Leer más

Equipo de soporte de Iron

Estamos disponibles online las 24 horas, 5 días a la semana.
Chat
Email
Llámame