HiQPdf 与 IronPDF:技术比较指南
HiQPdfvs IronPDF:渲染引擎、API 设计和现代 .NET 兼容性。
当 .NET 开发人员评估 HTML 转 PDF 解决方案时,HiQPdf 成为基于 WebKit 渲染的商业库。 虽然HiQPdf支持 HTML5/CSS3,但其较老的 WebKit 引擎在处理现代 JavaScript 框架时可能会很吃力,而且免费版本有 3 页的限制,并带有干扰性水印。IronPDFfor .NET 提供了一种与众不同的方法:基于 Chromium 的现代渲染引擎,完全支持 JavaScript,并在所有 .NET 平台上提供统一的软件包。
本比较从技术相关的维度对这两个库进行了研究,以帮助专业开发人员和架构师针对其 .NET PDF 需求做出明智的决定。
了解 HiQPdf.
HiQPdf 是一个商业 HTML 转 PDF 库,使用基于 WebKit 的渲染引擎。该库使用<代码>HtmlToPdf</代码作为其主要转换器类,并使用 ConvertHtmlToMemory() 和 ConvertUrlToMemory() 等方法返回原始 byte[] 数据。 配置通过 Document 对象上的属性链进行处理,包括 Document.Header, Document.Footer 和 Document.PageSize.
HiQPdf 的免费版本有一个很大的限制--PDF 输出最多只能有 3 页,而且还有一个侵入式水印。 这使得在评估过程中很难对较大的文档进行全面测试。 该库针对不同平台使用了多个 NuGet 包变体(HiQPdf、HiQPdf.Free、HiQPdf.NetCore、HiQPdf.NetCore.x64、HiQPdf.Client),文档中没有明确说明对 .NET Core 或 .NET 5+ 的支持。
对于页眉和页脚,HiQPdf 使用添加到 Document.Header 和 Document.Footer 集合中的<代码>HtmlToPdfVariableElement</代码对象。 页码占位符使用语法<代码>{CrtPage}</代码表示当前页,{PageCount} 表示总页数。
了解IronPDF
IronPDF 是一个 .NET PDF 库,使用现代 Chromium 渲染引擎,提供对 HTML5、CSS3 和 JavaScript 框架(包括 React、Angular 和 Vue)的全面支持。 该库使用<代码>ChromePdfRenderer</代码作为其主要呈现类,并使用 RenderHtmlAsPdf() 和 RenderUrlAsPdf() 等方法返回<代码>PDF 文档</代码对象。
IronPDF 为所有平台提供了一个统一的 NuGet 包,并记录了 .NET 6、7、8、9 和 10 的兼容性。配置直接在呈现器上使用<代码>渲染选项</代码属性。 页眉和页脚可以使用带有 CenterText 和 FontSize 等属性的 TextHeaderFooter 。 页码占位符使用{page}和<代码>{总页数}</代码语法。
呈现引擎和兼容性对比
这些库的根本区别在于它们的渲染引擎和平台支持。
| 方面 | HiQPdf | IronPDF |
|---|---|---|
| 渲染引擎 | 基于 WebKit(较旧) | 现代 Chromium |
| 免费级别 | 3 页限制 + 水印 | 30 天全面试用 |
| 现代 JS 支持 | 有限的 | 完整(React、Angular、Vue) |
| .NET Core/5+ 支持。 | 需要多个软件包 | 单一的统一软件包 |
| API 设计 | 复杂的属性链 | 简洁流畅的 API |
| CSS3 支持。 | 部分翻译 | 全面支持 |
| 文档 | 支离破碎 | 综合性 |
| NuGet软件包 | 多种变体 | 单个软件包 |
HiQPdf 基于 WebKit 的引擎是一种较老的技术,在使用现代 JavaScript 框架和复杂 HTML 结构时可能会遇到困难。 IronPdf 的 Chrome 引擎可提供与 Google Chrome 浏览器相同的渲染质量,确保现代网络内容的准确转换。
代码比较:常见的 PDF 操作
HTML 和 URL 到 PDF 的转换
最基本的操作展示了 API 设计的差异。
HiQPdf:
// NuGet: Install-Package HiQPdf
using HiQPdf;
using System;
class Program
{
static void Main()
{
HtmlToPdf htmlToPdfConverter = new HtmlToPdf();
byte[] pdfBuffer = htmlToPdfConverter.ConvertUrlToMemory("https://example.com");
System.IO.File.WriteAllBytes("output.pdf", pdfBuffer);
// Convert HTML string
string html = "<h1>Hello World</h1><p>This is a PDF document.</p>";
byte[] pdfFromHtml = htmlToPdfConverter.ConvertHtmlToMemory(html, "");
System.IO.File.WriteAllBytes("fromhtml.pdf", pdfFromHtml);
}
}// NuGet: Install-Package HiQPdf
using HiQPdf;
using System;
class Program
{
static void Main()
{
HtmlToPdf htmlToPdfConverter = new HtmlToPdf();
byte[] pdfBuffer = htmlToPdfConverter.ConvertUrlToMemory("https://example.com");
System.IO.File.WriteAllBytes("output.pdf", pdfBuffer);
// Convert HTML string
string html = "<h1>Hello World</h1><p>This is a PDF document.</p>";
byte[] pdfFromHtml = htmlToPdfConverter.ConvertHtmlToMemory(html, "");
System.IO.File.WriteAllBytes("fromhtml.pdf", pdfFromHtml);
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://example.com");
pdf.SaveAs("output.pdf");
// Convert HTML string
string html = "<h1>Hello World</h1><p>This is a PDF document.</p>";
var pdfFromHtml = renderer.RenderHtmlAsPdf(html);
pdfFromHtml.SaveAs("fromhtml.pdf");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://example.com");
pdf.SaveAs("output.pdf");
// Convert HTML string
string html = "<h1>Hello World</h1><p>This is a PDF document.</p>";
var pdfFromHtml = renderer.RenderHtmlAsPdf(html);
pdfFromHtml.SaveAs("fromhtml.pdf");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comHiQPdf 创建一个<代码>HtmlToPdf</代码转换器,调用 ConvertUrlToMemory() 或 ConvertHtmlToMemory() 获取原始 byte[] 数据,然后使用 File.WriteAllBytes() 手动写入磁盘。 ConvertHtmlToMemory()方法要求第二个参数为基础 URL(如不需要,则为空字符串)。
IronPDF 创建一个<代码>ChromePdfRenderer</代码,调用 RenderUrlAsPdf() 或 RenderHtmlAsPdf() 获得一个<代码>PDF 文档</代码对象,然后直接使用 SaveAs() 保存。 API 采用面向对象的文档处理方式,更加简洁。
有关高级 HTML 渲染选项,请浏览 HTML 到 PDF 转换指南。
合并多个 PDF 文件
PDF 合并演示了不同的文档操作方法。
HiQPdf:
// NuGet: Install-Package HiQPdf
using HiQPdf;
using System;
class Program
{
static void Main()
{
// Create first PDF
HtmlToPdf converter1 = new HtmlToPdf();
byte[] pdf1 = converter1.ConvertHtmlToMemory("<h1>First Document</h1>", "");
System.IO.File.WriteAllBytes("doc1.pdf", pdf1);
// Create second PDF
HtmlToPdf converter2 = new HtmlToPdf();
byte[] pdf2 = converter2.ConvertHtmlToMemory("<h1>Second Document</h1>", "");
System.IO.File.WriteAllBytes("doc2.pdf", pdf2);
// Merge PDFs
PdfDocument document1 = PdfDocument.FromFile("doc1.pdf");
PdfDocument document2 = PdfDocument.FromFile("doc2.pdf");
document1.AddDocument(document2);
document1.WriteToFile("merged.pdf");
}
}// NuGet: Install-Package HiQPdf
using HiQPdf;
using System;
class Program
{
static void Main()
{
// Create first PDF
HtmlToPdf converter1 = new HtmlToPdf();
byte[] pdf1 = converter1.ConvertHtmlToMemory("<h1>First Document</h1>", "");
System.IO.File.WriteAllBytes("doc1.pdf", pdf1);
// Create second PDF
HtmlToPdf converter2 = new HtmlToPdf();
byte[] pdf2 = converter2.ConvertHtmlToMemory("<h1>Second Document</h1>", "");
System.IO.File.WriteAllBytes("doc2.pdf", pdf2);
// Merge PDFs
PdfDocument document1 = PdfDocument.FromFile("doc1.pdf");
PdfDocument document2 = PdfDocument.FromFile("doc2.pdf");
document1.AddDocument(document2);
document1.WriteToFile("merged.pdf");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
// Create first PDF
var pdf1 = renderer.RenderHtmlAsPdf("<h1>First Document</h1>");
pdf1.SaveAs("doc1.pdf");
// Create second PDF
var pdf2 = renderer.RenderHtmlAsPdf("<h1>Second Document</h1>");
pdf2.SaveAs("doc2.pdf");
// Merge PDFs
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
// Create first PDF
var pdf1 = renderer.RenderHtmlAsPdf("<h1>First Document</h1>");
pdf1.SaveAs("doc1.pdf");
// Create second PDF
var pdf2 = renderer.RenderHtmlAsPdf("<h1>Second Document</h1>");
pdf2.SaveAs("doc2.pdf");
// Merge PDFs
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comHiQPdf 需要先将 PDF 保存到磁盘,使用 PdfDocument.FromFile() 加载它们,然后使用 AddDocument() 将一个附加到另一个,最后使用 WriteToFile() 保存结果。 这是对第一份文件的修改。
IronPDF 可以使用静态 PdfDocument.Merge() 方法直接在内存中合并文档,该方法会返回一个新的合并文档。 这种方法更简洁,不需要中间文件 I/O。
带页码的页眉和页脚
页眉和页脚配置显示了动态内容的不同方法。
HiQPdf:
// NuGet: Install-Package HiQPdf
using HiQPdf;
using System;
class Program
{
static void Main()
{
HtmlToPdf htmlToPdfConverter = new HtmlToPdf();
// Add header
htmlToPdfConverter.Document.Header.Height = 50;
HtmlToPdfVariableElement headerHtml = new HtmlToPdfVariableElement("<div style='text-align:center'>Page Header</div>", "");
htmlToPdfConverter.Document.Header.Add(headerHtml);
// Add footer with page number
htmlToPdfConverter.Document.Footer.Height = 50;
HtmlToPdfVariableElement footerHtml = new HtmlToPdfVariableElement("<div style='text-align:center'>Page {CrtPage} of {PageCount}</div>", "");
htmlToPdfConverter.Document.Footer.Add(footerHtml);
byte[] pdfBuffer = htmlToPdfConverter.ConvertHtmlToMemory("<h1>Document with Headers and Footers</h1>", "");
System.IO.File.WriteAllBytes("header-footer.pdf", pdfBuffer);
}
}// NuGet: Install-Package HiQPdf
using HiQPdf;
using System;
class Program
{
static void Main()
{
HtmlToPdf htmlToPdfConverter = new HtmlToPdf();
// Add header
htmlToPdfConverter.Document.Header.Height = 50;
HtmlToPdfVariableElement headerHtml = new HtmlToPdfVariableElement("<div style='text-align:center'>Page Header</div>", "");
htmlToPdfConverter.Document.Header.Add(headerHtml);
// Add footer with page number
htmlToPdfConverter.Document.Footer.Height = 50;
HtmlToPdfVariableElement footerHtml = new HtmlToPdfVariableElement("<div style='text-align:center'>Page {CrtPage} of {PageCount}</div>", "");
htmlToPdfConverter.Document.Footer.Add(footerHtml);
byte[] pdfBuffer = htmlToPdfConverter.ConvertHtmlToMemory("<h1>Document with Headers and Footers</h1>", "");
System.IO.File.WriteAllBytes("header-footer.pdf", pdfBuffer);
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPDF:
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
// Configure header and footer
renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
{
CenterText = "Page Header",
FontSize = 12
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
{
CenterText = "Page {page} of {total-pages}",
FontSize = 10
};
var pdf = renderer.RenderHtmlAsPdf("<h1>Document with Headers and Footers</h1>");
pdf.SaveAs("header-footer.pdf");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
// Configure header and footer
renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
{
CenterText = "Page Header",
FontSize = 12
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
{
CenterText = "Page {page} of {total-pages}",
FontSize = 10
};
var pdf = renderer.RenderHtmlAsPdf("<h1>Document with Headers and Footers</h1>");
pdf.SaveAs("header-footer.pdf");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comHiQPdf 通过 Document.Header 和 Document.Footer 属性配置页眉和页脚,设置 Height 和添加<代码>HtmlToPdfVariableElement</代码对象。 页码占位符使用<代码>{CrtPage}</代码表示当前页,使用<代码>{页数}</代码表示总页数。
IronPdf 使用 RenderingOptions.TextHeader 和 RenderingOptions.TextFooter 与 TextHeaderFooter 对象。 CenterText 和 FontSize 等属性提供了直接配置。 页码占位符使用{page}和 {total-pages}。
在 IronPDF 教程中了解有关页眉和页脚配置的更多信息。
API 映射参考
对于评估HiQPdf迁移或比较功能的开发人员,该映射显示了等价操作:
主类映射
| HiQPdf 类 | IronPdf 类 | 备注 |
|---|---|---|
| <代码>HtmlToPdf</代码 | <代码>ChromePdfRenderer</代码 | 主转换器类 |
| <代码>PDF 文档</代码 | <代码>PDF 文档</代码 | 名称相同,命名空间不同 |
| <代码>PDF 页</代码 | <代码>pdf.Pages[i]</代码 | 通过索引器访问 |
| <代码>PDFDocumentControl</代码 | <代码>渲染选项</代码 | 配置 |
PdfHeader / PdfDocumentHeader | <代码>HtmlHeaderFooter</代码 | 页眉配置 |
PdfFooter / PdfDocumentFooter | <代码>HtmlHeaderFooter</代码 | 页脚配置 |
| <代码>HtmlToPdfVariableElement</代码 | <代码>HtmlHeaderFooter.HtmlFragment</代码 | 页眉/页脚中的 HTML |
转换方法映射
| HiQPdf 方法 | IronPdf 方法 | 备注 |
|---|---|---|
| <代码>ConvertHtmlToMemory(html,baseUrl)</代码 | <代码>RenderHtmlAsPdf(html, baseUrl)</ 代码 | 返回 PdfDocument |
| <代码>ConvertUrlToMemory(url)</代码 | <代码>RenderUrlAsPdf(url)</代码 | 返回 PdfDocument |
| <代码>ConvertHtmlToFile(html, baseUrl, 路径)</代码 | <代码>RenderHtmlAsPdf(html).SaveAs(path)</代码 | 链式方法 |
| <代码>ConvertUrlToFile(url, 路径)</代码 | <代码>RenderUrlAsPdf(url).SaveAs(path)</代码 | 链式方法 |
属性映射
| HiQPdf 属性 | IronPdf 属性 | 备注 |
|---|---|---|
| <代码>浏览器宽度</代码 | <代码>RenderingOptions.ViewPortWidth</代码 | 像素 |
| <代码>浏览器高度</代码 | <代码>RenderingOptions.ViewPortHeight</代码 | 像素 |
| <代码>Document.PageSize</代码 | <代码>RenderingOptions.PaperSize</代码 | 使用枚举 |
| <代码>Document.PageOrientation</代码 | <代码>RenderingOptions.PaperOrientation</代码 | <代码>肖像</代码>/<代码>风景</代码 |
| <代码>Document.Margins.Top</代码 | <代码>RenderingOptions.MarginTop</代码 | 以毫米为单位(不是点数) |
| <代码>Document.Margins.Bottom</代码 | <代码>RenderingOptions.MarginBottom</代码 | 毫米 |
| <代码>Document.Margins.Left</代码 | <代码>RenderingOptions.MarginLeft</代码 | 毫米 |
| <代码>Document.Margins.Right</代码 | <代码>RenderingOptions.MarginRight</代码 | 毫米 |
| <代码>Document.Header.Height</代码 | <代码>HtmlHeader.MaxHeight</代码 | 页眉高度 |
| <代码>Document.Footer.Height</代码 | <代码>HtmlFooter.MaxHeight</代码 | 页脚高度 |
| <代码>序列号</代码 | <代码>IronPdf.License.LicenseKey</代码 | 全球设置 |
占位符语法映射
不同库的页眉和页脚占位符有所不同:
| HiQPdf | IronPDF |
|---|---|
| <代码>{CrtPage}</代码 | {page} |
| <代码>{页数}</代码 | <代码>{总页数}</代码 |
| <代码>{CrtPageUri}</代码 | <代码>{url}</代码 |
| <代码>{CrtPageTitle}</代码 | <代码>{html-title}</代码 |
功能对比摘要
| 特征 | HiQPdf | IronPDF |
|---|---|---|
| Chromium 渲染 | ❌ (WebKit) | ✅ |
| 现代 JavaScript(React、Angular、Vue) | ⚠️ 有限公司 | ✅ |
| 完全支持 CSS3 | ⚠️ 部分 | ✅ |
| 支持 .NET 6/7/8/9/10 | ⚠️ 文档不清晰 | ✅ |
| 单个 NuGet 软件包 | ❌(多种变体) | ✅ |
| 免费全面试用 | ❌(3 页限制 + 水印) | ✅(30 天) |
| HTML 至 PDF | ✅ | ✅ |
| URL 至 PDF | ✅ | ✅ |
| PDF 合并 | ✅ (AddDocument) | ✅(<代码>合并</代码) |
| 页眉/页脚 | ✅ (HtmlToPdfVariableElement) | ✅ (TextHeaderFooter) |
团队何时考虑从HiQPdf迁移到 IronPDF?
开发团队评估从HiQPdf过渡到IronPDF有几个原因:
限制性的免费版本:HiQPdf 的免费版本有 3 页的限制,并带有干扰性水印,因此基本上无法用于生产,也难以进行全面评估。IronPDF提供为期 30 天的全功能试用版,无页面限制。
较旧的 WebKit 引擎:HiQPdf 基于 WebKit 的渲染引擎在与 React、Angular 和 Vue 等现代 JavaScript 框架的竞争中举步维艰。IronPDF的 Chrome 引擎可提供与 Google Chrome 浏览器相同的渲染质量,确保复杂的现代网络内容的准确转换。
不明确的 .NET Core 支持:HiQPdf 文档没有明确说明 .NET Core 或 .NET 5+ 支持,并且该库需要针对不同平台的独立 NuGet 包。IronPDF提供了一个统一的软件包,以文档形式支持 .NET 6、7、8、9 和 10。
碎片化的 NuGet 软件包:HiQPdf 需要不同的软件包变体(HiQPdf、HiQPdf.Free、HiQPdf.NetCore、HiQPdf.NetCore.x64、HiQPdf.Client)以适用于不同的场景。 IronPdf 在所有平台上使用单一软件包。
复杂的 API 设计:HiQPdf 需要通过<代码>Document.Header.Height</代码和 Document.Footer.Add() 等属性链进行冗长的配置。IronPDF的流畅 API 与<代码>渲染选项</代码属性提供了更简洁的配置。
不同的占位符语法:HiQPdf 使用<代码>{CrtPage}</代码和<代码>{页数}</代码占位符,而 IronPdf 使用{page}和<代码>{总页数}</代码占位符。 迁移需要更新所有页眉/页脚模板。
优势和考虑因素
HiQPdf的优势
- HTML5/CSS3 支持:提供 HTML5 和 CSS3 渲染功能
- 成熟的图书馆:拥有现有用户群的商业库
HiQPdf注意事项
- WebKit 引擎:较旧的呈现技术,对现代 JavaScript 的支持有限
- 3页限制:免费版本受到很大限制
- 碎片化软件包:适用于不同平台的多个 NuGet 软件包
- 不明确的 .NET 支持:文档没有明确说明现代 .NET 兼容性
- 复杂的属性链:通过嵌套属性进行繁琐配置
- 基于点的单位:使用点(每英寸 72 点)进行测量
IronPDF的优势
IronPDF注意事项
- 商业许可:生产使用要求
- 毫米单位:使用毫米而不是点来表示页边距
结论
HiQPdf 和IronPDF代表了 .NET 应用程序中 HTML 转 PDF 技术的不同时代。HiQPdf基于 WebKit 的引擎提供基本的 HTML5/CSS3 支持,但在与现代 JavaScript 框架的配合上却很吃力,而且与多个零散软件包的 .NET Core 兼容性也不明确。 免费版的 3 页限制极大地限制了评估。
IronPdf 提供了基于 Chromium 的现代替代方案,为 React、Angular 和 Vue 应用程序提供全面的 JavaScript 支持。 统一的 NuGet 软件包支持 .NET 6/7/8/9/10,简化了部署,简洁的 API 设计降低了配置的复杂性。
随着企业对.NET 10、C# 14 以及 2026 年之前的应用程序开发进行规划,在带有零散软件包的旧式 WebKit 渲染和带有统一支持的现代 Chromium 渲染之间做出选择,会对开发速度和输出质量产生重大影响。 需要现代 JavaScript 框架支持、明确的 .NET 兼容性或简化软件包管理的团队会发现IronPDFfor .NET 能有效满足这些要求。