如何在 C# 中將 DinkToPdf 遷移到 IronPDF
DinkToPdf 封裝了 wkhtmltopdf,繼承了其所有安全漏洞和技術限制。 了解這些問題對於評估移民的緊迫性至關重要。
關鍵安全問題
DinkToPdf繼承了wkhtmltopdf存在的關鍵未修補安全漏洞:
- 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*"需要預見的重大變化
| 改變 | 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步驟 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;步驟 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";完整的 API 遷移參考
核心類別映射
| DinkToPdf | IronPDF | 筆記 |
|---|---|---|
SynchronizedConverter | ChromePdfRenderer | 預設情況下線程安全 |
BasicConverter | ChromePdfRenderer | 同類型,更簡單 |
PdfTools | 不需要 | 內化的 |
HtmlToPdfDocument | 不需要 | 直接方法調用 |
GlobalSettings | RenderingOptions | 渲染器的一部分 |
ObjectSettings | RenderingOptions | 渲染器的一部分 |
MarginSettings | 個體邊際屬性 | MarginTop 、 MarginBottom等。 |
全域設定映射
| 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);
}
}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");
}
}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);
}
}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");
}
}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);
}
}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");
}
}IronPDF 的RenderingOptions以統一、流暢的 API 取代了GlobalSettings和MarginSettings 。 如需更多配置選項,請參閱渲染選項文件。
關鍵遷移說明
移除本地二進位文件
最重要的清理步驟是刪除 wkhtmltopdf 原生二進位檔案。 IronPDF 沒有原生依賴項:
# Delete native binaries
rm libwkhtmltox.* 2>/dev/null# Delete native binaries
rm libwkhtmltox.* 2>/dev/null無需單例模式
為了避免崩潰,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();更豐富的回傳類型
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");完全支援 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!遷移後檢查清單
程式碼遷移完成後,請驗證以下內容:
執行所有單元測試以驗證 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 年的發展,這種差距只會越來越大。
其他資源
從 DinkToPdf 遷移到 IronPDF 可以消除關鍵安全漏洞 (CVE-2022-35583)、線程安全崩潰、原生二進位部署複雜性和過時的 CSS 渲染。 過渡到現代 Chromium 引擎可實現完整的 CSS3 支援、可靠的 JavaScript 執行,以及由積極維護的程式庫帶來的安心感。






