如何用 C# 從 PuppeteerSharp 轉移到 IronPDF
從PuppeteerSharp轉移到 IronPDF:完整的 C# 遷移指南。
從PuppeteerSharp轉換到IronPDF可將您的 PDF 生成工作流程從依賴 300MB 以上的瀏覽器自動化工具轉換為具有自動記憶體管理功能的專用 PDF 函式庫。 本指南提供完整的逐步遷移路徑,可消除 Chromium 下載、解決記憶體洩漏問題,並提供全面的 PDF 操作功能。
為什麼要從PuppeteerSharp轉移到 IronPDF?
瞭解 PuppeteerSharp。
PuppeteerSharp 是 Google 的 Puppeteer 的 .NET 移植,將瀏覽器自動化功能帶入 C#。 它使用 Chrome 內建的列印至 PDF 功能來產生 PDF,就像在瀏覽器中按下 Ctrl+P 一樣。 這會產生為紙張最佳化的印刷就緒輸出,與您在螢幕上看到的不同。
PuppeteerSharp 是專為網頁測試和搜刮而設計,而非文件生成。 使用PuppeteerSharp生成 PDF 虽然能够胜任,但会带来巨大的生产挑战。
瀏覽器自動化問題
PuppeteerSharp 是專為瀏覽器自動化而設計,而非文件生成。 這在用於 PDF 時會產生基本問題:
1.首次使用前需下載 300MB+ Chromium。PuppeteerSharp的一個顯著缺點是其龐大的部署規模,這主要是由於它捆綁了 Chromium 二進位檔案。 這種龐大的規模會使 Docker 映像變得臃腫,並在無伺服器環境中造成冷啟動問題。
2.負載下的記憶體洩漏需要手動回收瀏覽器。 眾所周知,PuppeteerSharp 在高負載狀態下會發生記憶體洩漏。 瀏覽器實體累積的記憶體必須以手動方式進行流程管理與回收。
3.複雜的 async 模式與瀏覽器生命週期管理。
4.Print-to-PDF 輸出(等同於 Ctrl+P,而非螢幕擷取)。 版面可能會回流,背景可能會依預設省略,而且輸出會以分頁方式列印,而非配合瀏覽器的視埠。
5.不支援 PDF/A 或 PDF/UA,以符合法規要求。PuppeteerSharp無法製作 PDF/A (歸檔) 或 PDF/UA (無障礙) 相容的文件。
6.無 PDF 操作 - 僅生成,無合併/分割/編輯。 雖然PuppeteerSharp能有效率地產生 PDF,但它缺乏進一步操作的功能,例如合併、分割、保護或編輯 PDF。
PuppeteerSharp與IronPDF的比較
| 範疇 | PuppeteerSharp | IronPDF |
|---|---|---|
| 主要目的 | 瀏覽器自動化 | 生成 PDF |
| Chromium相依性 | 300MB+ 獨立下載 | 內建最佳化引擎 |
| API複雜性 | 同步瀏覽器/網頁生命週期 | 同步單行字 |
| 初始化 | BrowserFetcher.DownloadAsync() + LaunchAsync | 新的 ChromePdfRenderer() |
| 記憶體管理 | 需要手動回收瀏覽器 | 自動化 |
| 負載下的記憶體 | 500MB+ 有洩漏 | ~50MB 穩定 |
| 冷啟動 | 45 秒以上 | ~20 秒 |
| PDF/A支援 | 無法提供 | 全面支援 |
| PDF/UA 可訪問性 | 無法提供 | 全面支援 |
| PDF編輯 | 無法提供 | 合併、分割、蓋章、編輯 |
| 數位簽名 | 無法提供 | 全面支援 |
| 線程安全 | 限額 | 全文 |
| 專業支援。 | 社區 | 有 SLA 的商業翻譯 |
平台支援
| 圖書館 | .NET Framework 4.7.2 | .NET Core 3.1 | .NET 6-8 | .NET 10 |
|---|---|---|---|---|
| IronPDF | 全文 | 全文 | 全文 | 全文 |
| PuppeteerSharp | 限額 | 全文 | 全文 | 待定 |
IronPDF 跨 .NET 平台的廣泛支援,可確保開發人員在各種環境中利用IronPDF而不會遇到相容性問題,為 2025 年和 2026 年的現代 .NET 應用程式提供靈活的選擇。
開始之前
先決條件
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 PuppeteerSharp
dotnet remove package PuppeteerSharp
# Remove downloaded Chromium binaries (~300MB recovered)
# Delete the .local-chromium folder
# Add IronPDF
dotnet add package IronPdf# Remove PuppeteerSharp
dotnet remove package PuppeteerSharp
# Remove downloaded Chromium binaries (~300MB recovered)
# Delete the .local-chromium folder
# Add IronPDF
dotnet add package IronPdf使用 IronPDF 不需要 BrowserFetcher.DownloadAsync() - 會自動捆綁渲染引擎。
授權組態
// 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完整的 API 參考資料
命名空間變更
// Before: PuppeteerSharp
using PuppeteerSharp;
using PuppeteerSharp.Media;
using System.Threading.Tasks;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;// Before: PuppeteerSharp
using PuppeteerSharp;
using PuppeteerSharp.Media;
using System.Threading.Tasks;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;IRON VB CONVERTER ERROR developers@ironsoftware.com核心 API 對應
| PuppeteerSharp API | IronPdf API | 筆記 |
|---|---|---|
new BrowserFetcher().DownloadAsync() | 不需要 | 無需下載瀏覽器 |
| <代碼>Puppeteer.LaunchAsync(選項)</代碼 | 不需要 | 無瀏覽器管理 |
| <代碼>browser.NewPageAsync()</代碼 | 不需要 | 無頁面上下文 |
page.GoToAsync(url)。 | renderer.RenderUrlAsPdf(url)。 | 直接渲染 |
page.SetContentAsync(html) | renderer.RenderHtmlAsPdf(html)。 | 直接渲染 |
page.PdfAsync(path) | <代碼>pdf.SaveAs(路徑)</代碼 | 渲染後 |
await page.CloseAsync() | 不需要 | 自動清理 |
await browser.CloseAsync() | 不需要 | 自動清理 |
PdfOptions.Format | RenderingOptions.PaperSize | 紙張大小 |
| <編碼>PdfOptions.Landscape</編碼 | <編碼>RenderingOptions.PaperOrientation</編碼 | 導向 |
| <編碼>PdfOptions.MarginOptions</編碼 | RenderingOptions.MarginTop/Bottom/Left/Right渲染選項。 | 個別邊距 |
| <編碼>PdfOptions.PrintBackground</編碼 | <編碼>RenderingOptions.PrintHtmlBackgrounds</編碼 | 背景印刷 |
| <編碼>PdfOptions.HeaderTemplate</編碼 | <編碼>RenderingOptions.HtmlHeader</編碼 | HTML 標頭 |
| <編碼>PdfOptions.FooterTemplate</編碼 | RenderingOptions.HtmlFooter | HTML 頁腳 |
page.WaitForSelectorAsync()。 | <編碼>RenderingOptions.WaitFor.HtmlElementId</編碼 | 等待元素 |
程式碼遷移範例
範例 1:基本 HTML 到 PDF 的轉換
之前 (PuppeteerSharp):
// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
var browserFetcher = new BrowserFetcher();
await browserFetcher.DownloadAsync();
await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = true
});
await using var page = await browser.NewPageAsync();
await page.SetContentAsync("<h1>Hello World</h1><p>This is a PDF document.</p>");
await page.PdfAsync("output.pdf");
}
}// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
var browserFetcher = new BrowserFetcher();
await browserFetcher.DownloadAsync();
await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = true
});
await using var page = await browser.NewPageAsync();
await page.SetContentAsync("<h1>Hello World</h1><p>This is a PDF document.</p>");
await page.PdfAsync("output.pdf");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comAfter (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF document.</p>");
pdf.SaveAs("output.pdf");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF document.</p>");
pdf.SaveAs("output.pdf");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.com本範例展示了基本的架構差異。PuppeteerSharp需要六個同步操作:BrowserFetcher.DownloadAsync() (300MB+ Chromium 下載)、Puppeteer.LaunchAsync()、browser.NewPageAsync()、page.SetContentAsync() 和 page.PdfAsync(), Plus 與 await using 的適當處理。
IronPDF 消除了所有這些複雜性:創建一個 ChromePdfRenderer ,呼叫 RenderHtmlAsPdf() 以及 SaveAs() 。 沒有 async 模式、沒有瀏覽器生命週期、沒有 Chromium 下載。IronPDF的方法提供了更簡潔的語法,並能更好地與現代 .NET 應用程式整合。 請參閱 HTML to PDF 文件,以瞭解全面的範例。
範例 2:URL 到 PDF 的轉換
之前 (PuppeteerSharp):
// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
var browserFetcher = new BrowserFetcher();
await browserFetcher.DownloadAsync();
await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = true
});
await using var page = await browser.NewPageAsync();
await page.GoToAsync("https://www.example.com");
await page.PdfAsync("webpage.pdf");
}
}// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
var browserFetcher = new BrowserFetcher();
await browserFetcher.DownloadAsync();
await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = true
});
await using var page = await browser.NewPageAsync();
await page.GoToAsync("https://www.example.com");
await page.PdfAsync("webpage.pdf");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comAfter (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.comPuppeteerSharp 使用 GoToAsync() 來導航到 URL,接著是 PdfAsync() 。IronPDF提供了單一的 RenderUrlAsPdf() 方法,可在一次呼叫中處理導航和 PDF 生成。 請參閱我們的 教學,瞭解更多資訊。
範例 3:自訂頁面設定與邊界
之前 (PuppeteerSharp):
// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using PuppeteerSharp.Media;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
var browserFetcher = new BrowserFetcher();
await browserFetcher.DownloadAsync();
await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = true
});
await using var page = await browser.NewPageAsync();
await page.SetContentAsync("<h1>Custom PDF</h1><p>With landscape orientation and margins.</p>");
await page.PdfAsync("custom.pdf", new PdfOptions
{
Format = PaperFormat.A4,
Landscape = true,
MarginOptions = new MarginOptions
{
Top = "20mm",
Bottom = "20mm",
Left = "20mm",
Right = "20mm"
}
});
}
}// NuGet: Install-Package PuppeteerSharp
using PuppeteerSharp;
using PuppeteerSharp.Media;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
var browserFetcher = new BrowserFetcher();
await browserFetcher.DownloadAsync();
await using var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{
Headless = true
});
await using var page = await browser.NewPageAsync();
await page.SetContentAsync("<h1>Custom PDF</h1><p>With landscape orientation and margins.</p>");
await page.PdfAsync("custom.pdf", new PdfOptions
{
Format = PaperFormat.A4,
Landscape = true,
MarginOptions = new MarginOptions
{
Top = "20mm",
Bottom = "20mm",
Left = "20mm",
Right = "20mm"
}
});
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comAfter (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
var pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>With landscape orientation and margins.</p>");
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.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
var pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>With landscape orientation and margins.</p>");
pdf.SaveAs("custom.pdf");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.com此範例顯示 PDF 選項如何在兩個函式庫之間對應。PuppeteerSharp使用 PdfOptions 與 Format, Landscape, 和 MarginOptions 包含字串值 ("20mm")。 IronPdf 使用 RenderingOptions 屬性,其中包含直接的紙張尺寸枚舉、方向枚舉,以及以毫米為單位的數字邊界值。
關鍵對應:
Format = PaperFormat.A4→PaperSize = PdfPaperSize.A4Landscape = true→PaperOrientation = PdfPaperOrientation.Landscape。MarginOptions.Top = "20mm"→MarginTop = 20(數字毫米)
記憶體洩漏問題
PuppeteerSharp 在持續負載下會造成記憶體累積:
// ❌PuppeteerSharp- Memory grows with each operation
// Requires explicit browser recycling every N operations
for (int i = 0; i < 1000; i++)
{
var page = await browser.NewPageAsync();
await page.SetContentAsync($"<h1>Document {i}</h1>");
await page.PdfAsync($"doc_{i}.pdf");
await page.CloseAsync(); // Memory still accumulates!
}
// Must periodically: await browser.CloseAsync(); and re-launch
// ✅IronPDF- Stable memory, reuse renderer
var renderer = new ChromePdfRenderer();
for (int i = 0; i < 1000; i++)
{
var pdf = renderer.RenderHtmlAsPdf($"<h1>Document {i}</h1>");
pdf.SaveAs($"doc_{i}.pdf");
// Memory managed automatically
}// ❌PuppeteerSharp- Memory grows with each operation
// Requires explicit browser recycling every N operations
for (int i = 0; i < 1000; i++)
{
var page = await browser.NewPageAsync();
await page.SetContentAsync($"<h1>Document {i}</h1>");
await page.PdfAsync($"doc_{i}.pdf");
await page.CloseAsync(); // Memory still accumulates!
}
// Must periodically: await browser.CloseAsync(); and re-launch
// ✅IronPDF- Stable memory, reuse renderer
var renderer = new ChromePdfRenderer();
for (int i = 0; i < 1000; i++)
{
var pdf = renderer.RenderHtmlAsPdf($"<h1>Document {i}</h1>");
pdf.SaveAs($"doc_{i}.pdf");
// Memory managed automatically
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPdf 不需要PuppeteerSharp所需的瀏覽器池架構:
// Before (PuppeteerSharp - delete entire class)
public class PuppeteerBrowserPool
{
private readonly ConcurrentBag<IBrowser> _browsers;
private readonly SemaphoreSlim _semaphore;
private int _operationCount;
// ... recycling logic ...
}
// After (IronPDF - simple reuse)
public class PdfService
{
private readonly ChromePdfRenderer _renderer = new();
public byte[] Generate(string html)
{
return _renderer.RenderHtmlAsPdf(html).BinaryData;
}
}// Before (PuppeteerSharp - delete entire class)
public class PuppeteerBrowserPool
{
private readonly ConcurrentBag<IBrowser> _browsers;
private readonly SemaphoreSlim _semaphore;
private int _operationCount;
// ... recycling logic ...
}
// After (IronPDF - simple reuse)
public class PdfService
{
private readonly ChromePdfRenderer _renderer = new();
public byte[] Generate(string html)
{
return _renderer.RenderHtmlAsPdf(html).BinaryData;
}
}IRON VB CONVERTER ERROR developers@ironsoftware.com關鍵遷移注意事項
Async 到 Sync 的轉換
PuppeteerSharp 自始至終需要 async/await; IronPdf 支援同步作業:
// PuppeteerSharp: Async required
public async Task<byte[]> GeneratePdfAsync(string html)
{
await new BrowserFetcher().DownloadAsync();
await using var browser = await Puppeteer.LaunchAsync(...);
await using var page = await browser.NewPageAsync();
await page.SetContentAsync(html);
return await page.PdfDataAsync();
}
// IronPDF: Sync default
public byte[] GeneratePdf(string html)
{
var renderer = new ChromePdfRenderer();
return renderer.RenderHtmlAsPdf(html).BinaryData;
}
// Or async when needed
public async Task<byte[]> GeneratePdfAsync(string html)
{
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return pdf.BinaryData;
}// PuppeteerSharp: Async required
public async Task<byte[]> GeneratePdfAsync(string html)
{
await new BrowserFetcher().DownloadAsync();
await using var browser = await Puppeteer.LaunchAsync(...);
await using var page = await browser.NewPageAsync();
await page.SetContentAsync(html);
return await page.PdfDataAsync();
}
// IronPDF: Sync default
public byte[] GeneratePdf(string html)
{
var renderer = new ChromePdfRenderer();
return renderer.RenderHtmlAsPdf(html).BinaryData;
}
// Or async when needed
public async Task<byte[]> GeneratePdfAsync(string html)
{
var renderer = new ChromePdfRenderer();
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
return pdf.BinaryData;
}IRON VB CONVERTER ERROR developers@ironsoftware.com邊際單位轉換
PuppeteerSharp 使用字串單位; IronPdf 使用數字毫米:
//PuppeteerSharp- string units
MarginOptions = new MarginOptions
{
Top = "1in", // 25.4mm
Bottom = "0.75in", // 19mm
Left = "1cm", // 10mm
Right = "20px" // ~7.5mm at 96dpi
}
//IronPDF- numeric millimeters
renderer.RenderingOptions.MarginTop = 25; // mm
renderer.RenderingOptions.MarginBottom = 19;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 8;//PuppeteerSharp- string units
MarginOptions = new MarginOptions
{
Top = "1in", // 25.4mm
Bottom = "0.75in", // 19mm
Left = "1cm", // 10mm
Right = "20px" // ~7.5mm at 96dpi
}
//IronPDF- numeric millimeters
renderer.RenderingOptions.MarginTop = 25; // mm
renderer.RenderingOptions.MarginBottom = 19;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 8;IRON VB CONVERTER ERROR developers@ironsoftware.com頁首/頁尾占位符轉換
| PuppeteerSharp 類別 | IronPdf 占位符 |
|---|---|
class="pageNumber"></編碼 | {page} |
class="totalPages"></編碼 | {總頁數} |
<span> class="date">。 | <編碼>{日期}</編碼 |
<span> class="title">。 | <編碼>{html-title}</編碼 |
遷移後的新功能
轉移到IronPDF之後,您將獲得PuppeteerSharp無法提供的功能:
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水印。
var watermark = new TextStamper
{
Text = "CONFIDENTIAL",
FontSize = 48,
Opacity = 30,
Rotation = -45
};
pdf.ApplyStamp(watermark);var watermark = new TextStamper
{
Text = "CONFIDENTIAL",
FontSize = 48,
Opacity = 30,
Rotation = -45
};
pdf.ApplyStamp(watermark);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;IRON VB CONVERTER ERROR developers@ironsoftware.com數位簽名
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.comPDF/A 合規性
pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);pdf.SaveAsPdfA("archive.pdf", PdfAVersions.PdfA3b);IRON VB CONVERTER ERROR developers@ironsoftware.com效能比較摘要
| 指標 | PuppeteerSharp | IronPDF | 改進 |
|---|---|---|---|
| 第一份 PDF (冷启动) | 45s+ | ~20s | 速度快 55% 以上。 |
| 後續 PDF | 變數 | 一致性 | 可預測性。 |
| 記憶體使用情況 | 500MB+ (成長中) | ~50MB (穩定) | 減少 90% 記憶體 |
| 磁碟空間 (Chromium) | 300MB+ | 0 | 消除下載。 |
| 瀏覽器下載 | 要求 | 不需要 | 零設定 |
| 線程安全 | 限額 | 全文 | 可靠的並發性 |
| PDF 生成時間 | 45s | 20s | 快55%。 |
遷移清單
預遷移
- [確認程式碼中所有PuppeteerSharp的用法
- [ ] 文件邊界值(將字串轉換為毫米)
- [ ] 轉換時請注意頁首/頁尾的占位符語法
- [ ] 刪除瀏覽器匯集/回收基礎架構
- [ ] 從 ironpdf.com 獲得IronPDF授權金鑰
套件變更
- [ ] 移除
PuppeteerSharpNuGet 套件 - [ ] 刪除
.local-chromium資料夾,以回收 ~300MB 磁碟空間 - [ ] 安裝
IronPDFNuGet 套件:dotnet add package IronPdf。
程式碼變更
- [ ] 更新命名空間匯入
- [ ] 移除
BrowserFetcher.DownloadAsync()呼叫 - [ ] 移除
Puppeteer.LaunchAsync()和瀏覽器管理 - [ ] 將
page.SetContentAsync()+page.PdfAsync()改為RenderHtmlAsPdf() - [ ] 將
page.GoToAsync()+page.PdfAsync()替換為RenderUrlAsPdf()。 - [ ] 將邊距字串轉換為毫米值
- [ ] 轉換頁首/頁尾佔位符語法
- [ ] 移除所有瀏覽器/網頁處理程式碼
- [ ] 刪除瀏覽器池架構
- [ ] 在應用程式啟動時加入授權初始化
後遷移
- [ ] PDF 輸出的視覺比較
- [ ] 記憶體穩定性的負載測試(應保持穩定而無需循環使用)
- [ ] 用頁碼驗證標題/頁尾的呈現
- [ ] 必要時增加新功能(安全性、水印、合併)。
結論
在選擇PuppeteerSharp和IronPDF時,請考慮您專案的特定需求。PuppeteerSharp在需要精確的 HTML 呈現,以及管理 Chromium 相依性的開銷合理的情況下表現優異。 相比之下,IronPDF 提供了一個全面的套件,具有廣泛的 PDF 處理功能、無與倫比的部署簡便性以及優異的記憶體管理,非常適合追求簡單性及多功能性的開發人員。
本次轉換的主要變更如下 1.架構:瀏覽器自動化工具 → 專用的 PDF 函式庫 2.依賴項目:300MB+Chromium 下載 → 綁定的渲染引擎 3.複雜性:6 個以上的同步操作 → 3 個同步呼叫 4.記憶體:500MB 以上有洩漏 → ~50MB 穩定 5.瀏覽器管理:手動生命週期與回收 → 自動處理 6.邊界:字串單位 ("20mm") → 數字毫米 (20) 7.Placeholders:CSS 類別 (<span> class="pageNumber">) → 大括號 ({page}) 8.效能:45 秒冷啟動 → ~20秒冷啟動 9.新功能:PDF 合併、分割、水印、安全性、數位簽署、PDF/A 合規性
這兩個函式庫都有其獨特的優點和缺點,瞭解這些優點和缺點可以引導您選擇合適的工具來滿足您的 PDF 產生和處理需求。






