比較

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.FooterDocument.PageSize

免費版 HiQPdf 有一個重大限制——PDF 輸出最多只能有 3 頁,並且帶有明顯的水印,這使得在評估過程中對較大文件進行徹底測試變得困難。 本函式庫為不同平台提供了多個NuGet包變體(HiQPdf、HiQPdf.Free、HiQPdf.NetCore、HiQPdf.NetCore.x64、HiQPdf.Client),但文件沒有明確說明是否支援.NET Core或.NET 5+。

對於頁首和頁腳,HiQPdf 使用添加到 Document.HeaderDocument.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,並帶有 CenterTextFontSize 等屬性。 頁碼佔位符使用 {page}{total-pages} 語法。

渲染引擎及相容性比較

這些庫之間的根本區別在於它們的渲染引擎和平台支援。

方面HiQPdfIronPDF
渲染引擎基於 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);
    }
}
$vbLabelText   $csharpLabel

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");
    }
}
$vbLabelText   $csharpLabel

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");
    }
}
$vbLabelText   $csharpLabel

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");
    }
}
$vbLabelText   $csharpLabel

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);
    }
}
$vbLabelText   $csharpLabel

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");
    }
}
$vbLabelText   $csharpLabel

HiQPdf 透過 Document.HeaderDocument.Footer 屬性配置頁首和頁腳,設定 Height 並新增 HtmlToPdfVariableElement 物件。 頁碼佔位符使用 {CrtPage} 表示目前頁碼,使用 {PageCount} 表示總頁碼。

IronPDF使用 RenderingOptions.TextHeaderRenderingOptions.TextFooterTextHeaderFooter 物件。 屬性如 CenterTextFontSize 提供直接配置。 頁碼佔位符使用 {page}{total-pages}

請在IronPDF教學中了解更多關於頁首和頁尾配置的資訊。

API對應參考

對於正在評估 HiQPdf 遷移或比較功能的開發人員來說,此映射顯示了等效操作:

主類別映射

HiQPdf 類IronPDF類
HtmlToPdfChromePdfRenderer
PdfDocumentPdfDocument
PdfPagepdf.Pages[i]
PdfDocumentControlRenderingOptions
PdfHeader / PdfDocumentHeaderHtmlHeaderFooter
PdfFooter / PdfDocumentFooterHtmlHeaderFooter
HtmlToPdfVariableElementHtmlHeaderFooter.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屬性
BrowserWidthRenderingOptions.ViewPortWidth
BrowserHeightRenderingOptions.ViewPortHeight
Document.PageSizeRenderingOptions.PaperSize
Document.PageOrientationRenderingOptions.PaperOrientation
Document.Margins.TopRenderingOptions.MarginTop
Document.Margins.BottomRenderingOptions.MarginBottom
Document.Margins.LeftRenderingOptions.MarginLeft
Document.Margins.RightRenderingOptions.MarginRight
Document.Header.HeightHtmlHeader.MaxHeight
Document.Footer.HeightHtmlFooter.MaxHeight
SerialNumberIronPdf.License.LicenseKey

佔位符語法映射

不同庫的頁首和頁尾佔位符有所不同:

HiQPdfIronPDF
{CrtPage}{page}
{PageCount}{total-pages}
{CrtPageUri}{url}
{CrtPageTitle}{html-title}

功能對比總結

特徵HiQPdfIronPDF
鉻渲染❌(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.HeightDocument.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 的優勢

  • Chromium 引擎:現代渲染技術,完全支援JavaScript -統一包:適用於所有平台的單一NuGet包 -完整試用: 30 天全功能試用 -支援現代.NET :已提供.NET 6、7、8、9 和 10 的文檔 -簡潔的 API:流暢的 RenderingOptions 配置 -豐富的資源:大量的教學文檔

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可以有效地滿足這些需求。

立即開始免費試用IronPDF ,並瀏覽其全面的文檔,以評估其是否符合您的特定需求。