跳至頁尾內容
移民指南

如何在 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 生命週期管理。


開始之前

先決條件

  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 套件變更

# 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
SHELL

許可證配置

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");
$vbLabelText   $csharpLabel

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";
$vbLabelText   $csharpLabel

確定 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" .
SHELL

完整 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;
$vbLabelText   $csharpLabel

核心類別映射

PDF反應器IronPDF筆記
PDFreactorChromePdfRenderer主轉換類
ConfigurationChromePdfRenderOptionsPDF 設定
ResultPdfDocument輸出文件
config.Document = htmlrenderer.RenderHtmlAsPdf(html)HTML 輸入
result.Document (byte[])pdf.BinaryData原始位元組

配置屬性映射

PDF反應器 配置IronPDF渲染選項筆記
config.Document = htmlrenderer.RenderHtmlAsPdf(html)HTML 內容
config.Document = urlrenderer.RenderUrlAsPdf(url)URL轉換
config.PageFormat = PageFormat.A4RenderingOptions.PaperSize = PdfPaperSize.A4紙張尺寸
config.PageOrientationRenderingOptions.PaperOrientation方向
config.PageMarginsRenderingOptions.MarginTop/Bottom/Left/Right頁邊距(毫米)
config.EnableJavaScript = trueRenderingOptions.EnableJavaScript = trueJS執行
config.AddUserStyleSheet(css)在 HTML 中嵌入 CSSCSS注入
config.Titlepdf.MetaData.Title元數據
config.Encryptionpdf.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);
    }
}
$vbLabelText   $csharpLabel

(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");
    }
}
$vbLabelText   $csharpLabel

根本差別在於建築模式。 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);
    }
}
$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://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");
    }
}
$vbLabelText   $csharpLabel

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);
    }
}
$vbLabelText   $csharpLabel

(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");
    }
}
$vbLabelText   $csharpLabel

這個例子展示了最顯著的語法差異。 PDF反應器 使用 CSS 分頁媒體語法和@page規則、 @top-center / @bottom-center區域以及透過AddUserStyleSheet()注入的頁碼的counter(page)

IronPDF 使用原生 .NET API,將TextHeaderFooter物件指派給RenderingOptions.TextHeaderRenderingOptions.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();
$vbLabelText   $csharpLabel

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}" 
};
$vbLabelText   $csharpLabel

頁碼佔位符語法

// 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}
$vbLabelText   $csharpLabel

結果處理變更

配置 + 結果模式變成直接 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;
$vbLabelText   $csharpLabel

利潤單位變化

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
$vbLabelText   $csharpLabel

遷移後的新功能

遷移到 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");
$vbLabelText   $csharpLabel

水印

pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");
pdf.ApplyWatermark("<h2 style='color:red;'>CONFIDENTIAL</h2>");
$vbLabelText   $csharpLabel

文字擷取

string text = pdf.ExtractAllText();
string text = pdf.ExtractAllText();
$vbLabelText   $csharpLabel

密碼保護

pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
pdf.SecuritySettings.UserPassword = "userpassword";
pdf.SecuritySettings.OwnerPassword = "ownerpassword";
$vbLabelText   $csharpLabel

功能對比總結

特徵PDF反應器IronPDF
HTML 轉 PDF
PDF檔案的URL
頁首/頁尾CSS 分頁媒體原生 API
頁面設定
JavaScript 支援
Native .NET
進行中
合併PDF
拆分PDF
水印
文字擷取
表格填寫
數位簽名

遷移清單

遷移前

  • 清點程式碼庫中所有 PDF反應器 的使用情況
  • 記錄所有使用的 CSS 分頁媒體規則
  • 注意所有組態設定(邊距、頁面大小、JavaScript)
  • 規劃 IronPDF 許可證密鑰儲存(建議使用環境變數)
  • 先使用 IronPDF 試用許可證進行測試

軟體包變更

  • 刪除PDFreactor.NET NuGet 套件
  • 刪除PDFreactor.Native.Windows.x64 NuGet 套件 安裝IronPdf NuGet 套件: 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 的執行情況
  • 根據需要新增功能(合併、浮水印、安全)。

柯蒂斯·週
技術撰稿人

Curtis Chau擁有卡爾頓大學電腦科學學士學位,專長於前端開發,精通Node.js、TypeScript、JavaScript和React。他熱衷於打造直覺美觀的使用者介面,喜歡使用現代框架,並擅長撰寫結構清晰、視覺效果出色的使用者手冊。

除了開發工作之外,柯蒂斯對物聯網 (IoT) 也抱有濃厚的興趣,致力於探索硬體和軟體整合的創新方法。閒暇時,他喜歡玩遊戲和製作 Discord 機器人,將他對科技的熱愛與創造力結合。