比较

PDFreactor 与 IronPDF:技术比较指南

当 .NET 开发人员需要将 HTML 转换为 PDF 时,他们会遇到架构截然不同的库。PDFreactor作为基于 Java 的转换服务器运行,具有出色的 CSS 分页媒体支持,而IronPDFfor .NET 则提供了一个内嵌 Chromium 引擎的本地 .NET 库。本比较研究了这两种解决方案,分析了它们的架构差异、集成复杂性以及对不同应用需求的适用性。

什么是 PDFreactor?

PDFreactor 是一款功能强大的 HTML 转 PDF 转换服务器,它采用专有技术将 HTML 和 CSS 内容转换为高质量的 PDF 文档。 该库支持许多 CSS 属性,包括高级 CSS 分页媒体规范,因此对于需要最高保真度的复杂布局渲染来说,它是一个不错的选择。

PDFreactor 作为基于 Java 的独立服务运行,.NET 应用程序通过 REST API 调用或套接字连接与之通信。 该库使用配置对象模式,将设置和 HTML 内容捆绑在一起并发送到服务器进行处理。

PDFreactor 的主要特点包括

-基于 Java 的服务器:作为独立服务运行,需要 Java 运行时环境。

  • CSS 分页媒体支持:对 CSS3 和 CSS 分页媒体规范提供卓越的支持 -服务器架构:需要 .NET 应用程序使用 REST API 或套接字通信 -配置对象模式:使用Configuration对象来捆绑设置和内容 -高保真渲染:针对复杂的、印刷质量的文档布局进行了优化 -跨平台,通过 Java 实现:可在任何安装了 Java 的系统上运行

什么是 IronPDF?

IronPDF是一个完整的 .NET 原生库,提供完整的 PDF 生命周期管理。 ChromePdfRenderer 类使用嵌入式 Chromium 渲染引擎进行 HTML 到IronPDF的转换,提供完整的 CSS3 和 JavaScript 支持,无需外部依赖。

与PDFreactor的服务器架构不同,IronPDF 可在您的 .NET 应用程序中的进程内运行。 这就消除了 Java 依赖性、服务器基础设施和网络延迟--将 HTML 转换为 PDF 变成了一个简单的方法调用,而不是一个 HTTP 请求。

架构比较

PDFreactor 和IronPDF的根本区别在于它们的架构:外部 Java 服务器与本地 .NET 库。

方面PDFreactorIronPDF
运行时Java(外部服务器)本地 .NET(翻译中)
架构REST API 服务NuGet 库
部署Java + 服务器配置单个 NuGet 软件包
依赖关系JRE + HTTP 客户端自成一体
延迟网络往返直接方法调用
CSS支持CSS 分页媒体Chromium 引擎
PDF 操作仅转换整个生命周期
本地 .NET 库否(基于 Java)
跨平台能力是(依赖于 Java)是(捆绑 Chromium)
部署复杂性因 Java 而更加复杂简单,直接与 .NET 集成

对于在 .NET 环境中工作的团队来说,PDFreactor 的 Java 依赖性造成了极大的部署复杂性--在 CI/CD 管道中需要管理两个运行时,需要监控和维护单独的基础架构,每次转换都会产生网络延迟。

HTML 至 PDF 转换

将 HTML 内容转换为 PDF 演示了这些库之间的不同模式。

PDFreactor HTML 转 PDF 方法:

// NuGet: Install-Package PDFreactor.Native.Windows.x64
using RealObjects.PDFreactor;
using System.IO;

class Program
{
    static void Main()
    {
       PDFreactorpdfReactor = new PDFreactor();

        string html = "<html><body><h1>Hello World</h1></body></html>";

        Configuration config = new Configuration();
        config.Document = html;

        Result result = pdfReactor.Convert(config);

        File.WriteAllBytes("output.pdf", result.Document);
    }
}
// NuGet: Install-Package PDFreactor.Native.Windows.x64
using RealObjects.PDFreactor;
using System.IO;

class Program
{
    static void Main()
    {
       PDFreactorpdfReactor = new PDFreactor();

        string html = "<html><body><h1>Hello World</h1></body></html>";

        Configuration config = new Configuration();
        config.Document = html;

        Result result = pdfReactor.Convert(config);

        File.WriteAllBytes("output.pdf", result.Document);
    }
}
Imports RealObjects.PDFreactor
Imports System.IO

Module Program
    Sub Main()
        Dim pdfReactor As New PDFreactor()

        Dim html As String = "<html><body><h1>Hello World</h1></body></html>"

        Dim config As New Configuration()
        config.Document = html

        Dim result As Result = pdfReactor.Convert(config)

        File.WriteAllBytes("output.pdf", result.Document)
    End Sub
End Module
$vbLabelText   $csharpLabel

IronPDF HTML 转 PDF 方法:

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

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        string html = "<html><body><h1>Hello World</h1></body></html>";

        var pdf = renderer.RenderHtmlAsPdf(html);

        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        string html = "<html><body><h1>Hello World</h1></body></html>";

        var pdf = renderer.RenderHtmlAsPdf(html);

        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf
Imports System

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()

        Dim html As String = "<html><body><h1>Hello World</h1></body></html>"

        Dim pdf = renderer.RenderHtmlAsPdf(html)

        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

PDFreactor 使用一个配置对象,其中 HTML 内容被分配给 Document 属性,然后传递给 Convert() 方法,该方法会返回一个结果对象。 PDF 字节通过 result.Document 访问,必须使用 File.WriteAllBytes() 将其写入磁盘。

IronPDF 的ChromePdfRenderer使用 RenderHtmlAsPdf() 直接接受 HTML 并返回一个带有 SaveAs() 方法的PDF 文档对象。 这种模式消除了配置对象仪式,提供了更直观的 API。 有关 HTML 转 PDF 的详细指导,请参阅 HTML 转 PDF 教程

将 URL 转换为 PDF.

将网页转换为 PDF 也显示出类似的模式差异。

PDFreactor URL 转 PDF 方法:

// NuGet: Install-Package PDFreactor.Native.Windows.x64
using RealObjects.PDFreactor;
using System.IO;

class Program
{
    static void Main()
    {
       PDFreactorpdfReactor = new PDFreactor();

        Configuration config = new Configuration();
        config.Document = "https://www.example.com";

        Result result = pdfReactor.Convert(config);

        File.WriteAllBytes("webpage.pdf", result.Document);
    }
}
// NuGet: Install-Package PDFreactor.Native.Windows.x64
using RealObjects.PDFreactor;
using System.IO;

class Program
{
    static void Main()
    {
       PDFreactorpdfReactor = new PDFreactor();

        Configuration config = new Configuration();
        config.Document = "https://www.example.com";

        Result result = pdfReactor.Convert(config);

        File.WriteAllBytes("webpage.pdf", result.Document);
    }
}
Imports RealObjects.PDFreactor
Imports System.IO

Class Program
    Shared Sub Main()
        Dim pdfReactor As New PDFreactor()

        Dim config As New Configuration()
        config.Document = "https://www.example.com"

        Dim result As Result = pdfReactor.Convert(config)

        File.WriteAllBytes("webpage.pdf", result.Document)
    End Sub
End Class
$vbLabelText   $csharpLabel

IronPDF URL 转 PDF 方法:

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

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

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

        pdf.SaveAs("webpage.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

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

        pdf.SaveAs("webpage.pdf");
    }
}
Imports IronPdf
Imports System

Class Program
    Shared Sub Main()
        Dim renderer = New ChromePdfRenderer()

        Dim pdf = renderer.RenderUrlAsPdf("https://www.example.com")

        pdf.SaveAs("webpage.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

PDFreactor 对 HTML 字符串和 URL 使用相同的 Configuration.Document 属性--库会自动确定内容类型。IronPDF提供了专门的 RenderUrlAsPdf() 方法,该方法明确指出了正在执行的操作,使代码更加自文档化。 了解有关 URL 至 PDF 转换的更多信息,请参阅IronPDF文档。

页眉和页脚

通过添加页眉和页脚,我们可以发现这些库之间存在根本性的不同。

PDFreactor页眉和页脚(CSS分页媒体):

// NuGet: Install-Package PDFreactor.Native.Windows.x64
using RealObjects.PDFreactor;
using System.IO;

class Program
{
    static void Main()
    {
       PDFreactorpdfReactor = new PDFreactor();

        string html = "<html><body><h1>Document with Headers</h1><p>Content here</p></body></html>";

        Configuration config = new Configuration();
        config.Document = html;
        config.AddUserStyleSheet("@page { @top-center { content: 'Header Text'; } @bottom-center { content: 'Page ' counter(page); } }");

        Result result = pdfReactor.Convert(config);

        File.WriteAllBytes("document.pdf", result.Document);
    }
}
// NuGet: Install-Package PDFreactor.Native.Windows.x64
using RealObjects.PDFreactor;
using System.IO;

class Program
{
    static void Main()
    {
       PDFreactorpdfReactor = new PDFreactor();

        string html = "<html><body><h1>Document with Headers</h1><p>Content here</p></body></html>";

        Configuration config = new Configuration();
        config.Document = html;
        config.AddUserStyleSheet("@page { @top-center { content: 'Header Text'; } @bottom-center { content: 'Page ' counter(page); } }");

        Result result = pdfReactor.Convert(config);

        File.WriteAllBytes("document.pdf", result.Document);
    }
}
Imports RealObjects.PDFreactor
Imports System.IO

Module Program
    Sub Main()
        Dim pdfReactor As New PDFreactor()

        Dim html As String = "<html><body><h1>Document with Headers</h1><p>Content here</p></body></html>"

        Dim config As New Configuration()
        config.Document = html
        config.AddUserStyleSheet("@page { @top-center { content: 'Header Text'; } @bottom-center { content: 'Page ' counter(page); } }")

        Dim result As Result = pdfReactor.Convert(config)

        File.WriteAllBytes("document.pdf", result.Document)
    End Sub
End Module
$vbLabelText   $csharpLabel

IronPDF 页眉和页脚(基于 API):

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

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
        {
            CenterText = "Header Text"
        };

        renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
        {
            CenterText = "Page {page}"
        };

        string html = "<html><body><h1>Document with Headers</h1><p>Content here</p></body></html>";

        var pdf = renderer.RenderHtmlAsPdf(html);

        pdf.SaveAs("document.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();

        renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
        {
            CenterText = "Header Text"
        };

        renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
        {
            CenterText = "Page {page}"
        };

        string html = "<html><body><h1>Document with Headers</h1><p>Content here</p></body></html>";

        var pdf = renderer.RenderHtmlAsPdf(html);

        pdf.SaveAs("document.pdf");
    }
}
Imports IronPdf
Imports IronPdf.Rendering
Imports System

Module Program
    Sub Main()
        Dim renderer As New ChromePdfRenderer()

        renderer.RenderingOptions.TextHeader = New TextHeaderFooter() With {
            .CenterText = "Header Text"
        }

        renderer.RenderingOptions.TextFooter = New TextHeaderFooter() With {
            .CenterText = "Page {page}"
        }

        Dim html As String = "<html><body><h1>Document with Headers</h1><p>Content here</p></body></html>"

        Dim pdf = renderer.RenderHtmlAsPdf(html)

        pdf.SaveAs("document.pdf")
    End Sub
End Module
$vbLabelText   $csharpLabel

PDFreactor 使用 CSS 分页媒体语法,包含 @page 规则和 @top-center/@bottom-center 区域。 counter(page) 函数提供页码。 这种方法利用了 CSS 标准,但需要具备 CSS 知识,并通过 AddUserStyleSheet() 进行基于字符串的配置。

IronPdf 使用专用的 API,其中包含分配给 RenderingOptionsTextHeaderFooter 对象。 {page} 占位符提供页码。 这种方法提供 IntelliSense 支持、编译时检查和更易于发现的 API。 有关全面的页眉/页脚实现,请参阅页眉和页脚文档

API 映射参考

对于评估将PDFreactor移植到IronPDF的团队来说,了解 API 映射有助于估算开发工作量。

核心类

PDFreactorIronPDF
PDFreactor|ChromePdfRenderer`
配置ChromePdfRenderOptions
结果PDF 文档
config.文档RenderHtmlAsPdf(html)
result.Document (byte[])pdf.BinaryData

配置属性

PDFreactor 配置IronPdf 渲染选项
config.Document = htmlrenderer.RenderHtmlAsPdf(html)
config.Document = urlrenderer.RenderUrlAsPdf(url)
config.PageFormat = PageFormat.A4RenderingOptions.PaperSize = PdfPaperSize.A4
config.PageOrientationRenderingOptions.PaperOrientation
config.PageMarginsRenderingOptions.MarginTop/Bottom/Left/Right
config.EnableJavaScript=trueRenderingOptions.EnableJavaScript = true
config.AddUserStyleSheet(css)在 HTML 中嵌入 CSS
config.Titlepdf.MetaData.Title
config.加密pdf.SecuritySettings

PDFreactor中不可用的功能

IronPdf 特点说明
PdfDocument.Merge()合并多个 PDF
pdf.ApplyWatermark()添加水印
pdf.ExtractAllText()提取文本内容
pdf.CopyPages(start, end)提取特定页面
pdf.SecuritySettings密码保护和加密
pdf.Sign(证书)数字签名
pdf.Form.GetFieldByName(name).Value表格填写

PDFreactor 仅专注于转换,而IronPDF则提供完整的 PDF 生命周期管理。 有关 PDF 操作功能,请参阅 合并和拆分 PDF 指南

Java 依赖性问题

PDFreactor 基于 Java 的架构给 .NET 环境带来了巨大挑战:

-需要 Java 运行时环境:必须在所有服务器上安装和维护 JRE/JDK -服务器架构:作为独立服务运行,需要调用 REST API 服务 -复杂部署:需要在 CI/CD 管道中管理两种运行时环境(Java + .NET) -网络延迟:每次 PDF 转换都需要与服务器进行 HTTP 往返通信。 -独立基础设施:额外的服务器用于监控、扩展和维护 -许可复杂性:每个服务器的许可都与 Java 服务实例绑定。 -运营开销:需要维护、监控和更新两个运行时环境

IronPDF 作为本地 .NET 库在进程中运行,从而消除了这些挑战。 无需安装 Java、无需服务器配置、无需网络延迟--只需 NuGet 软件包参考。

功能对比摘要

特点/方面PDFreactorIronPDF
本地 .NET 库否(基于 Java)
跨平台能力是(依赖于 Java)是(捆绑 Chromium)
CSS支持对 CSS3、CSS 分页媒体的高级支持通过 Chromium 实现全面的 HTML5/CSS3
部署复杂性因 Java 而更加复杂简单,直接与 .NET 集成
PDF 操作功能基础(仅限生成)广泛(合并、拆分、编辑、注释)
许可模式商业翻译商业翻译
主要用例高保真、复杂的文档在 .NET 应用程序中用途广泛、易于使用
页眉/页脚CSS 分页媒体(@page 规则)基于 API(TextHeaderFooter 对象)
JavaScript 执行支持支持(Chromium 引擎)

仅靠PDFreactor无法实现需要添加水印、PDF 合并、文本提取或表单填写等功能的应用。

CSS 分页媒体与基于 API 的方法

PDFreactor 的优势在于 CSS 分页媒体支持--使用 @page, @top-centercounter(page) 等标准 CSS 规则进行文档格式化。 这种方法有利于拥有丰富 CSS 专业知识的团队。

IronPdf 使用基于 API 的方法,具有专用对象,如 TextHeaderFooterHtmlHeaderFooter 。 这将提供

  • 支持 IntelliSense 以提高可发现性
  • 编译时类型检查
  • 无需维护基于字符串的 CSS
  • 更容易调试和测试

团队必须评估是否存在 CSS 分页媒体专业技术,或者基于 API 的配置是否更可取。

团队何时考虑从PDFreactor迁移到 IronPDF?

有几个因素促使团队将 IronPdf 作为PDFreactor的替代品进行评估:

部署简化:PDFreactor需要 Java 运行时安装、服务器配置和 REST API 集成。IronPDF以单个 NuGet 包的形式部署,没有外部依赖性。

基础设施精简:PDFreactor需要单独的服务器基础设施来托管 Java 服务。IronPDF 以进程内方式运行,无需额外的服务器进行监控和维护。

原生 .NET 集成:PDFreactor的 Java 架构在 .NET 环境中造成了集成障碍。IronPDF以熟悉的模式提供了本地 .NET API。

PDF 处理需求:PDFreactor专注于转换。 需要进行文档操作(合并、拆分、水印)的应用程序需要IronPDF的扩展功能。

CI/CD 简化:在 .NET CI/CD 管道中管理 Java 依赖项会增加复杂性。IronPDF简化了标准 NuGet 还原的管道。

降低延迟:PDFreactor的网络往返会给每次转换增加延迟。IronPDF的进程内架构消除了网络开销。

安装比较

PDFreactor 安装:

Install-Package PDFreactor.Native.Windows.x64
Install-Package PDFreactor.Native.Windows.x64
SHELL

Plus Java 运行时安装和服务器配置。

安装 IronPdf:

Install-Package IronPdf
Install-Package IronPdf
SHELL

IronPdf 需要配置许可证密钥:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

IronPDF 的首次运行会下载 Chromium 渲染引擎(一次性约 150MB)。 对于 Linux 部署,需要额外的系统依赖性。 该库支持 .NET Framework、.NET Core、.NET 5+,并向前兼容到 .NET 10 和 C# 14。

做出决定

在PDFreactor和IronPDF之间做出选择取决于您的项目要求和现有基础设施:

如果满足以下条件,请考虑使用 PDFreactor:您的项目需要高保真渲染和广泛的 CSS 分页媒体支持,您的团队拥有强大的 CSS 专业知识,您可以处理 Java 依赖项,并且仅转换功能就足够了。

如果您符合以下条件,请考虑使用 IronPDF:您正在 .NET 环境中进行开发并希望实现无缝集成;您希望消除 Java 依赖项和服务器基础架构;您需要对 PDF 进行转换以外的操作;您更喜欢基于 API 的配置而不是 CSS 字符串;或者您希望简化部署和 CI/CD 管道。

对于大多数现代 .NET 应用程序,特别是那些优先考虑部署简便性、本地集成和扩展 PDF 功能的应用程序,IronPDF 与PDFreactor基于 Java 的服务器方法相比具有显著的架构优势。

开始使用 IronPDF

如需评估 IronPdf 是否满足您的 PDF 生成需求,请联系我们:

1.通过 NuGet 安装:安装-打包 IronPdf 2.查看 入门文档</a 3.探索 HTML 转 PDF 教程 的转换模式 4.请查看 API 参考 以获取完整的方法文档

IronPDF 教程提供了全面的示例,涵盖从基本转换到高级 PDF 操作的常见场景。