跳過到頁腳內容
遷移指南

如何在 C# 中從 DinkToPdf 轉移到 IronPDF

從DinkToPdf轉移到 IronPDF:完整的 C# 遷移指南。

DinkToPdf 是 wkhtmltopdf 的開放原始碼 .NET wrapper,可將 HTML 轉換成 PDF。 然而,底層的 wkhtmltopdf 專案已於 2020 年拋棄,留下重要的安全漏洞尚未修補,包括 CVE-2022-35583 (伺服器端請求偽造)。DinkToPdf的線程安全問題會導致生產程序當機,加上過時的 WebKit 渲染引擎不支援現代 CSS,DinkToPdf 為生產應用程式帶來了重大風險。 這份全面的指南提供了從DinkToPdf到IronPDF的逐步遷移路徑--IronPDF 是一個線程安全的 .NET PDF 函式庫,具有現代化的 Chromium 渲染功能,且無本地二進位依賴。

為什麼要從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 支援**|無 Flexbox/Grid|完整的 CSS3| |**JavaScript**。|有限、不一致|全面支援| |**維護**|被遺棄 (2018)|積極維護| ### 功能對比 |特點|DinkToPdf|IronPDF| |---------|-----------|---------| |HTML 至 PDF|✅(過時的引擎)|✅ (Chromium)| |URL 至 PDF|✅|✅| |自訂頁邊|✅|✅| | 頁首/頁尾 |✅(有限)|✅ (完整 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](https://ironpdf.com/licensing/) 網站免費試用) ### 審核DinkToPdf使用情況 在您的解決方案目錄中執行這些指令,以識別所有DinkToPdf參考資料: ```bash # 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*" ``` ### 可預期的重大變更 |變更|DinkToPdf|IronPDF|影響力| |--------|-----------|---------|--------| |**轉換器**|`SynchronizedConverter(new PdfTools())`|<代碼>ChromePdfRendererHtmlToPdfDocumentPDF 文件libwkhtmltox.dll/soChromePdfRendererChromePdfRendererPdfToolsHtmlToPdfDocument| |`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`| ## 程式碼遷移範例 ### Basic HTML to PDF 基本轉換展示了從DinkToPdf冗長的配置到IronPDF精簡 API 的大幅簡化。 **DinkToPdf 實作:** ```csharp // 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 = "

Hello World

This is a PDF from HTML.

", WebSettings = { DefaultEncoding = "utf-8" } } } }; byte[] pdf = converter.Convert(doc); File.WriteAllBytes("output.pdf", pdf); } } ``` **IronPDF 實作:** ```csharp // NuGet: Install-Package IronPdf using IronPdf; using System; class Program { static void Main() { var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf("

Hello World

This is a PDF from HTML.

"); pdf.SaveAs("output.pdf"); } } ``` IronPDF 可將 20 行的DinkToPdf設定縮減為 4 行。 不需要 `SynchronizedConverter`, 不需要 `PdfTools`, 不需要 `HtmlToPdfDocument`, 不需要`物件設定`- 只需要渲染和保存。 如需更多選項,請參閱 [HTML to PDF 文件](https://ironpdf.com/how-to/html-file-to-pdf/)。 ### URL 轉 PDF **DinkToPdf 實作:** ```csharp // 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 實作:** ```csharp // 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` 設定。 如需更多選項,請參閱 [URL 至 PDF 文件](https://ironpdf.com/how-to/url-to-pdf/)。 ### 具有橫向和邊界的自訂設定 **DinkToPdf 實作:** ```csharp // 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 = "

Custom PDF

Landscape orientation with custom margins.

", WebSettings = { DefaultEncoding = "utf-8" } } } }; byte[] pdf = converter.Convert(doc); File.WriteAllBytes("custom.pdf", pdf); } } ``` **IronPDF 實作:** ```csharp // 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("

Custom PDF

Landscape orientation with custom margins.

"); pdf.SaveAs("custom.pdf"); } } ``` IronPDF 的`渲染選項`以統一、流暢的 API 取代`全局設定`和`邊界設定`兩者。 如需更多組態選項,請參閱 [渲染選項說明文件](https://ironpdf.com/tutorials/)。 ## 關鍵遷移注意事項 ### 移除原生二進位檔案 最重要的清理步驟是移除 wkhtmltopdf 原生二進位檔案。 IronPdf 沒有本機相依性: ```bash # Delete native binaries rm libwkhtmltox.* 2>/dev/null ``` ### 不需要單件。 DinkToPdf 的`同步轉換器`必須註冊為單例,以避免當機。IronPDF的<代碼>ChromePdfRenderer(); // Or just create inline: var renderer = new ChromePdfRenderer(); ``` ### Richer 返回類型 DinkToPdf 返回`byte[]`。IronPDF返回<編碼>PDF 文件...
"; // Broken! //IronPDF- full support (modern Chromium) var html = @"
Left
Right
"; var pdf = renderer.RenderHtmlAsPdf(html); // Works! ``` ## 遷移後檢查清單 完成程式碼遷移後,請驗證下列事項: - [ ] 執行所有的單元測試,以驗證 PDF 產生是否正常運作 - [ ] 測試多執行緒情境 (這些會與DinkToPdf一起崩潰) - [ ] 比較 PDF 輸出品質(IronPDF 的 Chromium 渲染效果較佳) - [驗證 CSS 呈現 (Flexbox/Grid 現在可以運作) - [ ] 測試JavaScript執行 (使用 IronPdf 的可靠性) - [ ] 更新 CI/CD 管道以移除 wkhtmltopdf 安裝 - [驗證安全掃描通過 (不再有 CVE-2022-35583 標誌) - [ ] 從 Docker/部署腳本中移除原生二進位部署 ## Future-Proofing Your PDF Infrastructure 由於 .NET 10 即將推出,而 C# 14 也將引進新的語言功能,因此選擇積極維護的 PDF 函式庫可確保長期的相容性。 IronPdf 的現代 Chromium 引擎會定期更新,而DinkToPdf棄用的 wkhtmltopdf 仍停留在 2015 年的功能 - 這種差距會不斷擴大,因為網頁標準會在 2025 年和 2026 年不斷演進。 ## 其他資源 - [IronPDF文件](https://ironpdf.com/docs/)。 - [HTML to PDF Tutorials](https://ironpdf.com/tutorials/) - [API Reference](https://ironpdf.com/object-reference/api/) - [NuGet 套件](https://www.nuget.org/packages/IronPdf/)。 - [授權選項](https://ironpdf.com/licensing/) --- 從DinkToPdf轉移到IronPDF可消除重要的安全漏洞 (CVE-2022-35583)、線程安全崩潰、原生二進位部署的複雜性,以及過時的 CSS 渲染。 過渡到現代 Chromium 引擎可提供完整的CSS3支援、可靠的JavaScript執行,以及積極維護的程式庫所帶來的安心感。
Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。