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:
-
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.
-
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.
-
Arquitectura de pruebas no optimizada para la generación de documentos.
-
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.
-
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.
- 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
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
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 pruebaProxy: Interceptación de red para pruebas (sobrecarga innecesaria)DownloadsPath: Gestión de artefactos de pruebaTracesDir: 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
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
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")
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
- Entorno .NET : .NET Framework 4.6.2+ o .NET Core 3.1+ / .NET 5/6/7/8/9+
- Acceso a NuGet : Capacidad para instalar paquetes NuGet
- 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
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"
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
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
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
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
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
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
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
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
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
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
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")
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")
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
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
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)
Cumplimiento de PDF/A
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b)
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
.playwrightpara recuperar ~400 MB de espacio en disco - Instalar
IronPdfel 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()aRenderHtmlAsPdf() - Convertir
page.GotoAsync()+page.PdfAsync()aRenderUrlAsPdf() - 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

