フッターコンテンツにスキップ
移行ガイド

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は完全なドキュメントインテリジェンスプラットフォームのオーバーヘッドなしにきれいに統合する、よりシンプルな基盤を提供します。


始める前に

前提条件

  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
SHELL

ライセンス構成

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

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" .
SHELL

完全な 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.5CSS <コード>不透明度:0.5</コードCSSスタイリング
annotation.FontSize = 48.CSS フォントサイズ: 48pxCSSスタイリング

コード移行の例

例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");
    }
}
$vbLabelText   $csharpLabel

翻訳後(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");
    }
}
$vbLabelText   $csharpLabel

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

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

この例では、基本的なアーキテクチャの違いが浮き彫りになっています。 Nutrient.io は注釈ベースのアプローチを使用します。OpacityFontSizeなどのプロパティを持つTextAnnotationオブジェクトを作成し、ページごとにawait document.AddAnnotationAsync(i, watermark)呼び出してすべてのページOpacityループします。 そのためには、注釈システムを理解し、自らループを管理する必要があります。

IronPDF はHTML ベースのアプローチを使用します。ApplyWatermark ApplyWatermark()メソッドは CSS スタイルが適用された HTML 文字列を受け入れます。 透かしは、1回の呼び出しですべてのページに自動的に適用されます。 アノテーション固有のオブジェクト・プロパティではなく、おなじみのCSSプロパティ(color, opacityfont-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");
$vbLabelText   $csharpLabel

もし非同期操作が必要であれば、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
$vbLabelText   $csharpLabel

構成パターンの変更

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);
$vbLabelText   $csharpLabel

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>"
$vbLabelText   $csharpLabel

ページ番号の取り扱い

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}"
};
$vbLabelText   $csharpLabel

トラブルシューティング

問題 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();
$vbLabelText   $csharpLabel

問題 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);
$vbLabelText   $csharpLabel

課題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>");
$vbLabelText   $csharpLabel

問題 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);
$vbLabelText   $csharpLabel

移行チェックリスト

移行前

  • コードベース内のすべてのPSPDFKit/Nutrientの使用状況を一覧表示する
  • 調整が必要な可能性のある非同期パターンを文書化する
  • すべての構成オブジェクトとそのプロパティを一覧表示します
  • 注釈ベースの機能(透かし、ヘッダー)を識別する
  • フォーム処理要件を確認する
  • IronPDFライセンスキーを取得する

パッケージの変更

  • PSPDFKit.NET NuGet パッケージを削除する
  • Nutrient NuGet パッケージを削除する
  • IronPdf NuGet パッケージをインストールします: 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パイプラインの更新

カーティス・チャウ
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。