如何用 C# 從 Nutrient.io 轉移到 IronPDF
從 Nutrient.io 遷移到 IronPDF:完整的 C# 遷移指南。
從 Nutrient.io(前身為 PSPDFKit)遷移至IronPDFfor .NET 可簡化您的 .NET PDF 工作流程,從具有異步先行模式的複雜文檔智慧平台轉換為具有直接同步 API 的專注 PDF 函式庫。本指南提供全面、逐步的遷移路徑,可消除平台開銷,同時維持所有基本的 PDF 功能。
為何要從 Nutrient.io 轉移到 IronPDF?
平台複雜性問題
Nutrient.io(前身為 PSPDFKit)已從 PDF SDK 演變成一個全面的"文件智慧平台"。雖然這種轉型擴大了功能,但對於只需要可靠 PDF 作業的團隊而言,卻帶來了重大的挑戰:
1.平台過度工程:曾經的 PDF SDK 現在已經成為一個完整的文件智慧平台,具有 AI 功能和文件工作流程功能,而這些功能對於簡單的 PDF 任務來說可能是不必要的。
2.Enterprise Pricing:Nutrient.io 定位於大型組織,其定價不透明,需要聯絡銷售人員。 這對中小型團隊造成障礙,也使預算規劃變得困難。
3.Rebrand Confusion:PSPDFKit → Nutrient 的過渡造成了同時引用兩個名稱的文件問題。套件名稱可能仍使用 PSPDFKit,過渡期間的轉移路徑仍不清楚。
4.Async-First Complexity:Nutrient.io 中的一切都需要 async/await 模式。 即使是簡單的操作也需要 PdfProcessor.CreateAsync() 來進行初始化,基本任務也需要 async 方法,增加了同步工作流程的開銷。
5.Heavy Dependencies:完整的平台需要更多的資源,需要更多的套件佔用空間、更多的初始化時間,以及額外的設定。
Nutrient.io 與IronPDF的比較
| 範疇 | Nutrient.io (PSPDFKit) | IronPDF |
|---|---|---|
| 重點 | 文件智慧平台 | PDF 圖書館 |
| 定價 | 企業(聯絡銷售) | 透明、已發表 |
| 架構 | 複雜的平台 | 簡單的圖書館 |
| API 風格 | 同步第一 | 同步與同步選項 |
| 依賴 | 重型 | 輕量級 |
| 配置 | 複雜的組態物件 | 直接的屬性 |
| 學習曲線 | Steep (平台) | 溫和 |
| 目標使用者 | 企業 | 所有團隊規模 |
對於計劃在 2025 年和 2026 年之前採用 .NET 10 和 C# 14 的團隊而言,IronPDF 提供了一個更簡單的基礎,可以乾淨地整合,而不需要完整文件智慧平台的開銷。
開始之前
先決條件
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 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授權組態
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";IRON VB CONVERTER ERROR developers@ironsoftware.com識別 Nutrient.io 使用方式
# Find all Nutrient/PSPDFKit references
grep -r "PSPDFKit\|Nutrient\|PdfProcessor\|PdfConfiguration" --include="*.cs" .# Find all Nutrient/PSPDFKit references
grep -r "PSPDFKit\|Nutrient\|PdfProcessor\|PdfConfiguration" --include="*.cs" .完整的 API 參考資料
初始化映射
| Nutrient.io (PSPDFKit) | IronPDF | 筆記 |
|---|---|---|
等待 PdfProcessor.CreateAsync()。 | 新的 ChromePdfRenderer() | 不需要 async |
| <程式碼>processor.Dispose()</程式碼 | (自動或手動) | 簡化生命週期 |
new PdfConfiguration { ... } | <編碼>renderer.RenderingOptions</編碼 | 基於屬性 |
文件載入映射
| Nutrient.io (PSPDFKit) | IronPDF | 筆記 |
|---|---|---|
等待處理器.OpenAsync(路徑)。 | PdfDocument.FromFile(path) | 預設同步 |
Document.LoadFromStream(stream)。 | PdfDocument.FromStream(stream) | 串流支援 |
Document.LoadFromBytes(bytes) | new PdfDocument(bytes) | 位元組 |
PDF 生成映射
| Nutrient.io (PSPDFKit) | IronPDF | 筆記 |
|---|---|---|
await processor.GeneratePdfFromHtmlStringAsync(html) | renderer.RenderHtmlAsPdf(html)。 | 同步方法 |
await processor.GeneratePdfFromUrlAsync(url) | renderer.RenderUrlAsPdf(url)。 | 直接 URL |
await processor.GeneratePdfFromFileAsync(path)<br | renderer.RenderHtmlFileAsPdf(path)。 | HTML 檔案 |
文件操作映射
| Nutrient.io (PSPDFKit) | IronPDF | 筆記 |
|---|---|---|
await processor.MergeAsync(docs) | <代碼>PdfDocument.Merge(pdfs)</代碼 | 同步 |
| <編碼>document.PageCount</編碼 | <編碼>pdf.PageCount</編碼 | 相同模式 |
await document.SaveAsync(path) | <代碼>pdf.SaveAs(路徑)</代碼 | 同步 |
| <編碼>document.ToBytes()</編碼 | <編碼>pdf.BinaryData</編碼 | 位元組 |
註解與水印對應
| Nutrient.io (PSPDFKit) | IronPDF | 筆記 |
|---|---|---|
await document.AddAnnotationAsync(index, annotation) | pdf.ApplyWatermark(html)。 | 基於 HTML |
new TextAnnotation("text") | 水印中的 HTML | 更靈活 |
annotation.Opacity = 0.5。 | CSS 不透明度:0.5 | CSS 造型 |
annotation.FontSize = 48 | CSS font-size: 48px | CSS 造型 |
程式碼遷移範例
範例 1:HTML 到 PDF 的轉換
之前 (Nutrient.io):
// 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comAfter (IronPDF):
// 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comNutrient.io 方法需要幾個 async 步驟:使用等待 PdfProcessor.CreateAsync()。創建一個 PdfProcessor ,然後呼叫 await processor.GeneratePdfFromHtmlStringAsync() ,最後再呼叫 await document.SaveAsync() 。 整個方法必須標示 async 任務,處理器需要有 using 語句才能正確處理。
IronPdf 大幅簡化了這項工作。 建立一個 ChromePdfRenderer, 呼叫 RenderHtmlAsPdf(), 並使用 SaveAs() 儲存。 不需要 async/await,不需要管理處理器生命週期,簡單的操作也不需要 using 區塊。 對於 PDF 工作流程不需要 async 模式的開發人員而言,此模式較為直覺。 請參閱 HTML to PDF 文件,以瞭解其他渲染選項。
範例 2:合併多個 PDF 檔案
之前 (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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comAfter (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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comNutrient.io 的合併作業需要使用等待 PdfProcessor.CreateAsync()。建立一個處理器,使用獨立的 await processor.OpenAsync() 呼叫開啟每個文件,建立一個 List<PdfDocument> ,使用該清單呼叫 await processor.MergeAsync() ,最後再使用 await mergedDocument.SaveAsync() 。 這就是基本合併的五個同步操作。
IronPDF 將這個過程縮小為四個同步行:使用 PdfDocument.FromFile() 載入每個 PDF,使用靜態 PdfDocument.Merge() 方法合併,然後儲存。 無處理器生命週期、無需建立清單 (您可以直接傳遞文件)、無 async 開銷。 進一步瞭解 合併與分割 PDF 的相關資訊。
範例 3:新增水印
之前 (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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comAfter (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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.com本範例強調一個基本的架構差異。 Nutrient.io 使用 基於注解的方法:您建立一個 TextAnnotation 物件,並賦予 Opacity 和 FontSize 等屬性,然後在每個頁面中迴圈呼叫 await document.AddAnnotationAsync(i, watermark) 。 這需要瞭解註解系統並自行管理迴圈。
IronPdf 使用 基於 HTML 的方法:ApplyWatermark() 方法接受具有 CSS 定義的 HTML 字串。 水印會在一次呼叫中自動套用至所有頁面。 您可以透過熟悉的 CSS 屬性 (color、opacity、font-size) 來控制外觀,而非特定於註解的物件屬性。 這種方法提供了更多的造型彈性-您可以使用任何 HTML/CSS,包括漸層、圖片和複雜的佈局。 有關進階範例,請參閱 watermark 文件。
關鍵遷移注意事項
Async 到同步的轉換
最重要的改變是移除不必要的 async/await 模式:
// Nutrient.io: Async-first
using var processor = await PdfProcessor.CreateAsync();
var document = await processor.GeneratePdfFromHtmlStringAsync(html);
await document.SaveAsync("output.pdf");
// IronPDF:預設同步(async available when needed)
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");// Nutrient.io: Async-first
using var processor = await PdfProcessor.CreateAsync();
var document = await processor.GeneratePdfFromHtmlStringAsync(html);
await document.SaveAsync("output.pdf");
// IronPDF:預設同步(async available when needed)
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");IRON VB CONVERTER ERROR developers@ironsoftware.com如果您确实需要异步操作,IronPDF 提供了异步变体,如 RenderHtmlAsPdfAsync() 。
消除處理器生命週期
Nutrient.io 需要製作處理器並進行處理:
// Nutrient.io: Processor lifecycle management
using var processor = await PdfProcessor.CreateAsync();
// ... use processor ...
// Processor disposed at end of using block
// IronPDF: No processor lifecycle
var renderer = new ChromePdfRenderer();
// Reuse renderer, no complex lifecycle management// Nutrient.io: Processor lifecycle management
using var processor = await PdfProcessor.CreateAsync();
// ... use processor ...
// Processor disposed at end of using block
// IronPDF: No processor lifecycle
var renderer = new ChromePdfRenderer();
// Reuse renderer, no complex lifecycle managementIRON VB CONVERTER ERROR developers@ironsoftware.com設定模式變更
Nutrient.io 使用組態物件; IronPdf 使用屬性:
// Nutrient.io: Config object
var config = new PdfConfiguration
{
PageSize = PageSize.A4,
Margins = new Margins(20, 20, 20, 20)
};
var doc = await processor.GeneratePdfFromHtmlStringAsync(html, config);
// IronPDF: Properties on RenderingOptions
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
var pdf = renderer.RenderHtmlAsPdf(html);// Nutrient.io: Config object
var config = new PdfConfiguration
{
PageSize = PageSize.A4,
Margins = new Margins(20, 20, 20, 20)
};
var doc = await processor.GeneratePdfFromHtmlStringAsync(html, config);
// IronPDF: Properties on RenderingOptions
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 20;
renderer.RenderingOptions.MarginBottom = 20;
renderer.RenderingOptions.MarginLeft = 20;
renderer.RenderingOptions.MarginRight = 20;
var pdf = renderer.RenderHtmlAsPdf(html);IRON VB CONVERTER ERROR developers@ironsoftware.com註解為 HTML 水印
以 HTML 字串取代註解物件:
// Nutrient.io: Annotation object with properties
new TextAnnotation("CONFIDENTIAL") { Opacity = 0.5f, FontSize = 48 }
// IronPDF: HTML with CSS
"<h1 style='opacity:0.5; font-size:48px;'>CONFIDENTIAL</h1>"// Nutrient.io: Annotation object with properties
new TextAnnotation("CONFIDENTIAL") { Opacity = 0.5f, FontSize = 48 }
// IronPDF: HTML with CSS
"<h1 style='opacity:0.5; font-size:48px;'>CONFIDENTIAL</h1>"IRON VB CONVERTER ERROR developers@ironsoftware.com頁面編碼處理
Nutrient.io 需要手動計算頁數; IronPdf 已內建占位符:
// Nutrient.io: Manual loop and page counting
for (int i = 0; i < doc.PageCount; i++)
{
var footer = new TextAnnotation($"Page {i + 1} of {doc.PageCount}");
await doc.AddAnnotationAsync(i, footer);
}
// IronPDF: Built-in placeholders
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "Page {page} of {total-pages}"
};// Nutrient.io: Manual loop and page counting
for (int i = 0; i < doc.PageCount; i++)
{
var footer = new TextAnnotation($"Page {i + 1} of {doc.PageCount}");
await doc.AddAnnotationAsync(i, footer);
}
// IronPDF: Built-in placeholders
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "Page {page} of {total-pages}"
};IRON VB CONVERTER ERROR developers@ironsoftware.com疑難排解
問題 1:PdfProcessor 未找到
問題:PdfProcessor class 在IronPDF中不存在。
解決方案:使用ChromePdfRenderer:
// Nutrient.io
using var processor = await PdfProcessor.CreateAsync();
// IronPDF
var renderer = new ChromePdfRenderer();// Nutrient.io
using var processor = await PdfProcessor.CreateAsync();
// IronPDF
var renderer = new ChromePdfRenderer();IRON VB CONVERTER ERROR developers@ironsoftware.com問題 2:GeneratePdfFromHtmlStringAsync 未找到
問題:不存在 Async HTML 方法。
解決方案:使用 RenderHtmlAsPdf():
// Nutrient.io
var document = await processor.GeneratePdfFromHtmlStringAsync(html);
// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);// Nutrient.io
var document = await processor.GeneratePdfFromHtmlStringAsync(html);
// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);IRON VB CONVERTER ERROR developers@ironsoftware.com問題 3:找不到 TextAnnotation
問題:IronPDF 中不存在註解類別。
解決方案:使用基於 HTML 的水印:
// Nutrient.io
var watermark = new TextAnnotation("DRAFT") { Opacity = 0.5 };
await document.AddAnnotationAsync(0, watermark);
// IronPDF
pdf.ApplyWatermark("<div style='opacity:0.5;'>DRAFT</div>");// Nutrient.io
var watermark = new TextAnnotation("DRAFT") { Opacity = 0.5 };
await document.AddAnnotationAsync(0, watermark);
// IronPDF
pdf.ApplyWatermark("<div style='opacity:0.5;'>DRAFT</div>");IRON VB CONVERTER ERROR developers@ironsoftware.com問題 4:找不到 MergeAsync
問題:不存在同步合併方法。
解決方案:使用靜態 PdfDocument.Merge():
// Nutrient.io
var mergedDocument = await processor.MergeAsync(documentList);
// IronPDF
var merged = PdfDocument.Merge(pdf1, pdf2);// Nutrient.io
var mergedDocument = await processor.MergeAsync(documentList);
// IronPDF
var merged = PdfDocument.Merge(pdf1, pdf2);IRON VB CONVERTER ERROR developers@ironsoftware.com遷移清單
預遷移
- [清查程式碼庫中所有 PSPDFKit/Nutrient 的使用情況
- [ ] 記錄可能需要調整的 async 模式
- [ ] 列出所有組態物件及其屬性
- [ ] 識別基於注解的功能(水印、標頭)
- [ ] 檢閱表單處理需求
- [ ] 獲得 IronPdf 授權金鑰
套件變更
- [ ] 移除
PSPDFKit.NETNuGet 套件 - [ ] 移除
NutrientNuGet 套件 - [ ] 安裝
IronPDFNuGet 套件:dotnet add package IronPdf。 - [ ] 更新命名空間匯入
程式碼變更
- [ ] 在啟動時加入授權金鑰組態
- [ ] 將
PdfProcessor.CreateAsync()替換為新的 ChromePdfRenderer()。 - [ ] 將
processor.GeneratePdfFromHtmlStringAsync()替換為renderer.RenderHtmlAsPdf()。 - [ ] 將
processor.MergeAsync()替換為PdfDocument.Merge()。 - [ ] 將
TextAnnotation水印轉換為 HTML 水印 - [ ] 使用
RenderingOptions屬性取代 config 物件 - [ ] 更新 header/footer 以使用
HtmlHeaderFooter與占位符 - [ ] 移除不必要的 async/await 模式
後遷移
- [ ] 移除不再需要的 async/await
- [ ] 執行比較 PDF 輸出的回歸測試
- [ ] 用頁碼驗證標題/頁腳
- [ ] 測試水印渲染
- [ ] 更新 CI/CD 管道
結論
從 Nutrient.io 遷移到 IronPDF,以專注的 PDF 函式庫取代複雜的文件智慧平台,簡化您的 PDF 工作流程。 遷移消除了 async-first 複雜性、處理器生命週期管理和基於注解的方法,轉而採用直接的同步 API 和基於 HTML 的樣式。
本次轉換的主要變更如下 1.架構:文件智慧平台 → 聚焦 PDF 函式庫 2.API 風格:同步第一 → 同步與同步選項 3.初始化:await PdfProcessor.CreateAsync() → new ChromePdfRenderer() 4.HTML 至 PDF:GeneratePdfFromHtmlStringAsync() → RenderHtmlAsPdf() 5.合併:processor.MergeAsync(list) → PdfDocument.Merge(pdf1, pdf2) 6.水印:TextAnnotation 物件 → 使用 CSS 的 HTML 字串 7.頁碼:手動循環 → {page}和 {total-pages}占位符






