如何在 C# 中將 PDFreactor 遷移到 IronPDF
從 PDF反應器 遷移到 IronPDF 可以消除 Java 依賴項和伺服器基礎設施,同時透過原生 .NET 程式庫提供等效的 HTML 到 PDF 轉換功能。 本指南提供了一個完整的、逐步的遷移路徑,將您的基於 Java 的伺服器架構替換為可無縫整合到 .NET 應用程式中的進程內程式庫。
為什麼要從 PDF反應器 遷移到 IronPDF
了解 PDFreactor
PDFreactor 是一個功能強大的 HTML 轉 PDF 轉換伺服器,可跨多個平台整合。 作為商業解決方案,PDFreactor 利用其專有技術將 HTML 和 CSS 內容轉換為高品質的 PDF 文件。 PDF反應器 的顯著特點之一是支援多種 CSS 屬性,這使其成為複雜佈局渲染的理想選擇。
然而,PDFreactor 對 Java 的依賴在 .NET 環境中帶來了一些挑戰,其非原生特性可能會使部署和整合變得複雜。 它對 Java 的依賴會為 .NET 應用程式帶來額外的開銷,通常需要額外的整合工作。
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 管理。 用於監控、擴展和維護的額外伺服器。
PDF反應器 與 IronPDF 的比較
| 特徵/方面 | PDF反應器 | IronPDF |
|---|---|---|
| 原生 .NET 函式庫 | 否(基於 Java 的) | 是的 |
| 運行時 | Java(外部伺服器) | 原生 .NET(進程內) |
| 建築學 | REST API 服務 | NuGet 函式庫 |
| 部署 | Java + 伺服器配置 | 單一 NuGet 套件 |
| 依賴關係 | JRE + HTTP 用戶端 | 自給自足 |
| 延遲 | 網路往返 | 直接方法調用 |
| 跨平台能力 | 是的(依賴Java) | 是的(捆綁式鉻) |
| CSS 支援 | 對 CSS3 和 CSS 分頁媒體的高級支持 | 全面支援 HTML5/CSS3 |
| 部署複雜性 | 由於 Java 的原因,情況變得更加複雜。 | 簡單易用,可直接與 .NET 集成 |
| PDF 處理功能 | 基本(僅限生成) | 功能強大,包括合併、拆分、編輯和註釋。 |
與 PDF反應器 不同,IronPDF 是一個原生 .NET 程式庫,專門設計用於無縫整合到 .NET 專案中,而無需 Java 等外部依賴項。 IronPDF 使用捆綁的 Chromium 渲染引擎,只需幾行程式碼即可將 HTML 轉換為 PDF。
對於計劃在 2025 年和 2026 年採用 .NET 10 和 C# 14 的團隊,IronPDF 提供了一個原生的 .NET 解決方案,消除了 Java 伺服器的複雜性,同時提供了全面的 PDF 生命週期管理。
開始之前
先決條件
- .NET 環境: .NET Framework 4.6.2+ 或 .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet 存取權限:能夠安裝 NuGet 套件
- IronPDF 許可證:請從ironpdf.com取得您的許可證密鑰。
NuGet 套件變更
# Remove PDF反應器 NuGet packages
dotnet remove package PDFreactor.NET
dotnet remove package PDFreactor.Native.Windows.x64
# Stop PDF反應器 server service (if running locally)
# Windows: net stop PDFreactor
# Linux: sudo systemctl stop pdfreactor
# Install IronPDF
dotnet add package IronPdf# Remove PDF反應器 NuGet packages
dotnet remove package PDFreactor.NET
dotnet remove package PDFreactor.Native.Windows.x64
# Stop PDF反應器 server 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");IronPDF(應用層):
// 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";確定 PDF反應器 的使用情況
# Find PDF反應器 usage
grep -r "PDFreactor\|RealObjects\|Configuration.*Document" --include="*.cs" .
# Find CSS 分頁媒體 rules to convert
grep -r "@page\|counter(page)\|counter(pages)" --include="*.cs" --include="*.css" .# Find PDF反應器 usage
grep -r "PDFreactor\|RealObjects\|Configuration.*Document" --include="*.cs" .
# Find CSS 分頁媒體 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;核心類別映射
| PDF反應器 | IronPDF | 筆記 |
|---|---|---|
PDFreactor | ChromePdfRenderer | 主轉換類 |
Configuration | ChromePdfRenderOptions | PDF 設定 |
Result | PdfDocument | 輸出文件 |
config.Document = html | renderer.RenderHtmlAsPdf(html) | HTML 輸入 |
result.Document (byte[]) | pdf.BinaryData | 原始位元組 |
配置屬性映射
| PDF反應器 配置 | 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.Encryption | pdf.SecuritySettings | 安全 |
PDF反應器 中尚未提供新功能
| 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()
{
PDF反應器 pdfReactor = 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()
{
PDF反應器 pdfReactor = 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);
}
}(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");
}
}根本差別在於建築模式。 PDF反應器 需要建立一個PDFreactor實例(連接到 Java 伺服器),一個單獨的Configuration物件來保存設定和 HTML 內容,呼叫Convert()函數傳回一個Result對象,最後使用File.WriteAllBytes()將result.Document位元組寫入檔案。
IronPDF 將此程序簡化為建立一個ChromePdfRenderer ,直接使用 HTML 字串呼叫RenderHtmlAsPdf() ,然後對傳回的PdfDocument使用內建的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()
{
PDF反應器 pdfReactor = 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()
{
PDF反應器 pdfReactor = new PDFreactor();
Configuration config = new Configuration();
config.Document = "https://www.example.com";
Result result = pdfReactor.Convert(config);
File.WriteAllBytes("webpage.pdf", result.Document);
}
}(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");
}
}PDFreactor 對 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()
{
PDF反應器 pdfReactor = 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()
{
PDF反應器 pdfReactor = 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);
}
}(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");
}
}這個例子展示了最顯著的語法差異。 PDF反應器 使用 CSS 分頁媒體語法和@page規則、 @top-center / @bottom-center區域以及透過AddUserStyleSheet()注入的頁碼的counter(page) 。
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();CSS 分頁媒體到 IronPDF API
將 CSS @page規則替換為 RenderingOptions:
// PDF反應器 CSS: @page { @bottom-center { content: 'Page ' counter(page); } }
// IronPDF equivalent:
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
CenterText = "Page {page}"
};// PDF反應器 CSS: @page { @bottom-center { content: 'Page ' counter(page); } }
// IronPDF equivalent:
renderer.RenderingOptions.TextFooter = new TextHeaderFooter
{
CenterText = "Page {page}"
};頁碼佔位符語法
// PDF反應器 CSS: counter(page)
// IronPDF: {page}
// PDF反應器 CSS: counter(pages)
// IronPDF: {total-pages}// PDF反應器 CSS: counter(page)
// IronPDF: {page}
// PDF反應器 CSS: counter(pages)
// IronPDF: {total-pages}結果處理變更
配置 + 結果模式變成直接 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;利潤單位變化
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 mm遷移後的新功能
遷移到 IronPDF 後,您將獲得 PDF反應器 無法提供的功能:
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");水印
pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");文字擷取
string text = pdf.ExtractAllText();string text = pdf.ExtractAllText();密碼保護
pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";功能對比總結
| 特徵 | PDF反應器 | IronPDF |
|---|---|---|
| HTML 轉 PDF | ✓ | ✓ |
| PDF檔案的URL | ✓ | ✓ |
| 頁首/頁尾 | CSS 分頁媒體 | 原生 API |
| 頁面設定 | ✓ | ✓ |
| JavaScript 支援 | ✓ | ✓ |
| Native .NET | ✗ | ✓ |
| 進行中 | ✗ | ✓ |
| 合併PDF | ✗ | ✓ |
| 拆分PDF | ✗ | ✓ |
| 水印 | ✗ | ✓ |
| 文字擷取 | ✗ | ✓ |
| 表格填寫 | ✗ | ✓ |
| 數位簽名 | ✗ | ✓ |
遷移清單
遷移前
- 清點程式碼庫中所有 PDF反應器 的使用情況
- 記錄所有使用的 CSS 分頁媒體規則
- 注意所有組態設定(邊距、頁面大小、JavaScript)
- 規劃 IronPDF 許可證密鑰儲存(建議使用環境變數)
- 先使用 IronPDF 試用許可證進行測試
軟體包變更
- 刪除
PDFreactor.NETNuGet 套件 - 刪除
PDFreactor.Native.Windows.x64NuGet 套件 安裝IronPdfNuGet 套件:dotnet add package IronPdf
程式碼更改
- 更新命名空間導入(
using RealObjects.PDFreactor;→using IronPdf;) - 新增
using IronPdf.Rendering;用於頁首/頁尾類 - 將
PDFreactor類別替換為ChromePdfRenderer - 將
Configuration物件轉換為RenderingOptions屬性 - 將
config.Document = html替換為renderer.RenderHtmlAsPdf(html) - 將
config.Document = url替換為renderer.RenderUrlAsPdf(url) - 將
File.WriteAllBytes(path, result.Document)替換為pdf.SaveAs(path) - 將 CSS
@page規則轉換為TextHeader/TextFooter對象 - 更新頁碼佔位符(
counter(page)→{page}) - 將邊距單位從字串轉換為毫米
基礎設施遷移
- 移除 Java 執行時間要求
- 停用 PDF反應器 伺服器
- 更新 Docker/部署配置
- 更新 CI/CD 管線
移民後
- 測試 PDF 輸出品質符合預期
- 驗證頁首/頁尾渲染效果
- 如果使用,請驗證 JavaScript 的執行情況
- 根據需要新增功能(合併、浮水印、安全)。






