跳過到頁腳內容
MIGRATION GUIDES

How to Migrate from DinkToPdf to IronPDF in C#

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) 現代鉻
螺紋安全 並發使用中崩潰 完全螺紋安全
本地依賴項 平台特定二進位文件 純 NuGet 套件
CSS 支援 不使用 Flexbox/Grid 完整的 CSS3
JavaScript 有限、不一致 全力支持
維護 棄置 (2018) 積極維護

功能對比

特徵 DinkToPdf IronPDF
HTML 轉 PDF ✅(過時的引擎) ✅(鉻)
PDF檔案的URL
自訂邊距
頁首/頁尾 ✅(限量) ✅(完整 HTML 程式碼)
CSS3 ❌ 有限 ✅ 已完成
Flexbox/Grid
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 all DinkToPdf usages 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 all DinkToPdf usages 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(new PdfTools()) ChromePdfRenderer 更簡單的實例化
文件 HtmlToPdfDocument 直接方法調用 沒有文檔對象
設定 GlobalSettings + ObjectSettings RenderingOptions 單一選項對象
返回類型 byte[] PdfDocument 更強大的物體
二進位 libwkhtmltox.dll/so 無(已管理) 移除本地文件
螺紋安全 需要SynchronizedConverter 預設情況下線程安全 更簡潔的程式碼
單例模式 任何一生 靈活的

逐步遷移過程

步驟 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 不需要 直接方法調用
GlobalSettings RenderingOptions 渲染器的一部分
ObjectSettings RenderingOptions 渲染器的一部分
MarginSettings 個體邊際屬性 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當量
Margins.Top = 10 MarginTop = 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 轉 PDF 文件

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配置。 更多選項請參閱PDF 文件的 URL

自訂設定(橫向和邊距)

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 的RenderingOptions以統一、流暢的 API 取代了GlobalSettingsMarginSettings 。 如需更多配置選項,請參閱渲染選項文件

關鍵遷移說明

移除本地二進位文件

最重要的清理步驟是刪除 wkhtmltopdf 原生二進位檔案。 IronPDF 沒有原生依賴項:

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

無需單例模式

為了避免崩潰,DinkToPdf 的SynchronizedConverter必須註冊為單例。 IronPDF 的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();
// 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

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

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

// IronPDF returns 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 年的功能水平——隨著網絡標準在 2025 年和 2026 年的發展,這種差距只會越來越大。

其他資源

IronPDF 文件


從 DinkToPdf 遷移到 IronPDF 可以消除關鍵安全漏洞 (CVE-2022-35583)、線程安全崩潰、原生二進位部署複雜性和過時的 CSS 渲染。 過渡到現代 Chromium 引擎可實現完整的 CSS3 支援、可靠的 JavaScript 執行,以及由積極維護的程式庫帶來的安心感。

Curtis Chau
技術撰稿人

Curtis Chau 擁有電腦科學學士學位(卡爾頓大學),專長於前端開發,精通 Node.js、TypeScript、JavaScript 和 React。Curtis 對製作直覺且美觀的使用者介面充滿熱情,他喜歡使用現代化的架構,並製作結構良好且視覺上吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 也有濃厚的興趣,他喜歡探索整合硬體與軟體的創新方式。在空閒時間,他喜歡玩遊戲和建立 Discord bots,將他對技術的熱愛與創意結合。