C#でNutrient.ioからIronPDFに移行する方法
Nutrient.io(旧PSPDFKit)からIronPDFへの移行は、非同期ファーストのパターンを持つ複雑なドキュメントインテリジェンスプラットフォームから、簡単な同期APIを持つPDFライブラリへ移行することで、.NET PDFワークフローを簡素化します。このガイドでは、すべての重要なPDF機能を維持しながらプラットフォームのオーバーヘッドを排除する、包括的でステップバイステップの移行パスを提供します。
Nutrient.ioからIronPDFに移行する理由
プラットフォームの複雑性の問題
Nutrient.io(旧PSPDFKit)は、PDF SDKから包括的な "ドキュメントインテリジェンスプラットフォーム "へと進化しました。この変革は、機能の幅を広げる一方で、単に信頼性の高いPDF操作が必要なチームにとっては大きな課題をもたらします:
1.プラットフォームの過剰エンジニアリング:かつては PDF SDK だったものが、今では AI 機能とドキュメント ワークフロー機能を備えた完全なドキュメント インテリジェンス プラットフォームになっていますが、単純な PDF タスクには不要な場合があります。
2.エンタープライズ価格設定: Nutrient.io は、価格設定が不透明で営業担当者への問い合わせが必要な大規模組織向けに位置付けられています。 そのため、小規模から中規模のチームにとっては障壁となり、予算計画も難しくなります。
3.ブランド変更に伴う混乱: PSPDFKit から Nutrient への移行により、両方の名称を参照するドキュメントに問題が発生しています。パッケージ名には引き続き PSPDFKit が使用される可能性があり、移行中の移行パスは依然として不明確です。
4.非同期優先の複雑さ: Nutrient.io のすべてには async/await パターンが必要です。 単純な操作であっても、初期化にはPdfProcessor.CreateAsync()が必要であり、基本的なタスクには非同期メソッドが必要で、同期ワークフローにはオーバーヘッドが追加されます。
5.依存関係が重い:完全なプラットフォームでは、パッケージのフットプリントが大きくなり、初期化に時間がかかり、構成も追加されるため、より多くのリソースが必要になります。
Nutrient.ioとIronPDFの比較
| アスペクト | Nutrient.io (PSPDFKit) | IronPDF |
|---|---|---|
| フォーカス | ドキュメントインテリジェンスプラットフォーム | PDFライブラリ |
| 価格 | エンタープライズ(営業担当) | 透明性のある出版物 |
| アーキテクチャ | 複雑なプラットフォーム | シンプルなライブラリ |
| APIスタイル | 非同期ファースト | 非同期オプション付き同期 |
| 依存関係 | 重い | 軽量 |
| 構成 | 複雑な設定オブジェクト | わかりやすいプロパティ |
| 学習曲線 | Steep(プラットフォーム) | ジェントル(ライブラリ) |
| 対象ユーザー | エンタープライズ | すべてのチームサイズ |
2025年、2026年まで.NET 10とC# 14の導入を計画しているチームにとって、IronPDFは完全なドキュメントインテリジェンスプラットフォームのオーバーヘッドなしにきれいに統合する、よりシンプルな基盤を提供します。
始める前に
前提条件
- .NET 環境: .NET Framework 4.6.2+ または .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGetアクセス: NuGetパッケージをインストールする機能
- 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";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()を待ちます。 | new ChromePdfRenderer(). | 非同期は不要 |
プロセッサ.Dispose() | (自動または手動) | よりシンプルなライフサイクル |
new PdfConfiguration { ... } | renderer.RenderingOptions。 | プロパティベース |
ドキュメント読み込みマッピング
| Nutrient.io (PSPDFKit) | IronPDF | ノート |
|---|---|---|
awaitプロセッサ.OpenAsync(path)。 | PdfDocument.FromFile(パス)。 | デフォルトで同期 |
Document.LoadFromStream(stream)(ドキュメント.ロードフロムストリーム)。 | <コード>PdfDocument.FromStream(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). | renderer.RenderHtmlFileAsPdf(path)のようにします。 | HTMLファイル |
ドキュメント操作マッピング
| Nutrient.io (PSPDFKit) | IronPDF | ノート |
|---|---|---|
awaitプロセッサ.MergeAsync(docs)。 | PdfDocument.Merge(pdfs). | 同期 |
| <コード>document.PageCount</コード | <コード>pdf.PageCount</コード | 同じパターン |
await document.SaveAsync(path). | pdf.SaveAs(path)のようにします。 | 同期 |
| <コード>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 フォントサイズ: 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");
}
}翻訳後(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");
}
}awaitPdfProcessor.CreateAsync()でPdfProcessorを作成し、await processor.GeneratePdfFromHtmlStringAsync()を呼び出し、最後にawait document.SaveAsync()を呼び出します。 メソッド全体はasync Taskとマークされなければならず、プロセッサは適切な処理のためにusingステートメントを必要とします。
IronPDFはこれを劇的に簡素化します。 ChromePdfRendererを作成し、RenderHtmlAsPdf()を呼び出し、SaveAs()で保存します。 async/awaitは不要で、プロセッサのライフサイクルを管理する必要もなく、単純な操作に``ブロックを使用する必要もありません。 このパターンは、PDFワークフローに非同期パターンを必要としない開発者にとっては、より直感的です。 その他のレンダリングオプションについては、HTML to PDF documentationを参照してください。
例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");
}
}翻訳後(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");
}
}Nutrient.ioのマージ操作では、await PdfProcessor.CreateAsync()でプロセッサを作成し、別々のawait processor.OpenAsync()呼び出しで各ドキュメントを開き、List<PdfDocument>を作成し、そのリストでawait processor.MergeAsync()を呼び出し、最後にawait mergedDocument.SaveAsync()を呼び出す必要があります。 これは、基本的なマージのための5つの非同期操作です。
IronPDFはこれを4つの同期行に減らします: PdfDocument.FromFile()で各PDFをロードし、静的なPdfDocument.Merge()メソッドでマージし、保存します。 プロセッサのライフサイクルがなく、リスト作成が不要で(ドキュメントを直接渡すことができます)、非同期のオーバーヘッドがありません。 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");
}
}翻訳後(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");
}
}この例では、基本的なアーキテクチャの違いが浮き彫りになっています。 Nutrient.io は注釈ベースのアプローチを使用します。OpacityやFontSizeなどのプロパティを持つTextAnnotationオブジェクトを作成し、ページごとにawait document.AddAnnotationAsync(i, watermark)呼び出してすべてのページOpacityループします。 そのためには、注釈システムを理解し、自らループを管理する必要があります。
IronPDF はHTML ベースのアプローチを使用します。ApplyWatermark ApplyWatermark()メソッドは CSS スタイルが適用された HTML 文字列を受け入れます。 透かしは、1回の呼び出しですべてのページに自動的に適用されます。 アノテーション固有のオブジェクト・プロパティではなく、おなじみのCSSプロパティ(color, opacity、font-size)によって外観を制御します。 グラデーション、画像、複雑なレイアウトなど、あらゆるHTML/CSSを使用できます。 高度な例については、透かしのドキュメントを参照してください。
重要な移行に関する注意事項
非同期から同期への変換
最も大きな変更点は、不要な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");もし非同期操作が必要であれば、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 management構成パターンの変更
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);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>"ページ番号の取り扱い
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}"
};トラブルシューティング
問題 1: PdfProcessor が見つかりません。
問題:IronPDFにPdfProcessorクラスが存在しません。
解決策: 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();問題 2: GeneratePdfFromHtmlStringAsync が見つかりません。
問題:非同期 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);課題3: テキストアノテーションが見つかりません
問題: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>");問題 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);移行チェックリスト
移行前
- コードベース内のすべてのPSPDFKit/Nutrientの使用状況を一覧表示する
- 調整が必要な可能性のある非同期パターンを文書化する
- すべての構成オブジェクトとそのプロパティを一覧表示します
- 注釈ベースの機能(透かし、ヘッダー)を識別する
- フォーム処理要件を確認する
- IronPDFライセンスキーを取得する
パッケージの変更
PSPDFKit.NETNuGet パッケージを削除するNutrientNuGet パッケージを削除するIronPdfNuGet パッケージをインストールします:dotnet add package IronPdf- 名前空間のインポートを更新する
コードの変更
- 起動時にライセンスキー設定を追加する
PdfProcessor.CreateAsync()をnew ChromePdfRenderer()に置き換えますprocessor.GeneratePdfFromHtmlStringAsync()をrenderer.RenderHtmlAsPdf()に置き換えますprocessor.MergeAsync()をPdfDocument.Merge()に置き換えます。TextAnnotation透かしを HTML の透かしに変換します- 設定オブジェクトを
RenderingOptionsプロパティに置き換える - プレースホルダー付きの
HtmlHeaderFooter使用するようにヘッダー/フッターを更新します - 不要な async/await パターンを削除する
移行後
- 不要になった async/await を削除します
- PDF出力を比較する回帰テストを実行する
- ページ番号付きのヘッダー/フッターを検証する
- 透かしのレンダリングをテストする
- CI/CDパイプラインの更新






