比較

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

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

對於頁首和頁尾,HiQPdf 使用<編碼>HtmlToPdfVariableElement</編碼物件加入 Document.HeaderDocument.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屬性。 頁首和頁尾可以使用 TextHeaderFooterCenterTextFontSize 等屬性。 頁數占位符使用{page}{總頁數}語法。

渲染引擎與相容性比較

這些函式庫的基本差異在於它們的呈現引擎和平台支援。

範疇HiQPdfIronPDF
渲染引擎基於 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);
    }
}
$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() 得到一個<編碼>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");
    }
}
$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() 將一個附加到另一個,最後再使用 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);
    }
}
$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}</編碼表示目前頁面,使用<編碼>{頁數}</編碼表示總頁數。

IronPdf 使用 RenderingOptions.TextHeaderRenderingOptions.TextFooterTextHeaderFooter 物件。 CenterTextFontSize 等屬性提供了直接的設定。 頁數占位符使用{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.BottomRenderingOptions.MarginBottom
Document.Margins.LeftRenderingOptions.MarginLeft
Document.Margins.Right<編碼>RenderingOptions.MarginRight</編碼
Document.Header.Height<編碼>HtmlHeader.MaxHeight</編碼
Document.Footer.HeightHtmlFooter.MaxHeight
序列號IronPDF.License.LicenseKey

占位符語法對應

不同函式庫的頁首和頁尾占位符有所不同:

HiQPdfIronPDF
<編碼>{CrtPage}</編碼{page}
<編碼>{頁數}</編碼{總頁數}
<編碼>{CrtPageUri}</編碼<編碼>{url}</編碼
<編碼>{CrtPageTitle}</編碼<編碼>{html-title}</編碼

功能比較摘要

特點HiQPdfIronPDF
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.HeightDocument.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的優勢

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

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

免費試用開始評估 IronPDF,並探索全面的文件,以評估是否適合您的特定需求。