比較

jsreport與IronPDF:技術比較指南

當.NET開發人員需要將HTML轉換為PDF時,他們會遇到具有根本不同架構的程式庫。 PDFreactor作為一個基於Java的轉換伺服器運行,具有出色的CSS Paged Media支援,而IronPDF提供了一個嵌入瀏覽器引擎的原生.NET程式庫。本比較檢視了兩個解決方案,分析其架構差異、整合複雜性及對不同應用需求的適合性。

什麼是PDFreactor?

PDFreactor是一個強大的HTML到PDF轉換伺服器,使用專有技術將HTML和CSS內容轉換為高質量的PDF文件。 該程式庫支持許多CSS屬性,包括高階的CSS Paged Media規範,使其成為需要最高保真度的複雜佈局渲染的一個良好選擇。

PDFreactor作為一個獨立的Java服務運行,.NET應用程式通過REST API調用或socket連接與其通信。 該程式庫使用Configuration物件模式,將設定和HTML內容打包在一起並發送到伺服器進行處理。

PDFreactor的關鍵特點包括:

  • Java-Based Server:作為需要Java運行環境的獨立服務運行
  • CSS Paged Media Support:對CSS3和CSS Paged Media規格的出色支持
  • Server Architecture:需要來自.NET應用程式的REST API或socket通信
  • Configuration Object Pattern:使用Configuration物件來打包設定和內容
  • High-Fidelity Rendering:針對複雜的、印刷品質文件佈局進行最佳化
  • Cross-Platform via Java:運行在任何安裝了Java的系統上

什麼是 IronPDF?

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

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

架構比較

PDFreactor和IronPDF之間的根本區別在於它們的架構:外部Java伺服器與原生.NET程式庫。

方面PDFreactorIronPDF
RuntimeJava(外部伺服器)原生.NET(內部)
架構REST API服務NuGet程式庫
部署Java + 伺服器配置單一NuGet套件
依賴性JRE + HTTP客戶端自包含
延遲網路往返直接方法呼叫
CSS支援CSS Paged MediaChromium引擎
PDF 操作僅轉換完整生命週期
Native .NET Library否(基於Java)
Cross-Platform Capability是(取決於Java)是(捆綁Chromium)
Deployment Complexity由於Java而更加複雜簡單,直接整合到.NET

對於在.NET環境中工作的團隊,PDFreactor的Java依賴造成了顯著的部署複雜性——在CI/CD流水線中需要管理兩個運行環境,單獨的基礎設施需要監控和維護,以及每次轉換的網路延遲。

HTML到PDF轉換

將HTML內容轉換為PDF顯示了這些程式庫之間的不同模式。

PDFreactor HTML-to-PDF approach:

// NuGet: Install-Package PDFreactor.Native.Windows.x64
using RealObjects.PDFreactor;
using System.IO;

class Program
{
    static void Main()
    {
        PDFreactor 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()
    {
        PDFreactor 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);
    }
}
Imports RealObjects.PDFreactor
Imports System.IO

Class Program
    Shared 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 Class
$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");
    }
}
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 Class
$vbLabelText   $csharpLabel

PDFreactor使用Result物件。 PDF字節通過File.WriteAllBytes()寫入磁碟。

IronPDF的PdfDocument物件。 此模式消除了配置物件的繁瑣過程,並提供了更直觀的API。 有關HTML到PDF轉換的詳細指南,請參閱HTML到PDF教學

URL 轉 PDF

將網頁轉換為PDF顯示了類似的模式差異。

PDFreactor URL-to-PDF approach:

// NuGet: Install-Package PDFreactor.Native.Windows.x64
using RealObjects.PDFreactor;
using System.IO;

class Program
{
    static void Main()
    {
        PDFreactor 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()
    {
        PDFreactor pdfReactor = 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 Class
$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");
    }
}
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 Class
$vbLabelText   $csharpLabel

PDFreactor對HTML字串和URL使用相同的Configuration.Document屬性——該程式庫自動確定內容型別。 IronPDF提供了一個專用的RenderUrlAsPdf()方法,明確表示正在執行的操作,讓程式碼更具自我文件記錄性。 在IronPDF文件中了解更多關於URL到PDF轉換的資訊。

頁眉和頁腳

新增頁眉和頁腳顯示了這些程式庫之間根本不同的方法。

PDFreactor headers and footers (CSS Paged Media):

// NuGet: Install-Package PDFreactor.Native.Windows.x64
using RealObjects.PDFreactor;
using System.IO;

class Program
{
    static void Main()
    {
        PDFreactor 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()
    {
        PDFreactor 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);
    }
}
Imports RealObjects.PDFreactor
Imports System.IO

Class Program
    Shared 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 Class
$vbLabelText   $csharpLabel

IronPDF headers and footers (API-based):

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

PDFreactor使用帶有@bottom-center區域的CSS Paged Media語法。 counter(page)函式提供頁碼。 此方法利用CSS標準,但需要通過AddUserStyleSheet()進行CSS知識和基於字串的配置。

IronPDF使用專門的API,RenderingOptions{page}占位符提供頁碼。 此方法提供IntelliSense支持、編譯時檢查和更易發現的API。 有關全面的頁眉/頁尾實施,請參閱頁眉和頁尾文件

API映射參考

對於評估從PDFreactor遷移到IronPDF的團隊,了解API映射有助於估計開發工作。

核心類

PDFreactorIronPDF
PDFreactorChromePdfRenderer
ConfigurationChromePdfRenderOptions
ResultPdfDocument
config.DocumentRenderHtmlAsPdf(html)
result.Document (byte[])pdf.BinaryData

Configuration Properties

PDFreactor配置IronPDFRenderingOptions
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)將CSS嵌入HTML中
config.Titlepdf.MetaData.Title
config.Encryptionpdf.SecuritySettings

Features Unavailable in PDFreactor

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
  • Server Architecture:作為需要REST API呼叫的獨立服務運行
  • Complex Deployment:在CI/CD流水線中管理兩個運行環境(Java + .NET)
  • Network Latency:每次PDF轉換都需要向伺服器進行HTTP往返
  • Separate Infrastructure:需監控、擴展和維護的額外伺服器
  • License Complexity:與Java服務實例綁定的按伺服器授權
  • Operational Overhead:維護、監控及更新兩個運行環境

IronPDF通過作為原生.NET程式庫進程內部運行來消除此類挑戰。 無Java安裝、無伺服器配置、無網路延遲——僅需一個NuGet套件引用。

功能比較總結

功能/方面PDFreactorIronPDF
Native .NET Library否(基於Java)
Cross-Platform Capability是(取決於Java)是(捆綁Chromium)
CSS支援高級支援CSS3、CSS Paged Media全面支持Chromium via HTML5/CSS3
Deployment Complexity由於Java而更加複雜簡單,直接整合到.NET
PDF Manipulation Features基本(僅生成)廣泛(合併、拆分、編輯、註釋)
授權模式商業商業
Primary Use Case高保真、複雜文件廣泛使用,便於.NET應用中的使用
頁眉/頁腳CSS Paged Media(@page規則)API-based(TextHeaderFooter物件)
JavaScript 執行支持支持(Chromium引擎)

需要浮水印、PDF合併、文字提取或表單填寫的應用無法僅用PDFreactor實現。

CSS Paged Mediavs API-Based Approach

PDFreactor的優勢在於CSS Paged Media支援——利用標準CSS規則如counter(page)進行文件格式化。 此方法對具備強大CSS專業知識的團隊有益。

IronPDF使用帶專用物件的API-based方法,如HtmlHeaderFooter。 這提供:

  • 可發掘性的IntelliSense支持
  • 編譯時型別檢查
  • 無需維護基於字串的CSS
  • 更易於除錯和測試

團隊需評估是否具備CSS Paged Media專業知識,或是否偏好API-based的配置。

當團隊考慮從PDFreactor轉換到IronPDF時

多種因素推動團隊評估IronPDF作為PDFreactor的替代方案:

Deployment Simplification:PDFreactor需要Java運行時安裝、伺服器配置和REST API整合。 IronPDF作為一個無外部依賴的NuGet套件部署。

Infrastructure Reduction:PDFreactor需要單獨的伺服器基礎設施以托管Java服務。IronPDF在進程中運行,消除需監控和維護的額外伺服器。

Native .NET Integration:PDFreactor的Java架構在.NET環境中造成整合困難。 IronPDF提供一個具有熟悉模式的原生.NET API。

PDF Manipulation Needs:PDFreactor專注於轉換。 需要文件操作(合併、拆分、浮水印)的應用需要IronPDF的擴展能力。

CI/CD Simplification:在.NET CI/CD流水線中管理Java依賴增加了複雜性。 IronPDF簡化流水線為標準NuGet還原。

Latency Reduction:PDFreactor的網路往返增加了每次轉換的延遲。 IronPDF的進程內架構消除網路開銷。

安裝比較

PDFreactor安裝:

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

加上Java運行時安裝和伺服器配置。

IronPDF安裝:

IronPDF需要授權金鑰配置:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
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 Paged Media支援,您的團隊擁有強大的CSS專業知識,可以處理Java依賴,並且僅轉換功能足夠。

考慮使用IronPDF:如果您在.NET環境中開發並希望順利整合,想要消除Java依賴和伺服器基礎設施,您需要超出轉換的PDF操作,偏好API-based配置而非CSS字串,或希望簡化部署和CI/CD流水線。

對於大多數現代.NET應用——特別是那些優先考慮部署簡單性、原生整合和擴展的PDF功能的應用——IronPDF提供了比PDFreactor基於Java的伺服器方法顯著的架構優勢。

開始使用 IronPDF

要評估您的 PDF 生成需求的 IronPDF:

  1. 透過NuGet安裝:Install-Package IronPdf
  2. 查看入門文件
  3. 探索HTML到PDF教程以了解轉換模式
  4. 檢查API參考以獲得完整的方法文件

IronPDF教程提供了涵蓋從基本轉換到高級PDF操作的常見場景的完整範例。

請注意PDFReactor是其相應所有者的註冊商標。 本網站與RealObjects無任何關聯、認可或贊助。 所有產品名稱、標誌和品牌均為其各自所有者的財產。 比較僅供資訊參考,並反映了撰寫時公開的資訊。)}