比較

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}語法。

渲染引擎及相容性比較

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

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

HiQPdf創建一個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 Module
$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");
    }
}
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 Module
$vbLabelText   $csharpLabel

HiQPdf要求先將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 Class
$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");
    }
}
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 Class
$vbLabelText   $csharpLabel

HiQPdf通過HtmlToPdfVariableElement物件。 頁碼佔位符使用{PageCount}表示總頁數。

IronPDF使用TextHeaderFooter物件。 屬性如FontSize提供直接配置。 頁碼佔位符使用{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
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的優勢

  • 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提供具備完整JavaScript支援的現代Chromium替代方案,適用於React、Angular和Vue應用。 單一統一的NuGet套件,具有.NET 6/7/8/9/10的文檔支援,使部署簡單,而乾淨的API設計減少了配置複雜性。

隨著企業計劃為.NET 10、C# 14和到2026年的應用開發,選擇較舊的WebKit渲染和分散的套件或現代的Chromium渲染和統一的支援會顯著影響開發速度和輸出質量。 需要現代JavaScript框架支援、明確的.NET相容性或精簡的套件管理的團隊會發現IronPDF能有效滿足這些需求。

開始評估IronPDF,通過免費試用,並查看更多詳細文檔,來評估其對您的具體需求是否合適。

請注意HiQPdf是其各自所有者的註冊商標。 本網站與HiQPdf軟體無關,且並未受到其認可或贊助。 所有產品名稱、標誌和品牌均為其各自所有者的財產。 比較僅供信息之用,並反映撰寫時的公開信息。)}]