比較

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

渲染引擎和相容性比較

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

方面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通過設置Document.Footer屬性配置頁眉和頁腳。 頁數佔位符使用當前頁的{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-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的優勢

  • 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年的應用開發,在支離破碎的包和現代Chromium渲染與統一支持之間做出選擇將顯著影響開發速度和輸出質量。 需要現代JavaScript框架支持、明確的.NET相容性或簡化包管理的團隊會發現IronPDF有效地滿足這些需求。

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

請注意HiQPdf是其各自所有者的註冊商標。 本網站與HiQPdf軟體無關,未經HiQPdf軟體支持或贊助。 所有產品名稱、標誌和品牌均為其各自所有者的財產。 比較僅供資訊參考,並反映了撰寫時公開的資訊。)}