HiQPdf vs IronPDF:技術比較指南
當.NET開發人員評估 HTML 轉 PDF 解決方案時,HiQPdf 因其採用基於 WebKit 的渲染技術而脫穎而出,成為一個商業庫。 雖然 HiQPdf 支援 HTML5/CSS3,但其較舊的 WebKit 引擎可能難以相容於現代JavaScript框架,而且免費版本僅限 3 頁,並帶有明顯的浮水印。 相較之下, IronPDF使用基於 Chromium 的現代渲染引擎,提供完整的JavaScript支持,並在所有.NET平台上提供統一的軟體包。
此比較從相關技術方面對這兩個庫進行評估,以幫助專業開發人員和架構師根據其.NET PDF 需求做出明智的決策。
HiQPDF概述
HiQPdf 是一個商業的 HTML 轉 PDF 函式庫,它採用基於 WebKit 的渲染引擎。本庫的主要轉換器類別 HtmlToPdf 包含諸如 ConvertHtmlToMemory() 和 ConvertUrlToMemory() 之類的方法,這些方法傳回原始 byte[] 資料。 配置是透過 Document 物件上的屬性鏈來管理的,例如 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() 之類的方法,這些方法傳回 PdfDocument 物件。
IronPDF為所有平台提供了一個統一的NuGet包,並已記錄其與.NET 6、7、8、9 和 10 的兼容性。配置直接在渲染器上使用 RenderingOptions 屬性。 頁首和頁尾可使用 TextHeaderFooter,並帶有 CenterText 和 FontSize 等屬性。 頁碼佔位符使用 {page} 和 {total-pages} 語法。
渲染引擎及相容性比較
這些庫之間的根本區別在於它們的渲染引擎和平台支援。
| 方面 | HiQPdf | IronPDF |
|---|---|---|
| 渲染引擎 | 基於 WebKit 的(舊版) | 現代鉻 |
| 免費套餐 | 3頁限制 + 浮水印 | 30 天完整試用期 |
| 現代 JS 支持 | 有限的 | 完整(React、Angular、Vue) |
| .NET Core/5+ 支持 | 需要多個包裹 | 單一統一包裝 |
| API設計 | 複雜的產權鏈 | 簡潔流暢的 API |
| CSS3 支持 | 部分的 | 支援 |
| 文件 | 碎片化的 | 徹底 |
| NuGet套件 | 多種變體 | 單包裝 |
HiQPdf 基於 WebKit 的引擎是較老的技術,在處理現代JavaScript框架和複雜的 HTML 結構時可能會遇到挑戰。 IronPDF 的 Chromium 引擎提供與 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);
}
}IronPDF:
// 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");
}
}HiQPdf 建立一個 HtmlToPdf 轉換器,呼叫 ConvertUrlToMemory() 或 ConvertHtmlToMemory() 來取得原始 byte[] 數據,然後使用 File.WriteAllBytes() 手動寫入磁碟。 ConvertHtmlToMemory() 方法需要一個基本 URL 的第二個參數(如果不需要,則為空字串)。
IronPDF建立一個 ChromePdfRenderer,呼叫 RenderUrlAsPdf() 或 RenderHtmlAsPdf() 來取得一個 PdfDocument 對象,然後直接使用 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");
}
}IronPDF:
// 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");
}
}HiQPdf 要求先將 PDF 儲存到磁碟,然後使用 PdfDocument.FromFile() 載入它們,再使用 AddDocument() 將一個 PDF 追加到另一個 PDF 中,最後使用 WriteToFile() 儲存結果。 這將修改原有的第一個文件。
IronPDF可以使用靜態方法直接在記憶體中合併文檔,該方法會傳回一個新的合併文檔。 這種方法更簡潔,不需要中間檔案 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);
}
}IronPDF:
// 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");
}
}HiQPdf 透過 Document.Header 和 Document.Footer 屬性配置頁首和頁腳,設定 Height 並新增 HtmlToPdfVariableElement 物件。 頁碼佔位符使用 {CrtPage} 表示目前頁碼,使用 {PageCount} 表示總頁碼。
IronPDF使用 RenderingOptions.TextHeader 和 RenderingOptions.TextFooter 和 TextHeaderFooter 物件。 屬性如 CenterText 和 FontSize 提供直接配置。 頁碼佔位符使用 {page} 和 {total-pages}。
請在IronPDF教學中了解更多關於頁首和頁尾配置的資訊。
API對應參考
對於正在評估 HiQPdf 遷移或比較功能的開發人員來說,此映射顯示了等效操作:
主類別映射
| HiQPdf 類 | IronPDF類 |
|---|---|
HtmlToPdf | ChromePdfRenderer |
PdfDocument | PdfDocument |
PdfPage | pdf.Pages[i] |
PdfDocumentControl | RenderingOptions |
PdfHeader / PdfDocumentHeader | HtmlHeaderFooter |
PdfFooter / PdfDocumentFooter | HtmlHeaderFooter |
HtmlToPdfVariableElement | HtmlHeaderFooter.HtmlFragment |
轉換方法映射
| HiQPdf 方法 | IronPDF方法 |
|---|---|
ConvertHtmlToMemory(html, baseUrl) | RenderHtmlAsPdf(html, baseUrl) |
ConvertUrlToMemory(url) | RenderUrlAsPdf(url) |
ConvertHtmlToFile(html, baseUrl, path) | RenderHtmlAsPdf(html).SaveAs(path) |
ConvertUrlToFile(url, path) | RenderUrlAsPdf(url).SaveAs(path) |
屬性映射
| HiQPdf屬性 | IronPDF屬性 |
|---|---|
BrowserWidth | RenderingOptions.ViewPortWidth |
BrowserHeight | 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 |
SerialNumber | IronPdf.License.LicenseKey |
佔位符語法映射
不同庫的頁首和頁尾佔位符有所不同:
| HiQPdf | IronPDF |
|---|---|
{CrtPage} | {page} |
{PageCount} | {total-pages} |
{CrtPageUri} | {url} |
{CrtPageTitle} | {html-title} |
功能對比總結
| 特徵 | HiQPdf | IronPDF |
|---|---|---|
| 鉻渲染 | ❌(WebKit) | ✅ |
| 現代JavaScript (React、Angular、Vue) | ⚠️ 有限 | ✅ |
| 完全支援 CSS3 | ⚠️部分 | ✅ |
| 支援.NET 6/7/8/9/10 | ⚠️ 檔不清晰 | ✅ |
| 單一NuGet包 | ❌(多種變體) | ✅ |
| 免費完整試用 | ❌(限3頁+浮水印) | ✅(30天) |
| HTML 轉 PDF | ✅ | ✅ |
| PDF檔案的URL | ✅ | ✅ |
| PDF合併 | ✅ (AddDocument) | ✅ (Merge) |
| 頁首/頁尾 | ✅ (HtmlToPdfVariableElement) | ✅ (TextHeaderFooter) |
當團隊考慮從 HiQPDF 遷移到IronPDF時
開發團隊基於以下幾個原因評估從 HiQPDF 過渡到IronPDF :
免費版限制過多: HiQPdf 的免費版限制為 3 頁,並帶有明顯的水印,使其基本上無法用於生產,也難以進行徹底評估。 IronPDF提供 30 天全功能試用,不限頁數。
舊版 WebKit 引擎: HiQPdf 基於 WebKit 的渲染引擎難以處理 React、Angular 和 Vue 等現代JavaScript框架。 IronPDF 的 Chromium 引擎提供與 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 的 fluent API 具有 RenderingOptions 屬性,提供了更清晰的配置。
不同的佔位符語法: HiQPdf 使用 {CrtPage} 和 {PageCount} 佔位符,而IronPDF使用 {page} 和 {total-pages}。 遷移需要更新所有頁首/頁尾模板。
優勢與考量
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相容性或簡化的套件管理的團隊來說, IronPDF可以有效地滿足這些需求。
