IRONSOFTWAREHOME
影片

using IronPDF 在 PDFs 中渲染 WebGL 內容

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

從Microsoft Playwright for .NET遷移到IronPDF,將您的PDF生成工作流從瀏覽器自動化測試框架轉移到專用的PDF程式庫。 本指南提供了一個逐步遷移路徑,移除異步瀏覽器生命周期管理和單獨的playwright install瀏覽器二進制下載步驟。

為什麼從Playwright遷移到IronPDF

了解.NET的Playwright

Playwright for .NET(NuGet Microsoft.Playwright,MIT授權)是Microsoft的瀏覽器自動化框架,主要設計用於跨Chromium、Firefox和WebKit的端到端測試。 其典型工作負載是互動性的:點擊按鈕、填寫表單、攔截網路請求、截圖及驗證跨瀏覽器相容性。

在Playwright中生成PDF是一個透過Page.PdfAsync()暴露的次要功能,僅支持Chromium — Firefox和WebKit不實現PDF輸出。 輸出使用瀏覽器的列印至PDF路徑(相當於Ctrl+P),這對佈局、背景和分頁有影響:

  • 測試先行架構,未優化於無頭文件生成
  • 瀏覽器二進制(Chromium及選擇性地Firefox和WebKit)必須透過playwright install單獨安裝
  • 為自動化測試工作流程設計的異步API
  • 無內建PDF/A、PDF/UA、數位簽名、浮水印、合併或安全功能

使用Playwright生成PDF時的考量

Playwright是為端到端測試設計的,而不是文件生成。 當將其重新用於PDF時,有幾個實際的影響:

  1. 透過playwright install獲取瀏覽器二進制。 Playwright的預設配置會下載瀏覽器二進制(Chromium、Firefox、WebKit),這可能是對於具有嚴格資源或部署限制的環境的考量。

  2. 異步瀏覽器/上下文/頁面模型。 開發人員需要熟悉瀏覽器上下文和頁生命周期管理,包括釋放。

  3. 測試先行架構,未優化於高容量文件生成。

  4. 列印至PDF語義相當於Ctrl+P瀏覽器列印。 佈局可能重新排列,背景可能預設被省略,且輸出會分頁以供列印。

  5. 無PDF/A或PDF/UA輸出。 Playwright不生成符合PDF/A(歸檔)或PDF/UA(可存取性)標準的文件。 對於第508條款、EU可存取性指令或長期歸檔需求,通常需要專用的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

多瀏覽器介面:

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

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步驟以及不需要管理瀏覽器/上下文/頁面生命周期。

Playwright與IronPDF性能比較

指標PlaywrightIronPDF
主要目的E2E瀏覽器自動化框架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編輯不可用合併、拆分、加蓋、編輯
支持模型社區支持商業與SLA

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

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

之後(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需要五個異步操作:CloseAsync()進行明確的瀏覽器清理。

IronPDF消除了所有這些複雜性:建立SaveAs()。 無異步模式,無瀏覽器生命周期,無清理程式碼。 IronPDF的方法提供了更清晰的語法和與現代.NET應用程式的更好整合。 查看更多HTML到PDF文件以獲得完整的範例。

範例2:URL轉PDF轉換

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

之後(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:具有邊距的自訂頁面大小

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

之後(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使用字串值邊距("0.5in"),而IronPDF使用數字毫米值。 轉換為:1英寸=25.4毫米,所以12。 Playwright的PaperSize = PdfPaperSize.Letter

範例4:標頭、頁腳和自訂設置

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

之後(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使用數字毫米:

PlaywrightIronPDF(毫米)
"1in"25
"0.5in"12
"1cm"10

標頭/頁腳佔位符轉換

Playwright類別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後,您將獲得Playwright不能提供的功能:

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

遷移檢查表

遷移前

  • 識別所有Playwright的PDF生成程式碼
  • 文件邊距值(將英寸/厘米轉換為毫米)
  • 注意標頭/頁腳佔位符語法轉換
  • 獲取IronPDF授權金鑰來自ironpdf.com

套件變更

  • 移除Microsoft.Playwright NuGet包
  • 刪除.playwright資料夾(以及在使用者配置檔下的快取Playwright瀏覽器二進制)
  • 安裝IronPdf NuGet包:dotnet add package IronPdf

程式碼變更

  • 更新命名空間導入
  • ChromePdfRenderer替換異步瀏覽器生命周期
  • page.SetContentAsync() + RenderHtmlAsPdf()
  • page.GotoAsync() + RenderUrlAsPdf()
  • 將邊距字串轉換為毫米值
  • 轉換標頭/頁腳佔位符語法
  • 移除所有的瀏覽器/頁面釋放程式碼
  • 在應用程式啟動時新增授權初始化

遷移後

  • PDF輸出的視覺比較
  • 驗證標頭/頁腳渲染與頁碼的精確性
  • 測試邊距和頁面大小的精確性
  • 根據需要新增新功能(安全性、水印、合併)

請注意: Playwright是其相應所有者的註冊商標。 此網站與Microsoft無關,也未獲其認可或贊助。 所有產品名稱、標誌和品牌均為其各自所有者的財產。 比較僅供參考,反映撰寫時公開可用的資訊。
Curtis Chau
技術作家

Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。

...
閱讀更多

相關文章

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天試用金鑰
無需信用卡或帳戶建立