比较

NReco.PdfGenerator 与 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)Chromium (当前)
安全性20 多个 CVE,已放弃主动安全更新
CSS支持CSS2.1, 有限 CSS3完全 CSS3、网格、Flexbox
JavaScript语言基本 ES5完整的 ES6+
依赖关系外部 wkhtmltopdf 二进制文件自成一体
支持同步仅同步完整的异步/等待
网络字体有限的完整的谷歌字体,@font-face
免费试用带水印全部功能
定价透明度不透明,请联系销售出版定价

NReco.PdfGenerator 继承了 wkhtmltopdf 的所有安全漏洞,包括已记录的服务器端请求伪造 CVE、本地文件读取漏洞和潜在的远程代码执行。 由于 wkhtmltopdf 已于 2020 年废弃,因此没有针对这些问题的补丁。

IronPdf 的 Chromium 引擎支持当前的 Web 标准,支持现代 CSS 功能,如网格和 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 对象还提供对 BinaryDataStream 的访问,前者用于字节数组访问,后者用于基于流的操作。

对于熟悉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,输出)</代码<代码>RenderUrlAsPdf(url)</代码
<代码>GeneratePdfFromFile(path,output)</代码<代码>RenderHtmlFileAsPdf(path)</代码
(不支持)<代码>RenderHtmlAsPdfAsync(html)</代码

配置属性映射

NReco.PdfGeneratorIronPDF
<代码>Orientation = PageOrientation.Landscape</ 代码<代码>RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape</ 代码
<代码>大小 = 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.PdfGeneratorIronPDF翻译目的
<代码>[页面]</代码{page}当前页码
<代码>[topage]</代码<代码>{总页数}</代码总页数
<代码>[日期]</代码<代码>{日期}</代码当前日期
<代码>[时间]</代码<代码>{时间}</代码当前时间
<代码>[标题]</代码<代码>{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);
$vbLabelText   $csharpLabel

异步支持比较

现代网络应用程序受益于不阻塞线程的异步操作。 这对于处理并发请求的 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 thread
$vbLabelText   $csharpLabel

IronPdf 支持完整的异步/等待模式:

//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 软件包的形式自成一体:

#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
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

Plus 特定平台的 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

在启动 wkhtmltopdf 进程时,NReco.PdfGenerator 也有初始化开销,另外还有外部进程管理带来的持续内存开销。

做出决定

在 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.为专业文档配置页眉和页脚

IronPDF 教程为常见场景提供了全面的示例,API 参考记录了所有可用的类和方法。

最终思考

NReco.PdfGenerator 和IronPDF代表了 PDF 生成技术的不同时代。 NReco.PdfGenerator 封装了 wkhtmltopdf 的 2012 WebKit 引擎,既继承了其熟悉的 API,也保留了其安全漏洞和渲染限制。 IronPdf 使用现代 Chromium 引擎,具有主动维护、当前网络标准支持和异步功能。

对于担心安全合规性、现代 CSS/JavaScript 要求或部署复杂性的团队来说,IronPDF 提供了一条前进的道路,而不会因放弃依赖关系而产生技术债务。 转换过程需要更新 API 调用和占位符语法,但无需管理外部二进制文件,还能解决记录在案的安全漏洞。

根据您对安全态势、渲染保真度、异步支持和部署简易性的具体要求,评估这两个选项。 了解本比较中概述的架构差异将有助于您根据 PDF 生成需求和现代化目标做出明智的决定。