IronPDF與Puppeteer Sharp:完整的C# PDF庫對比指南
在建立需要 PDF 功能的 .NET 應用程式時,開發人員經常面臨一個重要的決定:哪個 PDF 函式庫最適合他們的需求? 在討論中經常出現的兩個熱門選項是 IronPDF 和 Puppeteer Sharp。雖然這兩個函式庫都可以從 HTML 內容產生 PDF,但它們在方法、功能和使用案例上有很大的差異。
IronPDF 是專為 .NET 開發人員設計的綜合 PDF 函式庫,除了簡單的產生功能外,還提供廣泛的 PDF 操作功能。 另一方面,Puppeteer Sharp 是 Google 的 Puppeteer 函式庫的 .NET 移植,主要著重於瀏覽器自動化,PDF 生成是其功能之一。 瞭解每個函式庫的優點與限制,對於做出符合您專案需求的明智決策是非常重要的。
快速比較表
| 類別 | 特點/方面 | IronPDF。 | Puppeteer Sharp | 主要優勢 |
|---|---|---|---|---|
| 核心架構 | 設計理念 | 整合 Chrome 引擎的 PDF-first 函式庫 | 具有 PDF 匯出功能的瀏覽器自動化工具 | IronPDF:專為 PDF 而設計 |
| API 的複雜性 | 簡單的方法如 RenderHtmlAsPdf() | IronPDF:更少的程式碼行數 | ||
| 學習曲線 | 一般需時 1-2 天 | 3-5 天(瀏覽器概念) | IronPDF:更快採用 | |
| 平台支援 | 跨平台 | 原生支援,無需額外套件 | 需要 Chrome/Chromium 下載 | IronPDF:更簡單的部署 |
| .NET 版本 | .NET 10、9、8、7、6、5、Core 3.1 以上、Framework 4.6.2 以上 | .NET 8、Standard 2.0、Framework 4.6.1+ | IronPDF:最新的 .NET 支援 | |
| 操作系統 | Windows、Linux、macOS、Docker 本機 | Windows、Linux(有注意事項)、macOS | IronPDF:通用支援 | |
| HTML至PDF | 渲染引擎 | 嵌入式 Chrome 引擎 | 無頭 Chrome/Chromium 控件 | 兩者兼具:基於 Chrome 的精確性 |
| JavaScript 支援 | 完整的 JS 支援與渲染延遲 | 有等待條件的完整 JS | Puppeteer:更多 JS 控制 | |
| PDF功能 | 安全性與加密 | AES-256、密碼、權限 | 不支援 | IronPDF:企業安全性 |
| 數位簽名 | 原生支援與證書 | 需要外部程式庫 | IronPDF:內建簽章 | |
| PDF 編輯 | 合併、分割、水印、表格 | 僅產生 | IronPDF:完整操作 | |
| 瀏覽器自動化 | 網路爬取 | 並非主要重點 | 完全瀏覽器控制 | Puppeteer:瀏覽器自動化 |
| 截圖擷取 | 僅將 PDF 轉換為影像 | 完整頁面/元件截圖 | Puppeteer:多功能擷取 | |
| Licensing & Pricing | 授權模式 | 商業、永久授權 | MIT 授權 (免費) | Puppeteer:無費用 |
| 入職價格 | $999 (Lite license) | 免費 | Puppeteer:零障礙 | |
| <強>支援強 > | 文件 | 廣泛的教學、API 參考 | GitHub 文件、社群資源 | IronPDF:專業文件 |
| 技術支援 | 24/5 工程師支援 | 僅限社群 | IronPDF:專業支援 | |
| 最適合 | 用例 | 企業 PDF、報告、發票 | 測試、搜刮、基本 PDF | 取決於上下文 |
IronPDF 和 Puppeteer Sharp 是什麼?
什麼是 IronPDF?
IronPDF是一個 .NET PDF 庫,用於在託管的 C# 程式碼中產生、編輯和操作 PDF 文件。 它內建的 Chromium 引擎可以將 HTML(包括完整的 CSS3 和 JavaScript)轉換為 PDF,而無需外部瀏覽器進程。 此 API 涵蓋加密、數位簽章、表單填寫、浮水印和文件合併等功能,所有功能均可透過單一 NuGet 套件存取。
IronPDF 支援 .NET 9,並且正在開發 .NET 10 相容性。 還包含進階 PDF 處理功能,包括內容擷取和頁面加蓋。
什麼是 Puppeteer Sharp?
Puppeteer Sharp 是 Google 廣受歡迎的 Node.js Puppeteer 函式庫的 .NET 移植,由 Darío Kondratiuk 負責維護。 它提供了一個高階 API,可透過 DevTools 通訊協定,以程式化的方式控制無頭 Chrome 或 Chromium 瀏覽器。 雖然 Puppeteer Sharp 可以產生 PDF,但它主要是設計為一種瀏覽器自動化工具,擅長於網頁搜刮、自動測試和擷取螢幕截圖。
該程式庫透過啟動和控制一個無頭瀏覽器實例來運作,讓開發人員可以瀏覽網頁、與元素互動,並將內容匯出為包括 PDF 在內的各種格式。 根據 近期的基準,Puppeteer Sharp 在簡單的 HTML 渲染上具有效能優勢,但相較於專用的 PDF 函式庫,需要更複雜的設定。 正在評估 IronPDF 是否滿足其 PDF 產生需求的團隊可以存取 30 天免費試用。
跨平台相容性如何比較?
IronPDF 跨平台支援
IronPDF 提供廣泛的跨平台相容性,支援在各種環境中部署。 圖書館的工作方式如下:
-
.NET版本:
- .NET 10、9、8、7、6、5 (含 .NET 10 準備)
- .NET Core 3.1+
- .NET 標準 2.0+
- .NET Framework 4.6.2+
- 完全支援 C#、VB.NET 和 F#
-
作業系統與環境:
- Windows(包括 Windows 伺服器)
- Linux (所有主要發行版本)
- macOS (Intel 和 Apple Silicon)
- Docker容器
- 雲端平台:Azure、AWS Lambda
- 開發工具:
- 微軟 Visual Studio JetBrains Rider & ReSharper
- Visual Studio 程式碼
IronPDF 的原生跨平台支援意味著不同的環境不需要額外的套件或設定。 如相容性里程碑更新中所述,程式庫會自動偵測目標平台並進行最佳化。
Puppeteer Sharp 跨平台支援
Puppeteer Sharp 提供跨平台相容性,但有一些重要的注意事項:
-
.NET版本:
- 提供 .NET 8 版本
- .NET Standard 2.0 函式庫
- .NET Framework 4.6.1+
- .NET Core 2.0 或更高版本
-
作業系統:
- Windows (完全支援)
- Linux (需要 X-server,可能需要疑難排解)
- macOS(標準支援)
- Docker (與 Chrome 的相依性)
- 瀏覽器需求:
- 需要下載 Chromium 二進位檔案 (~170MB)
- 支援 Chrome、Chromium 和 Firefox 瀏覽器
- 提供無頭和有頭模式
根據 官方文件,Linux 使用者在執行 Chrome 時可能會遇到問題,需要參考疑難排解指南。該函式庫需要管理瀏覽器下載和生命週期,增加了部署的複雜性。
哪個函式庫提供更好的 PDF 功能?
在評估 PDF 功能時,IronPDF 與 Puppeteer Sharp 的差異會變得特別明顯。 讓我們詳細檢視它們的核心功能。
IronPDF 功能
IronPDF 提供一套全面的 PDF 操作工具:
-
PDF 生成和轉换:
-
安全功能:
- 256 位元 AES 加密
- 具有使用者/所有者權限的密碼保護
- 數位簽章與證書支援
- 權限管理(列印、複製、編輯限制)
-
PDF 編輯能力:
- [合併和分割 PDFs](/how-to/合併或分割 PDFs/)
- 新增頁眉、頁腳和頁碼
- 使用 HTML/CSS 製作水印。
- 表單建立與填寫
- 文字和圖像戳記
- PDF壓縮
- 進階功能:
- 符合 PDF/A 規範以利歸檔
- OCR 功能 (透過 IronOCR 整合)
- BarCode 生成
- 支援多執行緒
Puppeteer Sharp 功能
Puppeteer Sharp 著重於以 PDF 作為輸出選項的瀏覽器自動化:
-
PDF生成:
- 透過瀏覽器列印功能將 HTML 轉換為 PDF
- 自訂頁面大小和頁邊空白
- 頁首和頁尾 (有限的樣式設計)
- 反應式佈局的視埠控制
-
瀏覽器自動化:
- 完全控制無頭 Chrome/Chromium
- JavaScript 執行與等待
- 表格填寫與 UI 互動
- 網路請求攔截
- 螢幕截圖功能:
- 全頁或特定元素的捕捉
- 多種圖片格式 (PNG、JPG)
- 視埠操作
*設計邊界:
- PDF 編輯功能不屬於 Puppeteer Sharp 目前的業務範圍。
- 不包含加密和安全選項。
- 數位簽章支援不屬於其功能集的一部分。
- 不提供表單建立工具 需要處理 PDF 文件的團隊通常會添加單獨的庫。
如 API Template 所述,"Puppeteer Sharp 是流行的 Puppeteer 函式庫的 C# 移植,該函式庫用於無頭 Chrome 自動化。 在本文中,我們將了解如何使用 Puppeteer Sharp 從 HTML 模板產生 PDF。"
真實世界的程式碼範例:IronPDF vs Puppeteer Sharp
讓我們探索這兩個函式庫的實際實作,以瞭解它們的使用模式和功能。
HTML 至 PDF 轉換比較
IronPDF範例:
using IronPdf;
// Initialize the Chrome renderer
var renderer = new ChromePdfRenderer();
// Configure rendering options for professional output
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 40;
renderer.RenderingOptions.MarginBottom = 40;
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
// Convert HTML string to PDF
var pdf = renderer.RenderHtmlAsPdf(@"
<html>
<head>
<style>
body { font-family: Arial, sans-serif; }
h1 { color: #2e6da4; }
.invoice-header { background-color: #f5f5f5; padding: 20px; }
</style>
</head>
<body>
<div class='invoice-header'>
<h1>Invoice #12345</h1>
<p>Generated on: " + DateTime.Now.ToString("yyyy-MM-dd") + @"</p>
</div>
</body>
</html>");
// Save the PDF
pdf.SaveAs("invoice.pdf");
using IronPdf;
// Initialize the Chrome renderer
var renderer = new ChromePdfRenderer();
// Configure rendering options for professional output
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 40;
renderer.RenderingOptions.MarginBottom = 40;
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print;
// Convert HTML string to PDF
var pdf = renderer.RenderHtmlAsPdf(@"
<html>
<head>
<style>
body { font-family: Arial, sans-serif; }
h1 { color: #2e6da4; }
.invoice-header { background-color: #f5f5f5; padding: 20px; }
</style>
</head>
<body>
<div class='invoice-header'>
<h1>Invoice #12345</h1>
<p>Generated on: " + DateTime.Now.ToString("yyyy-MM-dd") + @"</p>
</div>
</body>
</html>");
// Save the PDF
pdf.SaveAs("invoice.pdf");
Imports IronPdf
' Initialize the Chrome renderer
Private renderer = New ChromePdfRenderer()
' Configure rendering options for professional output
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 40
renderer.RenderingOptions.MarginBottom = 40
renderer.RenderingOptions.CssMediaType = PdfCssMediaType.Print
' Convert HTML string to PDF
Dim pdf = renderer.RenderHtmlAsPdf("
<html>
<head>
<style>
body { font-family: Arial, sans-serif; }
h1 { color: #2e6da4; }
.invoice-header { background-color: #f5f5f5; padding: 20px; }
</style>
</head>
<body>
<div class='invoice-header'>
<h1>Invoice #12345</h1>
<p>Generated on: " & DateTime.Now.ToString("yyyy-MM-dd") & "</p>
</div>
</body>
</html>")
' Save the PDF
pdf.SaveAs("invoice.pdf")
這個 IronPDF 範例展示了函式庫直截了當的方法。 ChromePdfRenderer 類別在內部處理 HTML 渲染的所有複雜性。 主要優點包括
- 單一方法呼叫進行轉換 (
RenderHtmlAsPdf) - 內建對CSS 媒體類型的支持
- 不需要瀏覽器生命週期管理
- 立即可用,無須下載外部依賴
Puppeteer Sharp 示例:
using PuppeteerSharp;
// Download Chromium if not already present
await new BrowserFetcher().DownloadAsync();
// Launch browser instance
var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = true,
Args = new[] { "--no-sandbox", "--disable-setuid-sandbox" }
});
try
{
// Create new page
var page = await browser.NewPageAsync();
// Set content
await page.SetContentAsync(@"
<html>
<head>
<style>
body { font-family: Arial, sans-serif; }
h1 { color: #2e6da4; }
.invoice-header { background-color: #f5f5f5; padding: 20px; }
</style>
</head>
<body>
<div class='invoice-header'>
<h1>Invoice #12345</h1>
<p>Generated on: " + DateTime.Now.ToString("yyyy-MM-dd") + @"</p>
</div>
</body>
</html>");
// Wait for content to load
await page.WaitForSelectorAsync(".invoice-header");
// Generate PDF
await page.PdfAsync("invoice.pdf", new PdfOptions
{
Format = PaperFormat.A4,
MarginOptions = new MarginOptions
{
Top = "40px",
Bottom = "40px",
Left = "40px",
Right = "40px"
}
});
}
finally
{
// Clean up browser instance
await browser.CloseAsync();
}
using PuppeteerSharp;
// Download Chromium if not already present
await new BrowserFetcher().DownloadAsync();
// Launch browser instance
var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = true,
Args = new[] { "--no-sandbox", "--disable-setuid-sandbox" }
});
try
{
// Create new page
var page = await browser.NewPageAsync();
// Set content
await page.SetContentAsync(@"
<html>
<head>
<style>
body { font-family: Arial, sans-serif; }
h1 { color: #2e6da4; }
.invoice-header { background-color: #f5f5f5; padding: 20px; }
</style>
</head>
<body>
<div class='invoice-header'>
<h1>Invoice #12345</h1>
<p>Generated on: " + DateTime.Now.ToString("yyyy-MM-dd") + @"</p>
</div>
</body>
</html>");
// Wait for content to load
await page.WaitForSelectorAsync(".invoice-header");
// Generate PDF
await page.PdfAsync("invoice.pdf", new PdfOptions
{
Format = PaperFormat.A4,
MarginOptions = new MarginOptions
{
Top = "40px",
Bottom = "40px",
Left = "40px",
Right = "40px"
}
});
}
finally
{
// Clean up browser instance
await browser.CloseAsync();
}
Imports PuppeteerSharp
' Download Chromium if not already present
Await (New BrowserFetcher()).DownloadAsync()
' Launch browser instance
Dim browser = Await Puppeteer.LaunchAsync(New LaunchOptions With {
.Headless = True,
.Args = { "--no-sandbox", "--disable-setuid-sandbox" }
})
Try
' Create new page
Dim page = Await browser.NewPageAsync()
' Set content
Await page.SetContentAsync("
<html>
<head>
<style>
body { font-family: Arial, sans-serif; }
h1 { color: #2e6da4; }
.invoice-header { background-color: #f5f5f5; padding: 20px; }
</style>
</head>
<body>
<div class='invoice-header'>
<h1>Invoice #12345</h1>
<p>Generated on: " & DateTime.Now.ToString("yyyy-MM-dd") & "</p>
</div>
</body>
</html>")
' Wait for content to load
Await page.WaitForSelectorAsync(".invoice-header")
' Generate PDF
Await page.PdfAsync("invoice.pdf", New PdfOptions With {
.Format = PaperFormat.A4,
.MarginOptions = New MarginOptions With {
.Top = "40px",
.Bottom = "40px",
.Left = "40px",
.Right = "40px"
}
})
Finally
' Clean up browser instance
Await browser.CloseAsync()
End Try
Puppeteer Sharp 方法需要更多的設定:
- 瀏覽器下載與管理 (~170MB Chromium)
- 使用 try/finally 進行明確的資源清理
- 動態內容的手動等待條件
- 以字串為基礎的邊際規格
根據Stack Overflow 上的討論,開發者在使用 Puppeteer Sharp 時經常會遇到頁面大小和渲染一致性方面的問題。
使用動態內容工作
使用 JavaScript 的 IronPDF:
using IronPdf;
var renderer = new ChromePdfRenderer();
// Configure JavaScript execution
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.RenderDelay = 2000; // Wait 2 seconds for JS
// Render a page with dynamic charts
var pdf = renderer.RenderUrlAsPdf("https://example.com/dashboard");
// Apply security settings
pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.OwnerPassword = "owner456";
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.NoPrint;
pdf.SaveAs("secure-dashboard.pdf");
using IronPdf;
var renderer = new ChromePdfRenderer();
// Configure JavaScript execution
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.RenderDelay = 2000; // Wait 2 seconds for JS
// Render a page with dynamic charts
var pdf = renderer.RenderUrlAsPdf("https://example.com/dashboard");
// Apply security settings
pdf.SecuritySettings.UserPassword = "user123";
pdf.SecuritySettings.OwnerPassword = "owner456";
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.NoPrint;
pdf.SaveAs("secure-dashboard.pdf");
Imports IronPdf
Private renderer = New ChromePdfRenderer()
' Configure JavaScript execution
renderer.RenderingOptions.EnableJavaScript = True
renderer.RenderingOptions.RenderDelay = 2000 ' Wait 2 seconds for JS
' Render a page with dynamic charts
Dim pdf = renderer.RenderUrlAsPdf("https://example.com/dashboard")
' Apply security settings
pdf.SecuritySettings.UserPassword = "user123"
pdf.SecuritySettings.OwnerPassword = "owner456"
pdf.SecuritySettings.AllowUserPrinting = IronPdf.Security.PdfPrintSecurity.NoPrint
pdf.SaveAs("secure-dashboard.pdf")
IronPDF 的動態內容處理方式著重於簡潔性。 RenderDelay 選項提供了一個簡單的方法來等待JavaScript 執行和渲染。 其他優點:
- 直接整合的安全功能
- 無需管理瀏覽器狀態
- 跨環境的一致呈現
針對更複雜的 JavaScript 情境,IronPDF 提供 WaitFor 類 以進行精確的時序控制。
具有動態內容的 Puppeteer Sharp:
using PuppeteerSharp;
var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = true });
var page = await browser.NewPageAsync();
// Navigate to page
await page.GoToAsync("https://example.com/dashboard", new NavigationOptions
{
WaitUntil = new[] { WaitUntilNavigation.Networkidle0 }
});
// Execute custom JavaScript
await page.EvaluateExpressionAsync(@"
// Trigger chart rendering
document.dispatchEvent(new Event('load-charts'));
");
// Wait for specific element
await page.WaitForSelectorAsync(".chart-container", new WaitForSelectorOptions
{
Visible = true,
Timeout = 30000
});
// Generate PDF (no built-in security features)
await page.PdfAsync("dashboard.pdf");
await browser.CloseAsync();
using PuppeteerSharp;
var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = true });
var page = await browser.NewPageAsync();
// Navigate to page
await page.GoToAsync("https://example.com/dashboard", new NavigationOptions
{
WaitUntil = new[] { WaitUntilNavigation.Networkidle0 }
});
// Execute custom JavaScript
await page.EvaluateExpressionAsync(@"
// Trigger chart rendering
document.dispatchEvent(new Event('load-charts'));
");
// Wait for specific element
await page.WaitForSelectorAsync(".chart-container", new WaitForSelectorOptions
{
Visible = true,
Timeout = 30000
});
// Generate PDF (no built-in security features)
await page.PdfAsync("dashboard.pdf");
await browser.CloseAsync();
Imports PuppeteerSharp
Private browser = await Puppeteer.LaunchAsync(New LaunchOptions With {.Headless = True})
Private page = await browser.NewPageAsync()
' Navigate to page
Await page.GoToAsync("https://example.com/dashboard", New NavigationOptions With {
.WaitUntil = { WaitUntilNavigation.Networkidle0 }
})
' Execute custom JavaScript
Await page.EvaluateExpressionAsync("
// Trigger chart rendering
document.dispatchEvent(new Event('load-charts'));
")
' Wait for specific element
Await page.WaitForSelectorAsync(".chart-container", New WaitForSelectorOptions With {
.Visible = True,
.Timeout = 30000
})
' Generate PDF (no built-in security features)
Await page.PdfAsync("dashboard.pdf")
Await browser.CloseAsync()
Puppeteer Sharp 擅長於複雜的瀏覽器互動:
- 精細控制頁面導覽
- 自訂 JavaScript 執行
- 靈活的等待條件
- 直接 DOM 操作
加密和密碼保護等安全功能不在 Puppeteer Sharp 的範圍內,因此需要這些功能的團隊需要整合一個單獨的 PDF 程式庫,如官方文件所述。
進階 PDF 作業
IronPDF - 完整的文件工作流程:
using IronPdf;
using IronPdf.Signing;
// Create initial PDF from HTML template
var renderer = new ChromePdfRenderer();
var invoice = renderer.RenderHtmlFileAsPdf("invoice-template.html");
// Add watermark
invoice.ApplyWatermark("<h2 style='color:red; opacity:0.5'>CONFIDENTIAL</h2>",
30, IronPdf.Editing.VerticalAlignment.Middle,
IronPdf.Editing.HorizontalAlignment.Center);
// Merge with terms and conditions
var terms = PdfDocument.FromFile("terms.pdf");
var combined = PdfDocument.Merge(invoice, terms);
// Add digital signature
var signature = new PdfSignature("certificate.pfx", "password");
combined.Sign(signature);
// Set metadata
combined.MetaData.Author = "Accounting Department";
combined.MetaData.Title = "Invoice #12345";
combined.MetaData.CreationDate = DateTime.Now;
// Compress and save
combined.CompressImages(90);
combined.SaveAs("final-invoice.pdf");
using IronPdf;
using IronPdf.Signing;
// Create initial PDF from HTML template
var renderer = new ChromePdfRenderer();
var invoice = renderer.RenderHtmlFileAsPdf("invoice-template.html");
// Add watermark
invoice.ApplyWatermark("<h2 style='color:red; opacity:0.5'>CONFIDENTIAL</h2>",
30, IronPdf.Editing.VerticalAlignment.Middle,
IronPdf.Editing.HorizontalAlignment.Center);
// Merge with terms and conditions
var terms = PdfDocument.FromFile("terms.pdf");
var combined = PdfDocument.Merge(invoice, terms);
// Add digital signature
var signature = new PdfSignature("certificate.pfx", "password");
combined.Sign(signature);
// Set metadata
combined.MetaData.Author = "Accounting Department";
combined.MetaData.Title = "Invoice #12345";
combined.MetaData.CreationDate = DateTime.Now;
// Compress and save
combined.CompressImages(90);
combined.SaveAs("final-invoice.pdf");
Imports IronPdf
Imports IronPdf.Signing
' Create initial PDF from HTML template
Private renderer = New ChromePdfRenderer()
Private invoice = renderer.RenderHtmlFileAsPdf("invoice-template.html")
' Add watermark
invoice.ApplyWatermark("<h2 style='color:red; opacity:0.5'>CONFIDENTIAL</h2>", 30, IronPdf.Editing.VerticalAlignment.Middle, IronPdf.Editing.HorizontalAlignment.Center)
' Merge with terms and conditions
Dim terms = PdfDocument.FromFile("terms.pdf")
Dim combined = PdfDocument.Merge(invoice, terms)
' Add digital signature
Dim signature = New PdfSignature("certificate.pfx", "password")
combined.Sign(signature)
' Set metadata
combined.MetaData.Author = "Accounting Department"
combined.MetaData.Title = "Invoice #12345"
combined.MetaData.CreationDate = DateTime.Now
' Compress and save
combined.CompressImages(90)
combined.SaveAs("final-invoice.pdf")
本範例展示了 IronPDF 全面的 PDF 處理能力:
- 基於模板從 HTML 檔案產生
- 使用 CSS 設定控制的水印
- 多部分 PDF 的文件合併
- 用於驗證的數位簽章
- 文件屬性的元資料管理
- 圖片壓縮以減少檔案大小
戳記功能和數位簽名支援使 IronPDF 適合企業文件工作流程。
Puppeteer Sharp - 瀏覽器自動化焦點:
using PuppeteerSharp;
var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = false, // Show browser for debugging
SlowMo = 50 // Slow down actions
});
var page = await browser.NewPageAsync();
// Navigate to web application
await page.GoToAsync("https://app.example.com/login");
// Automate login
await page.TypeAsync("#username", "user@example.com");
await page.TypeAsync("#password", "password123");
await page.ClickAsync("#login-button");
// Wait for dashboard
await page.WaitForNavigationAsync();
// Take screenshot for documentation
await page.ScreenshotAsync("dashboard-screenshot.png", new ScreenshotOptions
{
FullPage = true,
Type = ScreenshotType.Png
});
// Generate report PDF
await page.ClickAsync("#generate-report");
await page.WaitForSelectorAsync(".report-ready");
// Save the generated report
await page.PdfAsync("automated-report.pdf", new PdfOptions
{
DisplayHeaderFooter = true,
HeaderTemplate = "<div style='font-size:10px;'>Report Header</div>",
FooterTemplate = "<div style='font-size:10px;'>Page <span class='pageNumber'></span></div>",
Format = PaperFormat.A4
});
await browser.CloseAsync();
using PuppeteerSharp;
var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = false, // Show browser for debugging
SlowMo = 50 // Slow down actions
});
var page = await browser.NewPageAsync();
// Navigate to web application
await page.GoToAsync("https://app.example.com/login");
// Automate login
await page.TypeAsync("#username", "user@example.com");
await page.TypeAsync("#password", "password123");
await page.ClickAsync("#login-button");
// Wait for dashboard
await page.WaitForNavigationAsync();
// Take screenshot for documentation
await page.ScreenshotAsync("dashboard-screenshot.png", new ScreenshotOptions
{
FullPage = true,
Type = ScreenshotType.Png
});
// Generate report PDF
await page.ClickAsync("#generate-report");
await page.WaitForSelectorAsync(".report-ready");
// Save the generated report
await page.PdfAsync("automated-report.pdf", new PdfOptions
{
DisplayHeaderFooter = true,
HeaderTemplate = "<div style='font-size:10px;'>Report Header</div>",
FooterTemplate = "<div style='font-size:10px;'>Page <span class='pageNumber'></span></div>",
Format = PaperFormat.A4
});
await browser.CloseAsync();
Imports PuppeteerSharp
Private browser = await Puppeteer.LaunchAsync(New LaunchOptions With {
.Headless = False,
.SlowMo = 50
})
Private page = await browser.NewPageAsync()
' Navigate to web application
Await page.GoToAsync("https://app.example.com/login")
' Automate login
Await page.TypeAsync("#username", "user@example.com")
Await page.TypeAsync("#password", "password123")
Await page.ClickAsync("#login-button")
' Wait for dashboard
Await page.WaitForNavigationAsync()
' Take screenshot for documentation
Await page.ScreenshotAsync("dashboard-screenshot.png", New ScreenshotOptions With {
.FullPage = True,
.Type = ScreenshotType.Png
})
' Generate report PDF
Await page.ClickAsync("#generate-report")
Await page.WaitForSelectorAsync(".report-ready")
' Save the generated report
Await page.PdfAsync("automated-report.pdf", New PdfOptions With {
.DisplayHeaderFooter = True,
.HeaderTemplate = "<div style='font-size:10px;'>Report Header</div>",
.FooterTemplate = "<div style='font-size:10px;'>Page <span class='pageNumber'></span></div>",
.Format = PaperFormat.A4
})
Await browser.CloseAsync()
Puppeteer Sharp 的強項在於瀏覽器自動化情境:
- 自動登入和導覽
- 在任何點擷取螢幕截圖
- 與網路應用程式互動
- 從網路應用程式動態產生報告
ZenRows 指出,"Puppeteer Sharp 可以模擬多種自動化使用者互動。 這些包括滑鼠移動、等待等等"。
有哪些效能考量?
IronPDF 性能
IronPDF 已針對 PDF 作業進行最佳化,並具備多項效能功能:
-
記憶體管理:
- 透過 .NET 垃圾回收有效使用記憶體
- 批次處理最佳化。
- 大型文件的串流支援
-
多執行緒:
- 完整的 async/await 支援
- 平行 PDF 生成能力
- 線程安全操作
- 渲染速度:
- 典型 HTML 到 PDF 的平均時間為 0.8-1.2 秒
- 內建 Chrome 引擎可消除外部程序開銷
- 重複操作的快取機制
根據 效能最佳化指南,IronPDF 的初始渲染可能會因為引擎初始化而變慢,但後續作業已高度最佳化。
Puppeteer 的敏銳效能
Puppeteer Sharp 的性能特性因其架構而異:
-
瀏覽器開銷:
- 需要下載 ~170MB Chromium
- 每個瀏覽器實例需要 150-200MB RAM
- 瀏覽器啟動時間增加 1-3 秒
-
渲染速度:
- 簡單 HTML 需時 0.3-0.5 秒
- 並發多個實例可能會降低效能
- 資源密集的並行作業
- 優化策略:
- 建議重新使用瀏覽器實例
- 多個 PDF 的連接池
- 無頭模式可降低開銷
基準測試顯示 Puppeteer 對於簡單的 HTML 可以更快,但對於生產使用則需要謹慎的資源管理。
定價與授權如何比較?
IronPDF 定價結構
IronPDF提供靈活的商業授權選項:
-
授權層級(定價截至 2025 年): *精簡版授權: $999 - 1 位開發者,1 個地點,1 個項目
- Plus 授權: $1,499 - 3 位開發者,3 個地點,3 個項目 *專業許可證: $2,999 - 10 位開發人員,10 個地點,10 個項目
- 無限制 License: 適合較大團隊的自訂價格
-
其他選項:
- 免版稅再分發:+$2,999
- 提供 SaaS/OEM 授權
- Iron Suite :$1,498,共9款產品
- 30 天退款保證
- 支援與更新:
- 包含一年的支援與更新
- 延伸支援:999 美元/年或 5 年 1,999 美元
- 所有授權均提供 24/5 工程師支援
Puppeteer Sharp 授權
Puppeteer Sharp 使用 MIT 授權:
- 成本:完全免費
- 商業用途:無限制允許
- 支援: 透過 GitHub 以社群為基礎
- 更新:開放源碼社群驅動
雖然許可證本身是免費的,但團隊應該將專案總成本考慮在內:
- 支援工作依賴開源社區,而不是專門的團隊。 基礎設施管理是你們團隊的職責。 進階 PDF 功能需要整合其他函式庫 故障排除通常依賴社群論壇和自我診斷。
正如 Reddit 的 dotnet 社群所討論的,選擇通常取決於專業支援和進階功能是否值得投資。
除了授權費用之外,專案總成本還包括開發人員花費在管理瀏覽器生命週期程式碼、整合用於加密和數位簽章的獨立庫以及在沒有專門支援的環境中進行部署問題故障排除上的時間。 對於評估多年專案生命週期成本的團隊來說,這些整合和維護成本往往超過開源授權和商業授權之間的差異。
文件和支援服務有何異同?
IronPDF 文件與支援
IronPDF 提供全面的專業資源:
-
文件:
- 廣泛的 API 參考。
- 50+ 教學涵蓋常見的情境
- 200多個程式碼範例。
- YouTube 上的視訊教學
- 定期更新文件
-
支援管道:
- 24/5 即時工程師支援
- 電子郵件和電話支援(取決於授權)
- 複雜問題的螢幕分享會議
- 社群論壇
- Slack 討論頻道
- 學習資源:
Puppeteer Sharp 文件與支援
Puppeteer Sharp 依賴社群資源:
-
文件:
- API 文件
- GitHub README 和 wiki
- 儲存庫中的程式碼範例
- 原始 Puppeteer 文件連結
- 支援選項:
- 用於錯誤報告的 GitHub 問題
- 社群討論
- Stack Overflow 問題
- 無官方支援管道
*注意事項:
- 文檔更新遵循開源貢獻週期 社群成員貢獻了大部分新增內容。 故障排除指南的覆蓋範圍比商業庫窄。
- 部分範例反映了早期的 API 版本
開發者部落格提供了有用的技術見解,但文章發佈時間取決於維護者的安排,而不是固定的節奏。
您應該選擇哪一種 PDF 函式庫?
IronPDF 和 Puppeteer Sharp 之間的抉擇取決於您的特定需求和使用個案。
選擇 IronPDF 時:。
- 建立需要安全、專業 PDF 的企業應用程式
- 需要基本生成之外的全面 PDF 功能
- 想要最小的程式碼複雜度與直接的 API
- 需要專業的支援和說明文件
- 使用多種 PDF 格式工作(DOCX、圖片等) *需要內建安全功能,例如加密和簽名
- 跨各種平台部署而無相容性疑慮
- 上市時間價值高於初始成本
IronPDF 擅長處理以下情境:
- 發票和報告生成
- 文件管理系統
- 合規要求的文件
- 多格式文件處理
- 大量 PDF 作業
何時選擇 Puppeteer Sharp:
- 主要重點是瀏覽器自動化,其次是 PDF。
- 預算限制阻止商業授權
- Need web scraping capabilities 以及 PDF 生成
- 能夠自如地管理瀏覽器基礎架構。
- 簡單的 PDF 要求不含進階功能
- 具備 Node.js 現有的 Puppeteer 知識
- 建立測試框架或自動化工具
Puppeteer Sharp 適用於:
- 自動化測試與 PDF 報告
- 帶有 PDF 匯出的網頁搜刮
- 簡單的 HTML 至 PDF 轉換
- 截圖擷取工作流程
- 基於瀏覽器的自動化任務
真實世界建議
1.適用於生產應用程式: IronPDF 的可靠性、支援和功能足以證明投資的合理性 2.適用於原型: Puppeteer Sharp 的免費授權可讓您快速進行實驗 3.適用於複雜的 PDF: IronPDF 的進階功能可節省開發時間 4.適用於瀏覽器測試: Puppeteer Sharp 的自動化功能無與倫比
支援現代 CSS 架構
IronPDF 和 Puppeteer Sharp 均使用 Chromium 渲染引擎,這意味著兩者理論上都可以處理 Bootstrap、Tailwind CSS 和 Foundation 等現代 CSS 框架。 然而,實施的複雜性和開發人員的經驗有很大的差異。
IronPDF:簡化的 Bootstrap 渲染。
IronPDF 以 PDF 為重點的 API 可讓您以最少的程式碼直接呈現 Bootstrap 的佈局:
-一行程式碼轉換:無需瀏覽器生命週期管理 -內建優化:自動處理 CSS/JavaScript 加載 -已適配 Bootstrap 5:完全支援Bootstrap 首頁與模板 -生產就緒:包含安全性、壓縮和企業級功能
程式碼範例:IronPDF Bootstrap 渲染。
using IronPdf;
// Simple, direct Bootstrap rendering
var renderer = new ChromePdfRenderer();
string bootstrapContent = @"
<!DOCTYPE html>
<html>
<head>
<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
</head>
<body>
<div class='container mt-5'>
<div class='row'>
<div class='col-md-4 mb-4'>
<div class='card shadow'>
<div class='card-body'>
<h5 class='card-title'>Quick Start</h5>
<p class='card-text'>Render Bootstrap with one method call.</p>
<a href='#' class='btn btn-primary'>Learn More</a>
</div>
</div>
</div>
</div>
</div>
</body>
</html>";
// Single method call - no browser management
var pdf = renderer.RenderHtmlAsPdf(bootstrapContent);
pdf.SaveAs("bootstrap-layout.pdf");
using IronPdf;
// Simple, direct Bootstrap rendering
var renderer = new ChromePdfRenderer();
string bootstrapContent = @"
<!DOCTYPE html>
<html>
<head>
<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
</head>
<body>
<div class='container mt-5'>
<div class='row'>
<div class='col-md-4 mb-4'>
<div class='card shadow'>
<div class='card-body'>
<h5 class='card-title'>Quick Start</h5>
<p class='card-text'>Render Bootstrap with one method call.</p>
<a href='#' class='btn btn-primary'>Learn More</a>
</div>
</div>
</div>
</div>
</div>
</body>
</html>";
// Single method call - no browser management
var pdf = renderer.RenderHtmlAsPdf(bootstrapContent);
pdf.SaveAs("bootstrap-layout.pdf");
Imports IronPdf
' Simple, direct Bootstrap rendering
Dim renderer As New ChromePdfRenderer()
Dim bootstrapContent As String = "
<!DOCTYPE html>
<html>
<head>
<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
</head>
<body>
<div class='container mt-5'>
<div class='row'>
<div class='col-md-4 mb-4'>
<div class='card shadow'>
<div class='card-body'>
<h5 class='card-title'>Quick Start</h5>
<p class='card-text'>Render Bootstrap with one method call.</p>
<a href='#' class='btn btn-primary'>Learn More</a>
</div>
</div>
</div>
</div>
</div>
</body>
</html>"
' Single method call - no browser management
Dim pdf = renderer.RenderHtmlAsPdf(bootstrapContent)
pdf.SaveAs("bootstrap-layout.pdf")
Puppeteer Sharp:基於瀏覽器的 Bootstrap 渲染。
Puppeteer Sharp 需要明確的瀏覽器管理和生命週期控制,以進行 Bootstrap 渲染:
程式碼範例:Puppeteer 銳利的 Bootstrap 渲染。
using PuppeteerSharp;
// Download Chromium if needed (one-time ~170MB)
await new BrowserFetcher().DownloadAsync();
// Launch browser instance
var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = true });
try
{
var page = await browser.NewPageAsync();
// Set Bootstrap content
await page.SetContentAsync(@"
<!DOCTYPE html>
<html>
<head>
<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
</head>
<body>
<div class='container mt-5'>
<div class='row'>
<div class='col-md-4 mb-4'>
<div class='card shadow'>
<div class='card-body'>
<h5 class='card-title'>Quick Start</h5>
<p class='card-text'>Render Bootstrap with browser automation.</p>
<a href='#' class='btn btn-primary'>Learn More</a>
</div>
</div>
</div>
</div>
</div>
</body>
</html>");
// Wait for Bootstrap CSS to load
await page.WaitForNetworkIdleAsync();
// Generate PDF
await page.PdfAsync("bootstrap-layout.pdf");
}
finally
{
// Required cleanup
await browser.CloseAsync();
}
using PuppeteerSharp;
// Download Chromium if needed (one-time ~170MB)
await new BrowserFetcher().DownloadAsync();
// Launch browser instance
var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = true });
try
{
var page = await browser.NewPageAsync();
// Set Bootstrap content
await page.SetContentAsync(@"
<!DOCTYPE html>
<html>
<head>
<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
</head>
<body>
<div class='container mt-5'>
<div class='row'>
<div class='col-md-4 mb-4'>
<div class='card shadow'>
<div class='card-body'>
<h5 class='card-title'>Quick Start</h5>
<p class='card-text'>Render Bootstrap with browser automation.</p>
<a href='#' class='btn btn-primary'>Learn More</a>
</div>
</div>
</div>
</div>
</div>
</body>
</html>");
// Wait for Bootstrap CSS to load
await page.WaitForNetworkIdleAsync();
// Generate PDF
await page.PdfAsync("bootstrap-layout.pdf");
}
finally
{
// Required cleanup
await browser.CloseAsync();
}
Imports PuppeteerSharp
' Download Chromium if needed (one-time ~170MB)
Await (New BrowserFetcher()).DownloadAsync()
' Launch browser instance
Dim browser = Await Puppeteer.LaunchAsync(New LaunchOptions With {.Headless = True})
Try
Dim page = Await browser.NewPageAsync()
' Set Bootstrap content
Await page.SetContentAsync("
<!DOCTYPE html>
<html>
<head>
<link href='https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css' rel='stylesheet'>
</head>
<body>
<div class='container mt-5'>
<div class='row'>
<div class='col-md-4 mb-4'>
<div class='card shadow'>
<div class='card-body'>
<h5 class='card-title'>Quick Start</h5>
<p class='card-text'>Render Bootstrap with browser automation.</p>
<a href='#' class='btn btn-primary'>Learn More</a>
</div>
</div>
</div>
</div>
</div>
</body>
</html>")
' Wait for Bootstrap CSS to load
Await page.WaitForNetworkIdleAsync()
' Generate PDF
Await page.PdfAsync("bootstrap-layout.pdf")
Finally
' Required cleanup
Await browser.CloseAsync()
End Try
Bootstrap 開發的主要差異
複雜性:
- IronPDF: 4 行程式碼(初始化、渲染、儲存)
- Puppeteer Sharp: 15 行以上程式碼(下載、啟動、頁面管理、清理)
特點: IronPDF:內建安全功能、壓縮功能、浮水印功能和簽名功能
- Puppeteer Sharp:需要處理 PDF 的團隊需要添加單獨的庫
部署: IronPDF:獨立運行,無外部依賴項
- Puppeteer Sharp:需要 Chromium 二進位(約 170MB)和瀏覽器管理。
由於這兩個函式庫都使用 Chromium 引擎,因此都能準確呈現 Bootstrap。 選擇取決於您是需要簡單的 PDF 產生工作流程 (IronPDF) 或更廣泛的瀏覽器自動化功能 (Puppeteer Sharp)。
有關 CSS 架構相容性的詳細資訊,請參閱 Bootstrap & Flexbox CSS 指南。
底線。
IronPDF 和 Puppeteer Sharp 分別滿足 .NET 生態系中不同的需求。 IronPDF 提供全面的 PDF 解決方案,具有豐富的功能集、專業的支援以及專為 PDF 操作設計的 API。 它將企業 PDF 工作流程所需的一切功能(生成、編輯、安全性和簽名)整合到一個文檔齊全的軟體包中。
Puppeteer Sharp 作為一款瀏覽器自動化工具,擁有強大的功能,其中一項功能就是匯出 PDF 檔案。 對於主要工作涉及無頭瀏覽器控制、網頁抓取或自動化測試的團隊來說,這是一個架構完善的選擇。其 MIT 授權和強大的社群支援使其適用於 PDF 產生需求簡單的專案。
對於需要可靠產生 PDF 以及具備操作、安全性和合規性功能的商業應用而言,IronPDF 是更實用的選擇。 透過專用 API 和專業支援節省的開發時間通常超過了授權成本。也就是說,如果瀏覽器自動化是核心需求,而 PDF 輸出是次要的,那麼 Puppeteer Sharp 仍然是一個可靠的選擇。
準備好體驗與眾不同了嗎? 從 IronPDF 的 30天免費試用開始,探索其全面的功能,看看它如何簡化您的 PDF 工作流程。 無論您是要建立發票、報表或複雜的文件系統,IronPDF 都能提供成功所需的工具和支援。
!{--01001100010010010100001001010010010000010101001001011001010111110101001101010100010001010101010 10100010111110101010001010010010010010100000101001100010111110100001001001100010011111010000100100110001001111010101
常見問題解答
怎樣在 C# 中將 HTML 轉換為 PDF?
您可以使用 IronPDF 的 RenderHtmlAsPdf 方法將 HTML 字符串轉換為 PDF。您還可以使用 RenderHtmlFileAsPdf 將 HTML 文件轉換為 PDF。
IronPDF 和 Puppeteer Sharp 之間的主要區別是什麼?
IronPDF 是一個專為 .NET 開發人員設計的全面 PDF 庫,提供廣泛的 PDF 操作功能,如加密、簽署和編輯。Puppeteer Sharp 是一個瀏覽器自動化工具,它可以將生成 PDF 作為其功能之一,主要側重於控制無頭 Chrome 進行測試和網路抓取。
我可以程序化地向 PDF 添加安全功能嗎?
IronPDF 提供全面的安全功能,包括 AES-256 加密、密碼保護和細粒度權限控制。您可以設置用戶和擁有者密碼,通過 SecuritySettings 屬性限制打印、複製和編輯。本地還支援數字簽名。
哪個庫提供更好的跨平台兼容性?
IronPDF提供卓越的跨平台兼容性,原生支援Windows、Linux、macOS、Docker、Azure和AWS。 它支援.NET 10、9、8、7、6、Core、Standard和Framework,無需為不同环境進行额外配置或程序包。
這些庫如何處理 JavaScript 渲染?
由於採用基於 Chrome 的渲染,兩個庫都支援 JavaScript 執行。IronPDF 提供簡單的渲染延遲選項和 WaitFor class 用於計時控制。Puppeteer Sharp 提供更細緻的控制,具有等待條件和直接 JavaScript 執行功能。
這些庫的授權成本是多少?
IronPDF 採用商業授權,Lite 授權(1 位開發人員,1 個項目)的起價為 $749。有多個層級一直到企業無限授權。Puppeteer Sharp 根據 MIT 授權完全免費,但缺乏專業支援和高級功能。
我可以使用這些庫編輯現有的 PDF 文檔嗎?
IronPDF 提供廣泛的 PDF 編輯功能,包括合併、拆分、添加水印、頁眉/頁腳、表單填寫和頁面操作。Puppeteer Sharp 僅生成 PDF,對於任何編輯操作需要額外的庫。
這兩個庫都可以實現瀏覽器自動化嗎?
Puppeteer Sharp 在瀏覽器自動化方面表現出色,提供對無頭 Chrome 的完整控制,包括導航、表單填寫和截圖捕捉。IronPDF 專注於 PDF 操作,除渲染網頁內容為 PDF 外,未提供其他瀏覽器自動化功能。
有什麼樣的開發者支援可用?
IronPDF 提供 24/5 的專業工程師支援、豐富的文檔、教程和 API 參考。支援包括電子郵件、電話和根據授權層級的屏幕共享選項。Puppeteer Sharp 通過 GitHub 和 Stack Overflow 提供社區支援。
我如何處理 PDF 中的動態內容和 AJAX 加載的元素?
IronPDF 通過渲染延遲和 JavaScript 執行設置來處理動態內容。您可以為精確的計時設置 RenderDelay 或使用 WaitFor class。Puppeteer Sharp 提供等待條件、導航選項和直接 JavaScript 執行來應對複雜的動態內容場景。

