比較

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.PdfGeneratorIronPDF
渲染引擎WebKit Qt (2012)鉻(當前)
安全20多個CVE,已放棄主動安全性更新
CSS 支援CSS2.1,有限的 CSS3完整的 CSS3、Grid 和 Flexbox 框架
JavaScriptES5 基礎完整的 ES6+
依賴關係外部 wkhtmltopdf 二進位文件自給自足
非同步支援僅同步完全異步/等待
網頁字體有限的完整的 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);
    }
}
$vbLabelText   $csharpLabel

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");
    }
}
$vbLabelText   $csharpLabel

這兩個函式庫都只需要極少的程式碼即可實現基本轉換。 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);
    }
}
$vbLabelText   $csharpLabel

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");
    }
}
$vbLabelText   $csharpLabel

NReco.PdfGenerator 對檔案路徑和 URL 都使用 GeneratePdfFromFile(),這在語義上可能會造成混淆。 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);
    }
}
$vbLabelText   $csharpLabel

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");
    }
}
$vbLabelText   $csharpLabel

NReco.PdfGenerator 需要以毫米為單位指定頁面尺寸(A4 為 210×297),並使用 PageMargins 物件。 IronPDF使用 PdfPaperSize 枚舉表示標準尺寸,並透過 RenderingOptions 提供單獨的邊距屬性。 RenderingOptions類別集中管理所有頁面配置,使用戶可以透過 IDE 自動完成功能發現設定。

API對應參考

對於考慮將 NReco.PdfGenerator 遷移到IronPDF 的團隊來說,了解 API 映射有助於估算工作量並規劃過渡。

核心方法映射

NReco.PdfGeneratorIronPDF
new HtmlToPdfConverter()new ChromePdfRenderer()
GeneratePdf(html)RenderHtmlAsPdf(html)
GeneratePdfFromFile(url, output)RenderUrlAsPdf(url)
GeneratePdfFromFile(path, output)RenderHtmlFileAsPdf(path)
(不支持)RenderHtmlAsPdfAsync(html)

配置屬性映射

NReco.PdfGeneratorIronPDF
Orientation = PageOrientation.LandscapeRenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape
Size = PageSize.A4RenderingOptions.PaperSize = PdfPaperSize.A4
Margins.Top = 10RenderingOptions.MarginTop = 10
Zoom = 0.9fRenderingOptions.Zoom = 90
PageHeaderHtml = "..."RenderingOptions.HtmlHeader
PageFooterHtml = "..."RenderingOptions.HtmlFooter

佔位符語法差異

頁首和頁尾通常包含動態內容,例如頁碼。 不同函式庫的佔位符語法有所不同:

NReco.PdfGeneratorIronPDF目的
[page]{page}目前頁碼
[topage]{total-pages}總頁數
[date]{date}目前日期
[time]{time}目前時間
[title]{html-title}文件標題
[webpage]{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);
$vbLabelText   $csharpLabel

非同步支援比較

現代 Web 應用程式受益於不會阻塞執行緒的非同步操作。 這對於處理並發請求的ASP.NET Core應用程式尤其重要。

NReco.PdfGenerator 僅提供同步操作,這可能會在 PDF 生成期間阻塞 Web 伺服器執行緒:

// NReco.PdfGenerator - synchronous only
var pdfBytes = converter.GeneratePdf(html);  // Blocks thread
// NReco.PdfGenerator - synchronous only
var pdfBytes = converter.GeneratePdf(html);  // Blocks thread
$vbLabelText   $csharpLabel

IronPDF完全支援 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");
$vbLabelText   $csharpLabel

對於響應 HTTP 請求生成 PDF 的應用程序,IronPDF 的非同步支援透過在渲染過程中釋放線程來提高可擴展性。

依賴關係和部署差異

NReco.PdfGenerator 需要係統上存在 wkhtmltopdf 二進位。 這會帶來部署方面的挑戰:

  • 必須管理特定於平台的二進位(Windows .exe、Linux .so、macOS .dylib) Docker 映像需要安裝 wkhtmltopdf CI/CD 管線需要二進位設定步驟 安全掃描器會標記已知的 CVE。

IronPDF是一個獨立的NuGet套件:

# IronPDF installation - complete
dotnet add package IronPdf

# NReco.PdfGenerator installation - plus binary management
dotnet add package NReco.PdfGenerator
# Plus: install wkhtmltopdf per platform
# IronPDF installation - complete
dotnet add package IronPdf

# NReco.PdfGenerator installation - plus binary management
dotnet add package NReco.PdfGenerator
# Plus: install wkhtmltopdf per platform
SHELL

從 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.PdfGenerator
Install-Package NReco.PdfGenerator
SHELL

此外,還提供針對特定平台的 wkhtmltopdf 二進位檔案的安裝和管理。

IronPDF安裝:

Install-Package IronPdf
Install-Package IronPdf
SHELL

IronPDF需要在應用程式啟動時配置許可證密鑰:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
$vbLabelText   $csharpLabel

這兩個函式庫都支援.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>");
$vbLabelText   $csharpLabel

NReco.PdfGenerator 在啟動 wkhtmltopdf 進程時也有初始化開銷,此外還有來自外部進程管理的持續記憶體開銷。

做出決定

NReco.PdfGenerator 和IronPDF之間的選擇取決於您的特定需求:

如果符合以下條件,請考慮使用 NReco.PdfGenerator:您現有的基於 wkhtmltopdf 的工作流程運行正常,安全掃描程式的結果在您的環境中可以接受,您不需要現代 CSS 或JavaScript功能,並且可以管理特定於平台的二進位部署。

如果符合以下條件,請考慮使用IronPDF :安全合規性要求解決 wkhtmltopdf CVE;您的設計使用現代 CSS 功能,如 Grid 或 Flexbox;您需要 Web 應用程式的 async/await 支援;您希望透過消除外部二進位檔案來部署;或者您喜歡簡化透明的許可和定價。

對於在 2025 年建立現代.NET應用程式並計劃在 2026 年開發的團隊而言,IronPDF 積極維護的 Chromium 引擎為當前和未來的 Web 標準相容性提供了基礎。

IronPDF入門指南

要評估IronPDF是否滿足您的 PDF 生成需求:

  1. 安裝IronPDF NuGet套件Install-Package IronPdf
  2. 查看HTML 轉 PDF 教學課程,了解基本轉換模式
  3. 探索網頁擷取的URL 轉 PDF 轉換方法
  4. 為專業文件設定頁首和頁尾

IronPDF教學提供了一個常見情境的全面範例, API 參考文件則記錄了所有可用的類別和方法。

最後想說的話

NReco.PdfGenerator 和IronPDF代表了 PDF 生成技術的不同時代。 NReco.PdfGenerator 封裝了 wkhtmltopdf 的 2012 WebKit 引擎,既保留了其熟悉的 API,也保留了其安全漏洞和渲染限制。 IronPDF使用具有積極維護、當前 Web 標準支援和非同步功能的現代 Chromium 引擎。

對於專注於安全合規性、現代 CSS/ JavaScript要求或部署複雜性的團隊而言, IronPDF提供了一條前進的道路,而無需承擔被遺棄的依賴項所帶來的技術債。 此次過渡需要更新 API 呼叫和占位符語法,但消除了管理外部二進位檔案的需要,並解決了已記錄的安全漏洞。

根據您對安全性、渲染保真度、非同步支援和部署簡易性的具體要求,評估這兩個選項。 了解本對比中概述的架構差異將有助於您做出明智的決定,以滿足您的 PDF 生成需求和現代化目標。