MIGRATION GUIDES How to Migrate from DinkToPdf to IronPDF in C# Curtis Chau 發表日期:2026年1月11日 下載 IronPDF NuGet 下載 DLL 下載 Windows 安裝程式 開始免費試用 法學碩士副本 法學碩士副本 將頁面複製為 Markdown 格式,用於 LLMs 在 ChatGPT 中打開 請向 ChatGPT 諮詢此頁面 在雙子座打開 請向 Gemini 詢問此頁面 在 Grok 中打開 向 Grok 詢問此頁面 打開困惑 向 Perplexity 詢問有關此頁面的信息 分享 在 Facebook 上分享 分享到 X(Twitter) 在 LinkedIn 上分享 複製連結 電子郵件文章 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*" 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 個體邊際屬性 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); } } $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 取代了GlobalSettings和MarginSettings 。 如需更多配置選項,請參閱渲染選項文件。 關鍵遷移說明 移除本地二進位文件 最重要的清理步驟是刪除 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 文件 HTML 轉 PDF 教學課程 API 參考 NuGet 套件 -授權選項 從 DinkToPdf 遷移到 IronPDF 可以消除關鍵安全漏洞 (CVE-2022-35583)、線程安全崩潰、原生二進位部署複雜性和過時的 CSS 渲染。 過渡到現代 Chromium 引擎可實現完整的 CSS3 支援、可靠的 JavaScript 執行,以及由積極維護的程式庫帶來的安心感。 Curtis Chau 立即與工程團隊聊天 技術撰稿人 Curtis Chau 擁有電腦科學學士學位(卡爾頓大學),專長於前端開發,精通 Node.js、TypeScript、JavaScript 和 React。Curtis 對製作直覺且美觀的使用者介面充滿熱情,他喜歡使用現代化的架構,並製作結構良好且視覺上吸引人的手冊。除了開發之外,Curtis 對物聯網 (IoT) 也有濃厚的興趣,他喜歡探索整合硬體與軟體的創新方式。在空閒時間,他喜歡玩遊戲和建立 Discord bots,將他對技術的熱愛與創意結合。 相關文章 發表日期 2026年2月1日 How to Migrate from ZetPDF to IronPDF in C# Master the migration from ZetPDF to IronPDF with this complete C# guide. Switch from a coordinate-based library to a modern HTML-to-PDF solution. Includes code examples for HTML conversion, merging PDFs, and removing PDFSharp dependencies. 閱讀更多 發表日期 2026年2月1日 How to Migrate from Scryber.Core to IronPDF in C# Master the migration from Scryber.Core to IronPDF with this complete C# guide. Switch from custom XML/HTML parsing to a modern Chromium renderer. Includes code examples for HTML conversion, URL rendering, and replacing proprietary bindings. 閱讀更多 發表日期 2026年2月1日 How to Migrate from XFINIUM.PDF to IronPDF in C# Master the migration from XFINIUM.PDF to IronPDF with this complete C# guide. Switch from manual coordinate-based positioning to declarative HTML/CSS rendering. Includes code examples for replacing graphics primitives and automatic layout. 閱讀更多 How to Migrate from DynamicPDF to IronPDF in C#How to Migrate from CraftMyPDF to I...
發表日期 2026年2月1日 How to Migrate from ZetPDF to IronPDF in C# Master the migration from ZetPDF to IronPDF with this complete C# guide. Switch from a coordinate-based library to a modern HTML-to-PDF solution. Includes code examples for HTML conversion, merging PDFs, and removing PDFSharp dependencies. 閱讀更多
發表日期 2026年2月1日 How to Migrate from Scryber.Core to IronPDF in C# Master the migration from Scryber.Core to IronPDF with this complete C# guide. Switch from custom XML/HTML parsing to a modern Chromium renderer. Includes code examples for HTML conversion, URL rendering, and replacing proprietary bindings. 閱讀更多
發表日期 2026年2月1日 How to Migrate from XFINIUM.PDF to IronPDF in C# Master the migration from XFINIUM.PDF to IronPDF with this complete C# guide. Switch from manual coordinate-based positioning to declarative HTML/CSS rendering. Includes code examples for replacing graphics primitives and automatic layout. 閱讀更多