PDFreactor vs IronPDF:技術比較指南
當 .NET 開發人員需要將 HTML 轉換為 PDF 時,他們會遇到架構截然不同的程式庫。PDFreactor作為一個基於 Java 的轉換伺服器,擁有優異的CSS 分頁媒體支援,而IronPDF則提供一個內嵌 Chromium 引擎的原生 .NET 函式庫。本比較將研究這兩種解決方案,分析其架構差異、整合複雜度,以及是否適合不同的應用程式需求。
什麼是 PDFreactor?
PDFreactor 是一款功能強大的 HTML 轉 PDF 轉換伺服器,它採用專有技術將 HTML 和 CSS 內容轉換為高品質的 PDF 文件。 該庫支援許多 CSS 屬性,包括高級 CSS 分頁媒體規範,因此對於需要最高保真度的複雜佈局渲染來說,它是一個不錯的選擇。
PDFreactor 以基於 Java 的獨立服務方式執行,.NET 應用程式則透過 REST API 呼叫或套接字連線與PDFreactor進行通訊。 該函式庫使用設定物件模式,其中設定與 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 函式庫。
| 範疇 | PDFreactor | IronPDF |
|---|---|---|
| 運行時間 | 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-to-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 ModuleIronPDF HTML-to-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 ClassPDFreactor 使用一個設定物件,HTML 內容被指定給 Document 屬性,然後傳給 Convert() 方法,該方法會傳回一個結果物件。 PDF 位元組透過 result.Document 存取,並必須使用 File.WriteAllBytes() 寫入磁碟。
IronPDF 的ChromePdfRenderer使用 RenderHtmlAsPdf() 直接接受 HTML 並返回一個具有 SaveAs() 方法的PDF 文件物件。 此模式消除了配置物件儀式,並提供更直覺的 API。 如需 HTML 至IronPDF轉換的詳細指引,請參閱 HTML 至 PDF 教學。
URL 至 PDF 轉換
將網頁轉換為 PDF 顯示出類似的模式差異。
PDFreactor URL-to-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 ClassIronPDF URL-to-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 ClassPDFreactor 對於 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 ModuleIronPDF 標頭和頁腳(基於 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 ModulePDFreactor 使用 CSS 分頁媒體語法,包含 @page 規則和 @top-center/@bottom-center 區域。 counter(page) 函式提供頁數。 此方法利用 CSS 標準,但需要 CSS 知識以及透過 AddUserStyleSheet() 進行以字串為基礎的設定。
IronPdf 使用專用的 API,其 TextHeaderFooter 物件指定給 RenderingOptions 。 {page} 占位符提供頁數。 此方法可提供 IntelliSense 支援、編譯時檢查以及更易發現的 API。 有關全面的標頭/頁尾實作,請參閱 標頭與頁尾文件。
API 對應參考。
對於評估PDFreactor移轉至IronPDF的團隊而言,瞭解 API 對應有助於估算開發工作。
核心類別
| PDFreactor | IronPDF |
|---|---|
PDFreactor | ChromePdfRenderer |
設定 | ChromePdfRenderOptions |
結果 | PDF 文件 |
config.文件 | RenderHtmlAsPdf(html) |
result.Document (byte[]) | pdf.BinaryData |
設定屬性
| PDFreactor 組態 | IronPdf RenderingOptions |
|---|---|
config.Document = html | renderer.RenderHtmlAsPdf(html)。 |
config.Document = url。 | renderer.RenderUrlAsPdf(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。 |
config.AddUserStyleSheet(css)。 | 在 HTML 中嵌入 CSS |
config.Title | pdf.MetaData.Title |
config.Encryption | 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 套件即可。
功能比較摘要
| 功能/外觀 | PDFreactor | IronPDF |
|---|---|---|
| 原生 .NET 函式庫。 | 無(基於 Java) | 是 |
| 跨平台能力 | 是(依賴 Java) | 是(捆綁 Chromium) |
| CSS 支援 | 進階支援 CSS3、CSS Paged Media | 透過 Chromium 全面掌握 HTML5/CSS3 |
| 部署複雜性 | 由於 Java 較為複雜 | 簡單,直接與 .NET 整合 |
| PDF 操作功能 | 基本 (僅限世代) | 廣泛(合併、分割、編輯、註解) |
| 授權模式 | 商業的 | 商業的 |
| 主要使用個案 | 高保真、複雜的文件 | 在 .NET 應用程式中廣泛使用、易於使用 |
| 頁首/頁腳 | CSS 分頁媒體 (@page 規則) | 以 API 為基礎 (TextHeaderFooter 物件) |
| JavaScript 執行 | 支援 | 支援 (Chromium 引擎) |
僅靠PDFreactor無法實現需要新增浮水印、PDF 合併、文字擷取或表單填寫等功能的應用。
CSS 分頁媒體 vs 基於 API 的方法
PDFreactor 的強項在於 CSS 分頁媒體支援 - 使用標準 CSS 規則如 @page, @top-center, 和 counter(page) 來進行文件格式設定。 此方法可讓擁有強大 CSS 專業知識的團隊受惠。
IronPdf 使用基於 API 的方法,並提供專用物件,如 TextHeaderFooter 和 HtmlHeaderFooter 等。 這提供了
- 支援 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.x64Install-Package PDFreactor.Native.Windows.x64Plus Java runtime 安裝與伺服器設定。
安裝 IronPdf:
Install-Package IronPdfInstall-Package IronPdfIronPdf 需要配置許可金鑰:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"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 安裝:Install-Package IronPdf。 2.檢閱 入門文件。 3.探索HTML轉PDF教學的轉換模式 4.檢查 API 參考,以取得完整的方法說明文件
IronPDF教學提供全面的範例,涵蓋從基本轉換到進階 PDF 操作的常見情境。