HiQPdf vs IronPDF:技術比較指南
HiQPdfvs IronPDF:渲染引擎、API 設計與現代 .NET 相容性。
當 .NET 開發人員評估 HTML-to-PDF 解決方案時,HiQPdf 成為基於 WebKit 渲染的商業函式庫。 雖然HiQPdf提供 HTML5/CSS3 支援,但其較舊的 WebKit 引擎在處理現代 JavaScript 架構時可能會有困難,而且免費版本強加了 3 頁的限制與侵入性的水印。IronPDF提供了一種與眾不同的方法:基於 Chromium 的現代化渲染引擎,具有完整的 JavaScript 支援,以及跨越所有 .NET 平台的統一套件。
本比較針對技術上相關的層面檢視這兩個函式庫,以協助專業開發人員和架構人員針對他們的 .NET PDF 需求做出明智的決定。
瞭解 HiQPdf
HiQPdf 是一個商用 HTML-to-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() 會返回<編碼>PDF 文件</編碼物件。
IronPDF 為所有平台提供單一統一的 NuGet 套件,並記錄了 .NET 6、7、8、9 和 10 的相容性。配置直接在渲染器上使用渲染選項屬性。 頁首和頁尾可以使用 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);
}
}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}和{總頁數}。
在 IronPDF 教程中了解更多關於頁首和頁尾配置的資訊。
API 對應參考。
對於評估HiQPdf遷移或比較功能的開發人員而言,此對應顯示等效的操作:
主類映射
| HiQPdf 類別 | IronPdf 類別 | 筆記 |
|---|---|---|
| <編碼>HtmlToPdf</編碼 | <代碼>ChromePdfRenderer</代碼 | 主要轉換器類別 |
| <編碼>PDF 文件</編碼 | <編碼>PDF 文件</編碼 | 相同的名稱,不同的命名空間 |
PdfPage | <代碼>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,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 | 在 mm |
Document.Margins.Left | RenderingOptions.MarginLeft | 在 mm |
Document.Margins.Right | <編碼>RenderingOptions.MarginRight</編碼 | 在 mm |
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。
Fragmented NuGet Packages: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 頁限制:免費版受到極大限制
- Fragmented Packages:適用於不同平台的多個 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 能有效滿足這些需求。