比较

Expert PDF 与 IronPDF:技术比较指南

当 .NET 开发人员评估 HTML 到 PDF 转换库时,Expert PDF 是一个具有成熟 HTML5 支持的商业选项。 然而,它的文档自 2018 年以来就没有更新过,它依赖于过时的 Chrome 渲染引擎,而且其碎片化的产品模型导致许多团队考虑其他替代方案。 IronPdf 采用最新的 Chromium 渲染技术、持续更新以及将功能整合到单个软件包中的一体化库,提供了一种现代化的方法。

本次比较从相关技术方面考察了这两个库,以帮助专业开发人员和架构师针对其 .NET PDF 需求做出明智的决策。

了解专家 PDF.

Expert PDF (ExpertPdf) 是一个商业的 HTML 转 PDF 转换库,可帮助将动态网页转换为 PDF 文档。 该库声称支持 HTML5,这有利于以 PDF 格式呈现现代网络内容。

Expert PDF 使用 PdfConverter 类作为其主要转换接口,提供 GetPdfBytesFromUrl()GetPdfBytesFromHtmlFile() 等方法,用于各种转换场景。 该库通过转换器上的 PdfHeaderOptionsPdfFooterOptions 属性来组织配置。

Expert PDF 的一个重要局限是它依赖于旧版本的 Chrome 浏览器来渲染 PDF。 现代网络标准和后续 Chromium 版本中的渲染改进并未反映在专家 PDF的输出中,这可能会导致在使用 CSS3 功能(如 Flexbox 和 Grid)的现代网页设计时渲染精度降低。

Expert PDF 的文档自 2018 年以来一直处于冻结状态,超过六年没有更新,这使得开发人员越来越难以找到最新的信息、示例和最佳实践。 该库作为一个分散的产品套件出售,每个套件(HtmlToPdf、PDFMerge、PDFSecurity、PDFSplit、PdfToImage)都需要单独授权,价格从 550 美元到 1200 美元不等。

了解IronPDF

IronPDF 是一个以持续更新和改进而著称的 .NET PDF 库。 该库使用最新的 Chromium 渲染引擎,确保符合现代网络标准,并能准确渲染 HTML,同时完全支持 CSS3,包括 Flexbox 和网格布局。

IronPDF使用 ChromePdfRenderer 作为其主要转换类,而 RenderingOptions 提供页面大小、方向、边距、页眉和页脚的配置。 该库返回 PdfDocument 对象,可以在保存之前对其进行进一步操作,从而为后处理操作提供灵活性。

IronPDF 提供详尽的文档,每月持续发布新版本,原生支持 .NET 6/7/8/9+,并真正实现跨 Windows、Linux、macOS 和 Docker 环境的跨平台兼容性。

架构和产品模型比较

这些 .NET PDF 库的根本区别在于它们的产品组织和渲染技术。

方面专家 PDFIronPDF
文档自 2018 年起冻结持续更新
渲染引擎传统 Chrome 浏览器最新 Chromium
CSS支持有限的 CSS3完整的 CSS3(Flexbox、网格)
价格$550-$1,200有竞争力的定价
更新频率不经常每月发布
产品模型零散(5 个以上 DLL)一体化库
现代.NET有限的.NET 6/7/8/9+ 原生语言
支持同步有限的完整的异步/等待
安全更新不经常常规补丁

Expert PDF 的零散产品套件包括

  • ExpertPdf.HtmlToPdf: HTML 转 PDF 转换
  • ExpertPdf.PDFMerge: PDF 合并
  • ExpertPdf.PDFSecurity:加密和密码 ExpertPdf.PDFSplit: PDF 分割
  • ExpertPdf.PdfToImage: PDF 转图像

每个软件包都需要单独授权。IronPDF将所有同等功能整合到一个 NuGet 包中。

代码比较:常见的 PDF 操作

HTML 到 PDF 转换

将 HTML 内容转换为 PDF 演示了 API 的基本差异。

专家级 PDF:

// NuGet: Install-Package ExpertPdf.HtmlToPdf
using ExpertPdf.HtmlToPdf;
using System;

class Program
{
    static void Main()
    {
        // Create the PDF converter
        PdfConverter pdfConverter = new PdfConverter();

        // Convert HTML string to PDF
        byte[] pdfBytes = pdfConverter.GetPdfBytesFromHtmlString("<h1>Hello World</h1><p>This is a PDF document.</p>");

        // Save to file
        System.IO.File.WriteAllBytes("output.pdf", pdfBytes);

        Console.WriteLine("PDF created successfully!");
    }
}
// NuGet: Install-Package ExpertPdf.HtmlToPdf
using ExpertPdf.HtmlToPdf;
using System;

class Program
{
    static void Main()
    {
        // Create the PDF converter
        PdfConverter pdfConverter = new PdfConverter();

        // Convert HTML string to PDF
        byte[] pdfBytes = pdfConverter.GetPdfBytesFromHtmlString("<h1>Hello World</h1><p>This is a PDF document.</p>");

        // Save to file
        System.IO.File.WriteAllBytes("output.pdf", pdfBytes);

        Console.WriteLine("PDF created successfully!");
    }
}
$vbLabelText   $csharpLabel

IronPDF:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        // Create a PDF from HTML string
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF document.</p>");

        // Save to file
        pdf.SaveAs("output.pdf");

        Console.WriteLine("PDF created successfully!");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        // Create a PDF from HTML string
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF document.</p>");

        // Save to file
        pdf.SaveAs("output.pdf");

        Console.WriteLine("PDF created successfully!");
    }
}
$vbLabelText   $csharpLabel

Expert PDF 直接从 GetPdfBytesFromHtmlString() 返回 byte[],需要使用 File.WriteAllBytes() 手动写入文件。 IronPDF返回一个 PdfDocument 对象,该对象具有 SaveAs() 方法,从而提供更简洁的保存操作,并允许在保存之前进行额外的操作。

有关高级 HTML 渲染选项,请浏览 HTML 到 PDF 转换指南

URL到PDF转换

将网页截取为 PDF 文档可显示配置模式差异。

专家级 PDF:

// NuGet: Install-Package ExpertPdf.HtmlToPdf
using ExpertPdf.HtmlToPdf;
using System;

class Program
{
    static void Main()
    {
        // Create the PDF converter
        PdfConverter pdfConverter = new PdfConverter();

        // Set page size and orientation
        pdfConverter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4;
        pdfConverter.PdfDocumentOptions.PdfPageOrientation = PdfPageOrientation.Portrait;

        // Convert URL to PDF
        byte[] pdfBytes = pdfConverter.GetPdfBytesFromUrl("https://www.example.com");

        // Save to file
        System.IO.File.WriteAllBytes("webpage.pdf", pdfBytes);

        Console.WriteLine("PDF from URL created successfully!");
    }
}
// NuGet: Install-Package ExpertPdf.HtmlToPdf
using ExpertPdf.HtmlToPdf;
using System;

class Program
{
    static void Main()
    {
        // Create the PDF converter
        PdfConverter pdfConverter = new PdfConverter();

        // Set page size and orientation
        pdfConverter.PdfDocumentOptions.PdfPageSize = PdfPageSize.A4;
        pdfConverter.PdfDocumentOptions.PdfPageOrientation = PdfPageOrientation.Portrait;

        // Convert URL to PDF
        byte[] pdfBytes = pdfConverter.GetPdfBytesFromUrl("https://www.example.com");

        // Save to file
        System.IO.File.WriteAllBytes("webpage.pdf", pdfBytes);

        Console.WriteLine("PDF from URL created successfully!");
    }
}
$vbLabelText   $csharpLabel

IronPDF:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        // Create a PDF renderer
        var renderer = new ChromePdfRenderer();

        // Set page size and orientation
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait;

        // Convert URL to PDF
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");

        // Save to file
        pdf.SaveAs("webpage.pdf");

        Console.WriteLine("PDF from URL created successfully!");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        // Create a PDF renderer
        var renderer = new ChromePdfRenderer();

        // Set page size and orientation
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait;

        // Convert URL to PDF
        var pdf = renderer.RenderUrlAsPdf("https://www.example.com");

        // Save to file
        pdf.SaveAs("webpage.pdf");

        Console.WriteLine("PDF from URL created successfully!");
    }
}
$vbLabelText   $csharpLabel

这两个库都提供页面大小和方向配置。专家 PDF使用 PdfDocumentOptions.PdfPageSizePdfDocumentOptions.PdfPageOrientation,而IronPDF使用 RenderingOptions.PaperSizeRenderingOptions.PaperOrientation。 命名遵循类似模式,但IronPDF使用 "Paper "前缀,以便与印刷术语保持一致。

URL to PDF 文档中了解有关 URL 呈现的更多信息。

带页码的页眉和页脚

添加页眉和页脚显示了 API 设计上的显著差异,特别是在页码语法方面。

专家级 PDF:

// NuGet: Install-Package ExpertPdf.HtmlToPdf
using ExpertPdf.HtmlToPdf;
using System;

class Program
{
    static void Main()
    {
        // Create the PDF converter
        PdfConverter pdfConverter = new PdfConverter();

        // Enable header
        pdfConverter.PdfHeaderOptions.ShowHeader = true;
        pdfConverter.PdfHeaderOptions.HeaderText = "Document Header";
        pdfConverter.PdfHeaderOptions.HeaderTextAlignment = HorizontalTextAlign.Center;

        // Enable footer with page numbers
        pdfConverter.PdfFooterOptions.ShowFooter = true;
        pdfConverter.PdfFooterOptions.FooterText = "Page &p; of &P;";
        pdfConverter.PdfFooterOptions.FooterTextAlignment = HorizontalTextAlign.Right;

        // Convert HTML file to PDF
        byte[] pdfBytes = pdfConverter.GetPdfBytesFromHtmlFile("input.html");

        // Save to file
        System.IO.File.WriteAllBytes("output-with-header-footer.pdf", pdfBytes);

        Console.WriteLine("PDF with headers and footers created successfully!");
    }
}
// NuGet: Install-Package ExpertPdf.HtmlToPdf
using ExpertPdf.HtmlToPdf;
using System;

class Program
{
    static void Main()
    {
        // Create the PDF converter
        PdfConverter pdfConverter = new PdfConverter();

        // Enable header
        pdfConverter.PdfHeaderOptions.ShowHeader = true;
        pdfConverter.PdfHeaderOptions.HeaderText = "Document Header";
        pdfConverter.PdfHeaderOptions.HeaderTextAlignment = HorizontalTextAlign.Center;

        // Enable footer with page numbers
        pdfConverter.PdfFooterOptions.ShowFooter = true;
        pdfConverter.PdfFooterOptions.FooterText = "Page &p; of &P;";
        pdfConverter.PdfFooterOptions.FooterTextAlignment = HorizontalTextAlign.Right;

        // Convert HTML file to PDF
        byte[] pdfBytes = pdfConverter.GetPdfBytesFromHtmlFile("input.html");

        // Save to file
        System.IO.File.WriteAllBytes("output-with-header-footer.pdf", pdfBytes);

        Console.WriteLine("PDF with headers and footers created successfully!");
    }
}
$vbLabelText   $csharpLabel

IronPDF:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        // Create a PDF renderer
        var renderer = new ChromePdfRenderer();

        // Configure header
        renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
        {
            CenterText = "Document Header",
            DrawDividerLine = true
        };

        // Configure footer with page numbers
        renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
        {
            RightText = "Page {page} of {total-pages}",
            DrawDividerLine = true
        };

        // Convert HTML file to PDF
        var pdf = renderer.RenderHtmlFileAsPdf("input.html");

        // Save to file
        pdf.SaveAs("output-with-header-footer.pdf");

        Console.WriteLine("PDF with headers and footers created successfully!");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        // Create a PDF renderer
        var renderer = new ChromePdfRenderer();

        // Configure header
        renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
        {
            CenterText = "Document Header",
            DrawDividerLine = true
        };

        // Configure footer with page numbers
        renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
        {
            RightText = "Page {page} of {total-pages}",
            DrawDividerLine = true
        };

        // Convert HTML file to PDF
        var pdf = renderer.RenderHtmlFileAsPdf("input.html");

        // Save to file
        pdf.SaveAs("output-with-header-footer.pdf");

        Console.WriteLine("PDF with headers and footers created successfully!");
    }
}
$vbLabelText   $csharpLabel

Expert PDF 需要使用布尔标志 (ShowHeader = true) 启用页眉/页脚,并使用基于文本的配置,其中 &p;&P; 标记分别表示当前页和总页数。 IronPDF使用具有特定位置属性的 TextHeaderFooter 对象(RightText)和 {page} / {total-pages} 占位符。 IronPDF还提供 DrawDividerLine 用于视觉分离。

为了实现完全的 HTML 控制, IronPDF还支持 HtmlHeaderFooter,允许在页眉和页脚中进行完整的 HTML/CSS 样式设置。

方法映射参考

对于评估专家 PDF 迁移或比较功能的开发人员,本映射显示了等效操作:

核心类映射

专家 PDFIronPDF
PdfConverterChromePdfRenderer
PdfDocumentOptionsChromePdfRenderOptions
PdfSecurityOptionsPdfDocument.SecuritySettings
PdfHeaderOptionsHtmlHeaderFooterTextHeaderFooter
PdfFooterOptionsHtmlHeaderFooterTextHeaderFooter
PDFMergePdfDocument.Merge()

方法映射

专家 PDFIronPDF
pdfConverter.GetPdfBytesFromHtmlString(html)renderer.RenderHtmlAsPdf(html).BinaryData
pdfConverter.GetPdfBytesFromUrl(url)renderer.RenderUrlAsPdf(url).BinaryData
pdfConverter.GetPdfBytesFromHtmlFile(path)renderer.RenderHtmlFileAsPdf(path).BinaryData
pdfConverter.SavePdfFromUrlToFile(url, path)renderer.RenderUrlAsPdf(url).SaveAs(path)

配置映射

专家 PDFIronPDF
PdfDocumentOptions.PdfPageSize = PdfPageSize.A4RenderingOptions.PaperSize = PdfPaperSize.A4
PdfDocumentOptions.PdfPageOrientation = PortraitRenderingOptions.PaperOrientation = PdfPaperOrientation.Portrait
PdfDocumentOptions.MarginTopRenderingOptions.MarginTop
pdfConverter.LicenseKey = "..."IronPdf.License.LicenseKey = "..."

页面编号标记

专家 PDFIronPDF
&p;(当前页面){page}
&P;(总页数){total-pages}

功能对比摘要

特征专家 PDFIronPDF
HTML 至 PDF
URL 至 PDF
HTML 文件到 PDF
页眉/页脚✅(基于文本)✅(HTML 或文本)
页码✅(&P;)✅({total-pages})
PDF 合并✅(单独软件包)✅(包括)
PDF 安全✅(单独软件包)✅(包括)
PDF 分割✅(单独软件包)✅(包括)
将 PDF 转换为图像✅(单独软件包)✅(包括)
CSS3 Flexbox/网格❌(有限)✅(完全支持)
跨平台有限的支持

团队何时考虑从专家 PDF迁移到 IronPDF?

开发团队评估从专家 PDF过渡到IronPDF有几个原因:

文档时效性:专家 PDF的文档自 2018 年以来一直处于冻结状态——超过六年没有更新。 寻求最新信息、示例和最佳实践的团队发现IronPDF不断更新的文档更适合现代开发工作流程。

现代 CSS 渲染:专家 PDF依赖于旧版 Chrome,可能无法正确渲染现代 CSS3 功能(Flexbox、Grid、CSS 变量)。IronPDF最新的 Chromium 引擎可确保准确呈现当代网页设计。

软件包整合:专家 PDF的分散产品套件(HtmlToPdf、PDFMerge、PDFSecurity、PDFSplit、PdfToImage)需要多个许可证。 IronPdf 将所有同等功能整合到一个 NuGet 包中,简化了依赖关系管理,降低了许可复杂性。

性价比评估:专家 PDF的许可费用为 550 美元至 1200 美元,价格过高,但提供的却是过时的渲染技术。 团队会评估成本是否与所提供的传统技术相符。

现代 .NET 支持:面向 .NET 6/7/8/9+ 的应用程序可受益于IronPDF的原生支持和完整的 async/await 模式,而专家 PDF的现代 .NET 支持则较为有限。

更新频率:专家 PDF的更新频率较低,而IronPDF则每月发布一次,这影响了功能可用性和安全补丁的及时性。

优势和考虑因素

专家 PDF的优势

  • HTML5 支持:具备基本的 HTML5 渲染能力 -已建立的库:已在生产环境中验证 -熟悉的 API:简洁的 PdfConverter 模式

PDF 专家注意事项

-文档已冻结:自 2018 年以来未更新 -旧版渲染:旧版 Chrome 浏览器对 CSS3 的支持有限 -产品分散:需要单独的软件包和许可证。 -高级定价:传统技术定价为 550 美元至 1200 美元 -现代 .NET 功能有限:落后于当前的 .NET 版本 -更新频率低:安全更新和功能更新很少。

IronPDF的优势

-现代渲染:采用最新的 Chromium 引擎,实现像素级完美输出 -一体化软件包:在一个 NuGet 包中完成 PDF 生成、合并、安全保护和提取。 -积极开发:每月更新,包含新功能和安全补丁 -更完善的文档:全面的教程和示例 -真正的跨平台:支持 Windows、Linux、macOS 和 Docker -现代 .NET:原生支持 .NET 6/7/8/9+ -完全支持异步:全面采用现代 async/await 模式

IronPDF注意事项

-两步保存:渲染返回 PdfDocument,然后调用 SaveAs()(提供灵活性) -不同的占位符:使用 {page} 语法,而不是 &p;

结论

Expert PDF 和IronPDF都为 .NET 开发人员提供 HTML 到 PDF 的转换,但它们代表了技术时间轴上的不同点。Expert PDF 提供了成熟的功能,但自 2018 年以来文档一直处于冻结状态,传统的 Chrome 渲染引擎限制了 CSS3 支持,而且产品模式分散,需要多个许可证。

IronPdf 通过最新的 Chromium 渲染、持续的月度更新、全面的文档以及整合功能的一体化软件包,提供了一个现代化的替代方案。 对于需要当前 CSS3 支持、主动维护或跨平台部署的团队,IronPDF 可以满足这些特定要求。

随着企业对 .NET 10、C# 14 以及 2026 年之前的应用程序开发进行规划,选择取决于具体的优先事项。 拥有成熟的专家 PDF实现和简单的 HTML 布局的团队可以继续找到适当的结果。 对于现代网页设计、主动安全补丁和合并许可,IronPdf 提供了更合适的方法。

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