跳至頁尾內容
移民指南

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

功能對比

特徵DinkToPdfIronPDF
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

需要預見的重大變化

改變DinkToPdfIronPDF影響
轉換器SynchronizedConverter(new PdfTools())ChromePdfRenderer更簡單的實例化
文件HtmlToPdfDocument直接方法調用沒有文檔對象
設定GlobalSettings + ObjectSettingsRenderingOptions單一選項對象
返回類型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 遷移參考

核心類別映射

DinkToPdfIronPDF筆記
SynchronizedConverterChromePdfRenderer預設情況下線程安全
BasicConverterChromePdfRenderer同類型,更簡單
PdfTools不需要內化的
HtmlToPdfDocument不需要直接方法調用
GlobalSettingsRenderingOptions渲染器的一部分
ObjectSettingsRenderingOptions渲染器的一部分
MarginSettings個體邊際屬性MarginTopMarginBottom等。

全域設定映射

DinkToPdf 全域設置IronPDF當量
ColorMode = ColorMode.Color預設(始終為彩色)
Orientation = Orientation.PortraitPaperOrientation = PdfPaperOrientation.Portrait
Orientation = Orientation.LandscapePaperOrientation = PdfPaperOrientation.Landscape
PaperSize = PaperKind.A4PaperSize = PdfPaperSize.A4
Margins = new MarginSettings()個體邊際屬性

邊距設定映射

DinkToPdf 邊距IronPDF當量
Margins.Top = 10MarginTop = 10
Margins.Bottom = 10MarginBottom = 10
Margins.Left = 15MarginLeft = 15
Margins.Right = 15MarginRight = 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擁有卡爾頓大學電腦科學學士學位,專長於前端開發,精通Node.js、TypeScript、JavaScript和React。他熱衷於打造直覺美觀的使用者介面,喜歡使用現代框架,並擅長撰寫結構清晰、視覺效果出色的使用者手冊。

除了開發工作之外,柯蒂斯對物聯網 (IoT) 也抱有濃厚的興趣,致力於探索硬體和軟體整合的創新方法。閒暇時,他喜歡玩遊戲和製作 Discord 機器人,將他對科技的熱愛與創造力結合。