IRONSOFTWAREHOME
视频

在 PDF 中通过 IronPDF 呈现 WebGL 内容

Curtis Chau
Curtis Chau
Updated: 2026年7月19日

从 Microsoft编剧for .NET 迁移到IronPDF将您的 PDF 生成工作流程从基于浏览器自动化测试框架转移到专用的 PDF 库。 本指南提供了一步一步的迁移路径,去除了异步浏览器生命周期管理和单独的playwright install浏览器二进制下载步骤。

为什么要从编剧迁移到 IronPDF.

了解编剧适用于 .NET.

Playwright for .NET (NuGet Microsoft.Playwright, MIT许可) 是微软的浏览器自动化框架,主要设计用于跨Chromium、Firefox和WebKit的端到端测试。 其典型工作负载是交互式的:点击按钮、填充表单、拦截网络请求、截取屏幕截图及验证跨浏览器兼容性。

在Playwright中,PDF生成是通过Page.PdfAsync()公开的次要功能,并且仅在Chromium上支持——Firefox和WebKit不实现PDF输出。 输出使用浏览器的打印到 PDF 路径(等同于 Ctrl+P),这对布局、背景和分页有影响:

  • 面向测试优先的架构,不为无头文档生成优化
  • 浏览器二进制文件(Chromium以及可选的Firefox和WebKit)必须通过playwright install单独安装
  • 为测试自动化工作流设计的异步 API
  • 无内置 PDF/A、PDF/UA、数字签名、水印、合并或安全功能

使用编剧生成 PDF 时的注意事项

Playwright 设计用于端到端测试,而非文档生成。 在将其重新用于 PDF 时的一些实际影响:

  1. 通过playwright install获取浏览器二进制文件。 Playwright的默认配置下载浏览器二进制文件(Chromium、Firefox、WebKit),这对于资源或部署限制严格的环境来说是一个考量。

  2. 异步浏览器/上下文/页面模型。 开发者需要对浏览器上下文和页面生命周期管理(包括销毁)感到熟悉。

  3. 面向测试优先的架构,不适合高负载的文档生成。

  4. 等同于 Ctrl+P 的打印到 PDF 语义。 布局可以回流,默认情况下可以省略背景,输出为分页打印。

  5. **无 PDF/A 或 PDF/UA 输出。**编剧不生成符合 PDF/A(存档)或 PDF/UA(无障碍性)标准的文档。 对于《第 508 条》、《欧盟无障碍性指令》或长期档案要求,通常需要专用的 PDF 库。

  6. 每渲染的浏览器资源使用每个 PDF 都会启动浏览器上下文和页面。

配置表面

Playwright 提供一个面向测试自动化的配置表面。 在仅用于 PDF 生成时最相关的部分:

浏览器安装步骤:

# Separate installation step before first use
playwright install            # Downloads browser binaries (Chromium, Firefox, WebKit)
# Or for a single browser:
playwright install chromium   # Chromium-only (the only engine that supports PDF output)
SHELL

浏览器启动配置:

// 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
});

测试专用配置选项:

  • Headless:必须为生产环境配置无头模式(测试默认有头)
  • SlowMo:测试时延(与PDF生成无关)
  • Devtools:测试工具配置(文档不需要)
  • ExecutablePath:测试环境中的自定义浏览器路径
  • Proxy:测试的网络拦截(不必要的开销)
  • DownloadsPath:测试工件管理
  • TracesDir:测试执行轨迹

浏览器上下文管理:

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

多浏览器表面:

//编剧supports launching multiple engines
await playwright.Chromium.LaunchAsync();  // For Chromium-based testing (and PDF output)
await playwright.Firefox.LaunchAsync();   // For Firefox testing
await playwright.Webkit.LaunchAsync();    // For WebKit/Safari testing
// Note: Page.PdfAsync() is implemented on Chromium only.
C#

IronPDF:单一打包渲染器

// No separate browser-binary install or context management
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");

IronPDF在NuGet包内附带其渲染引擎,因此没有单独的playwright install步骤,也没有浏览器/上下文/页生命周期需要管理。

###编剧与IronPDF性能对比

指标编剧IronPDF
主要目的端到端浏览器自动化框架PDF 文档生成
设计理念测试优先;PDF 是次要功能专用 PDF 库
NuGet软件包Microsoft.Playwright (MIT)IronPdf (商业)
浏览器二进制步骤单独的playwright install下载包在 NuGet 包中
支持 PDF 的引擎仅Chromium(Firefox/WebKit不实现Page.PdfAsync()单一打包的基于 Chromium 的渲染器
首次渲染(冷启动)4.5 秒钟2.8 秒钟
后续渲染3.8-4.1 秒0.8-1.2 秒
每次转换的内存280-420MB80-120MB
API 风格异步浏览器/上下文/页面生命周期同步或异步; renderer-based
初始化CreateAsync() + LaunchAsync() + NewPageAsync()new ChromePdfRenderer()
PDF/A支持不可用支持
PDF/UA 辅助功能不可用支持
数字签名不可用支持
PDF 编辑不可用合并、拆分、盖章、编辑
支持模型社区有服务水平协议的商业翻译

IronPDF 专为 PDF 生成而构建,具有面向文档的 API 表面。 它使用单一打包的基于 Chromium 的渲染引擎,并支持同步和异步操作,这为开发者提供了更简单的心智模型,当目标是 PDF 输出而非浏览器交互时。

底线

Playwright 是当主要工作负载是浏览器自动化或跨浏览器测试时的强大选择,PDF 输出是偶尔的次要任务。IronPDF是当 PDF 生成是主要工作负载时的更好选择:没有单独的浏览器二进制安装步骤,没有浏览器/上下文/页面生命周期需要管理,而且包括 PDF/A、数字签名、安全性和合并等文档功能现成可用。


开始之前

前提条件

  1. .NET 环境: .NET Framework 4.6.2+ 或 .NET Core 3.1+ / .NET 5/6/7/8/9+
  2. **NuGet 访问权限:**能够安装 NuGet 包
  3. **IronPDF 许可证:**请从ironpdf.com获取您的许可证密钥。

NuGet 软件包变更

# Remove Playwright
dotnet remove package Microsoft.Playwright

# Remove the downloaded browser binaries
# Delete the .playwright folder in your project (and any cached binaries
# under your user profile, e.g. %USERPROFILE%\.cache\ms-playwright on Windows)

# Add IronPDF
dotnet add package IronPdf
SHELL

使用IronPDF不需要playwright install - 渲染引擎自动捆绑。

许可配置

// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";

完整的 API 参考

命名空间变更

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

// After: IronPDF
using IronPdf;
using IronPdf.Rendering;

核心 API 映射

Playwright APIIronPDF API
Playwright.CreateAsync()new ChromePdfRenderer()
playwright.Chromium.LaunchAsync()不需要
browser.NewPageAsync()不需要
page.GotoAsync(url)renderer.RenderUrlAsPdf(url)
page.SetContentAsync(html) + page.PdfAsync()renderer.RenderHtmlAsPdf(html)
page.CloseAsync()不需要
browser.CloseAsync()不需要
PagePdfOptions.FormatRenderingOptions.PaperSize
PagePdfOptions.MarginRenderingOptions.MarginTop/Bottom/Left/Right
PagePdfOptions.DisplayHeaderFooterTextFooter
PagePdfOptions.HeaderTemplateRenderingOptions.HtmlHeader
PagePdfOptions.FooterTemplateRenderingOptions.HtmlFooter
<span class='pageNumber'>{page}

代码迁移示例

示例 1:HTML 字符串到 PDF 的转换

之前(编剧):

// 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();
    }
}

After (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");
    }
}

本例展示了基本的架构差异。 Playwright需要五个异步操作:Playwright.CreateAsync(), Chromium.LaunchAsync(), NewPageAsync(), SetContentAsync(), 和CloseAsync()的显式浏览器清理。

IronPDF消除了所有这些复杂性:创建SaveAs()。 无异步模式、无浏览器生命周期、无清理代码。IronPDF的方法提供了更简洁的语法和与现代 .NET 应用程序更好的集成。 请参阅 HTML 转 PDF 文档,了解全面的示例。

示例 2:URL 到 PDF 的转换

之前(编剧):

// 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();
    }
}

After (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");
    }
}

Playwright使用PdfAsync()。 IronPDF提供了一个RenderUrlAsPdf()方法,该方法在一次调用中处理导航和PDF生成。 请注意,Playwright需要在RenderingOptions.PaperSize进行纸张大小配置。 在我们的教程中了解更多信息。

示例 3:带边距的自定义页面大小

之前(编剧):

// 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" }
        });
    }
}

After (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");
    }
}

Playwright使用基于字符串的边距值("1in", "0.5in"),而IronPDF使用数字毫米值。 转换为:1英寸 = 25.4mm,因此12。 Playwright的PaperSize = PdfPaperSize.Letter

示例 4:页眉、页脚和自定义设置

之前(编剧):

// 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();
    }
}

After (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");
    }
}

该示例显示了页眉/页脚占位符语法上的差异。 Playwright使用基于HTML类的占位符({page})。 请注意,Playwright需要DisplayHeaderFooter = true来启用页眉/页脚,而IronPDF在您设置页眉/页脚内容时自动启用它们。


关键迁移说明

同步到同步转换

Playwright 要求全程使用 async/await;IronPDF支持同步操作:

// 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 使用字符串单位;IronPDF使用数字毫米:

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

页眉/页脚占位符转换

剧作家类IronPDF 占位符
<span class='pageNumber'>{page}
<span class='totalPages'>{total-pages}
<span class='date'>{date}
<span class='title'>{html-title}

消除浏览器生命周期

删除所有浏览器管理代码:

// 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");

迁移后的新功能

迁移到IronPDF后,您将获得编剧无法提供的功能:

PDF 合并

var pdf1 = renderer.RenderHtmlAsPdf(html1);
var pdf2 = renderer.RenderHtmlAsPdf(html2);
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");

水印

pdf.ApplyWatermark("<h1 style='color:red; opacity:0.3;'>DRAFT</h1>");

密码保护

pdf.SecuritySettings.OwnerPassword = "admin";
pdf.SecuritySettings.UserPassword = "readonly";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;

数字签名

var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);

PDF/A 合规性

pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);

迁移清单

迁移前

  • 识别所有编剧PDF 生成代码
  • 文档边距值(将英寸/厘米转换为毫米)
  • 注意页眉/页脚占位符语法以进行转换
  • ironpdf.com获取IronPDF许可证密钥

软件包变更

  • 移除Microsoft.Playwright NuGet包
  • 删除.playwright文件夹(以及用户配置文件下缓存的任何Playwright浏览器二进制文件)
  • 安装IronPdf NuGet包:dotnet add package IronPdf

代码更改

  • 更新命名空间导入
  • 使用ChromePdfRenderer替换异步浏览器生命周期
  • page.SetContentAsync() + page.PdfAsync() 转换为RenderHtmlAsPdf()
  • page.GotoAsync() + page.PdfAsync() 转换为RenderUrlAsPdf()
  • 将边距字符串转换为毫米值
  • 转换页眉/页脚占位符语法
  • 删除所有浏览器/页面销毁代码
  • 在应用程序启动时添加许可证初始化

后迁移

  • PDF 输出的视觉比较
  • 验证页眉/页脚的显示是否正确,并显示页码
  • 测试页边距和页面尺寸的准确性
  • 根据需要添加新功能(安全、水印、合并)

请注意: Playwright是其各自所有者的注册商标。 本网站与微软公司没有任何关联,也未获得微软公司的认可或赞助。 所有产品名称、徽标和品牌均为各自所有者的财产。 比较仅供参考,反映撰写时公开可用的信息。
Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

...
阅读更多

相关文章

Key in blue circle

立即获取免费的 30 天试用版密钥

Your trial license will be sent to your email address

无任何限制。100% 解锁。无需信用卡。

bullet_checked无需信用卡或创建账户无任何限制。100% 解锁。无需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
预约您的免费现场演示
Booking Badge

深受全球数百万工程师信赖

Iron Software 的客户徽标
获取您的无义务咨询
填写下面的表格或通过sales@ironsoftware.com
您的资料将始终保密。
深受全球数百万工程师信赖
Iron Software 的客户徽标
立即获取您的免费30 天试用密钥
无需信用卡或创建账户