比較

Foxit SDK與IronPDF:技術比較指南

當.NET開發人員需要PDF處理功能時,他們經常會遇到Nutrient.io(原PSPDFKit)——一個已從PDF SDK轉變為完整文件智慧解決方案的平台。 本比較審視了Nutrient.io和IronPDF在關鍵技術方面的表現,以協助開發人員、架構師和技術決策者選擇適合他們的PDF生成和操作工作流程的工具。

Nutrient.io是什麼?

Nutrient.io,之前稱為PSPDFKit,已從一個以PDF為中心的程式庫轉變為一個完整的文件智慧平台。 此變化擴展了其功能,超越了簡單的PDF處理,包含了由AI驅動的文件分析和廣泛的文件工作流程功能。

該程式庫通過其PdfProcessor.CreateAsync()非同步建立。 操作如HTML轉PDF、文件合併和浮水印都使用非同步/等待模式,通過如AddAnnotationAsync()之類的方法。

平台架構將Nutrient.io定位為具有企業定價結構的大型組織。 從PSPDFKit到Nutrient.io的重新命名導致了文件複雜性,包名和引用有時使用了不同的名稱。

什麼是 IronPDF?

IronPDF是一個專為.NET環境設計的專用PDF程式庫。 IronPDF專注於PDF操作:生成、操作、合併、浮水印等等,而不是將自己定位為一個文件智慧平台。

ChromePdfRenderer類作為PDF生成的主要介面,使用基於Chromium的渲染引擎將HTML、CSS和JavaScript轉換為高保真度的PDF文件。 PdfDocument類提供了現有PDF的廣泛操作功能。

IronPDF的架構強調簡單性,提供同步和非同步方法以適應不同的應用程式模式。 配置通過RenderingOptions屬性發生,設置可以通過IDE自動完成發現。

架構方法比較

這些程式庫的根本區別在於它們的範圍和複雜性。 Nutrient.io已經發展為一個平台,而IronPDF依然是一個專注的程式庫。

方面Nutrient.io(PSPDFKit)IronPDF
範圍文件智慧平台專用PDF程式庫
複雜性高,屬於完整平台的一部分中等,專注於PDF任務
價格企業級易於適應不同規模的團隊
PDF著重點是更廣泛文件框架的一部分專用PDF功能
整合由於廣泛的功能,可能很複雜簡單且直觀
目標使用者大型組織需要先進的文件技術開發人員需要可靠的PDF工具
API風格首先非同步,複雜同步配合非同步選擇
學習曲線陡峭(平台)溫和(程式庫)

Nutrient.io的平台方法意味著即使只需基本的PDF操作,應用程式也會接收到AI功能和文件工作流程能力。 這可能為擁有簡單需求的專案引入不必要的複雜性。

HTML到PDF轉換

這兩個程式庫都支持將HTML內容轉換為PDF文件。 API模式在複雜性和風格上顯著不同。

Nutrient.io的HTML轉PDF方法:

// NuGet: Install-Package PSPDFKit.Dotnet
using PSPDFKit.Pdf;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var htmlContent = "<html><body><h1>Hello World</h1></body></html>";

        using var processor = await PdfProcessor.CreateAsync();
        var document = await processor.GeneratePdfFromHtmlStringAsync(htmlContent);
        await document.SaveAsync("output.pdf");
    }
}
// NuGet: Install-Package PSPDFKit.Dotnet
using PSPDFKit.Pdf;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        var htmlContent = "<html><body><h1>Hello World</h1></body></html>";

        using var processor = await PdfProcessor.CreateAsync();
        var document = await processor.GeneratePdfFromHtmlStringAsync(htmlContent);
        await document.SaveAsync("output.pdf");
    }
}
Imports PSPDFKit.Pdf
Imports System.Threading.Tasks

Module Program
    Async Function Main() As Task
        Dim htmlContent As String = "<html><body><h1>Hello World</h1></body></html>"

        Using processor = Await PdfProcessor.CreateAsync()
            Dim document = Await processor.GeneratePdfFromHtmlStringAsync(htmlContent)
            Await document.SaveAsync("output.pdf")
        End Using
    End Function
End Module
$vbLabelText   $csharpLabel

IronPDF的HTML轉PDF方法:

// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var htmlContent = "<html><body><h1>Hello World</h1></body></html>";

        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;

class Program
{
    static void Main()
    {
        var htmlContent = "<html><body><h1>Hello World</h1></body></html>";

        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf(htmlContent);
        pdf.SaveAs("output.pdf");
    }
}
Imports IronPdf

Class Program
    Shared Sub Main()
        Dim htmlContent As String = "<html><body><h1>Hello World</h1></body></html>"

        Dim renderer As New ChromePdfRenderer()
        Dim pdf = renderer.RenderHtmlAsPdf(htmlContent)
        pdf.SaveAs("output.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

Nutrient.io需要使用await PdfProcessor.CreateAsync()非同步建立處理器,然後呼叫用於生成和保存的非同步方法。 每個操作都使用非同步/等待模式,並且正確處置需要using語句。

IronPDF預設提供同步方法,從而減少程式碼複雜性。 HTML轉PDF轉換工作流程涉及實例化SaveAs()進行保存。 對於需要非同步操作的應用程式,IronPDF也提供了非同步方法變體,如RenderHtmlAsPdfAsync()

Nutrient.io中的處理器生命周期需要使用using語句進行仔細管理,而IronPDF的渲染器可以被實例化和重用,而不需要複雜的生命周期管理。

合併PDF文件

文件合併展示了這些程式庫之間API複雜性的差異。

Nutrient.io的合併方法:

// NuGet: Install-Package PSPDFKit.Dotnet
using PSPDFKit.Pdf;
using System.Threading.Tasks;
using System.Collections.Generic;

class Program
{
    static async Task Main()
    {
        using var processor = await PdfProcessor.CreateAsync();

        var document1 = await processor.OpenAsync("document1.pdf");
        var document2 = await processor.OpenAsync("document2.pdf");

        var mergedDocument = await processor.MergeAsync(new List<PdfDocument> { document1, document2 });
        await mergedDocument.SaveAsync("merged.pdf");
    }
}
// NuGet: Install-Package PSPDFKit.Dotnet
using PSPDFKit.Pdf;
using System.Threading.Tasks;
using System.Collections.Generic;

class Program
{
    static async Task Main()
    {
        using var processor = await PdfProcessor.CreateAsync();

        var document1 = await processor.OpenAsync("document1.pdf");
        var document2 = await processor.OpenAsync("document2.pdf");

        var mergedDocument = await processor.MergeAsync(new List<PdfDocument> { document1, document2 });
        await mergedDocument.SaveAsync("merged.pdf");
    }
}
Imports PSPDFKit.Pdf
Imports System.Threading.Tasks
Imports System.Collections.Generic

Class Program
    Shared Async Function Main() As Task
        Using processor = Await PdfProcessor.CreateAsync()

            Dim document1 = Await processor.OpenAsync("document1.pdf")
            Dim document2 = Await processor.OpenAsync("document2.pdf")

            Dim mergedDocument = Await processor.MergeAsync(New List(Of PdfDocument) From {document1, document2})
            Await mergedDocument.SaveAsync("merged.pdf")
        End Using
    End Function
End Class
$vbLabelText   $csharpLabel

IronPDF合併方法:

// NuGet: Install-Package IronPdf
using IronPdf;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var pdf1 = PdfDocument.FromFile("document1.pdf");
        var pdf2 = PdfDocument.FromFile("document2.pdf");

        var merged = PdfDocument.Merge(pdf1, pdf2);
        merged.SaveAs("merged.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        var pdf1 = PdfDocument.FromFile("document1.pdf");
        var pdf2 = PdfDocument.FromFile("document2.pdf");

        var merged = PdfDocument.Merge(pdf1, pdf2);
        merged.SaveAs("merged.pdf");
    }
}
Imports IronPdf
Imports System.Collections.Generic

Class Program
    Shared Sub Main()
        Dim pdf1 = PdfDocument.FromFile("document1.pdf")
        Dim pdf2 = PdfDocument.FromFile("document2.pdf")

        Dim merged = PdfDocument.Merge(pdf1, pdf2)
        merged.SaveAs("merged.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

Nutrient.io需要:

  1. 非同步建立處理器
  2. 使用await processor.OpenAsync()非同步打開每個文件
  3. 為合併操作建立List<PdfDocument>
  4. 呼叫非同步MergeAsync()方法
  5. 非同步保存結果

IronPDF將此簡化為使用PdfDocument.Merge()方法。 PDF合併功能可以直接接受多個文件,而不需要為簡單合併構建列表。

新增浮水印

浮水印揭示了一個基本的設計哲學差異:Nutrient.io使用註釋物件,而IronPDF使用HTML字串。

Nutrient.io的浮水印方法:

// NuGet: Install-Package PSPDFKit.Dotnet
using PSPDFKit.Pdf;
using PSPDFKit.Pdf.Annotation;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var processor = await PdfProcessor.CreateAsync();
        var document = await processor.OpenAsync("document.pdf");

        for (int i = 0; i < document.PageCount; i++)
        {
            var watermark = new TextAnnotation("CONFIDENTIAL")
            {
                Opacity = 0.5,
                FontSize = 48
            };
            await document.AddAnnotationAsync(i, watermark);
        }

        await document.SaveAsync("watermarked.pdf");
    }
}
// NuGet: Install-Package PSPDFKit.Dotnet
using PSPDFKit.Pdf;
using PSPDFKit.Pdf.Annotation;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        using var processor = await PdfProcessor.CreateAsync();
        var document = await processor.OpenAsync("document.pdf");

        for (int i = 0; i < document.PageCount; i++)
        {
            var watermark = new TextAnnotation("CONFIDENTIAL")
            {
                Opacity = 0.5,
                FontSize = 48
            };
            await document.AddAnnotationAsync(i, watermark);
        }

        await document.SaveAsync("watermarked.pdf");
    }
}
Imports PSPDFKit.Pdf
Imports PSPDFKit.Pdf.Annotation
Imports System.Threading.Tasks

Class Program
    Shared Async Function Main() As Task
        Using processor = Await PdfProcessor.CreateAsync()
            Dim document = Await processor.OpenAsync("document.pdf")

            For i As Integer = 0 To document.PageCount - 1
                Dim watermark = New TextAnnotation("CONFIDENTIAL") With {
                    .Opacity = 0.5,
                    .FontSize = 48
                }
                Await document.AddAnnotationAsync(i, watermark)
            Next

            Await document.SaveAsync("watermarked.pdf")
        End Using
    End Function
End Class
$vbLabelText   $csharpLabel

IronPDF的浮水印方法:

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;

class Program
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("document.pdf");

        pdf.ApplyWatermark("<h1 style='color:gray;opacity:0.5;'>CONFIDENTIAL</h1>",
            50,
            VerticalAlignment.Middle,
            HorizontalAlignment.Center);

        pdf.SaveAs("watermarked.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Editing;

class Program
{
    static void Main()
    {
        var pdf = PdfDocument.FromFile("document.pdf");

        pdf.ApplyWatermark("<h1 style='color:gray;opacity:0.5;'>CONFIDENTIAL</h1>",
            50,
            VerticalAlignment.Middle,
            HorizontalAlignment.Center);

        pdf.SaveAs("watermarked.pdf");
    }
}
Imports IronPdf
Imports IronPdf.Editing

Class Program
    Shared Sub Main()
        Dim pdf = PdfDocument.FromFile("document.pdf")

        pdf.ApplyWatermark("<h1 style='color:gray;opacity:0.5;'>CONFIDENTIAL</h1>", 
                           50, 
                           VerticalAlignment.Middle, 
                           HorizontalAlignment.Center)

        pdf.SaveAs("watermarked.pdf")
    End Sub
End Class
$vbLabelText   $csharpLabel

Nutrient.io需要逐頁遍歷,使用像await document.AddAnnotationAsync()非同步新增每個註釋。 此方法需要了解註釋API和手動頁面遍歷。

IronPDF的浮水印功能使用具有CSS樣式的HTML字串。 ApplyWatermark()方法接受HTML內容、旋轉角度和對齊參數,將浮水印自動應用到所有頁面。 像color的CSS屬性處理需要單獨註釋屬性的樣式。

基於HTML的方法提供了若干優勢:

  • 熟悉的Web開發語法
  • 完整的CSS樣式功能
  • 單次方法呼叫應用於所有頁面
  • 不需要手動頁面遍歷

API映射參考

對於評估從Nutrient.io遷移到IronPDF的團隊,了解API對映有助於估算工作量。

核心方法對映

Nutrient.io(PSPDFKit)IronPDF
await PdfProcessor.CreateAsync()new ChromePdfRenderer()
await processor.OpenAsync(path)PdfDocument.FromFile(path)
await processor.GeneratePdfFromHtmlStringAsync(html)renderer.RenderHtmlAsPdf(html)
await processor.MergeAsync(docs)PdfDocument.Merge(pdfs)
await document.SaveAsync(path)pdf.SaveAs(path)
document.ToBytes()pdf.BinaryData
document.ToStream()pdf.Stream

配置對映

Nutrient.io(PSPDFKit)IronPDF
new PdfConfiguration { PageSize = ... }renderer.RenderingOptions.PaperSize = ...
config.Margins = new Margins(t, r, b, l)獨立的邊距屬性
config.Orientation = Orientation.LandscapeRenderingOptions.PaperOrientation

浮水印和註釋對映

Nutrient.io(PSPDFKit)IronPDF
new TextAnnotation("text")HTML字串
annotation.Opacity = 0.5CSS opacity: 0.5
annotation.FontSize = 48CSS font-size: 48px
await document.AddAnnotationAsync(index, annotation)pdf.ApplyWatermark(html)

頁眉/頁腳對映

Nutrient.io(PSPDFKit)IronPDF
(複雜的註釋方法)RenderingOptions.HtmlHeader
(複雜的註釋方法)RenderingOptions.HtmlFooter
(手動頁面計數){page} 佔位符
(手動計算){total-pages} 佔位符

Nutrient.io需要手動頁面計數和遍歷以在頁眉或頁腳中新增頁碼。 IronPDF提供內建佔位符,自動插入頁碼和總數。

命名空間和包更改

從Nutrient.io遷移到IronPDF的團隊需要更新命名空間導入:

Nutrient.io(PSPDFKit)IronPDF
using PSPDFKit.Pdf;using IronPdf;
using PSPDFKit.Pdf.Document;using IronPdf;
using PSPDFKit.Pdf.Rendering;using IronPdf.Rendering;
using PSPDFKit.Pdf.Annotation;using IronPdf;
using Nutrient.Pdf;using IronPdf;

NuGet包遷移:

# Remove Nutrient/PSPDFKit packages
dotnet remove package PSPDFKit.NET
dotnet remove package PSPDFKit.PDF
dotnet remove package Nutrient
dotnet remove package Nutrient.PDF

# Install IronPDF
dotnet add package IronPdf
# Remove Nutrient/PSPDFKit packages
dotnet remove package PSPDFKit.NET
dotnet remove package PSPDFKit.PDF
dotnet remove package Nutrient
dotnet remove package Nutrient.PDF

# Install IronPDF
dotnet add package IronPdf
SHELL

非同步與同步API設計

Nutrient.io使用首先非同步架構,幾乎每個操作都需要非同步/等待:

// Nutrient.io pattern - async everywhere
using var processor = await PdfProcessor.CreateAsync();
var document = await processor.OpenAsync(path);
await document.SaveAsync(outputPath);
// Nutrient.io pattern - async everywhere
using var processor = await PdfProcessor.CreateAsync();
var document = await processor.OpenAsync(path);
await document.SaveAsync(outputPath);
Imports System

Using processor = Await PdfProcessor.CreateAsync()
    Dim document = Await processor.OpenAsync(path)
    Await document.SaveAsync(outputPath)
End Using
$vbLabelText   $csharpLabel

IronPDF預設提供同步方法,並提供非同步替代選擇:

//IronPDFsync pattern (simpler)
var pdf = PdfDocument.FromFile(path);
pdf.SaveAs(outputPath);

//IronPDFasync pattern (when needed)
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
//IronPDFsync pattern (simpler)
var pdf = PdfDocument.FromFile(path);
pdf.SaveAs(outputPath);

//IronPDFasync pattern (when needed)
var pdf = await renderer.RenderHtmlAsPdfAsync(html);
' IronPDFsync pattern (simpler)
Dim pdf = PdfDocument.FromFile(path)
pdf.SaveAs(outputPath)

' IronPDFasync pattern (when needed)
Dim pdf = Await renderer.RenderHtmlAsPdfAsync(html)
$vbLabelText   $csharpLabel

對於不需要非同步的PDF操作的應用,例如後臺作業、控制台應用或同步服務方法,IronPDF的預設同步API降低了程式碼複雜性。 當需要非同步時,可使用方法。

當團隊考慮從Nutrient.io移至IronPDF

有多個因素促使團隊評估IronPDF作為Nutrient.io的替代方案:

平台複雜性: 需要僅有PDF生成和操作的團隊可能會發現Nutrient.io的文件智慧平台包含不必要的功能。 對於具有簡單需求的專案,AI能力和文件工作流程功能增加了複雜性。

價格透明性: Nutrient.io的企業定價需要聯繫銷售獲取報價,增加了預算規劃的複雜性。 預算有限的組織或需要可預測成本的組織可能更喜歡IronPDF的已發布定價模型

API簡單性: Nutrient.io的非同步優先設計需要在程式碼庫中全程使用非同步/等待模式,即使是簡單的操作。 偏好同步程式碼或想要在同步和非同步之間靈活運作的團隊將從IronPDF的方法中受益。

重新品牌混淆: PSPDFKit到Nutrient.io的過渡造成了文件的分裂,一些資源仍然引用老名稱和包標識符。 遇到此混淆的團隊可能會尋找名稱穩定程式庫。

整合簡單性: 建立處理器、管理生命週期和處理非同步模式增加了整合負擔。 IronPDF簡單的實例化和方法呼叫減少了新開發人員的上手時間。

浮水印實作: Nutrient.io中的基於註釋的浮水印要求頁面遍歷和註釋物件建立。 IronPDF基於HTML的方法利用了熟悉的Web開發技能,並在單個呼叫中應用浮水印。

安裝比較

Nutrient.io安裝:

Install-Package PSPDFKit.Dotnet
Install-Package PSPDFKit.Dotnet
SHELL

IronPDF安裝:

IronPDF在應用程式啟動時需要進行授權金鑰配置:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

這兩個程式庫都支持.NET Framework和現代.NET版本,使其相容於以.NET 10和C# 14為目標的應用。

做出決策

在Nutrient.io和IronPDF之間的選擇取決於您的具體需求:

考慮Nutrient.io如果:需要完整的文件智慧平台,具有AI能力,您有企業預算和能與銷售談判定價的採購流程,並且應用程式架構已經是全非同步優先。

考慮IronPDF如果:需要專注的PDF功能,無需平台的負擔,偏好透明定價和簡化的採購,想在同步和非同步API模式之間靈活運作,重視基於HTML的浮水印而非註釋物件,或需要內建的頁眉/頁腳佔位符以新增頁碼。

對於在2025年建立現代.NET應用並規劃到2026年的團隊,評估實際需要的PDF功能與平台整體能力有助於確定適當的工具。 許多專案發現,專注的PDF程式庫滿足他們的需求而無需文件智慧平台的複雜性。

開始使用 IronPDF

以IronPDF來評估您的PDF處理需求:

  1. 安裝IronPDF NuGet包Install-Package IronPdf
  2. 查看HTML到PDF教程以獲取基本轉換模式
  3. 探索浮水印功能以進行文件品牌化
  4. 檢查PDF合併能力以組裝文件

IronPDF教程提供了常見場景的全面範例,API參考文件列出了所有可用的類和方法。

結論

Nutrient.io和IronPDF代表了.NET應用中PDF功能的不同方法。 Nutrient.io已演變為具有AI功能和企業定位的文件智慧平台,而IronPDF保持為專注的PDF程式庫,易於整合。

對於需要PDF生成、操作、浮水印和合併且不需要其他平台功能的團隊,IronPDF的專注方法提供了簡單的API、靈活的同步/非同步模式和基於HTML的浮水印。 降低的複雜性轉換為更快的整合和更容易的維護。

針對您實際的PDF需求、團隊對API模式的偏好和預算限制評估這兩個選擇。 了解本比較中列出的架構差異將幫助您做出符合您PDF處理需求和開發實踐的明智決策。

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