NReco.PdfGenerator vs IronPDF:技術比較指南
NReco.PdfGenerator 概述
NReco.PdfGenerator 是一個 C# 函式庫,它利用 wkhtmltopdf 命令列工具將 HTML 文件轉換為 PDF。 它透過其HtmlToPdfConverter類別提供了一個簡單的 API,該類別呼叫 wkhtmltopdf 進行渲染。
wkhtmltopdf 工具採用 WebKit Qt 作為其渲染引擎,該版本可追溯到 2012 年左右。儘管使用廣泛,但 wkhtmltopdf 的開發已於 2020 年停止,因此不再提供安全性更新或新功能。 這對開發符合當前 CSS 和 JavaScript 要求的現代應用程式的團隊來說是一個挑戰。
免費版的 NReco.PdfGenerator 產生的 PDF 檔案帶有浮水印,因此如需用於生產用途,則必須購買商業授權。 取得這些許可證的價格需要聯繫銷售部門,這可能會使採購流程變得複雜。
IronPDF簡介
IronPDF 是一個 .NET 函式庫,使用基於 Chromium 的現代化渲染引擎,將 HTML、CSS 和 JavaScript 轉換成 PDF 文件。 ChromePdfRenderer類別是 HTML 到 PDF 轉換的主要接口,透過RenderingOptions屬性提供廣泛的配置選項。
與 wkhtmltopdf 封裝程式不同,IronPDF 的渲染引擎會定期接受更新,以確保安全性與相容性。 這個函式庫是自給自足的,不需要在不同的平台上管理外部的二進位相依性。
IronPDF 提供完整功能的試用期(無水印),讓團隊在購買前評估功能。 商業授權使用公開、透明的價格。
渲染引擎對比
這些函式庫的主要區別在於它們的渲染引擎,這會影響安全性和 CSS 相容性。
| 範疇 | NReco.PdfGenerator | IronPDF |
|---|---|---|
| 渲染引擎 | WebKit Qt (2012) | Chromium (目前) |
| 安全性 | 20+ CVE,已放棄 | 主動安全更新 |
| CSS 支援 | CSS2.1, 有限的 CSS3 | 完整的 CSS3、網格、Flexbox |
| JavaScript。 | 基本 ES5 | 完整的 ES6+ |
| 依賴性 | 外部 wkhtmltopdf 二進位 | 自成一格 |
| Async 支援 | 僅同步 | 完整的 async/await |
| 網路字型 | 限額 | 完整的 Google 字型,@font-face |
| 免費試用 | 水印 | 完整功能 |
| 定價透明度 | 不透明,請聯絡銷售 | 出版價格 |
NReco.PdfGenerator 繼承了 wkhtmltopdf 的所有安全漏洞,包括伺服器端請求偽造、本機檔案讀取漏洞和潛在遠端程式碼執行的 CVE 記錄。 由於 wkhtmltopdf 自 2020 年起已被棄用,因此無法針對這些問題提供修補程式。
IronPdf 的 Chromium 引擎提供當前 Web 標準支援,可實現現代 CSS 功能,如 Grid 和 Flexbox 布局、CSS 變數和自訂屬性。 JavaScript 執行支援 ES6+ 語法,包括 async/await 模式。
基本 HTML 到 PDF 的轉換
這兩個函式庫都處理基本的 HTML 至 PDF 轉換,但 API 模式不同。
NReco.PdfGenerator 方法:
// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;
class Program
{
static void Main()
{
var htmlToPdf = new HtmlToPdfConverter();
var htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
var pdfBytes = htmlToPdf.GeneratePdf(htmlContent);
File.WriteAllBytes("output.pdf", pdfBytes);
}
}// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;
class Program
{
static void Main()
{
var htmlToPdf = new HtmlToPdfConverter();
var htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
var pdfBytes = htmlToPdf.GeneratePdf(htmlContent);
File.WriteAllBytes("output.pdf", pdfBytes);
}
}IronPDF 方法:
// NuGet: Install-Package IronPdf
using IronPdf;
using System.IO;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using System.IO;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
}
}這兩個函式庫的基本轉換都只需要最少的程式碼。 NReco.PdfGenerator 返回一個 byte[] 陣列,需要手動進行檔案操作,而IronPDF返回一個 PdfDocument 物件,具有方便的方法,如 SaveAs() 。 IronPdf 物件還提供對 BinaryData 的存取,以存取位元組陣列,以及對 Stream 的存取,以進行基於流的操作。
對於熟悉 HTML 至 PDF 轉換工作流程的開發人員而言,IronPDF 的 API 會讓他們感覺直覺,同時提供基本轉換以外的額外功能。
URL 轉 PDF
將網頁轉換成 PDF 文件,可以發現方法命名和語義上的 API 差異。
NReco.PdfGenerator URL 轉換:
// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;
class Program
{
static void Main()
{
var htmlToPdf = new HtmlToPdfConverter();
var pdfBytes = htmlToPdf.GeneratePdfFromFile("https://www.example.com", null);
File.WriteAllBytes("webpage.pdf", pdfBytes);
}
}// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;
class Program
{
static void Main()
{
var htmlToPdf = new HtmlToPdfConverter();
var pdfBytes = htmlToPdf.GeneratePdfFromFile("https://www.example.com", null);
File.WriteAllBytes("webpage.pdf", pdfBytes);
}
}IronPDF URL 轉換:
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
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()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("webpage.pdf");
}
}NReco.PdfGenerator 使用 GeneratePdfFromFile() 來處理檔案路徑和 URL,這在語義上可能會造成混淆。IronPDF提供了一個專用的 RenderUrlAsPdf 方法,可以清楚地指出正在執行的操作。
自訂頁面大小與邊界
專業文件通常需要特定的頁面尺寸和頁邊配置。 這兩個函式庫都以不同的組態模式支援這些客製化功能。
NReco.PdfGenerator頁面配置:
// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;
class Program
{
static void Main()
{
var htmlToPdf = new HtmlToPdfConverter();
htmlToPdf.PageWidth = 210;
htmlToPdf.PageHeight = 297;
htmlToPdf.Margins = new PageMargins { Top = 10, Bottom = 10, Left = 10, Right = 10 };
var htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>";
var pdfBytes = htmlToPdf.GeneratePdf(htmlContent);
File.WriteAllBytes("custom-size.pdf", pdfBytes);
}
}// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;
class Program
{
static void Main()
{
var htmlToPdf = new HtmlToPdfConverter();
htmlToPdf.PageWidth = 210;
htmlToPdf.PageHeight = 297;
htmlToPdf.Margins = new PageMargins { Top = 10, Bottom = 10, Left = 10, Right = 10 };
var htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>";
var pdfBytes = htmlToPdf.GeneratePdf(htmlContent);
File.WriteAllBytes("custom-size.pdf", pdfBytes);
}
}IronPDF 頁面配置:
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 10;
var htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("custom-size.pdf");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 10;
var htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("custom-size.pdf");
}
}NReco.PdfGenerator 要求以毫米為單位指定頁面尺寸(A4 的尺寸為 210×297),並使用 PageMargins 物件。IronPDF使用 PdfPaperSize 枚舉用於標準尺寸,並透過 RenderingOptions 提供個別邊距屬性。 RenderingOptions 類集中了所有頁面設定,使設定可透過 IDE 自動完成發現。
API對應參考
對於考慮將 NReco.PdfGenerator 移植至IronPDF的團隊而言,瞭解 API 對應有助於估算工作量並規劃轉換。
核心方法映射
| NReco.PdfGenerator | IronPDF |
|---|---|
新的 HtmlToPdfConverter() | 新的 ChromePdfRenderer() |
GeneratePdf(html) | RenderHtmlAsPdf(html) |
GeneratePdfFromFile(url,輸出) | <代碼>RenderUrlAsPdf(url)</代碼 |
GeneratePdfFromFile(path,output) | RenderHtmlFileAsPdf(path) |
| (不支援) | <代碼>RenderHtmlAsPdfAsync(html)</代碼 |
配置屬性映射
| NReco.PdfGenerator | IronPDF |
|---|---|
Orientation = PageOrientation.Landscape。 | RenderingOptions.PaperOrientation=PdfPaperOrientation.Landscape渲染選項。 |
Size = PageSize.A4 | RenderingOptions.PaperSize=PdfPaperSize.A4渲染選項。 |
Margins.Top = 10 | RenderingOptions.MarginTop = 10 |
Zoom = 0.9f | RenderingOptions.Zoom = 90。 |
PageHeaderHtml="..."。 | <編碼>RenderingOptions.HtmlHeader</編碼 |
PageFooterHtml = "..." | RenderingOptions.HtmlFooter |
佔位符語法差異
頁首和頁尾通常包含動態內容,例如頁碼。 不同函式庫的占位符語法有所不同:
| NReco.PdfGenerator | IronPDF | 目的 |
|---|---|---|
[page] | {page} | 目前頁數 |
[topage] | {總頁數} | 總頁數 |
[日期] | <編碼>{日期}</編碼 | 目前日期 |
[時間] | {time} | 目前時間 |
[標題] | <編碼>{html-title}</編碼 | 文件標題 |
| <編碼>[網頁]</編碼 | <編碼>{url}</編碼 | 來源 URL |
從 NReco.PdfGenerator 遷移的團隊需要使用新的佔位符語法更新所有頁首和頁尾模板。
縮放價值轉換
NReco.PdfGenerator 使用浮動值 (0.0-2.0) 進行縮放,而IronPDF則使用百分比值:
// NReco: Zoom = 0.75f means 75%
// IronPDF: Zoom = 75 means 75%
int ironPdfZoom = (int)(nrecoZoom * 100);// NReco: Zoom = 0.75f means 75%
// IronPDF: Zoom = 75 means 75%
int ironPdfZoom = (int)(nrecoZoom * 100);非同步支援比較
現代網路應用程式受益於不會阻塞線程的異步操作。 這在處理並發請求的 ASP.NET Core 應用程式中尤其重要。
NReco.PdfGenerator 提供僅同步操作,在 PDF 生成過程中可能會阻塞網路伺服器線程:
// NReco.PdfGenerator - synchronous only
var pdfBytes = converter.GeneratePdf(html); // Blocks thread// NReco.PdfGenerator - synchronous only
var pdfBytes = converter.GeneratePdf(html); // Blocks threadIronPdf 支援完整的 async/await 模式:
//IronPDF- async support
var pdf = await renderer.RenderHtmlAsPdfAsync(html); // Non-blocking
await pdf.SaveAsAsync("output.pdf");//IronPDF- async support
var pdf = await renderer.RenderHtmlAsPdfAsync(html); // Non-blocking
await pdf.SaveAsAsync("output.pdf");對於回應 HTTP 請求產生 PDF 的應用程式,IronPDF 的 async 支援可在渲染過程中釋放線程來改善可擴展性。
依賴關係和部署差異
NReco.PdfGenerator 需要 wkhtmltopdf 二進位檔在系統上可用。 這造成了部署上的挑戰:
- 必須管理特定平台的二進位檔 (Windows .exe, Linux .so, macOS .dylib)
- Docker 映像需要安裝 wkhtmltopdf
- CI/CD 管線需要二進位配置步驟
- 安全掃描器標示已知的 CVE
IronPDF 自成一個 NuGet 套件:
#IronPDFinstallation - complete
dotnet add package IronPdf
# NReco.PdfGenerator installation - plus binary management
dotnet add package NReco.PdfGenerator
# Plus: install wkhtmltopdf per platform#IronPDFinstallation - complete
dotnet add package IronPdf
# NReco.PdfGenerator installation - plus binary management
dotnet add package NReco.PdfGenerator
# Plus: install wkhtmltopdf per platform從 NReco.PdfGenerator 遷移的團隊可以移除 wkhtmltopdf 的二進位檔,並簡化部署流程。
當團隊考慮從 NReco.PdfGenerator 遷移到IronPDF時
有幾個因素驅使團隊評估IronPDF作為 NReco.PdfGenerator 的替代品:
安全性合規性:當漏洞掃描器識別出 wkhtmltopdf CVE 時,有安全需求的組織將面臨挑戰。 由於 wkhtmltopdf 已被棄用,這些漏洞在 NReco.PdfGenerator 中並沒有修補途徑。IronPDF積極維護的 Chromium 引擎會收到安全更新。
現代 CSS 需求:需要使用 CSS Grid、Flexbox、CSS 變數或其他現代 CSS 特性的專案無法使用 wkhtmltopdf 2012 年的 WebKit 引擎。網頁設計師經常會在 NReco.PdfGenerator 中建立佈局,但這些佈局渲染不正確或根本無法渲染。
JavaScript 相容性:使用 JavaScript 渲染的內容(圖表、動態表格、計算值)產生 PDF 的應用程式需要現代 JavaScript 支援。 wkhtmltopdf 的 ES5 限制阻止了當代 JavaScript 函式庫的使用。
非同步應用程式架構: ASP.NET Core 應用程式受益於非同步 PDF 生成,從而保持執行緒效率。 NReco.PdfGenerator 僅同步的 API 可能會造成擴充性瓶頸。
簡化部署:在開發、測試和生產環境中管理特定於平台的 wkhtmltopdf 二進位檔案會增加操作複雜性。 團隊尋求可簡化 CI/CD 管線的獨立解決方案。
價格透明:預算規劃需要可預測的成本。 NReco.PdfGenerator 不透明的定價(聯繫銷售)使採購變得複雜,而IronPDF公佈的定價則可直接進行預算。
安裝對比
NReco.PdfGenerator 安裝:
Install-Package NReco.PdfGeneratorInstall-Package NReco.PdfGeneratorPlus 特定平台的 wkhtmltopdf 二進位安裝與管理。
安裝 IronPdf:
Install-Package IronPdfInstall-Package IronPdfIronPDF 需要在應用程式啟動時設定授權金鑰:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";這兩個函式庫都支援 .NET Framework 4.6.2+ 和 .NET Core/.NET 5+,使其相容於以 .NET 10 和 C# 14 為目標的現代 .NET 開發。
效能考量
IronPdf 的 Chromium 引擎在首次使用時會產生初始化成本(Chromium 啟動約需 1.5 秒)。 後續的渲染速度會明顯加快。 對於有延遲啟動需求的應用程式,在應用程式初始化時預熱渲染器可避免此延遲影響面向使用者的作業:
// Warm up at startup
new ChromePdfRenderer().RenderHtmlAsPdf("<html></html>");// Warm up at startup
new ChromePdfRenderer().RenderHtmlAsPdf("<html></html>");NReco.PdfGenerator 在產生 wkhtmltopdf 進程時也有初始化開銷,Plus 來自外部進程管理的持續記憶體開銷。
做出決定
在 NReco.PdfGenerator 和IronPDF之間的選擇取決於您的特定需求:
如果符合以下條件,請考慮使用 NReco.PdfGenerator:您現有的基於 wkhtmltopdf 的工作流程運行正常,安全掃描程式的結果在您的環境中可以接受,您不需要現代 CSS 或 JavaScript 功能,並且可以管理特定於平台的二進位部署。
如果符合以下條件,請考慮使用 IronPDF:安全合規性要求解決 wkhtmltopdf CVE;您的設計使用現代 CSS 功能,例如 Grid 或 Flexbox;您需要 Web 應用程式的 async/await 支援;您希望透過消除外部二進位檔案來簡化部署;或者您喜歡透明的許可和定價。
對於在 2025 年建立現代化 .NET 應用程式並規劃至 2026 年的團隊而言,IronPDF 積極維護的 Chromium 引擎提供了目前與未來網路標準相容的基礎。
開始使用 IronPdf
要評估IronPDF是否符合您的 PDF 生成需求:
1.安裝 IronPDF NuGet 套件:Install-Package IronPdf。 2.檢閱 HTML 至 PDF 教程,瞭解基本的轉換模式 3.探索URL轉換為PDF的網頁擷取功能 4.為專業文件配置 標頭和頁腳。
最後的想法
NReco.PdfGenerator 和IronPDF代表 PDF 生成技術的不同時代。 NReco.PdfGenerator 包覆了 wkhtmltopdf 的 2012 WebKit 引擎,同時延續其熟悉的 API 及其安全漏洞和渲染限制。 IronPdf 使用現代化的 Chromium 引擎,具有積極的維護、當前的網路標準支援以及 async 功能。
對於擔心安全合規性、現代 CSS/JavaScript 要求或部署複雜性的團隊而言,IronPDF 提供了一條前進的道路,而不會因放棄依賴性而造成技術債務。 轉換過程需要更新 API 呼叫和占位符語法,但不需要管理外部二進位檔案,並能解決記錄在案的安全漏洞。
根據您對於安全性、呈現保真度、同步支援和部署簡易性的特定需求,評估這兩個選項。 了解本比較中概述的架構差異,將有助於您做出符合 PDF 生成需求和現代化目標的明智決策。