HiQPdf與IronPDF:技術比較指南
當.NET開發人員評估HTML轉PDF解決方案時,HiQPdf作為一個使用WebKit渲染的商業程式庫脫穎而出。 雖然HiQPdf支援HTML5/CSS3,但其較舊的WebKit引擎可能在面對現代JavaScript框架時困難重重,且免費版本僅限於3頁且有明顯的浮水印。 相較之下,IronPDF使用現代的基於Chromium的渲染引擎,提供完整的JavaScript支援,並在所有.NET平台上提供統一的套件。
這次比較評估了這兩個程式庫在相關技術方面的表現,以協助專業開發人員和架構師在.NET PDF需求中做出明智的決策。
HiQPdf概述
HiQPdf是一個使用WebKit渲染引擎的商業HTML轉PDF程式庫。程式庫的主要轉換類byte[]資料。 配置管理是通過Document.Header, Document.PageSize。
HiQPdf的免費版本限制很大——PDF輸出最多3頁,並且有侵入性浮水印,使得在評估期間對較大文件進行徹底測試變得困難。 該程式庫針對不同平台提供多個NuGet套件變體 (HiQPdf, HiQPdf.Free, HiQPdf.NetCore, HiQPdf.NetCore.x64, HiQPdf.Client),但文件未明確說明.NET Core或.NET 5+的支援。
對於頁眉和頁腳,HiQPdf使用Document.Footer集合。 頁碼佔位符的語法為當前頁{PageCount}。
IronPDF概覽
IronPDF是.NET PDF程式庫,使用現代的基於Chromium的渲染引擎,支援HTML5、CSS3和包括React、Angular和Vue在內的JavaScript框架。 程式庫的主要渲染類PdfDocument物件。
IronPDF提供一個適用於所有平台的統一NuGet套件,兼容文檔對.NET 6, 7, 8, 9和10的支援。配置是使用RenderingOptions屬性直接在渲染器上進行。 頁眉和頁腳可以使用FontSize等屬性。 頁碼佔位符使用{total-pages}語法。
渲染引擎及相容性比較
這些程式庫之間的根本區別在於它們的渲染引擎和平台支援。
| 方面 | HiQPdf | IronPDF |
|---|---|---|
| 渲染引擎 | 基於WebKit(較舊版本) | 現代Chromium |
| 免費層級 | 3頁限製+浮水印 | 30天完整試用 |
| 現代JS支援 | 有限 | 完整支援 (React, Angular, Vue) |
| .NET Core/5+支援 | 需要多個套件 | 單一統一套件 |
| API設計 | 複雜的屬性鏈 | 擁有乾淨流暢的API |
| CSS3支持 | 部分 | 支持 |
| 文件資料 | 分散的 | 全面的 |
| NuGet套件 | 多個變體 | 單一套件 |
HiQPdf的基於WebKit的引擎是較舊的技術,在現代JavaScript框架和複雜HTML結構上可能會遇到挑戰。 IronPDF的Chromium引擎提供與Google Chrome相同的渲染質量,確保現代Web內容的準確轉換。
程式碼比較:常見的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);
}
}Imports HiQPdf
Imports System
Class Program
Shared Sub Main()
Dim htmlToPdfConverter As New HtmlToPdf()
Dim pdfBuffer As Byte() = htmlToPdfConverter.ConvertUrlToMemory("https://example.com")
System.IO.File.WriteAllBytes("output.pdf", pdfBuffer)
' Convert HTML string
Dim html As String = "<h1>Hello World</h1><p>This is a PDF document.</p>"
Dim pdfFromHtml As Byte() = htmlToPdfConverter.ConvertHtmlToMemory(html, "")
System.IO.File.WriteAllBytes("fromhtml.pdf", pdfFromHtml)
End Sub
End ClassIronPDF:
// 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");
}
}Imports IronPdf
Imports System
Module Program
Sub Main()
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://example.com")
pdf.SaveAs("output.pdf")
' Convert HTML string
Dim html As String = "<h1>Hello World</h1><p>This is a PDF document.</p>"
Dim pdfFromHtml = renderer.RenderHtmlAsPdf(html)
pdfFromHtml.SaveAs("fromhtml.pdf")
End Sub
End ModuleHiQPdf創建一個File.WriteAllBytes()手動寫入磁碟。 ConvertHtmlToMemory()方法需要第二個參數作為基本URL(如果不需要則空字符串)。
IronPDF創建一個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");
}
}Imports HiQPdf
Imports System
Module Program
Sub Main()
' Create first PDF
Dim converter1 As New HtmlToPdf()
Dim pdf1 As Byte() = converter1.ConvertHtmlToMemory("<h1>First Document</h1>", "")
System.IO.File.WriteAllBytes("doc1.pdf", pdf1)
' Create second PDF
Dim converter2 As New HtmlToPdf()
Dim pdf2 As Byte() = converter2.ConvertHtmlToMemory("<h1>Second Document</h1>", "")
System.IO.File.WriteAllBytes("doc2.pdf", pdf2)
' Merge PDFs
Dim document1 As PdfDocument = PdfDocument.FromFile("doc1.pdf")
Dim document2 As PdfDocument = PdfDocument.FromFile("doc2.pdf")
document1.AddDocument(document2)
document1.WriteToFile("merged.pdf")
End Sub
End ModuleIronPDF:
// 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");
}
}Imports IronPdf
Imports System
Module Program
Sub Main()
Dim renderer = New ChromePdfRenderer()
' Create first PDF
Dim pdf1 = renderer.RenderHtmlAsPdf("<h1>First Document</h1>")
pdf1.SaveAs("doc1.pdf")
' Create second PDF
Dim pdf2 = renderer.RenderHtmlAsPdf("<h1>Second Document</h1>")
pdf2.SaveAs("doc2.pdf")
' Merge PDFs
Dim merged = PdfDocument.Merge(pdf1, pdf2)
merged.SaveAs("merged.pdf")
End Sub
End ModuleHiQPdf要求先將PDF儲存到磁碟中,然後使用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);
}
}Imports HiQPdf
Imports System
Class Program
Shared Sub Main()
Dim htmlToPdfConverter As New HtmlToPdf()
' Add header
htmlToPdfConverter.Document.Header.Height = 50
Dim headerHtml As 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
Dim footerHtml As New HtmlToPdfVariableElement("<div style='text-align:center'>Page {CrtPage} of {PageCount}</div>", "")
htmlToPdfConverter.Document.Footer.Add(footerHtml)
Dim pdfBuffer As Byte() = htmlToPdfConverter.ConvertHtmlToMemory("<h1>Document with Headers and Footers</h1>", "")
System.IO.File.WriteAllBytes("header-footer.pdf", pdfBuffer)
End Sub
End ClassIronPDF:
// 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");
}
}Imports IronPdf
Imports IronPdf.Rendering
Imports System
Class Program
Shared Sub Main()
Dim renderer As New ChromePdfRenderer()
' Configure header and footer
renderer.RenderingOptions.TextHeader = New TextHeaderFooter() With {
.CenterText = "Page Header",
.FontSize = 12
}
renderer.RenderingOptions.TextFooter = New TextHeaderFooter() With {
.CenterText = "Page {page} of {total-pages}",
.FontSize = 10
}
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Document with Headers and Footers</h1>")
pdf.SaveAs("header-footer.pdf")
End Sub
End ClassHiQPdf通過HtmlToPdfVariableElement物件。 頁碼佔位符使用{PageCount}表示總頁數。
IronPDF使用TextHeaderFooter物件。 屬性如FontSize提供直接配置。 頁碼佔位符使用{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 |
|---|---|---|
| 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的Chromium引擎提供與Google Chrome相同的渲染質量,確保複雜現代Web內容的準確轉換。
不清晰的.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.Footer.Add()進行冗長的配置。 IronPDF使用RenderingOptions屬性的流暢API提供更簡潔的配置。
不同的佔位符語法:HiQPdf使用{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提供具備完整JavaScript支援的現代Chromium替代方案,適用於React、Angular和Vue應用。 單一統一的NuGet套件,具有.NET 6/7/8/9/10的文檔支援,使部署簡單,而乾淨的API設計減少了配置複雜性。
隨著企業計劃為.NET 10、C# 14和到2026年的應用開發,選擇較舊的WebKit渲染和分散的套件或現代的Chromium渲染和統一的支援會顯著影響開發速度和輸出質量。 需要現代JavaScript框架支援、明確的.NET相容性或精簡的套件管理的團隊會發現IronPDF能有效滿足這些需求。
開始評估IronPDF,通過免費試用,並查看更多詳細文檔,來評估其對您的具體需求是否合適。
