比较

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对象还提供了对 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}源 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的转换,用于网页抓取
  2. 为专业文档配置页眉和页脚

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

最终思考

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

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

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