如何用 C# 從 Playwright 轉移到 IronPDF
從編劇for .NET 轉換到 IronPDF,可將您的 PDF 生成工作流程從以測試為中心的瀏覽器自動化工具轉換為專用的 PDF 函式庫。 本指南提供完整的逐步遷移路徑,可消除複雜的 async 模式、瀏覽器生命週期管理和 400MB 以上的瀏覽器下載,同時提供更好的效能和專業的 PDF 功能。
為什麼要從編劇轉移到 IronPDF?
瞭解編劇for .NET
Playwright for .NET 是微軟的端對端測試框架,並非文件產生函式庫。它從一開始就專為跨 Chromium、Firefox 和 WebKit 瀏覽器的自動化測試而建置。編劇擅長測試各種場景:點擊按鈕、填寫表格、攔截網路請求、截取螢幕截圖以及驗證跨瀏覽器相容性。
關鍵理解:Playwright 是一款測試工具,現在重新用於產生 PDF 檔案。 PDF生成只是瀏覽器列印功能(Ctrl+P)的副產品,並非其主要設計目標。 這會造成根本性的架構不符: -測試優先架構:專為互動式瀏覽器測試而構建,而非無頭文件生產。 -多瀏覽器開銷:即使您只需要產生 PDF 文件,也會下載超過 400MB 的瀏覽器二進位(Chromium、Firefox、WebKit)。 -以測試為中心的 API:專為測試自動化工作流程設計的複雜非同步模式,而非文件產生。 -文件功能缺失:缺少 PDF/A 合規性、數位簽章、浮水印、合併、安全控制等功能。
測試框架問題
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.需要完整瀏覽器實體的重資源作業。
測試框架配置問題
Playwright 需要進行大量的以測試為中心的配置, QA 工程師需要了解這些配置,但文件開發人員不需要:
需要安裝瀏覽器:
# 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
瀏覽器啟動配置:
// 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
測試專用配置選項:
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
// 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
多瀏覽器複雜性:
//編劇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
//編劇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
Imports System.Threading.Tasks
'編劇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:零配置,零安裝
// 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")
真正的即插即用:IronPDF消除了所有測試框架的開銷。 無需瀏覽器安裝命令,無需無頭配置,無需上下文管理——只需實例化並渲染即可。 專為文件生成而設計,並非由測試工具改編而來。
編劇vsIronPDF性能比較
| 指標 | 編劇 | IronPDF |
|---|---|---|
| 主要目的 | 端對端測試框架 | 產生 PDF 文件 |
| 設計理念 | 具有 PDF 側邊欄功能的測試工具 | 專用 PDF 庫 |
| 需要安裝 | playwright install(下載量超過400MB) |
無 - 即時設定 |
| 需要配置 | 無頭模式、瀏覽器啟動選項、上下文 | 零配置 |
| 瀏覽器下載 | 400MB+(Chromium、Firefox、WebKit) | 內建最佳化引擎 |
| 設定複雜度 | 命令列安裝 + 啟動配置 | 即插即用 |
| 首次渲染(冷啟動) | 4.5 秒鐘 | 2.8 秒 |
| 後續渲染 | 3.8-4.1 秒 | 0.8-1.2 秒 |
| 每次轉換的記憶體 | 280-420MB | 80-120MB |
| API複雜性 | 複雜的非同步瀏覽器/上下文/頁面生命週期 | 簡單的同步單行命令 |
| 初始化 | CreateAsync() + LaunchAsync() + NewPageAsync() |
new ChromePdfRenderer() |
| PDF/A支援 | 無法使用 | 支援 |
| PDF/UA 可訪問性 | 無法使用 | 支援 |
| 數位簽名 | 無法使用 | 支援 |
| PDF編輯 | 無法使用 | 合併、拆分、蓋章、編輯 |
| 專業支援。 | 社區 | 有 SLA 的商業翻譯 |
IronPDF 是以 PDF 生成為重點而建立的。 與以測試為中心的編劇不同,IronPDF 提供各種以文件為中心的 API 功能。 它依賴於單一最佳化的 Chromium 實例,以效率為優先,並提供同步與異步操作。 如此一來,對於需要 PDF 功能的開發人員而言,心智模式和工作流程都會變得更簡單。
對於計劃在 2025 年和 2026 年之前採用 .NET 10 和 C# 14 的團隊而言,IronPDF 提供了專門打造的 PDF 解決方案,可消除瀏覽器自動化的開銷,同時提供更好的效能和專業的文件功能。
底線
Playwright 是微軟專為執行跨瀏覽器自動化測試的 QA 工程師設計的測試框架。 將其用於生成 PDF 文件是一種架構不匹配的情況,需要大量的測試相關知識:
- 手動瀏覽器安裝 (
playwright install) - 生產環境的無頭模式配置 瀏覽器啟動選項管理
- 上下文生命週期配置
- 只需一個瀏覽器即可完成多瀏覽器下載(400MB以上)
- 測試範式中的複雜非同步/等待模式
IronPDF 是一個文件產生庫,專為建立 PDF 工作流程的開發人員而設計。 它真正做到了即插即用: 無需安裝,立即生效
- 零配置——智慧預設設定
- 無需瀏覽器下載-內建優化引擎
- 簡單的 API-無需學習測驗概念 自動資源管理-無需生命週期複雜性
如果您需要跨瀏覽器測試 Web 應用程序,請使用 Playwright。 如果您需要產生 PDF 文檔,請使用 IronPDF。不要將測試框架應用於文件生成——使用專門為這項工作而設計的工具。
開始之前
先決條件
- .NET環境: .NET Framework 4.6.2+ 或.NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet存取權限:能夠安裝NuGet套件
- IronPDF許可證:請從IronPDF取得您的許可證密鑰。
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
IronPDF 不需要 playwright install - 渲染引擎會自動捆綁。
授權組態
// 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"
完整的 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;
' Before: Playwright
Imports Microsoft.Playwright
Imports System.Threading.Tasks
' After: IronPDF
Imports IronPdf
Imports IronPdf.Rendering
核心 API 對應
| Playwright API | IronPDF 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.Format |
RenderingOptions.PaperSize |
PagePdfOptions.Margin |
RenderingOptions.MarginTop/Bottom/Left/Right |
PagePdfOptions.DisplayHeaderFooter |
RenderingOptions.TextHeader/TextFooter |
PagePdfOptions.HeaderTemplate |
RenderingOptions.HtmlHeader |
PagePdfOptions.FooterTemplate |
RenderingOptions.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();
}
}
// 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
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");
}
}
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
本範例展示了基本的架構差異。Playwright 需要五個非同步操作:@@--CODE-19360--@@、@@--CODE-19361--@@、@@--CODE-19362--@@、@@--CODE-19363--@@ 和 @@--CODE-19364--@@,以及使用 @@--CODE-19365--@@ 進行顯式瀏覽器清理。
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();
}
}
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
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");
}
}
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 使用 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" }
});
}
}
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
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");
}
}
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 使用基於字串的邊距值("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();
}
}
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
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");
}
}
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
此範例顯示 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;
}
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
邊際單位轉換
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");
// 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")
遷移後的新功能
轉移到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");
Dim pdf1 = renderer.RenderHtmlAsPdf(html1)
Dim pdf2 = renderer.RenderHtmlAsPdf(html2)
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
水印。
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
密碼保護
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
數位簽名
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)
PDF/A 合規性
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b)
遷移清單
預遷移
- 識別所有編劇PDF 產生程式碼
- 文檔邊距值(將英吋/公分轉換為毫米)
- 注意頁首/頁尾佔位符語法以進行轉換
- 從ironpdf.com取得IronPDF許可證金鑰
套件變更
- 刪除
Microsoft.PlaywrightNuGet 套件 - 刪除
.playwright資料夾回收約 400MB 磁碟空間 - 安裝
IronPdfNuGet 套件:dotnet add package IronPdf
程式碼變更
- 更新命名空間匯入
- 將非同步瀏覽器生命週期替換為
ChromePdfRenderer - 將
page.SetContentAsync()+page.PdfAsync()轉換為RenderHtmlAsPdf() - 將
page.GotoAsync()+page.PdfAsync()轉換為RenderUrlAsPdf() - 將邊距字串轉換為毫米值
- 轉換頁首/頁尾佔位符語法
- 刪除所有瀏覽器/頁面銷毀程式碼
- 在應用程式啟動時新增許可證初始化
後遷移
- PDF 輸出的視覺比較
- 驗證頁首/頁尾的顯示是否正確,並顯示頁碼
- 測試頁邊距和頁面尺寸的準確性
- 根據需要新增功能(安全性、浮水印、合併)

