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

C#でDinkToPdfからIronPdfに移行する方法

DinkToPdfはwkhtmltopdfをラップし、そのセキュリティの脆弱性と技術的な制限をすべて受け継いでいます。 これらの問題を理解することは、移行の緊急性を評価する上で非常に重要です。

重大なセキュリティ問題

DinkToPdfは、wkhtmltopdfからパッチ未適用の重大なセキュリティ脆弱性を継承しています:

  1. CVE-2022-35583 (SSRF):サーバーサイドリクエストフォージェリにより、攻撃者が内部ネットワークリソースにアクセスできる 2.放棄されたプロジェクト: wkhtmltopdfは2020年からメンテナンスされていません 3.セキュリティパッチなし:既知の脆弱性は修正されない

技術的な問題

問題インパクト
スレッドセーフティSynchronizedConverterが本番環境で並行負荷がかかるとクラッシュする
ネイティブバイナリプラットフォーム固有の libwkhtmltox バイナリを使用した複雑なデプロイメント
CSSの制限事項Flexbox、Grid、モダンCSSのサポートはありません。
JavaScript(ジャバスクリプト一貫性のない実行、タイムアウト
レンダリング旧式のWebKitエンジン(2015年頃)
メンテナンス最終更新: 2018

アーキテクチャの比較

アスペクトDinkToPdfIronPDF
セキュリティCVE-2022-35583 (SSRF)、パッチ未適用既知の脆弱性なし
レンダリングエンジン時代遅れのWebKit(2015年)モダンChromium
スレッドセーフティ同時使用時のクラッシュ完全スレッドセーフ
ネイティブの依存関係プラットフォーム固有のバイナリ純粋なNuGetパッケージ
CSSサポートフレックスボックス/グリッドなし完全なCSS3
JavaScript(ジャバスクリプト限定的で一貫性がないフルサポート
メンテナンス見捨てられた (2018)積極的なメンテナンス

機能比較

フィーチャーDinkToPdfIronPDF
HTMLからPDFへ✅ (古いエンジン)✅ (Chromium)
URLからPDFへ
カスタムマージン
ヘッダー/フッター✅ (限定)✅ (完全なHTML)
CSS3❌ 制限付きフル
フレックスボックス/グリッド
JavaScript⚠️ 有限会社フル
PDF操作
フォーム入力
デジタル署名
暗号化
透かし
マージ/スプリット

移行前の準備

前提条件

あなたの環境がこれらの要件を満たしていることを確認してください:

  • .NET Framework 4.6.2+または.NET Core 3.1 / .NET 5-9
  • Visual Studio 2019+またはC#拡張機能付きVS Code
  • NuGetパッケージマネージャへのアクセス
  • IronPDFライセンスキー (ironpdf.com にて無料トライアル可能)

DinkToPdfの使用状況を確認する

ソリューションディレクトリで以下のコマンドを実行し、すべてのDinkToPdf参照を識別してください:

# Find allDinkToPdfusages in your codebase
grep -r "using DinkToPdf" --include="*.cs" .
grep -r "SynchronizedConverter\|HtmlToPdfDocument\|ObjectSettings" --include="*.cs" .

# Find NuGet package references
grep -r "DinkToPdf" --include="*.csproj" .

# Find wkhtmltopdf binaries
find . -name "libwkhtmltox*"
# Find allDinkToPdfusages in your codebase
grep -r "using DinkToPdf" --include="*.cs" .
grep -r "SynchronizedConverter\|HtmlToPdfDocument\|ObjectSettings" --include="*.cs" .

# Find NuGet package references
grep -r "DinkToPdf" --include="*.csproj" .

# Find wkhtmltopdf binaries
find . -name "libwkhtmltox*"
SHELL

予想される画期的な変更

変更DinkToPdfIronPDFインパクト
コンバーターSynchronizedConverter(新しいPdfTools())<コード>ChromePdfRenderer</コードよりシンプルなインスタンス化
ドキュメント<コード>HtmlToPdfDocument</コード直接メソッド呼び出しドキュメントオブジェクトなし
設定GlobalSettings +<コード>オブジェクト設定</コードです。<コード>レンダリングオプション</コード単一オプションオブジェクト
リターンタイプ<コード>バイト[]</コード<コード>PdfDocument</コードより強力なオブジェクト
<ストロング>バイナリ</ストロング<コード>libwkhtmltox.dll/so</コードなし(マネージド)ネイティブファイルの削除
スレッドセーフSynchronizedConverterが必要です。デフォルトでスレッドセーフよりシンプルなコード
DIシングルトン必須生涯柔軟性

ステップごとの移行プロセス

ステップ 1: NuGet パッケージを更新する。

DinkToPdfを削除し、IronPdfをインストールしてください:

# Remove DinkToPdf
dotnet remove package DinkToPdf

# Install IronPDF
dotnet add package IronPdf
# Remove DinkToPdf
dotnet remove package DinkToPdf

# Install IronPDF
dotnet add package IronPdf
SHELL

ステップ 2: ネイティブ バイナリの削除

プロジェクトからこれらのプラットフォーム固有のファイルを削除してください:

  • <コード>libwkhtmltox.dll</コード> (Windows)
  • <コード>libwkhtmltox.so</コード> (Linux)
  • <コード>libwkhtmltox.dylib</コード> (macOS)

IronPdfにはネイティブの依存関係はありません。

ステップ 3: 名前空間参照の更新

DinkToPdf名前空間をIronPdfに置き換えてください:

// Remove these
using DinkToPdf;
using DinkToPdf.Contracts;

// Add this
using IronPdf;
// Remove these
using DinkToPdf;
using DinkToPdf.Contracts;

// Add this
using IronPdf;
$vbLabelText   $csharpLabel

ステップ 4: ライセンスの設定

// Add at application startup (Program.cs or Global.asax)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Global.asax)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
$vbLabelText   $csharpLabel

完全な API 移行のリファレンス

コア クラス マッピング

DinkToPdfIronPDFノート
SynchronizedConverter(シンクロナイズド・コンバーター<コード>ChromePdfRenderer</コードデフォルトでスレッドセーフ
<コード>BasicConverter</コード<コード>ChromePdfRenderer</コード同じクラスでよりシンプルに
<コード>PdfTools</コード不要内部化
<コード>HtmlToPdfDocument</コード不要直接メソッド呼び出し
<コード>グローバル設定</コード<コード>レンダリングオプション</コードレンダラーの一部
<コード>オブジェクト設定</コード<コード>レンダリングオプション</コードレンダラーの一部
<コード>マージン設定</コード個々のマージン特性MarginTopMarginBottomなど。

グローバル設定のマッピング

DinkToPdf グローバル設定IronPDF 同等物
ColorMode = ColorMode.Color です。デフォルト(常にカラー)
Orientation = Orientation.Portrait です。PaperOrientation = PdfPaperOrientation.Portrait です。
Orientation = Orientation.Landscape.PaperOrientation = PdfPaperOrientation.Landscape です。
PaperSize = PaperKind.A4.PaperSize = PdfPaperSize.A4.
Margins = new MarginSettings().個々のマージン特性

マージン設定のマッピング

DinkToPdf のマージンIronPDF 同等物
マージン.トップ = 10マージントップ = 10
Margins.Bottom = 10.MarginBottom = 10.
Margins.Left = 15.MarginLeft = 15.
Margins.Right = 15.MarginRight = 15.

コード移行の例

基本的な HTML から PDF

基本的な変換は、DinkToPdfの冗長な設定からIronPdfの合理化されたAPIへの劇的な単純化を示しています。

DinkToPdfの実装:

// NuGet: Install-Package DinkToPdf
using DinkToPdf;
using DinkToPdf.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());
        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
                Orientation = Orientation.Portrait,
                PaperSize = PaperKind.A4,
            },
            Objects = {
                new ObjectSettings() {
                    HtmlContent = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>",
                    WebSettings = { DefaultEncoding = "utf-8" }
                }
            }
        };
        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("output.pdf", pdf);
    }
}
// NuGet: Install-Package DinkToPdf
using DinkToPdf;
using DinkToPdf.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());
        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
                Orientation = Orientation.Portrait,
                PaperSize = PaperKind.A4,
            },
            Objects = {
                new ObjectSettings() {
                    HtmlContent = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>",
                    WebSettings = { DefaultEncoding = "utf-8" }
                }
            }
        };
        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("output.pdf", pdf);
    }
}
$vbLabelText   $csharpLabel

IronPDFの実装:

// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML.</p>");
        pdf.SaveAs("output.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a PDF from HTML.</p>");
        pdf.SaveAs("output.pdf");
    }
}
$vbLabelText   $csharpLabel

IronPdfは20行のDinkToPdf設定を4行に減らします。 SynchronizedConverterも、PdfToolsも、HtmlToPdfDocumentも、ObjectSettingsもありません。 その他のオプションについては、HTML to PDF documentationを参照してください。

URLからPDFへの変換

DinkToPdfの実装:

// NuGet: Install-Package DinkToPdf
using DinkToPdf;
using DinkToPdf.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());
        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
                Orientation = Orientation.Portrait,
                PaperSize = PaperKind.A4,
            },
            Objects = {
                new ObjectSettings() {
                    Page = "https://www.example.com",
                }
            }
        };
        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("webpage.pdf", pdf);
    }
}
// NuGet: Install-Package DinkToPdf
using DinkToPdf;
using DinkToPdf.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());
        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
                Orientation = Orientation.Portrait,
                PaperSize = PaperKind.A4,
            },
            Objects = {
                new ObjectSettings() {
                    Page = "https://www.example.com",
                }
            }
        };
        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("webpage.pdf", pdf);
    }
}
$vbLabelText   $csharpLabel

IronPDFの実装:

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

IronPDFのRenderUrlAsPdfは入れ子になったObjectSettings.Pageの設定を直接メソッド呼び出しに置き換えます。 その他のオプションについては、URL to PDF documentationを参照してください。

ランドスケープと余白のカスタム設定

DinkToPdfの実装:

// NuGet: Install-Package DinkToPdf
using DinkToPdf;
using DinkToPdf.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());
        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
                Orientation = Orientation.Landscape,
                PaperSize = PaperKind.A4,
                Margins = new MarginSettings { Top = 10, Bottom = 10, Left = 15, Right = 15 }
            },
            Objects = {
                new ObjectSettings() {
                    HtmlContent = "<h1>Custom PDF</h1><p>Landscape orientation with custom margins.</p>",
                    WebSettings = { DefaultEncoding = "utf-8" }
                }
            }
        };
        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("custom.pdf", pdf);
    }
}
// NuGet: Install-Package DinkToPdf
using DinkToPdf;
using DinkToPdf.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());
        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
                Orientation = Orientation.Landscape,
                PaperSize = PaperKind.A4,
                Margins = new MarginSettings { Top = 10, Bottom = 10, Left = 15, Right = 15 }
            },
            Objects = {
                new ObjectSettings() {
                    HtmlContent = "<h1>Custom PDF</h1><p>Landscape orientation with custom margins.</p>",
                    WebSettings = { DefaultEncoding = "utf-8" }
                }
            }
        };
        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("custom.pdf", pdf);
    }
}
$vbLabelText   $csharpLabel

IronPDFの実装:

// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
        renderer.RenderingOptions.MarginTop = 10;
        renderer.RenderingOptions.MarginBottom = 10;
        renderer.RenderingOptions.MarginLeft = 15;
        renderer.RenderingOptions.MarginRight = 15;

        var pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>Landscape orientation with custom margins.</p>");
        pdf.SaveAs("custom.pdf");
    }
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;

class Program
{
    static void Main()
    {
        var renderer = new ChromePdfRenderer();
        renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape;
        renderer.RenderingOptions.MarginTop = 10;
        renderer.RenderingOptions.MarginBottom = 10;
        renderer.RenderingOptions.MarginLeft = 15;
        renderer.RenderingOptions.MarginRight = 15;

        var pdf = renderer.RenderHtmlAsPdf("<h1>Custom PDF</h1><p>Landscape orientation with custom margins.</p>");
        pdf.SaveAs("custom.pdf");
    }
}
$vbLabelText   $csharpLabel

IronPDFのRenderingOptionsGlobalSettingsMarginSettingsの両方を置き換え、統一された流暢なAPIを提供します。 その他の設定オプションについては、rendering options documentationを参照してください。

重要な移行に関する注意事項

ネイティブ バイナリの削除

最も重要なクリーンアップステップは、wkhtmltopdfネイティブバイナリを削除することです。 IronPDFにはネイティブの依存関係はありません:

# Delete native binaries
rm libwkhtmltox.* 2>/dev/null
# Delete native binaries
rm libwkhtmltox.* 2>/dev/null
SHELL

シングルトンは必要ありません。

DinkToPdf の SynchronizedConverter<//code> は、クラッシュを避けるためにシングルトンとして登録する必要がありました。 IronPDFのChromePdfRendererはDIのライフタイムに関係なくスレッドセーフです:

//DinkToPdf- MUST be singleton
services.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools()));

//IronPDF- any lifetime works
services.AddScoped<ChromePdfRenderer>();
// Or just create inline:
var renderer = new ChromePdfRenderer();
//DinkToPdf- MUST be singleton
services.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools()));

//IronPDF- any lifetime works
services.AddScoped<ChromePdfRenderer>();
// Or just create inline:
var renderer = new ChromePdfRenderer();
$vbLabelText   $csharpLabel

リチャーリターンタイプ

DinkToPdfはbyte[]を返します。 IronPDFは操作可能なPdfDocumentを返します:

//DinkToPdfreturns byte[]
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("output.pdf", pdf);
return File(pdf, "application/pdf");

//IronPDFreturns PdfDocument
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
return File(pdf.BinaryData, "application/pdf");
//DinkToPdfreturns byte[]
byte[] pdf = converter.Convert(doc);
File.WriteAllBytes("output.pdf", pdf);
return File(pdf, "application/pdf");

//IronPDFreturns PdfDocument
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
return File(pdf.BinaryData, "application/pdf");
$vbLabelText   $csharpLabel

完全なCSS3サポート。

DinkToPdfでは失敗するモダンレイアウトもIronPdfでは完璧に機能します:

//DinkToPdf- doesn't work (wkhtmltopdf uses 2015 WebKit)
var html = "<div style='display: flex;'>...</div>";  // Broken!

//IronPDF- full support (modern Chromium)
var html = @"
    <div style='display: flex; justify-content: space-between;'>
        <div>Left</div>
        <div>Right</div>
    </div>";
var pdf = renderer.RenderHtmlAsPdf(html);  // Works!
//DinkToPdf- doesn't work (wkhtmltopdf uses 2015 WebKit)
var html = "<div style='display: flex;'>...</div>";  // Broken!

//IronPDF- full support (modern Chromium)
var html = @"
    <div style='display: flex; justify-content: space-between;'>
        <div>Left</div>
        <div>Right</div>
    </div>";
var pdf = renderer.RenderHtmlAsPdf(html);  // Works!
$vbLabelText   $csharpLabel

移行後のチェックリスト

コードの移行が完了したら、以下を確認してください:

  • すべてのユニットテストを実行して、PDF生成が正しく機能することを確認します。
  • マルチスレッドのシナリオをテストする(DinkToPdf ではクラッシュする)
  • PDF出力品質を比較する(IronPDFのChromiumの方がレンダリング品質が良い)
  • CSS レンダリングを検証します (Flexbox/Grid が動作するようになりました) -JavaScript実行のテスト (IronPDF で信頼性あり)
  • CI/CD パイプラインを更新して wkhtmltopdf のインストールを削除します
  • セキュリティスキャンのパスを検証する(CVE-2022-35583フラグはなくなりました)
  • Docker/デプロイメント スクリプトからネイティブ バイナリ デプロイメントを削除する

PDFインフラストラクチャの将来性を確保する

.NET 10が目前に迫り、C# 14では新しい言語機能が導入されるため、積極的にメンテナンスされているPDFライブラリを選択することで、長期的な互換性を確保できます。 IronPDFの最新のChromiumエンジンは定期的なアップデートを受けていますが、DinkToPdfの放棄されたwkhtmltopdfは2015年の機能のまま凍結されています。

その他のリソース


DinkToPdfからIronPdfに移行することで、重大なセキュリティ脆弱性(CVE-2022-35583)、スレッドセーフのクラッシュ、ネイティブバイナリの展開の複雑さ、時代遅れのCSSレンダリングがなくなります。 最新のChromiumエンジンへの移行は、完全なCSS3サポート、信頼性の高いJavaScriptの実行、積極的にメンテナンスされるライブラリから得られる安心感を提供します。

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

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

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