Cómo migrar de Playwright a IronPDF en C#
La migración de Escritorfor .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 Escritora IronPDF
Entender Escritorpara .NET
Playwright para .NET forma parte de la familia de herramientas de automatización de navegadores de Microsoft; está estructurado en torno a la entrega de capacidades de prueba integrales a través de Chromium, Firefox y WebKit. La biblioteca adopta un diseño "testing-first", lo que significa que se centra principalmente en escenarios que implican pruebas basadas en navegador. Aunque Escritoradmite la generación de PDF, esta funcionalidad es más bien una característica complementaria y no ofrece la configuración granular que se ve en las herramientas PDF dedicadas.
Playwright for .NET es principalmente un marco de trabajo de automatización y pruebas de navegadores en el que la generación de PDF es una función secundaria. Al igual que PuppeteerSharp, Escritorgenera archivos PDF utilizando la función de impresión a PDF del navegador, que equivale a pulsar Ctrl+P. De este modo, se obtiene un resultado optimizado para la impresión. Esto produce una salida optimizada para papel, que difiere de la representación en pantalla.
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 Escritorimplica 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. Escritorno 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.
Comparación del rendimiento de Escritorfrente a IronPDF
| Métrica | Escritor | IronPDF |
|---|---|---|
| Finalidad principal | Pruebas de navegador | Generación de PDF |
| Descarga del navegador | 400MB+ (Chromium, Firefox, WebKit) | Motor integrado optimizado |
| 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 asíncrono de navegador/contexto/página | Sincronización de frases |
| Inicialización | playwright install + CreateAsync + LaunchAsync | <código>new ChromePdfRenderer()</código |
| Soporte PDF/A | No disponible | Soporte completo |
| Accesibilidad PDF/UA | No disponible | Soporte completo |
| Firmas digitales | No disponible | Soporte completo |
| Edición de PDF | No disponible | Combinar, dividir, sellar, 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.
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 de IronPDF: Obtenga su clave de licencia en ironpdf.com
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 IronPdfCon IronPDF no es necesario instalar playwright: 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";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;Mapeos de API principales
| API de Playwright | API de IronPDF | Notas |
|---|---|---|
| <código>Playwright.CreateAsync()</código | <código>new ChromePdfRenderer()</código | No se necesita async |
playwright.Chromium.LaunchAsync() | No es necesario | Sin gestión de navegador |
| <código>browser.NewPageAsync()</código | No es necesario | Sin contexto de página |
| <código>page.GotoAsync(url)</código | <código>renderer.RenderUrlAsPdf(url)</código | Representación directa de URL |
page.SetContentAsync(html) + page.PdfAsync() | renderer.RenderHtmlAsPdf(html) | Método único |
| <código>page.CloseAsync()</código | No es necesario | Limpieza automática |
| <código>browser.CloseAsync()</código | No es necesario | Limpieza automática |
| <código>PagePdfOptions.Format</código | <código>RenderingOptions.PaperSize</código | Tamaño del papel |
| <código>PagePdfOptions.Margin</código | <código>RenderingOptions.MarginTop/Bottom/Left/Right</código | Márgenes individuales |
| <código>PagePdfOptions.DisplayHeaderFooter</código | RenderingOptions.TextHeader/TextFooter | Encabezados/pies de página |
| <código>PagePdfOptions.HeaderTemplate</código | <código>RenderingOptions.HtmlHeader</código | Encabezados HTML |
| <código>PagePdfOptions.FooterTemplate</código | <código>RenderingOptions.HtmlFooter</código | Pies de página HTML |
| <código> class="pageNumber"></código> | {page} | Marcador de posición del número de página |
Ejemplos de migración de código
Ejemplo 1: Conversión de cadenas HTML a PDF
Antes (dramaturgo):
// 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();
}
}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");
}
}Este ejemplo demuestra la diferencia arquitectónica fundamental. Escritorrequiere cinco operaciones asíncronas: Playwright.CreateAsync(), Chromium.LaunchAsync(), NewPageAsync(), SetContentAsync(), y PdfAsync(), además de una limpieza explícita del navegador con CloseAsync().
IronPDF elimina toda esta complejidad: cree un ChromePdfRenderer, llame 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 (dramaturgo):
// 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();
}
}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");
}
}Playwright utiliza GotoAsync() para navegar a una URL seguida de PdfAsync().IronPDFproporciona un único método RenderUrlAsPdf() que gestiona la navegación y la generación de PDF en una sola llamada. Tenga en cuenta que Escritorrequiere especificar el Formato en PagePdfOptions, mientras queIronPDFutiliza <código>RenderingOptions.PaperSize</códigopara 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 (dramaturgo):
// 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" }
});
}
}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");
}
}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 "1 pulgada" se convierte en <código>25</códigoy "0,5 pulgadas" se convierte aproximadamente en 12. Playwright's Format = "Letter" se corresponde con IronPDF's PaperSize = PdfPaperSize.Letter.
Ejemplo 4: Encabezados, pies de página y configuración personalizada
Antes (dramaturgo):
// 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();
}
}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");
}
}Este ejemplo muestra la diferencia de sintaxis entre los marcadores de posición de encabezado y pie de página. Escritorutiliza marcadores de posición basados en clases HTML (<span> class="pageNumber"></span>), mientras queIronPDFutiliza marcadores de posición con llaves ({page}). Tenga en cuenta que Escritorrequiere DisplayHeaderFooter = true para habilitar los encabezados/pies de página, mientras queIronPDFlos habilita automáticamente al establecer el contenido del encabezado/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;
}Conversión de unidades de margen
Playwright utiliza unidades de cadena;IronPDFutiliza milímetros numéricos:
| Escritor | IronPDF(mm) |
|---|---|
| <código>"1in"</código> | <código>25</código |
| <código>"0.5in"</código> | <código>12</código |
| <código>"1cm"</código> | <código>10</código |
Conversión de marcadores de posición de encabezado/pie
| Clase de dramaturgia | Marcador de posición IronPDF |
|---|---|
| <código> class="pageNumber"></código> | {page} |
| <código> class="totalPages"></código> | {total de páginas} |
| <código> class="fecha"></código> | {fecha} |
| <código> class="title"></código> | {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");Nuevas capacidades tras la migración
Tras migrar a IronPDF, obtendrá funciones que Escritorno 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");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>");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;Firmas digitales
var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);var 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);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.com
Cambios en el paquete
- Eliminar el paquete NuGet
Microsoft.Playwright - Eliminar la carpeta
.playwrightpara recuperar aproximadamente 400 MB de espacio en disco - Instalar el paquete NuGet
IronPdf:dotnet add package IronPdf
Cambios de código
- Actualizar las importaciones de espacios de nombres
- Reemplazar 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






