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

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

アーキテクチャの比較

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

機能比較

フィーチャー DinkToPdf IronPDF
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

予想される画期的な変更

変更 DinkToPdf IronPDF インパクト
コンバーター 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 移行のリファレンス

コア クラス マッピング

DinkToPdf IronPDF ノート
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 は、クラッシュを避けるためにシングルトンとして登録する必要がありました。 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ボットを作成したりして、技術に対する愛情と創造性を組み合わせています。