跳過到頁腳內容
遷移指南

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

Migrating fromwkhtmltopdfto IronPDF:完整的 C# 開發人員指南。

wkhtmltopdf 一直是使用 Qt WebKit 將 HTML 文件轉換為 PDF 的廣泛工具。 儘管該專案因其命令列功能和免費授權而廣受開發人員歡迎,但現在卻出現了再也不能忽視的重大安全風險。 該函式庫已於 2016-2017 年正式棄用,一個 CRITICAL 嚴重性漏洞 (CVE-2022-35583) 仍永久未修補。

本指南提供了從wkhtmltopdf到IronPDF的完整轉換路徑,並提供逐步說明、程式碼比較以及實用範例,適合需要從應用程式中消除此安全風險的專業 .NET 開發人員使用。

重要安全警告:CVE-2022-35583

wkhtmltopdf 包含永遠無法修復的重要安全漏洞:

問題嚴重性狀態
CVE-2022-35583關鍵 (9.8/10)UNPATCHED 未修訂。
SSRF 漏洞基礎架構接管風險UNPATCHED 未修訂。
最近更新2016-2017被拋棄
WebKit版本2015 (Qt WebKit)OBSOLETE 刪除。
CSS 網格支援破損
Flexbox 支援部分的破損
ES6+ JavaScript破損

SSRF 攻擊如何運作

伺服器端請求偽造漏洞允許攻擊者存取內部服務、竊取憑證、掃描您的內部網路,並透過精心製作的 HTML 外洩敏感資料:

<!-- Malicious HTML submitted to your PDF generator -->
<iframe src="http://169.254.169.254/latest/meta-data/iam/security-credentials/"></iframe>
<img src="http://internal-database:5432/admin"/>
<!-- Malicious HTML submitted to your PDF generator -->
<iframe src="http://169.254.169.254/latest/meta-data/iam/security-credentials/"></iframe>
<img src="http://internal-database:5432/admin"/>
HTML

當wkhtmltopdf渲染此 HTML 時,它會從您伺服器的網路上下文擷取這些 URL,繞過防火牆和安全控制。

受影響的套用程式庫

wkhtmltopdf 的所有 .NET wrapper 都會繼承這些漏洞:

包裝程式庫狀態安全風險
DinkToPdf⚠️ CRITICAL
<強>Rotativa</強⚠️ CRITICAL
TuesPechkin⚠️ CRITICAL
WkHtmlToPdf-DotNet⚠️ CRITICAL
NReco.PdfGenerator使用 wkhtmltopdf⚠️ CRITICAL

如果您使用任何這些函式庫,就有可能受到 CVE-2022-35583 的攻擊。

IronPDFvs wkhtmltopdf:功能比較

了解架構上的差異有助於技術決策者評估遷移投資:

特點wkhtmltopdfIronPDF
授權LGPLv3 (免費)商業的
渲染引擎Qt WebKit (2015)目前的 Chromium 引擎
安全漏洞CVE-2022-35583, 主要未修補問題無已知 CVE
主動維護已放棄,自 2017 年起無任何有意義的更新定期發佈,積極維護
支援現代網路標準受限(flexbox 斷裂、無 CSS Grid)全面支援
整合與支援僅限於社群論壇廣泛的文件和專門的支援
CSS 網格❌ 不支援✅ 全面支援
<強>Flexbox</強⚠️ 破譯✅ 全面支援
ES6+ JavaScript❌ 不支援✅ 全面支援
Async/等待❌ 不支援✅ 全面支援
PDF 操作❌ 不支援✅ 全面支援
數位簽名❌ 不支援✅ 全面支援
PDF/A合規性❌ 不支援✅ 全面支援

快速入門:wkhtmltopdf 到IronPDF的遷移。

只要完成這些基本步驟,就可以立即開始遷移。

步驟 1:移除wkhtmltopdf套件和二進位檔案

移除所有wkhtmltopdfwrapper 套件:

# Removewkhtmltopdfwrapper (whichever you're using)
dotnet remove package WkHtmlToPdf-DotNet
dotnet remove package DinkToPdf
dotnet remove package TuesPechkin
dotnet remove package Rotativa
dotnet remove package Rotativa.AspNetCore
dotnet remove package NReco.PdfGenerator

# Removewkhtmltopdfbinary from your deployment
# Delete wkhtmltopdf.exe, wkhtmltox.dll, etc.
# Removewkhtmltopdfwrapper (whichever you're using)
dotnet remove package WkHtmlToPdf-DotNet
dotnet remove package DinkToPdf
dotnet remove package TuesPechkin
dotnet remove package Rotativa
dotnet remove package Rotativa.AspNetCore
dotnet remove package NReco.PdfGenerator

# Removewkhtmltopdfbinary from your deployment
# Delete wkhtmltopdf.exe, wkhtmltox.dll, etc.
SHELL

步驟 2:安裝 IronPDF

# AddIronPDF(secure, modern alternative)
dotnet add package IronPdf
# AddIronPDF(secure, modern alternative)
dotnet add package IronPdf
SHELL

步驟 3:更新命名空間

以 IronPdf 命名空間取代wkhtmltopdf命名空間:

// Before (wkhtmltopdf)
using WkHtmlToPdfDotNet;
using WkHtmlToPdfDotNet.Contracts;

// After (IronPDF)
using IronPdf;
// Before (wkhtmltopdf)
using WkHtmlToPdfDotNet;
using WkHtmlToPdfDotNet.Contracts;

// After (IronPDF)
using IronPdf;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

步驟 4:初始化授權

在應用程式啟動時加入授權初始化:

IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
$vbLabelText   $csharpLabel

程式碼遷移範例

將 HTML 轉換為 PDF

最基本的操作揭示了這些 .NET PDF 方式之間的複雜性差異。

wkhtmltopdf 方法:

// NuGet: Install-Package WkHtmlToPdf-DotNet
using WkHtmlToPdfDotNet;
using WkHtmlToPdfDotNet.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());
        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
               導向= Orientation.Portrait,
                PaperSize = PaperKind.A4
            },
            Objects = {
                new ObjectSettings()
                {
                    HtmlContent = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>"
                }
            }
        };
        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("output.pdf", pdf);
    }
}
// NuGet: Install-Package WkHtmlToPdf-DotNet
using WkHtmlToPdfDotNet;
using WkHtmlToPdfDotNet.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());
        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
               導向= Orientation.Portrait,
                PaperSize = PaperKind.A4
            },
            Objects = {
                new ObjectSettings()
                {
                    HtmlContent = "<h1>Hello World</h1><p>This is a PDF from HTML.</p>"
                }
            }
        };
        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("output.pdf", pdf);
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

wkhtmltopdf 需要使用 PdfTools 建立同步轉換器,使用 GlobalSettingsObjects 建構<編碼>HtmlToPdfDocument</編碼,設定如 ColorModeOrientationPaperSize 等屬性,呼叫 converter.Convert()來取得原始位元組,並使用 File.WriteAllBytes() 來手動寫入檔案。

IronPDF 完全消除了這個儀式-建立一個 ChromePdfRenderer, 呼叫 RenderHtmlAsPdf(), 並使用內建的 SaveAs() 方法。

如需進階的 HTML 至IronPDF情境,請參閱 HTML 至 PDF 轉換指南

將 URL 轉換為 PDF

URL 到 PDF 的轉換顯示出類似的複雜性模式。

wkhtmltopdf 方法:

// NuGet: Install-Package WkHtmlToPdf-DotNet
using WkHtmlToPdfDotNet;
using WkHtmlToPdfDotNet.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());
        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
               導向= 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 WkHtmlToPdf-DotNet
using WkHtmlToPdfDotNet;
using WkHtmlToPdfDotNet.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());
        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
               導向= Orientation.Portrait,
                PaperSize = PaperKind.A4
            },
            Objects = {
                new ObjectSettings()
                {
                    Page = "https://www.example.com"
                }
            }
        };
        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("webpage.pdf", pdf);
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

wkhtmltopdf 使用 ObjectSettings 中的 Page 屬性來指定 URL,需要相同的文件建構模式。IronPDF提供了一個專用的 RenderUrlAsPdf() 方法,可以清楚地表達出意圖。

探索URL至PDF文件的認證和自訂標頭選項。

自訂設定:具有頁面組態的 HTML 檔案

配置方向、邊界和紙張大小需要不同的方法。

wkhtmltopdf 方法:

// NuGet: Install-Package WkHtmlToPdf-DotNet
using WkHtmlToPdfDotNet;
using WkHtmlToPdfDotNet.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());
        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
               導向= Orientation.Landscape,
                PaperSize = PaperKind.A4,
                Margins = new MarginSettings() { Top = 10, Bottom = 10, Left = 10, Right = 10 }
            },
            Objects = {
                new ObjectSettings()
                {
                    Page = "input.html",
                    WebSettings = { DefaultEncoding = "utf-8" }
                }
            }
        };
        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("custom-output.pdf", pdf);
    }
}
// NuGet: Install-Package WkHtmlToPdf-DotNet
using WkHtmlToPdfDotNet;
using WkHtmlToPdfDotNet.Contracts;
using System.IO;

class Program
{
    static void Main()
    {
        var converter = new SynchronizedConverter(new PdfTools());
        var doc = new HtmlToPdfDocument()
        {
            GlobalSettings = {
                ColorMode = ColorMode.Color,
               導向= Orientation.Landscape,
                PaperSize = PaperKind.A4,
                Margins = new MarginSettings() { Top = 10, Bottom = 10, Left = 10, Right = 10 }
            },
            Objects = {
                new ObjectSettings()
                {
                    Page = "input.html",
                    WebSettings = { DefaultEncoding = "utf-8" }
                }
            }
        };
        byte[] pdf = converter.Convert(doc);
        File.WriteAllBytes("custom-output.pdf", pdf);
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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 = 10;
        renderer.RenderingOptions.MarginRight = 10;
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;

        var pdf = renderer.RenderHtmlFileAsPdf("input.html");
        pdf.SaveAs("custom-output.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 = 10;
        renderer.RenderingOptions.MarginRight = 10;
        renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;

        var pdf = renderer.RenderHtmlFileAsPdf("input.html");
        pdf.SaveAs("custom-output.pdf");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

wkhtmltopdf 將設定嵌套在 GlobalSettingsObjects 之內,其中 MarginSettings 為單獨的物件。IronPDF提供直接的渲染選項屬性,其名稱非常清楚,例如 PaperOrientation, MarginTop, 和 PaperSize.

wkhtmltopdfAPI 到IronPDF的映射參考。

此對應可透過顯示直接的 API 對應關係來加速遷移:

CLI 到IronPDF的映射

wkhtmltopdf CLI 選項IronPdf 同等級產品筆記
wkhtmltopdf 輸入.html 輸出.pdfrenderer.RenderHtmlFileAsPdf()檔案至 PDF
wkhtmltopdf URL output.pdfrenderer.RenderUrlAsPdf()URL 至 PDF
--頁面大小 A4RenderingOptions.PaperSize=PdfPaperSize.A4渲染選項。紙張大小
--頁面大小 LetterRenderingOptions.PaperSize=PdfPaperSize.Letter渲染選項。美國信件
--面向景觀RenderingOptions.PaperOrientation = Landscape導向
--margin-top 10mmRenderingOptions.MarginTop = 10邊距(以毫米為單位
--margin-bottom 10mmRenderingOptions.MarginBottom = 10
--margin-left 10mmRenderingOptions.MarginLeft = 10
--margin-right 10mmRenderingOptions.MarginRight = 10
--header-html header.html<編碼>RenderingOptions.HtmlHeader</編碼HTML 標題
--footer-center "[page]"{page} 占位符頁數
--footer-center "[toPage]"{total-pages} 占位符總頁數
<編碼>--enable-javascript</編碼預設啟用JavaScript
--javascript-delay 500RenderingOptions.WaitFor.RenderDelay = 500JS 延遲
--dpi 300RenderingOptions.Dpi=300DPI 設定
<編碼>--grayscale</編碼RenderingOptions.GrayScale=true灰階

C# Wrapper API 對應。

wkhtmltopdf WrapperIronPDF筆記
同步轉換器<代碼>ChromePdfRenderer</代碼主要呈現器
<編碼>HtmlToPdfDocument</編碼渲染選項配置
GlobalSettings.Out<代碼>pdf.SaveAs()</代碼輸出檔案
GlobalSettings.PaperSizeRenderingOptions.PaperSize紙張大小
GlobalSettings.Orientation<編碼>RenderingOptions.PaperOrientation</編碼導向
GlobalSettings.邊界RenderingOptions.Margin*個別邊距
ObjectSettings.Page 物件設定頁面<代碼>RenderHtmlFileAsPdf()</代碼檔案輸入
ObjectSettings.HtmlContent 物件設定。<代碼>RenderHtmlAsPdf()</代碼HTML 字串
converter.Convert(doc)<編碼>renderer.RenderHtmlAsPdf()</編碼生成 PDF

占位符語法遷移

wkhtmltopdf 占位符IronPdf 占位符
[page]{page}
[toPage]{總頁數}
[日期]<編碼>{日期}</編碼
[時間]{time}
[標題]<編碼>{html-title}</編碼
<編碼>[url]</編碼<編碼>{url}</編碼

常見的遷移問題與解決方案

問題 1:頁首/頁尾占位符語法

wkhtmltopdf: 使用方括號語法,如[page][toPage]

解決方案:更新IronPDF的大括弧占位符:

// Before (wkhtmltopdf)
FooterSettings = { Left = "Page [page] of [toPage]" }

// After (IronPDF)
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:left;'>Page {page} of {total-pages}</div>",
    MaxHeight = 25
};
// Before (wkhtmltopdf)
FooterSettings = { Left = "Page [page] of [toPage]" }

// After (IronPDF)
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
    HtmlFragment = "<div style='text-align:left;'>Page {page} of {total-pages}</div>",
    MaxHeight = 25
};
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

問題 2:JavaScript 延遲設定

wkhtmltopdf: 使用 JavascriptDelay 屬性,可靠性有限。

解決方案:IronPDF提供多種選項:

renderer.RenderingOptions.EnableJavaScript = true;

// Option 1: Fixed delay
renderer.RenderingOptions.WaitFor.RenderDelay(500);

// Option 2: Wait for specific element (more reliable)
renderer.RenderingOptions.WaitFor.HtmlElementById("content-loaded");

// Option 3: Wait forJavaScriptcondition
renderer.RenderingOptions.WaitFor.JavaScript("window.renderComplete === true");
renderer.RenderingOptions.EnableJavaScript = true;

// Option 1: Fixed delay
renderer.RenderingOptions.WaitFor.RenderDelay(500);

// Option 2: Wait for specific element (more reliable)
renderer.RenderingOptions.WaitFor.HtmlElementById("content-loaded");

// Option 3: Wait forJavaScriptcondition
renderer.RenderingOptions.WaitFor.JavaScript("window.renderComplete === true");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

第 3 期:現代 CSS 不會渲染

症狀: CSS Grid 和 Flexbox 佈局在wkhtmltopdf中呈現不正確。

解決方案:IronPDF的 Chromium 引擎可正確處理現代 CSS:

// This CSS now works with IronPDF
var html = @"
<style>
    .grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
    .flex { display: flex; justify-content: space-between; align-items: center; }
</style>
<div class='grid'>
    <div>Column 1</div>
    <div>Column 2</div>
    <div>Column 3</div>
</div>";

var pdf = renderer.RenderHtmlAsPdf(html);
// This CSS now works with IronPDF
var html = @"
<style>
    .grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
    .flex { display: flex; justify-content: space-between; align-items: center; }
</style>
<div class='grid'>
    <div>Column 1</div>
    <div>Column 2</div>
    <div>Column 3</div>
</div>";

var pdf = renderer.RenderHtmlAsPdf(html);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

第 4 期:同步與非同步渲染

wkhtmltopdf:裹包是同步和阻塞線程。

解決方案:IronPDF支援動態渲染:

public async Task<byte[]> GeneratePdfAsync(string html)
{
    var renderer = new ChromePdfRenderer();
    var pdf = await renderer.RenderHtmlAsPdfAsync(html);
    return pdf.BinaryData;
}
public async Task<byte[]> GeneratePdfAsync(string html)
{
    var renderer = new ChromePdfRenderer();
    var pdf = await renderer.RenderHtmlAsPdfAsync(html);
    return pdf.BinaryData;
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

wkhtmltopdf遷移清單

遷移前的任務

審核您的程式碼庫,找出所有wkhtmltopdf的用法:

# Find allwkhtmltopdfreferences
grep -r "WkHtmlToPdfDotNet\|DinkToPdf\|TuesPechkin\|Rotativa" --include="*.cs" .
grep -r "wkhtmltopdf" --include="*.yml" --include="*.yaml" --include="Dockerfile" .
# Find allwkhtmltopdfreferences
grep -r "WkHtmlToPdfDotNet\|DinkToPdf\|TuesPechkin\|Rotativa" --include="*.cs" .
grep -r "wkhtmltopdf" --include="*.yml" --include="*.yaml" --include="Dockerfile" .
SHELL

找出並記錄wkhtmltopdf二進位檔案,以便移除。 文件目前的設定(紙張大小、邊界、頁首/頁腳)。

程式碼更新任務

1.移除所有wkhtmltopdfwrapper NuGet 套件 2.移除wkhtmltopdf的二進位檔 (wkhtmltopdf.exe, wkhtmltox.dll) 3.安裝 IronPdf NuGet 套件 4.更新命名空間匯入,從 WkHtmlToPdfDotNetIronPdf 5.將同步轉換器改為 ChromePdfRenderer 6.將<編碼>HtmlToPdfDocument</編碼模式轉換為直接呈現方法 7.更新 GlobalSettings 配置為 RenderingOptions 8.將邊界配置從 MarginSettings 轉換為個別的屬性 9.更新占位符語法 ([page]{page},[toPage]{total-pages}) 10.在啟動時增加 IronPdf 授權初始化功能

後遷移測試

轉移後,驗證這些方面:

  • PDF 輸出的視覺比較 (應使用現代 CSS 支援來改善)
  • 驗證現代的 CSS 渲染(CSS Grid 和 Flexbox 現在可以使用)
  • 測試JavaScript繁重的頁面
  • 安全掃描以確認沒有wkhtmltopdf的二進位檔存在
  • 性能比較的負載測試

安全性驗證

# Scan for any remainingwkhtmltopdfartifacts
find /var/www/ -name "*wkhtmlto*" 2>/dev/null
find /usr/local/bin/ -name "*wkhtmlto*" 2>/dev/null
docker images | grep wkhtmltopdf

# Check if any process is still using it
ps aux | grep wkhtmltopdf
# Scan for any remainingwkhtmltopdfartifacts
find /var/www/ -name "*wkhtmlto*" 2>/dev/null
find /usr/local/bin/ -name "*wkhtmlto*" 2>/dev/null
docker images | grep wkhtmltopdf

# Check if any process is still using it
ps aux | grep wkhtmltopdf
SHELL

遷移到IronPDF的主要優點。

從wkhtmltopdf轉換到IronPDF提供了幾個關鍵優勢:

安全性:消除了 CVE-2022-35583 和所有wkhtmltopdf漏洞。IronPDF沒有已知的 CVE,並定期接受安全更新。

現代化的渲染引擎:IronPdf 使用目前的 Chromium 引擎,確保完全支援 CSS3、CSS Grid、Flexbox 和 ES6+ JavaScript。 現代框架能正確呈現。

簡化的 API:直接呈現方法取代文件建構模式。 內建 SaveAs() 方法可免除手動處理位元組。

延伸功能:PDF 操作、數位簽署、PDF/A 合規性、水印以及合併/分割操作是wkhtmltopdf無法提供的內建功能。

主動開發:隨著 .NET 10 和 C# 14 的採用增加至 2026 年,IronPDF 的定期更新可確保與目前和未來的 .NET 版本相容。

Async 支援:使用原生的 async/await 支援,防止高負載 Web 應用程式中的線程阻塞。

結論

wkhtmltopdf 作為免費的 HTML 至 PDF 轉換器服務 .NET 社群。 然而,由於該專案自 2016-2017 年起已正式放棄,而 CRITICAL severity SSRF 漏洞 (CVE-2022-35583) 永遠無法修補,繼續使用會為生產應用程式帶來不可接受的安全風險。

IronPDF 提供了一個現代化、安全的替代方案,其 Chromium 演算引擎可處理當代的網頁標準。 遷移路徑很直接:移除wkhtmltopdf套件和二進位檔,安裝 IronPDF,以直接渲染方法取代文件建構模式,並更新佔位符語法。

立即使用 免費試用 IronPDF 開始您的遷移,並消除基於wkhtmltopdf解決方案的固有安全漏洞。

如需全面的實施指導,請瀏覽 IronPdf文件教學,以及API參考

Curtis Chau
技術作家

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

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