比較

PDFreactor vs IronPDF:技術比較指南

當.NET開發人員需要將 HTML 轉換為 PDF 時,他們會遇到架構截然不同的程式庫。 PDF反應器 是一款基於 Java 的轉換伺服器,對 CSS 分頁媒體支援出色;而IronPDF提供了內建 Chromium 引擎的原生.NET程式庫。本文將對這兩種方案進行比較,分析它們的架構差異、整合複雜性以及對不同應用需求的適用性。

什麼是PDFreactor?

PDFreactor 是一款功能強大的 HTML 轉 PDF 轉換伺服器,它採用專有技術將 HTML 和 CSS 內容轉換為高品質的 PDF 文件。 該庫支援許多 CSS 屬性,包括高級 CSS 分頁媒體規範,因此對於需要最高保真度的複雜佈局渲染來說,它是一個不錯的選擇。

PDFreactor 作為獨立的基於 Java 的服務運行, .NET應用程式透過 REST API 呼叫或套接字連接與其通訊。 該庫使用 Configuration 物件模式,其中設定和 HTML 內容捆綁在一起並發送到伺服器進行處理。

PDFreactor的主要特色包括:

-基於 Java 的伺服器:作為獨立服務運行,需要 Java 執行環境。

  • CSS 分頁媒體支援:對 CSS3 和 CSS 分頁媒體規範提供卓越的支持 -伺服器架構:需要.NET應用程式使用 REST API 或套接字通訊 -配置物件模式:使用 Configuration 物件來捆綁設定和內容 -高保真渲染:針對複雜的、印刷品質的文件佈局進行了最佳化 -跨平台,透過 Java 實作:可在任何安裝了 Java 的系統上運行

IronPDF是什麼?

IronPDF是一個完整的.NET原生程式庫,提供完整的 PDF 生命週期管理。 ChromePdfRenderer類別使用嵌入式 Chromium 渲染引擎進行 HTML 到 PDF 的轉換,提供完整的 CSS3 和JavaScript支持,無需外部依賴項。

與 PDF反應器 的伺服器架構不同, IronPDF在您的.NET應用程式進程內運作。 這樣就消除了對 Java 的依賴、伺服器基礎設施和網路延遲——將 HTML 轉換為 PDF 變成了一個簡單的方法調用,而不是 HTTP 請求。

建築比較

PDFreactor 和IronPDF的根本差異在於它們的架構:外部 Java 伺服器與原生.NET函式庫。

方面PDF反應器IronPDF
運行時Java(外部伺服器)原生.NET (進程內)
建築學REST API 服務NuGet函式庫
部署Java + 伺服器配置單一NuGet包
依賴關係JRE + HTTP 用戶端自給自足
延遲網路往返直接方法調用
CSS 支援CSS 分頁媒體鉻引擎
PDF 處理僅轉換全生命週期
原生.NET函式庫否(基於 Java 的)是的
跨平台能力是的(依賴Java)是的(捆綁式鉻)
部署複雜性由於 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()
    {
        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 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");
    }
}
$vbLabelText   $csharpLabel

PDFreactor 使用一個 Configuration 對象,其中 HTML 內容被賦值給 Document 屬性,然後傳遞給 Convert() 方法,該方法傳回一個 Result 物件。 PDF 位元組透過 result.Document 訪問,必須使用 File.WriteAllBytes() 寫入磁碟。

IronPDF 的 ChromePdfRenderer 使用 RenderHtmlAsPdf(),它直接接受 HTML 並傳回一個有 PdfDocument 方法的物件。 這種模式省去了配置物件的繁瑣步驟,並提供了更直覺的 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()
    {
        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 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");
    }
}
$vbLabelText   $csharpLabel

PDFreactor 對 HTML 字串和 URL 使用相同的 Configuration.Document 屬性-此程式庫會自動決定內容類型。 IronPDF提供了一個專門的方法,明確地指示正在執行的操作,使程式碼更具自我文檔性。 請參閱IronPDF文檔,以了解有關URL 轉 PDF 的更多資訊。

頁首和頁尾

添加頁首和頁尾揭示了不同庫之間截然不同的方法。

PDFreactor頁首和頁尾(CSS分頁媒體):

// 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 的頁首和頁尾(基於 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");
    }
}
$vbLabelText   $csharpLabel

PDFreactor 使用 CSS 分頁媒體語法,帶有 @page 規則和 @bottom-center 區域。 counter(page) 函數提供頁碼。 這種方法利用了 CSS 標準,但需要 CSS 知識和基於字串的配置,透過 AddUserStyleSheet()

IronPDF使用專用 API,其中 TextHeaderFooter 物件指派給 RenderingOptions{page} 佔位符提供頁碼。 這種方法提供了 IntelliSense 支援、編譯時檢查和更容易發現的 API。 有關完整的頁首/頁尾實現,請參閱頁首和頁尾文件

API對應參考

對於正在評估將 PDF反應器 移轉到IronPDF 的團隊來說,了解 API 對應有助於估算開發工作量。

核心課程

PDF反應器IronPDF
PDFreactorChromePdfRenderer
ConfigurationChromePdfRenderOptions
ResultPdfDocument
config.DocumentRenderHtmlAsPdf(html)
result.Document (byte[])pdf.BinaryData

配置屬性

PDF反應器 配置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.Encryptionpdf.SecuritySettings

PDF反應器 中不可用的功能

IronPDF功能描述
PdfDocument.Merge()合併多個PDF文件
pdf.ApplyWatermark()添加浮水印
pdf.ExtractAllText()提取文字內容
pdf.CopyPages(start, end)提取特定頁面
pdf.SecuritySettings密碼保護和加密
pdf.Sign(certificate)數位簽名
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包引用即可。

功能對比總結

特徵/方面PDF反應器IronPDF
原生.NET函式庫否(基於 Java 的)是的
跨平台能力是的(依賴Java)是的(捆綁式鉻)
CSS 支援對 CSS3 和 CSS 分頁媒體的高級支持透過 Chromium 實現全面的 HTML5/CSS3 功能
部署複雜性由於 Java 的原因,情況變得更加複雜。簡單易用,可直接與.NET集成
PDF 處理功能基本(僅限生成)廣泛的(合併、分割、編輯、註釋)
許可模式商業的商業的
主要用例高保真、複雜文檔廣泛應用,易於在.NET應用程式中使用
頁首/頁尾CSS 分頁媒體(@page 規則)基於 API 的(TextHeaderFooter 物件)
JavaScript執行支援支援(Chromium 核心)

僅靠 PDF反應器 無法實現需要新增浮水印、PDF 合併、文字擷取或表單填寫等功能的應用。

CSS 分頁媒體與基於 API 的方法

PDFreactor 的優點在於對 CSS 分頁媒體的支援-使用標準 CSS 規則,如 @top-centercounter(page) 進行文件格式化。 這種方法有利於擁有紮實 CSS 專業知識的團隊。

IronPDF使用基於 API 的方法,具有專用對象,如 TextHeaderFooterHtmlHeaderFooter。 這提供了:

  • IntelliSense 支援可發現性
  • 編譯時類型檢查
  • 無需維護基於字串的 CSS
  • 更易於調試和測試

團隊必須評估是否具備 CSS 分頁媒體的專業知識,或是基於 API 的配置是否更可取。

當團隊考慮從 PDF反應器 遷移到IronPDF

促使團隊評估IronPDF作為 PDF反應器 的替代方案的因素有很多:

部署簡化: PDF反應器 需要 Java 執行時間安裝、伺服器設定和 REST API 整合。 IronPDF以單一NuGet套件的形式部署,沒有任何外部相依性。

IronPDF設施精簡: PDF反應器 需要單獨的伺服器基礎架構來託管 Java 服務。 IronPDF 以進程內方式運行,無需額外的伺服器進行監控和維護。

原生.NET整合: PDF反應器 的 Java 架構在.NET環境中造成了整合障礙。 IronPDF提供了一個具有熟悉模式的原生.NET API。

PDF 處理需求: PDF反應器 專注於轉換。 需要進行文件操作(合併、分割、新增浮水印)的應用需要 IronPDF 的擴充功能。

CI/CD 簡化:在.NET CI/CD 管道中管理 Java 依賴項會增加複雜性。 IronPDF簡化了管道,使其符合標準的NuGet還原要求。

降低延遲: PDF反應器 的網路往返會為每次轉換增加延遲。 IronPDF 的進程內架構消除了網路開銷。

安裝對比

PDFreactor安裝:

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

此外,還需要安裝Java執行環境並進行伺服器設定。

IronPDF安裝:

Install-Package IronPdf
Install-Package IronPdf
SHELL

IronPDF需要配置許可證金鑰:

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相比 PDF反應器 基於 Java 的伺服器方法提供了顯著的架構優勢。

IronPDF入門指南

要評估IronPDF是否滿足您的 PDF 生成需求:

  1. 透過NuGet安裝:Install-Package IronPdf
  2. 查看入門文檔
  3. 瀏覽HTML 轉 PDF 教學課程,尋找轉換模式
  4. 查看API 參考文件以取得完整的方法說明。

IronPDF教學提供了一個全面的範例,涵蓋從基本轉換到進階PDF操作的常見場景。