跳過到頁腳內容
遷移指南

如何用 C# 從 Playwright 轉移到 IronPDF

從編劇轉移到 IronPDF:完整的 C# 遷移指南。

從編劇for .NET 轉換到 IronPDF,可將您的 PDF 生成工作流程從以測試為中心的瀏覽器自動化工具轉換為專用的 PDF 函式庫。 本指南提供完整的逐步遷移路徑,可消除複雜的 async 模式、瀏覽器生命週期管理和 400MB 以上的瀏覽器下載,同時提供更好的效能和專業的 PDF 功能。

為什麼要從編劇轉移到 IronPDF?

瞭解編劇for .NET

Playwright for .NET 是 Microsoft 瀏覽器自動化工具系列的一部分; 本專案的結構圍繞著提供跨 Chromium、Firefox 和 WebKit 的全面測試功能。 圖書館採用"測試第一"的設計,這表示其主要重點在於涉及瀏覽器測試的情境。 雖然編劇支援 PDF 產生,但此功能僅屬於輔助功能,無法提供專用 PDF 工具的細部設定。

Playwright for .NET 主要是一個瀏覽器自動化和測試框架,其中 PDF 生成是次要功能。 如同 PuppeteerSharp,Playwright 使用瀏覽器的列印至 PDF 功能來產生 PDF,等同於按下 Ctrl+P。這會產生最佳化為紙張的列印就緒輸出,這與螢幕渲染不同。

測試框架問題

Playwright 是專為端對端測試而設計,而非文件生成。 這在用於 PDF 時會產生基本問題:

1.首次使用前需要下載 400MB 以上的瀏覽器。編劇的預設組態需要下載多個瀏覽器,這對於有嚴格資源限制的環境來說可能是個考量。

2.複雜的 async 模式與瀏覽器上下文和頁面管理。 開發人員必須熟悉瀏覽器上下文和頁面管理,以及正確的處理方式。

3.測試為先的架構未針對文件生成進行最佳化。

4.Print-to-PDF限制相當於Ctrl+P瀏覽器列印。 版面可能會回流,背景可能會依預設省略,而輸出則會分頁列印。

5.不支援 PDF/A 或 PDF/UA,以符合可存取性。編劇無法製作符合 PDF/A (歸檔) 或 PDF/UA (可存取性) 的文件。 針對 Section 508、歐盟可讀性指令或長期歸檔要求,您需要專用的 PDF 資料庫。

6.需要完整瀏覽器實體的重資源作業

編劇vsIronPDF性能比較

指標編劇IronPDF
主要目的瀏覽器測試生成 PDF
瀏覽器下載400MB+ (Chromium, Firefox, WebKit)內建最佳化引擎
首次渲染(冷啟動)4.5 秒鐘2.8 秒
後續渲染3.8-4.1 秒0.8-1.2 秒
每次轉換的記憶體280-420MB80-120MB
API複雜性異步瀏覽器/內容/頁面生命週期同步單行字
初始化playwright install + CreateAsync + LaunchAsync新的 ChromePdfRenderer()
PDF/A支援無法提供全面支援
PDF/UA 可訪問性無法提供全面支援
數位簽名無法提供全面支援
PDF編輯無法提供合併、分割、蓋章、編輯
專業支援社區有 SLA 的商業翻譯

IronPDF 是以 PDF 生成為重點而建立的。 與以測試為中心的編劇不同,IronPDF 提供各種以文件為中心的 API 功能。 它依賴於單一最佳化的 Chromium 實例,以效率為優先,並提供同步與異步操作。 如此一來,對於需要 PDF 功能的開發人員而言,心智模式和工作流程都會變得更簡單。

對於計劃在 2025 年和 2026 年之前採用 .NET 10 和 C# 14 的團隊而言,IronPDF 提供了專門打造的 PDF 解決方案,可消除瀏覽器自動化的開銷,同時提供更好的效能和專業的文件功能。


開始之前

先決條件

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

使用 IronPDF 無需 playwright 安裝 - 會自動捆綁渲染引擎。

授權組態

// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

完整的 API 參考資料

命名空間變更

// 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;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

核心 API 對應

Playwright APIIronPdf API筆記
<編碼>Playwright.CreateAsync()</編碼新的 ChromePdfRenderer()不需要 async
<編碼>playwright.Chromium.LaunchAsync()</編碼不需要無瀏覽器管理
<代碼>browser.NewPageAsync()</代碼不需要無頁面上下文
page.GotoAsync(url)renderer.RenderUrlAsPdf(url)直接 URL 呈現
page.SetContentAsync(html)+page.PdfAsync()renderer.RenderHtmlAsPdf(html)單一方法
page.CloseAsync()不需要自動清理
<代碼>browser.CloseAsync()</代碼不需要自動清理
<代碼>PagePdfOptions.格式</代碼RenderingOptions.PaperSize紙張大小
PagePdfOptions.邊界RenderingOptions.MarginTop/Bottom/Left/Right渲染選項。個別邊距
<代碼>PagePdfOptions.DisplayHeaderFooter</代碼RenderingOptions.TextHeader/TextFooter標題/頁腳
<編碼>PagePdfOptions.HeaderTemplate</編碼<編碼>RenderingOptions.HtmlHeader</編碼HTML 標頭
<編碼>PagePdfOptions.FooterTemplate</編碼RenderingOptions.HtmlFooterHTML 頁腳
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();
    }
}
// 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();
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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");
    }
}
// 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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

本範例展示了基本的架構差異。編劇需要五個同步操作:Playwright.CreateAsync()Chromium.LaunchAsync()NewPageAsync()SetContentAsync()PdfAsync(),Plus 使用CloseAsync()進行明確的瀏覽器清理。

IronPDF 消除了所有這些複雜性:創建一個 ChromePdfRenderer ,呼叫 RenderHtmlAsPdf() 以及 SaveAs() 。 沒有 async 模式、沒有瀏覽器生命週期、沒有清理程式碼。IronPDF的方法提供了更簡潔的語法,並能更好地與現代 .NET 應用程式整合。 請參閱 HTML to 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();
    }
}
// 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();
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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");
    }
}
// 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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Playwright 使用 GotoAsync() 來導航到 URL,接著是 PdfAsync() 。IronPDF提供了單一的 RenderUrlAsPdf() 方法,可在一次呼叫中處理導航和 PDF 生成。 請注意,Playwright 需要在 PagePdfOptions 中指定 Format ,而IronPDF則使用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" }
        });
    }
}
// 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" }
        });
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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");
    }
}
// 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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Playwright 使用基於字串的頁邊空白值("1in", "0.5in"),而IronPDF則使用數字毫米值。 換算方式為:1 吋 = 25.4 公釐,因此"1in"變成25"0.5in"約變成12。編劇的 Format = "Letter" 映射到IronPDF的 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();
    }
}
// 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();
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

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");
    }
}
// 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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

此範例顯示 header/footer 占位符的語法差異。編劇使用基於 HTML 類的占位符 (<span> class="pageNumber"></span>),而IronPDF則使用大括弧占位符 ({page})。 請注意,Playwright 需要 DisplayHeaderFooter = true 來啟用頁首/頁尾,而IronPDF會在您設定頁首/頁尾內容時自動啟用。


關鍵遷移注意事項

Async 到 Sync 的轉換

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: 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;
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

邊際單位轉換

Playwright 使用字串單位; IronPdf 使用數字毫米:

編劇IronPdf (mm)
"1in"25
"0.5in"12
"1cm"10

頁首/頁尾占位符轉換

編劇班IronPdf 占位符
class="pageNumber"></編碼{page}
class="totalPages"></編碼{總頁數}
<span> class="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");
// 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");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

遷移後的新功能

轉移到IronPDF之後,您將獲得編劇無法提供的功能:

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");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

水印。

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

密碼保護

pdf.SecuritySettings.OwnerPassword = "admin";
pdf.SecuritySettings.UserPassword = "readonly";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
pdf.SecuritySettings.OwnerPassword = "admin";
pdf.SecuritySettings.UserPassword = "readonly";
pdf.SecuritySettings.AllowUserCopyPasteContent = false;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

數位簽名

var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);
var signature = new PdfSignature("certificate.pfx", "password");
pdf.Sign(signature);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

PDF/A 合規性

pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

遷移清單

預遷移

  • [ ] 識別所有編劇PDF 生成代碼
  • [ ] 文件邊界值(將英寸/厘米轉換為毫米)
  • [ ] 轉換時請注意頁首/頁尾的占位符語法
  • [ ] 從 ironpdf.com 獲得IronPDF授權金鑰

套件變更

  • [ ] 移除 Microsoft.Playwright NuGet 套件
  • [ ] 刪除 .playwright 資料夾,以回收 ~400MB 磁碟空間
  • [ ] 安裝 IronPDF NuGet 套件:dotnet add package IronPdf

程式碼變更

  • [ ] 更新命名空間匯入
  • [ ] 使用 ChromePdfRenderer 取代 async 瀏覽器生命週期
  • [ ] 將 page.SetContentAsync() + page.PdfAsync() 轉換為 RenderHtmlAsPdf()
  • [ ] 將 page.GotoAsync() + page.PdfAsync() 轉換為 RenderUrlAsPdf()
  • [ ] 將邊距字串轉換為毫米值
  • [ ] 轉換頁首/頁尾佔位符語法
  • [ ] 移除所有瀏覽器/網頁處理程式碼
  • [ ] 在應用程式啟動時加入授權初始化

後遷移

  • [ ] PDF 輸出的視覺比較
  • [ ] 用頁碼驗證標題/頁尾的呈現
  • [ ] 測試頁邊距和頁面大小的準確性
  • [ ] 必要時增加新功能(安全性、水印、合併)。

結論

Playwright for .NET 和IronPDF都能滿足 .NET 生態系統中的不同需求。編劇的優勢在於其測試框架的功能,在需要時可利用其 PDF 生成功能加以補充。 然而,如果您的主要目標是以較少的開銷高效率、高品質地產生 PDF,IronPDF 是更有力的競爭者。

本次轉換的主要變更如下 1.架構:具備 PDF 功能的測試框架 → 專用的 PDF 函式庫 2.複雜性:5 個以上的同步操作 → 3 個同步呼叫 3.瀏覽器管理:手動處理的生命週期 → 自動處理 4.Performance: 4.5s cold start / 3.8-4.1s renders → 2.8s cold start / 0.8-1.2s renders 5.記憶體:每次轉換280-420MB→ 每次轉換 80-120MB 6.磁碟空間: 400MB+ 瀏覽器下載 → 零額外下載 7.邊界:字串單位 ("1in") → 數字毫米 (25) 8.Placeholders:CSS 類別 (<span> class="pageNumber">) → 大括號 ({page}) 9.新功能:PDF 合併、水印、安全性、數位簽署、符合 PDF/A 規範

考慮您的專案需求,並選擇與您的優先順序相符的函式庫 - 無論您需要的是可在一旁進行 PDF 生成的強大測試架構,或是可最大化轉換速度與資源效率的專用 PDF 工具。

探索完整的 IronPdf文件教學API參考,加速您的Playwright遷移。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。