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.Header 、 Document.Footer和Document.PageSize 。
免費版HiQPdf有一個重大限制——PDF 輸出最多只能有 3 頁,並且帶有明顯的水印,這使得在評估過程中對較大文件進行徹底測試變得困難。 本函式庫為不同平台提供了多個 NuGet 套件變體(HiQPdf、HiQPdf.Free、HiQPdf.NetCore、HiQPdf.NetCore.x64、HiQPdf.Client),但文件沒有明確說明是否支援 .NET Core 或 .NET 5+。
對於頁首和頁尾,HiQPdf 使用<編碼>HtmlToPdfVariableElement</編碼物件加入 Document.Header 和 Document.Footer 集合。 頁碼佔位符使用語法{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}和{總頁數}語法。
渲染引擎與相容性比較
這些函式庫的基本差異在於它們的呈現引擎和平台支援。
| 範疇 | 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);
}
}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() 得到一個<編碼>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");
}
}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() 將一個附加到另一個,最後再使用 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);
}
}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}</編碼表示目前頁面,使用<編碼>{頁數}</編碼表示總頁數。
IronPdf 使用 RenderingOptions.TextHeader 和 RenderingOptions.TextFooter 與 TextHeaderFooter 物件。 CenterText 和 FontSize 等屬性提供了直接的設定。 頁數占位符使用{page}和{總頁數}。
在 IronPDF 教程中了解更多關於頁首和頁尾配置的資訊。
API 對應參考。
對於評估HiQPdf遷移或比較功能的開發人員而言,此對應顯示等效的操作:
主類映射
| HiQPdf 類別 | IronPdf 類別 |
|---|---|
| <編碼>HtmlToPdf</編碼 | <代碼>ChromePdfRenderer</代碼 |
| <編碼>PDF 文件</編碼 | <編碼>PDF 文件</編碼 |
PdfPage | <代碼>pdf.Pages[i]</代碼 |
| <代碼>PdfDocumentControl</代碼 | 渲染選項 |
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,路徑)。 | <代碼>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) | ✅ (Merge) |
| 頁首/頁尾 | ✅ (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}和{PageCount}佔位符,而IronPDF使用{page}和{total-pages}佔位符。 遷移需要更新所有標題/頁腳模板。
優勢和考慮因素
HiQPdf的優勢
- HTML5/CSS3 支援:提供 HTML5 和 CSS3 渲染功能 -成熟圖書館:擁有現有使用者群體的商業圖書館
HiQPdf注意事項
WebKit 引擎:較舊的渲染技術,對現代 JavaScript 的支援有限。
- 3頁限制:免費版本受到諸多限制 -分散的套件:針對不同平台的多個 NuGet 套件
- .NET 支援不明確:文件沒有明確說明與現代 .NET 的兼容性 -複雜的屬性鏈:透過嵌套屬性進行詳細配置 -點單位:使用點(每英吋 72 點)進行測量
IronPDF的優勢
IronPDF注意事項
-商業許可:生產用途必需 毫米單位:邊距採用毫米而非磅。
結論
HiQPdf 和IronPDF代表了 .NET 應用程式中不同世代的 HTML-to-PDF 技術。HiQPdf基於 WebKit 的引擎提供基本的 HTML5/CSS3 支援,但在現代 JavaScript Framework 方面卻舉步維艱,而且提供的 .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 Framework 支援、清晰的 .NET 兼容性或簡化套件管理的團隊會發現IronPDFfor .NET 能有效滿足這些需求。