如何用 C# 从 PDFreactor 迁移到 IronPDF
从PDFreactor迁移到 IronPDF:完整的 C# 迁移指南
从PDFreactor迁移到IronPDF可消除 Java 依赖性和服务器基础架构,同时通过本地 .NET 库提供等效的 HTML 到 PDF 转换功能。 本指南提供了一个完整的、循序渐进的迁移路径,将您基于 Java 的服务器架构替换为可无缝集成到 .NET 应用程序中的进程内库。
为什么要从PDFreactor迁移到 IronPDF.
了解 PDFreactor。
PDFreactor 是一款功能强大的 HTML 到 PDF 转换服务器,可跨平台集成。 作为一种商业解决方案,PDFreactor 利用其专有技术将 HTML 和 CSS 内容转换为高质量的 PDF 文档。PDFreactor的显著属性包括支持大量 CSS 属性,这使其成为复杂布局渲染的有力候选工具。
然而,PDFreactor 对 Java 的依赖给 .NET 环境带来了一定的挑战,因为 Java 的非本地性质可能会使部署和集成复杂化。 在 .NET 应用程序中,对 Java 的依赖会产生额外的开销,通常需要额外的集成工作。
Java 依赖性问题
PDFreactor 的架构给 .NET 环境带来了一些挑战:
1.需要 Java 运行时:要求在所有服务器上安装 JRE/JDK。
2.服务器架构:作为独立服务运行,需要额外的基础设施。 作为基于服务器的解决方案,PDFreactor 的每次转换都需要调用 REST API。
3.复杂部署:在以 .NET 为主的生态系统中管理 Java 依赖关系会使设置复杂化并增加维护成本。 在 CI/CD 管道中管理两种运行时(Java + .NET)。
4.进程间通信:REST API 或套接字通信会增加延迟。 每次 PDF 转换都需要 HTTP 服务器往返。
5.独立的许可证管理:许可证绑定到服务器实例,而不是应用程序。 与 Java 服务实例绑定的每服务器许可。
6.资源隔离:独立的进程内存和 CPU 管理。 需要监控、扩展和维护额外的服务器。
PDFreactor与IronPDF对比
| 特点/方面 | PDFreactor | IronPDF |
|---|---|---|
| 本地 .NET 库 | 否(基于 Java) | 是 |
| 运行时 | Java(外部服务器) | 本地 .NET(翻译中) |
| 架构 | REST API 服务 | NuGet 库 |
| 部署 | Java + 服务器配置 | 单个 NuGet 软件包 |
| 依赖关系 | JRE + HTTP 客户端 | 自成一体 |
| 延迟 | 网络往返 | 直接方法调用 |
| 跨平台能力 | 是(依赖于 Java) | 是(捆绑 Chromium) |
| CSS支持 | 对 CSS3、CSS 分页媒体的高级支持 | 全面支持 HTML5/CSS3 |
| 部署复杂性 | 因 Java 而更加复杂 | 简单,直接与 .NET 集成 |
| PDF 操作功能 | 基础(仅限生成) | 广泛,包括合并、拆分、编辑和注释 |
IronPDF for .NET 与PDFreactor不同,它是一个本地 .NET 库,专门设计用于无缝集成到 .NET 项目中,而不需要像 Java 这样的外部依赖关系。 IronPdf 使用捆绑的 Chromium 渲染引擎,只需几行代码即可将 HTML 转换为 PDF。
对于计划在 2025 年和 2026 年之前采用 .NET 10 和 C# 14 的团队,IronPDF 提供了一个本地 .NET 解决方案,消除了 Java 服务器的复杂性,同时提供全面的 PDF 生命周期管理。
开始之前
前提条件
1..NET环境:.NET Framework 4.6.2+ 或 .NET Core 3.1+ / .NET 5/6/7/8/9+ 2.NuGet 访问:安装 NuGet 软件包的能力 3.IronPDF 许可证:从 ironpdf.com 获取许可证密钥
NuGet 软件包变更
# RemovePDFreactorNuGet packages
dotnet remove package PDFreactor.NET
dotnet remove package PDFreactor.Native.Windows.x64
# StopPDFreactorserver service (if running locally)
# Windows: net stop PDFreactor
# Linux: sudo systemctl stop pdfreactor
# Install IronPDF
dotnet add package IronPdf# RemovePDFreactorNuGet packages
dotnet remove package PDFreactor.NET
dotnet remove package PDFreactor.Native.Windows.x64
# StopPDFreactorserver service (if running locally)
# Windows: net stop PDFreactor
# Linux: sudo systemctl stop pdfreactor
# Install IronPDF
dotnet add package IronPdf许可配置
PDFreactor(基于服务器):
// License configured on server via config file or command line
// Client connects to licensed server
var pdfReactor = new PDFreactor("http://pdfreactor-server:9423");// License configured on server via config file or command line
// Client connects to licensed server
var pdfReactor = new PDFreactor("http://pdfreactor-server:9423");IRON VB CONVERTER ERROR developers@ironsoftware.comIronPDF(应用级):
// One-time setup at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY";// One-time setup at application startup
IronPdf.License.LicenseKey = "YOUR-IRONPDF-LICENSE-KEY";IRON VB CONVERTER ERROR developers@ironsoftware.com确定PDFreactor的用法
# FindPDFreactorusage
grep -r "PDFreactor\|RealObjects\|Configuration.*Document" --include="*.cs" .
# FindCSS 分页媒体rules to convert
grep -r "@page\|counter(page)\|counter(pages)" --include="*.cs" --include="*.css" .# FindPDFreactorusage
grep -r "PDFreactor\|RealObjects\|Configuration.*Document" --include="*.cs" .
# FindCSS 分页媒体rules to convert
grep -r "@page\|counter(page)\|counter(pages)" --include="*.cs" --include="*.css" .完整的 API 参考
命名空间变更
// Before: PDFreactor
using RealObjects.PDFreactor;
using System.IO;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;// Before: PDFreactor
using RealObjects.PDFreactor;
using System.IO;
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;IRON VB CONVERTER ERROR developers@ironsoftware.com核心类映射
| PDFreactor | IronPDF | 备注 |
|---|---|---|
| <代码>PDFreactor</代码 | <代码>ChromePdfRenderer</代码 | 主要转换类 |
| <代码>配置</代码 | <代码>ChromePdfRenderOptions</代码 | PDF 设置 |
| <代码>结果</代码 | <代码>PDF 文档</代码 | 输出文件 |
| <代码>config.Document = html</代码 | <代码>renderer.RenderHtmlAsPdf(html)</代码 | HTML 输入 |
result.Document (byte[]) | <代码>pdf.BinaryData</代码 | 原始字节 |
配置属性映射
| PDFreactor 配置 | IronPdf 渲染选项 | 备注 |
|---|---|---|
| <代码>config.Document = html</代码 | <代码>renderer.RenderHtmlAsPdf(html)</代码 | HTML 内容 |
| <代码>config.Document = url</ 代码 | <代码>renderer.RenderUrlAsPdf(url)</代码 | URL 转换 |
| <代码>config.PageFormat = PageFormat.A4</ 代码 | <代码>RenderingOptions.PaperSize = PdfPaperSize.A4</ 代码 | 纸张大小 |
| <代码>config.PageOrientation</代码 | <代码>RenderingOptions.PaperOrientation</代码 | 定位 |
| <代码>config.PageMargins</代码 | <代码>RenderingOptions.MarginTop/Bottom/Left/Right</代码 | 边距(毫米) |
config.EnableJavaScript=true | <代码>RenderingOptions.EnableJavaScript = true</ 代码 | JS 执行 |
| <代码>config.AddUserStyleSheet(css)</代码 | 在 HTML 中嵌入 CSS | CSS 注入 |
| <代码>config.Title</代码 | <代码>pdf.MetaData.Title</代码 | 元数据 |
| <代码>config.加密</代码 | <代码>pdf.SecuritySettings</代码 | 安全性 |
PDFreactor中不提供的新功能
| IronPdf 特点 | 说明 |
|---|---|
| <代码>PdfDocument.Merge()</代码 | 合并多个 PDF |
| <代码>pdf.ApplyWatermark()</代码 | 添加水印 |
| <代码>pdf.ExtractAllText()</代码 | 文本提取 |
| <代码>pdf.Form</代码 | 表格填写 |
| <代码>pdf.Sign()</代码 | 数字签名 |
代码迁移示例
示例 1:HTML 字符串到 PDF 的转换
之前(PDFreactor):
// 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);
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comAfter (IronPDF):
// 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.com最根本的区别在于架构模式。PDFreactor需要创建一个<代码>PDFreactor</代码实例(连接到 Java 服务器)、一个单独的<代码>配置</代码对象来保存设置和 HTML 内容,调用 Convert() 返回一个<代码>结果</代码对象,最后使用 File.WriteAllBytes() 将 result.Document 字节写入文件。
IronPDF 将此简化为创建一个 ChromePdfRenderer, 使用 HTML 字符串直接调用 RenderHtmlAsPdf(), 并在返回的<代码>PDF 文档</代码上使用内置的 SaveAs() 方法。 无服务器连接、无配置对象、无手动字节处理。 请参阅 HTML 转 PDF 文档,了解全面的示例。
示例 2:URL 到 PDF 的转换
之前(PDFreactor):
// 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);
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comAfter (IronPDF):
// 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comPDFreactor 对 HTML 字符串和 URL 使用相同的 config.Document 属性,并自动确定类型。 IronPdf 提供了明确的方法:RenderHtmlAsPdf() 用于 HTML 字符串,RenderUrlAsPdf() 用于 URL。 这种明确的方法可以提高代码的清晰度和 IntelliSense 支持。 在我们的教程中了解更多信息。
示例 3:带页码的页眉和页脚
之前(PDFreactor):
// 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);
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comAfter (IronPDF):
// 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.com本例显示了最明显的语法差异。PDFreactor使用 CSS 分页媒体语法,其中包含 @page 规则、@top-center/@bottom-center 区域和 counter(page) 用于通过 AddUserStyleSheet() 注入页码。
IronPDF 使用本地 .NET API,其中 TextHeaderFooter 对象分配给 RenderingOptions.TextHeader 和 RenderingOptions.TextFooter 。 页码使用 {page} 占位符,而不是 CSS counter(page) 。 请注意,IronPDF 还要求导入IronPdf.Rendering命名空间中的页眉/页脚类。
关键迁移说明
无需服务器
IronPDF 在进程中运行--无需配置 Java 服务器:
// PDFreactor: Requires server connection
var pdfReactor = new PDFreactor("http://localhost:9423");
// IronPDF: No server URL needed
var renderer = new ChromePdfRenderer();// PDFreactor: Requires server connection
var pdfReactor = new PDFreactor("http://localhost:9423");
// IronPDF: No server URL needed
var renderer = new ChromePdfRenderer();IRON VB CONVERTER ERROR developers@ironsoftware.com将 CSS 分页媒体转换为IronPDFAPI.
用 RenderingOptions 替换 CSS @page 规则:
//PDFreactorCSS: @page { @bottom-center { content: 'Page ' counter(page); } }
//IronPDFequivalent:
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
CenterText = "Page {page}"
};//PDFreactorCSS: @page { @bottom-center { content: 'Page ' counter(page); } }
//IronPDFequivalent:
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
CenterText = "Page {page}"
};IRON VB CONVERTER ERROR developers@ironsoftware.com页码占位符语法
//PDFreactorCSS: counter(page)
// IronPDF: {page}
//PDFreactorCSS: counter(pages)
// IronPDF: {total-pages}//PDFreactorCSS: counter(page)
// IronPDF: {page}
//PDFreactorCSS: counter(pages)
// IronPDF: {total-pages}IRON VB CONVERTER ERROR developers@ironsoftware.com结果处理更改
配置 + 结果模式直接变成 PdfDocument:
// PDFreactor: Configuration → Convert → Result → bytes
Result result = pdfReactor.Convert(config);
byte[] bytes = result.Document;
File.WriteAllBytes("output.pdf", bytes);
// IronPDF: Direct PdfDocument with built-in methods
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Or: byte[] bytes = pdf.BinaryData;// PDFreactor: Configuration → Convert → Result → bytes
Result result = pdfReactor.Convert(config);
byte[] bytes = result.Document;
File.WriteAllBytes("output.pdf", bytes);
// IronPDF: Direct PdfDocument with built-in methods
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Or: byte[] bytes = pdf.BinaryData;IRON VB CONVERTER ERROR developers@ironsoftware.com边际单位变化
PDFreactor 使用字符串; IronPdf 使用毫米:
// PDFreactor: config.PageMargins.Top = "1in"
// IronPDF: renderer.RenderingOptions.MarginTop = 25.4 // 1 inch in mm// PDFreactor: config.PageMargins.Top = "1in"
// IronPDF: renderer.RenderingOptions.MarginTop = 25.4 // 1 inch in mmIRON VB CONVERTER ERROR developers@ironsoftware.com迁移后的新功能
迁移到IronPDF后,您将获得PDFreactor无法提供的功能:
PDF 合并
var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");var pdf1 = PdfDocument.FromFile("document1.pdf");
var pdf2 = PdfDocument.FromFile("document2.pdf");
var merged = PdfDocument.Merge(pdf1, pdf2);
merged.SaveAs("merged.pdf");IRON VB CONVERTER ERROR developers@ironsoftware.com水印
pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");IRON VB CONVERTER ERROR developers@ironsoftware.com文本提取
string text = pdf.ExtractAllText();string text = pdf.ExtractAllText();Dim text As String = pdf.ExtractAllText()密码保护
pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";IRON VB CONVERTER ERROR developers@ironsoftware.com功能对比摘要
| 特征 | PDFreactor | IronPDF |
|---|---|---|
| HTML 至 PDF | ✓ | ✓ |
| URL 至 PDF | ✓ | ✓ |
| 页眉/页脚 | CSS 分页媒体 | 本地 API |
| 页面设置 | ✓ | ✓ |
| JavaScript 支持 | ✓ | ✓ |
| 本地 .NET | ✗ | ✓ |
| 翻译中 | ✗ | ✓ |
| 合并 PDF | ✗ | ✓ |
| 拆分 PDF | ✗ | ✓ |
| 水印 | ✗ | ✓ |
| 文本提取 | ✗ | ✓ |
| 表格填写 | ✗ | ✓ |
| 数字签名 | ✗ | ✓ |
迁移清单
迁移前
- [清点代码库中所有PDFreactor的使用情况
- [ ] 记录使用的所有 CSS 分页媒体规则
- [ ] 注意所有配置设置(页边距、页面大小、JavaScript)
- [ ] 计划 IronPdf 许可证密钥存储(建议使用环境变量)
- [ ] 先使用 IronPdf 试用版许可证进行测试
软件包变更
- [ ] 删除
PDFreactor.NETNuGet 软件包 - [ ] 删除
PDFreactor.Native.Windows.x64NuGet 软件包 - [ ] 安装
IronPDFNuGet 软件包:<代码>dotnet 添加软件包 IronPdf
代码更改
- [ ] 更新命名空间导入(
使用 RealObjects.PDFreactor;→使用 IronPdf;) - [ ] 为页眉/页脚类添加
using IronPdf.Rendering; - [ ] 使用<代码>ChromePdfRenderer</代码替换<代码>PDFreactor</代码类
- [ ] 将<代码>配置</代码对象转换为
RenderingOptions属性 - [ ] 使用<代码>renderer.RenderHtmlAsPdf(html)</代码替换<代码>config.Document = html</代码。
- [ ] 将<代码>config.Document = url</ 代码替换为<代码>renderer.RenderUrlAsPdf(url)</代码。
- [ ] 将
File.WriteAllBytes(path, result.Document)替换为pdf.SaveAs(path)。 - [ ] 将 CSS
@page规则转换为TextHeader/TextFooter对象 - [ ] 更新页码占位符 (
counter(page)→{page}) - [ ] 将边距单位从字符串转换为毫米
基础架构迁移
- [ ] 删除 Java 运行时要求
- [解散PDFreactor服务器
- [更新 Docker/部署配置
- [更新 CI/CD 管道
后迁移
- [ ] 测试 PDF 输出质量是否符合预期
- [ ] 验证页眉/页脚渲染
- [ ] 如果使用 JavaScript,则验证其执行情况
- [ ] 根据需要添加新功能(合并、水印、安全)。
结论
从PDFreactor迁移到IronPDF可以消除 Java 依赖性和服务器基础架构,同时提供同等的 HTML 转 PDF 功能。 在PDFreactor和IronPDF之间选择合适的工具主要取决于具体的项目要求和现有的基础设施。 如果您的项目需要高保真渲染和广泛的 CSS 支持,并且能够处理 Java 依赖关系,PDFreactor 将是您的最佳选择。 相反,如果您是在 .NET 环境中进行开发,并希望实现无缝集成和广泛的 PDF 功能,IronPDF for .NET 则是更合适的选择。
本次迁移的主要变化有 1.架构:基于服务器的 Java 服务 → 进程中的 .NET 库 2.主类:<代码>PDFreactor</代码> → <代码>ChromePdfRenderer</代码 3.配置:Configuration 对象 → RenderingOptions 属性 4.HTML 转换:<代码>config.Document</代码> + <代码>Convert()</代码> → <代码>RenderHtmlAsPdf()</代码 5.URL 转换:<代码>config.Document</代码> + <代码>Convert()</代码> → <代码>RenderUrlAsPdf()</代码 6.输出:<代码>result.Document</代码> + <代码>File.WriteAllBytes()</代码> → <代码>pdf.SaveAs()</代码 7.页眉/页脚:CSS @page 规则 → TextHeaderFooter 对象 8.页码:<代码>counter(page)</代码> → <代码>{page}</代码 9.新功能:PDF 合并、水印、文本提取、数字签名等功能
这些工具的主要优点包括:简化架构,无需单独的服务器进程;原生 .NET 集成,可直接调用 API 而不是 REST/IPC;降低复杂性,只需一个 NuGet 包,而不是 Java 运行时加服务器;除转换外,还支持完整的 PDF 生命周期,包括合并、分割、编辑和签名。






