DinkToPdf與IronPDF:技術比較指南
當.NET開發人員評估HTML到PDF的解決方案時,HiQPdf作為一個商業程式庫,以WebKit為基礎的渲染而脫穎而出。 儘管HiQPdf支持HTML5/CSS3,其較舊的WebKit引擎可能無法良好支援現代JavaScript框架,且免費版本僅限於3頁且具有明顯的水印。 相對而言,IronPDF使用現代的基於Chromium的渲染引擎,提供完整的JavaScript支援並在所有.NET平台上提供統一的包。
此比較評估針對相關技術面向的兩個程式庫,以協助專業開發人員和架構師為其.NET PDF需求做出明智的決策。
HiQPdf概述
HiQPdf是一個商業的HTML到PDF程式庫,採用WebKit-based渲染引擎。該程式庫的主要轉換器類別byte[]資料。 配置是通過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和JavaScript框架,包括React、Angular和Vue。 該程式庫的主要渲染類為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通過設置Document.Footer屬性配置頁眉和頁腳。 頁數佔位符使用當前頁的{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-based渲染引擎在面對現代的JavaScript框架如React、Angular和Vue時存在困難。 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的流暢API配有RenderingOptions屬性提供更清晰的配置。
不同的佔位符語法: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提供了一種現代的基於Chromium的替代方案,能夠完全支持React、Angular和Vue應用的JavaScript。 單一統一的NuGet包與記錄的.NET 6/7/8/9/10支援簡化了部署,且乾淨的API設計降低了配置複雜性。
隨著組織計劃.NET 10、C# 14和2026年的應用開發,在支離破碎的包和現代Chromium渲染與統一支持之間做出選擇將顯著影響開發速度和輸出質量。 需要現代JavaScript框架支持、明確的.NET相容性或簡化包管理的團隊會發現IronPDF有效地滿足這些需求。
從 免費試用 開始評估 IronPDF,並探索全面的文件以評估特定需求的適用性。
