比较
NReco.PdfGenerator 与 IronPDF:技术比较指南
已更新:
NReco.PdfGenerator 与 IronPDF:wkhtmltopdf Wrapper 与现代 Chromium 引擎的比较。
当.NET 开发人员需要将 HTML 内容转换为 PDF 文档时,他们经常会遇到 NReco.PdfGenerator--一种流行的 wkhtmltopdf 二进制封装。 然而,底层技术存在严重的安全性和兼容性问题,导致许多团队不得不评估IronPDF等替代品。 本比较在关键技术方面对这两个库进行了研究,以帮助开发人员、架构师和技术决策者选择适合其 PDF 生成工作流程的工具。
什么是 NReco.PdfGenerator? NReco.PdfGenerator 是一个 C# 库,旨在通过封装 wkhtmltopdf 命令行工具将 HTML 文档转换为 PDF。 该库通过其 `HtmlToPdfConverter` 类提供了一个熟悉的 API,该类在内部调用 wkhtmltopdf 来执行实际渲染。 wkhtmltopdf 工具使用 WebKit Qt 作为其渲染引擎--WebKit 的版本可追溯到大约 2012 年。虽然这种方法已被广泛采用,但 wkhtmltopdf 的开发已于 2020 年停止,这意味着没有进一步的安全补丁或功能更新。 这种依赖性给使用当前 CSS 和 JavaScript 要求构建现代应用程序的团队带来了挑战。 免费版本的 NReco.PdfGenerator 可在生成的 PDF 上添加水印,生产使用需要商业许可。 商业许可证的定价需要联系销售人员,这可能会使采购流程复杂化。什么是 IronPDF? [IronPDF](https://ironpdf.com/) 是一个 .NET 库,它使用基于 Chromium 的现代渲染引擎将 HTML、CSS 和 JavaScript 转换为 PDF 文档。 [ChromePdfRenderer](https://ironpdf.com/object-reference/api/IronPdf.ChromePdfRenderer.html) 类为 HTML 到IronPDF的转换提供了主要接口,并通过 `RenderingOptions` 属性提供了大量配置选项。 与 wkhtmltopdf 封装程序不同,IronPDF 的渲染引擎会定期接受安全和兼容性方面的更新。 该库是自包含的,无需跨不同平台管理外部二进制依赖性。 IronPDF 提供具有完整功能(无水印)的试用期,允许团队在购买前对功能进行评估。 商业许可使用公开、透明的定价。 ## 渲染引擎比较 这些库的根本区别在于它们的渲染引擎。 这种区别会影响到从安全态势到 CSS 兼容性等各个方面。 |方面| NReco.PdfGenerator |IronPDF| |--------|-------------------|---------| |**渲染引擎**|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 方法:** ```csharp // NuGet: Install-Package NReco.PdfGenerator using NReco.PdfGenerator; using System.IO; class Program { static void Main() { var htmlToPdf = new HtmlToPdfConverter(); var htmlContent = "Hello World
Hello World
This is a PDF document.
"; var pdfBytes = htmlToPdf.GeneratePdf(htmlContent); File.WriteAllBytes("output.pdf", pdfBytes); } } ``` **IronPdf 方法:** ```csharp // NuGet: Install-Package IronPdf using IronPdf; using System.IO; class Program { static void Main() { var renderer = new ChromePdfRenderer(); var htmlContent = "Hello World
This is a PDF document.
"; var pdf = renderer.RenderHtmlAsPdf(htmlContent); pdf.SaveAs("output.pdf"); } } ``` 这两个库都需要最少的代码进行基本转换。 NReco.PdfGenerator 返回一个 `byte[]` 数组,需要手动进行文件操作,而IronPDF返回一个 `PdfDocument` 对象,具有 `SaveAs()` 等便捷方法。 IronPdf 对象还提供对 `BinaryData` 和 `Stream` 的访问,前者用于字节数组访问,后者用于基于流的操作。 对于熟悉[HTML到PDF转换](https://ironpdf.com/how-to/html-file-to-pdf/)工作流程的开发人员来说,IronPDF的API将给人直观的感觉,同时提供基本转换之外的额外功能。 ## 将 URL 转换为 PDF. 将网页转换为 PDF 文档会显示出 API 在方法命名和语义方面的差异。 **NReco.PdfGenerator URL 转换:** ```csharp // 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 转换:** ```csharp // 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 对文件路径和 URL 均使用 `GeneratePdfFromFile()` 方法,这可能在语义上造成混淆。IronPDF提供了一个专门的 [RenderUrlAsPdf](https://ironpdf.com/how-to/url-to-pdf/) 方法,可清楚地指示正在执行的操作。 ## 自定义页面大小和页边距 专业文档通常需要特定的页面尺寸和页边距配置。 这两个库都以不同的配置模式支持这些定制。 **NReco.PdfGenerator页面配置:** ```csharp // 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 = "Custom Page Size
A4 size document with margins.
"; var pdfBytes = htmlToPdf.GeneratePdf(htmlContent); File.WriteAllBytes("custom-size.pdf", pdfBytes); } } ``` **IronPDF页面配置:** ```csharp // 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 = "Custom Page Size
A4 size document with margins.
"; var pdf = renderer.RenderHtmlAsPdf(htmlContent); pdf.SaveAs("custom-size.pdf"); } } ``` NReco.PdfGenerator 要求以毫米为单位指定页面尺寸(A4 为 210×297),并使用 `PageMargins` 对象。IronPDF对标准尺寸使用 `PdfPaperSize` 枚举,并通过 `RenderingOptions` 提供单独的页边距属性。 [RenderingOptions](https://ironpdf.com/how-to/html-headers-footers/) 类集中了所有页面配置,使设置可通过 IDE 自动完成发现。 ## API 映射参考 对于考虑将 NReco.PdfGenerator 移植到IronPDF的团队,了解 API 映射有助于估算工作量和规划过渡。 ### 核心方法映射 | NReco.PdfGenerator |IronPDF|备注| |-------------------|---------|-------| |<代码>new HtmlToPdfConverter()代码>new ChromePdfRenderer()GeneratePdf(html)RenderHtmlAsPdf(html)GeneratePdfFromFile(url,输出)RenderUrlAsPdf(url)GeneratePdfFromFile(path,output)RenderHtmlFileAsPdf(path)RenderHtmlAsPdfAsync(html)Orientation = PageOrientation.LandscapeRenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape大小 = PageSize.A4RenderingOptions.PaperSize = PdfPaperSize.A4Margins.Top = 10RenderingOptions.MarginTop = 10Zoom = 0.9fRenderingOptions.Zoom = 90PageHeaderHtml = "..."RenderingOptions.HtmlHeaderPageFooterHtml = "..."RenderingOptions.HtmlFooter[页面][topage]{总页数}[日期]{日期}[时间]{时间}[标题]{html-title}[网页]{url}