FO.NET與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+ CVEs,被放棄 | 活躍的安全更新 |
| CSS支援 | CSS2.1,有限的CSS3 | 完全支持CSS3,Grid,Flexbox |
| JavaScript | 基本的ES5 | 完整的ES6+ |
| 依賴性 | 外部wkhtmltopdf二進制文件 | 自包含 |
| Async 支援 | 僅同步 | 完整的async/await |
| Web 字體 | 有限 | 完整的Google字體,@font-face |
| 免費試用 | 有水印 | 完整功能 |
| 價格透明 | 不透明,聯絡銷售 | 發佈的價格 |
NReco.PdfGenerator繼承了wkhtmltopdf的所有安全漏洞,包括伺服器端請求偽造、本地文件讀取漏洞以及潛在的遠程程式碼執行的已記錄CVE。 由於wkhtmltopdf自2020年已經被放棄,這些問題沒有可用的補丁。
IronPDF的Chromium引擎提供了當前的網頁標準支持,啟用了Grid和Flexbox佈局、CSS變數和自定義屬性等現代CSS功能。 JavaScript執行支持包括async/await模式的ES6+語法。
基本的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);
}
}Imports NReco.PdfGenerator
Imports System.IO
Class Program
Shared Sub Main()
Dim htmlToPdf = New HtmlToPdfConverter()
Dim htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>"
Dim pdfBytes = htmlToPdf.GeneratePdf(htmlContent)
File.WriteAllBytes("output.pdf", pdfBytes)
End Sub
End ClassIronPDF 方法:
// 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");
}
}Imports IronPdf
Imports System.IO
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("output.pdf")
End Sub
End Class兩個程式庫都需要最少的程式碼以進行基本轉換。 NReco.PdfGenerator返回一個PdfDocument物件。 IronPDF物件還提供對於字節陣列存取的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);
}
}Imports NReco.PdfGenerator
Imports System.IO
Class Program
Shared Sub Main()
Dim htmlToPdf As New HtmlToPdfConverter()
Dim pdfBytes As Byte() = htmlToPdf.GeneratePdfFromFile("https://www.example.com", Nothing)
File.WriteAllBytes("webpage.pdf", pdfBytes)
End Sub
End ClassIronPDF 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");
}
}Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://www.example.com")
pdf.SaveAs("webpage.pdf")
End Sub
End ClassNReco.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);
}
}Imports NReco.PdfGenerator
Imports System.IO
Class Program
Shared Sub Main()
Dim htmlToPdf = New HtmlToPdfConverter()
htmlToPdf.PageWidth = 210
htmlToPdf.PageHeight = 297
htmlToPdf.Margins = New PageMargins With {.Top = 10, .Bottom = 10, .Left = 10, .Right = 10}
Dim htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>"
Dim pdfBytes = htmlToPdf.GeneratePdf(htmlContent)
File.WriteAllBytes("custom-size.pdf", pdfBytes)
End Sub
End ClassIronPDF頁面配置:
// 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");
}
}Imports IronPdf
Imports IronPdf.Rendering
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 10
renderer.RenderingOptions.MarginBottom = 10
renderer.RenderingOptions.MarginLeft = 10
renderer.RenderingOptions.MarginRight = 10
Dim htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
pdf.SaveAs("custom-size.pdf")
End Sub
End ClassNReco.PdfGenerator需要以毫米(210x297,A4)指定頁面尺寸並使用PageMargins物件。 IronPDF使用RenderingOptions提供各個邊距屬性。 RenderingOptions類集中所有頁面配置,通過IDE的自動補全使設置變得可發現。
API映射參考
對於考慮從NReco.PdfGenerator遷移到IronPDF的團隊來說,了解API映射有助於估計工作量並策劃過渡。
核心方法映射
| NReco.PdfGenerator | IronPDF |
|---|---|
new HtmlToPdfConverter() | new ChromePdfRenderer() |
GeneratePdf(html) | RenderHtmlAsPdf(html) |
GeneratePdfFromFile(url, output) | 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] | {total-pages} | 總頁數 |
[date] | {date} | 當前日期 |
[time] | {time} | 當前時間 |
[title] | {html-title} | 文件標題 |
[webpage] | {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);' NReco: Zoom = 0.75F means 75%
' IronPDF: Zoom = 75 means 75%
Dim ironPdfZoom As Integer = CInt(nrecoZoom * 100)異步支持比較
現代的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 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");Imports System.Threading.Tasks
' IronPDF - async support
Dim pdf = Await renderer.RenderHtmlAsPdfAsync(html) ' Non-blocking
Await pdf.SaveAsAsync("output.pdf")對於以回應HTTP請求生成PDF的應用程式,IronPDF的異步支持通過將資源執行緒在渲染過程中釋放來提高可擴展性。
依賴關係和部署差異
NReco.PdfGenerator要求系統上提供wkhtmltopdf二進制文件。 這產生了部署挑戰:
- 必須管理平台專用的二進制文件(Windows .exe、Linux .so、macOS .dylib)
- Docker映像需要安裝wkhtmltopdf
- 持續整合/持續部署流水線需要二進制供應步驟
- 安全掃描器標記了已知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二進制文件跨開發、預備和生產環境增加了運營複雜性。 團隊尋找簡化持續配管的自包含解決方案。
價格透明性:預算規劃要求可預測的費用。 NReco.PdfGenerator的不透明定價(聯絡銷售)複雜化了採購,而IronPDF的公佈價格使得預算編制直接明了。
安裝比較
NReco.PdfGenerator安裝:
Install-Package NReco.PdfGeneratorInstall-Package NReco.PdfGenerator加上平台專用的wkhtmltopdf二進制文件安裝和管理。
IronPDF安裝:
IronPDF在應用程式啟動時需要進行授權金鑰配置:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";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>");Dim renderer As New ChromePdfRenderer()
renderer.RenderHtmlAsPdf("<html></html>")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引擎提供了一個對當前和未來網頁標準的支持的基礎。
IronPDF入門
要評估您的 PDF 生成需求的 IronPDF:
1.安裝IronPDF NuGet包:Install-Package IronPdf
- 查看HTML到PDF教程以獲取基本轉換模式
- 探索URL到PDF轉換以捕捉網頁
- 為專業文件配置頁眉和頁腳
最終考量
NReco.PdfGenerator和IronPDF代表了PDF生成技術的不同時代。 NReco.PdfGenerator包裝了wkhtmltopdf的2012年WebKit引擎,沿用其熟悉的API,也在推進其安全漏洞和渲染限制。 IronPDF使用一個有活躍維護的現代Chromium引擎,支持現代網頁標準,並提供異步功能。
對於關注安全合規性、現代CSS/JavaScript要求或部署複雜性的團隊來說,IronPDF提供了一條不帶放棄依賴的技術負債的前進道路。 過渡需要更新API調用和佔位符語法,但消除了管理外部二進制文件的需要,並處理了已記錄的安全漏洞。
根據您的安全狀態、渲染保真度、異步支持和部署簡單性的具體需求評估兩個選擇。 理解本比較中所描繪的架構差異將幫助您做出符合您PDF生成需要和現代化目標的明智決策。
