比较

DinkToPdf 与 IronPDF:技术比较指南

当 .NET 开发人员评估 HTML 转 PDF 解决方案时,HiQPdf 因其采用基于 WebKit 的渲染技术而脱颖而出,成为一个商业库。 虽然HiQPdf支持 HTML5/CSS3,但其较旧的 WebKit 引擎可能难以兼容现代 JavaScript 框架,而且免费版本仅限 3 页,并带有明显的水印。 相比之下,IronPDF 使用基于 Chromium 的现代渲染引擎,提供完整的 JavaScript 支持,并在所有 .NET 平台上提供统一的软件包。

此比较从相关技术方面对这两个库进行评估,以帮助专业开发人员和架构师根据其 .NET PDF 需求做出明智的决策。

HiQPDF概述

HiQPdf是一个商业HTML到PDF库,采用基于WebKit的渲染引擎。该库的主要转换器类byte[]数据。 通过Document.PageSize

免费版HiQPdf存在一个重大限制——PDF 输出最多只能有 3 页,并且带有明显的水印,这使得在评估过程中对较大文档进行彻底测试变得困难。 该库为不同平台提供了多个 NuGet 包变体(HiQPdf、HiQPdf.Free、HiQPdf.NetCore、HiQPdf.NetCore.x64、HiQPdf.Client),但文档没有明确说明是否支持 .NET Core 或 .NET 5+。

对于页眉和页脚,HiQPdf使用添加到HtmlToPdfVariableElement对象。 页码占位符使用{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的 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);
    }
}
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 软件包否(多种变体)
免费全面试用否(三页限制+水印)是(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.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 年之前的应用程序开发进行规划,在带有零散软件包的旧式 WebKit 渲染和带有统一支持的现代 Chromium 渲染之间做出选择,会对开发速度和输出质量产生重大影响。 需要现代 JavaScript 框架支持、明确的 .NET 兼容性或简化软件包管理的团队会发现IronPDFfor .NET 能有效满足这些要求。

通过免费试用开始评估 IronPDF,并浏览全面的文档以评估是否适合您的特定需求。

请注意HiQPdf 是其各自所有者的注册商标。 本网站与HiQPdf Software没有关联、认可或赞助关系。 所有产品名称、徽标和品牌均为各自所有者的财产。 比较仅供参考,反映撰写时公开可用的信息。