如何在 C# 中從 NReco PDF 生成器轉換到 IronPDF
從NReco PDF 生成器移植到 IronPDF:完整的 C# 遷移指南。
從NReco PDF 生成器轉換到IronPDF可以消除從 wkhtmltopdf 繼承下來的重要安全漏洞,同時將您的 .NET PDF 工作流程從已經過時的 WebKit Qt 引擎(約 2012 年)升級到完全支援 CSS3 和JavaScript的現代 Chromium 渲染器。 本指南提供全面、逐步的轉換路徑,可同時解決NReco PDF 生成器的安全性問題和渲染限制。
為何要從NReco PDF 生成器移轉至 IronPDF?
NReco PDF 生成器的關鍵安全問題
NReco PDF Generator 包覆了已廢棄的 wkhtmltopdf 二進位檔,繼承了其所有的安全漏洞。 這並非理論上的問題,自 wkhtmltopdf 於 2020 年被棄用後,已有 20 多個記錄在案的 CVE,但卻沒有可用的修補程式:
- CVE-2020-21365:伺服器端請求偽造 (SSRF)
- CVE-2022-35583:透過 HTML 注入讀取本機檔案
- CVE-2022-35580:遠端執行程式碼的可能性
這些漏洞無法修補,因為底層的 wkhtmltopdf 專案已不再維護。
額外的 NReco PDF 生成器限制
1.水印免費版:生產使用需要付費授權,且價格不透明,需要聯絡銷售人員。
2.已停用的渲染引擎:WebKit Qt(約 2012 年)提供有限的現代網路支援:
- 無 CSS Grid 或 Flexbox
- 不使用現代JavaScript(ES6+)
- 網頁字型支援不佳
- 無 CSS 變數或自訂屬性
3.外部二進位依賴:需要管理每個平台的 wkhtmltopdf 二進位檔 (wkhtmltopdf.exe、wkhtmltox.dll)。
4.No Active Development(無主動開發): wrapper 會接受維護,但不會進行底層引擎更新。
5.Limited Async Support:同步 API 在 Web 應用程式中封鎖線程。
NReco PDF 生成器與IronPDF的比較
| 範疇 | NReco PDF 生成器 | IronPDF |
|---|---|---|
| 渲染引擎 | WebKit Qt (2012) | Chromium (目前) |
| 安全性 | 20 多個 CVE,沒有修補程式 | 主動安全更新 |
| CSS 支援 | CSS2.1, 有限的 CSS3 | 完整的 CSS3、網格、Flexbox |
| JavaScript | 基本 ES5 | 完整的 ES6+、async/await |
| 依賴 | 外部 wkhtmltopdf 二進位 | 自成一格 |
| 同步支援 | 僅同步 | 完整的 async/await |
| 網頁字型 | 限額 | 完整的 Google 字型,@font-face |
| 授權 | 價格不透明,請聯絡銷售人員 | 透明的定價 |
| 免費試用 | 水印 | 完整功能 |
對於計劃在 2025 年和 2026 年之前採用 .NET 10 和 C# 14 的團隊而言,IronPDF 提供了一個面向未來的基礎,具有積極的開發和現代化的渲染能力。
開始之前
先決條件
1..NET 環境:.NET Framework 4.6.2+ 或 .NET Core 3.1+ / .NET 5/6/7/8/9+ 2.NuGet存取:安裝 NuGet 套件的能力 3.IronPDF 授權:從IronPdf.com取得您的授權金鑰。
NuGet 套件變更
# Remove NReco.PdfGenerator
dotnet remove package NReco.PdfGenerator
# Install IronPDF
dotnet add package IronPdf# Remove NReco.PdfGenerator
dotnet remove package NReco.PdfGenerator
# Install IronPDF
dotnet add package IronPdf同時從您的部署中移除 wkhtmltopdf 二進位檔案:
- 從專案中刪除
wkhtmltopdf.exe,wkhtmltox.dll - 移除任何 wkhtmltopdf 安裝腳本
- 刪除特定平台的二進位資料夾
授權組態
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";IRON VB CONVERTER ERROR developers@ironsoftware.com識別 NReco PDF 生成器用法
# Find all NReco.PdfGenerator references
grep -r "NReco.PdfGenerator\|HtmlToPdfConverter\|GeneratePdf" --include="*.cs" .# Find all NReco.PdfGenerator references
grep -r "NReco.PdfGenerator\|HtmlToPdfConverter\|GeneratePdf" --include="*.cs" .完整的 API 參考資料
核心類對應
| NReco PDF 生成器 | IronPDF | 筆記 |
|---|---|---|
| <編碼>HtmlToPdfConverter</編碼 | <代碼>ChromePdfRenderer</代碼 | 主要呈現器 |
PageMargins 頁邊距 | 個別邊界屬性 | MarginTop, MarginBottom 等。 |
頁面方向 | <代碼>PdfPaperOrientation</代碼 | 枚舉 |
頁面大小 | <編碼>PdfPaperSize</編碼 | 枚舉 |
渲染方法映射
| NReco PDF 生成器 | IronPDF | 筆記 |
|---|---|---|
GeneratePdf(html) | RenderHtmlAsPdf(html) | 返回 PdfDocument |
GeneratePdfFromFile(url,輸出) | <代碼>RenderUrlAsPdf(url)</代碼 | 直接 URL 支援 |
| <代碼>GeneratePdfFromFile(htmlPath, 輸出)</代碼 | RenderHtmlFileAsPdf(path) | 檔案路徑 |
| (不支援 async) | <代碼>RenderHtmlAsPdfAsync(html)</代碼 | 同步版本 |
| (不支援 async) | <代碼>RenderUrlAsPdfAsync(url)</代碼 | 同步版本 |
頁面組態對應
| NReco PDF 生成器 | IronPDF | 筆記 |
|---|---|---|
PageWidth = 210 頁寬 | RenderingOptions.PaperSize=PdfPaperSize.A4渲染選項。 | 使用枚舉或 SetCustomPaperSize |
PageHeight = 297 頁高 | RenderingOptions.SetCustomPaperSizeinMilimeters(w,h)渲染選項。 | 自訂尺寸 |
Orientation = PageOrientation.Landscape。 | RenderingOptions.PaperOrientation=PdfPaperOrientation.Landscape渲染選項。 | 景觀 |
Size = PageSize.A4 | RenderingOptions.PaperSize=PdfPaperSize.A4渲染選項。 | 紙張尺寸枚舉 |
邊界對應
| NReco PDF 生成器 | IronPDF | 筆記 |
|---|---|---|
Margins.Top = 10 | RenderingOptions.MarginTop = 10 | 以毫米為單位 |
Margins.Bottom = 10 | RenderingOptions.MarginBottom = 10。 | 以毫米為單位 |
Margins.Left = 10 | RenderingOptions.MarginLeft = 10。 | 以毫米為單位 |
Margins.Right = 10 | RenderingOptions.MarginRight = 10。 | 以毫米為單位 |
new PageMargins { ... } | 個別屬性 | 無邊距物件 |
頁首/頁尾占位符對應
| NReco PDF 生成器 (wkhtmltopdf) | IronPDF | 筆記 |
|---|---|---|
[page] | {page} | 目前頁數 |
[topage] | {總頁數} | 總頁數 |
[日期] | <編碼>{日期}</編碼 | 目前日期 |
[時間] | {time} | 目前時間 |
[標題] | <編碼>{html-title}</編碼 | 文件標題 |
輸出處理映射
| NReco PDF 生成器 | IronPDF | 筆記 |
|---|---|---|
byte[] pdfBytes = GeneratePdf(html) | PdfDocument pdf = RenderHtmlAsPdf(html) | 回傳物件 |
File.WriteAllBytes(path, bytes)File.WriteAllBytes(path, bytes)File.WriteAllBytes(path) | <代碼>pdf.SaveAs(路徑)</代碼 | 直接儲存 |
return pdfBytes | return pdf.BinaryData | 取得位元組 |
new MemoryStream(pdfBytes) | <代碼>pdf.Stream</代碼 | 取得串流 |
程式碼遷移範例
範例 1:基本 HTML 到 PDF
之前 (NReco PDF 生成器):
// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;
class Program
{
static void Main()
{
var htmlToPdf = new HtmlToPdfConverter();
var htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
var pdfBytes = htmlToPdf.GeneratePdf(htmlContent);
File.WriteAllBytes("output.pdf", pdfBytes);
}
}// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;
class Program
{
static void Main()
{
var htmlToPdf = new HtmlToPdfConverter();
var htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
var pdfBytes = htmlToPdf.GeneratePdf(htmlContent);
File.WriteAllBytes("output.pdf", pdfBytes);
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comAfter (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System.IO;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using System.IO;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var htmlContent = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("output.pdf");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.com基本差異在於回傳類型和儲存模式。NReco PDF 生成器的 HtmlToPdfConverter.GeneratePdf() 會返回一個 byte[] ,您必須使用 File.WriteAllBytes() 來手動寫入磁碟。IronPDF的 ChromePdfRenderer.RenderHtmlAsPdf() 返回一個 PdfDocument 物件,並內建 SaveAs() 方法。
這種物件導向的方法提供了額外的好處:您可以在儲存之前對 PDF 進行操作(新增水印、合併文件、新增安全性)。 如果您需要原始位元組以與現有程式碼相容,請使用 pdf.BinaryData 。 請參閱 HTML to PDF 文件,以瞭解其他渲染選項。
範例 2:自訂頁面大小與頁邊空白
之前 (NReco PDF 生成器):
// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;
class Program
{
static void Main()
{
var htmlToPdf = new HtmlToPdfConverter();
htmlToPdf.PageWidth = 210;
htmlToPdf.PageHeight = 297;
htmlToPdf.Margins = new PageMargins { Top = 10, Bottom = 10, Left = 10, Right = 10 };
var htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>";
var pdfBytes = htmlToPdf.GeneratePdf(htmlContent);
File.WriteAllBytes("custom-size.pdf", pdfBytes);
}
}// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;
class Program
{
static void Main()
{
var htmlToPdf = new HtmlToPdfConverter();
htmlToPdf.PageWidth = 210;
htmlToPdf.PageHeight = 297;
htmlToPdf.Margins = new PageMargins { Top = 10, Bottom = 10, Left = 10, Right = 10 };
var htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>";
var pdfBytes = htmlToPdf.GeneratePdf(htmlContent);
File.WriteAllBytes("custom-size.pdf", pdfBytes);
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comAfter (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 10;
var htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("custom-size.pdf");
}
}// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4;
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 10;
var htmlContent = "<html><body><h1>Custom Page Size</h1><p>A4 size document with margins.</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlContent);
pdf.SaveAs("custom-size.pdf");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comNReco PDF Generator 使用數值尺寸 (PageWidth = 210, PageHeight = 297) 和PageMargins 頁邊距物件。IronPDF在 RenderingOptions 物件上使用<編碼>PdfPaperSize</編碼枚舉(其中包括 A4、Letter、Legal 等標準尺寸)和個別邊緣屬性。
主要的轉移變化:
PageWidth/PageHeight→RenderingOptions.PaperSize = PdfPaperSize.A4new PageMargins { Top = 10, ... }→ 個別屬性:RenderingOptions.MarginTop = 10.
對於枚舉沒有涵蓋的自訂紙張尺寸,請使用 RenderingOptions.SetCustomPaperSizeinMilimeters(width, height) 。 進一步瞭解 頁面配置選項。
範例 3:URL 到 PDF 的轉換
之前 (NReco PDF 生成器):
// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;
class Program
{
static void Main()
{
var htmlToPdf = new HtmlToPdfConverter();
var pdfBytes = htmlToPdf.GeneratePdfFromFile("https://www.example.com", null);
File.WriteAllBytes("webpage.pdf", pdfBytes);
}
}// NuGet: Install-Package NReco.PdfGenerator
using NReco.PdfGenerator;
using System.IO;
class Program
{
static void Main()
{
var htmlToPdf = new HtmlToPdfConverter();
var pdfBytes = htmlToPdf.GeneratePdfFromFile("https://www.example.com", null);
File.WriteAllBytes("webpage.pdf", pdfBytes);
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comAfter (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
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;
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.comNReco PDF Generator 對於本機檔案和 URL 都使用命名令人困惑的 GeneratePdfFromFile() 方法,且第二個參數為空。 IronPdf 提供了專用的方法:RenderUrlAsPdf() 適用於 URL,而 RenderHtmlFileAsPdf() 適用於本機 HTML 檔案。
IronPdf 的方法更簡潔、更直觀。對於 async 網路應用程式,使用 await renderer.RenderUrlAsPdfAsync(url) 以避免阻塞線程 - 這是NReco PDF 生成器所無法做到的。
關鍵遷移注意事項
縮放值轉換
NReco PDF Generator 使用浮動值 (0.0-2.0),而IronPDF則使用百分比整數:
// NReco PDF Generator: Zoom = 0.9f (90%)
// IronPDF: Zoom = 90
// Conversion formula:
int ironPdfZoom = (int)(nrecoZoom * 100);// NReco PDF Generator: Zoom = 0.9f (90%)
// IronPDF: Zoom = 90
// Conversion formula:
int ironPdfZoom = (int)(nrecoZoom * 100);IRON VB CONVERTER ERROR developers@ironsoftware.com占位符語法更新
所有頁首/頁尾的占位符都必須更新:
| NReco PDF 生成器 | IronPDF |
|---|---|
[page] | {page} |
[topage] | {總頁數} |
[日期] | <編碼>{日期}</編碼 |
[標題] | <編碼>{html-title}</編碼 |
// NReco PDF Generator:
converter.PageFooterHtml = "<div>Page [page] of [topage]</div>";
// IronPDF:
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div>Page {page} of {total-pages}</div>",
MaxHeight = 20
};// NReco PDF Generator:
converter.PageFooterHtml = "<div>Page [page] of [topage]</div>";
// IronPDF:
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div>Page {page} of {total-pages}</div>",
MaxHeight = 20
};IRON VB CONVERTER ERROR developers@ironsoftware.com返回類型變更
NReco PDF Generator 會直接回傳 byte[] ;IronPDF返回 PdfDocument :
//NReco PDF 生成器pattern:
byte[] pdfBytes = converter.GeneratePdf(html);
File.WriteAllBytes("output.pdf", pdfBytes);
//IronPDFpattern:
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Or if you need bytes:
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;//NReco PDF 生成器pattern:
byte[] pdfBytes = converter.GeneratePdf(html);
File.WriteAllBytes("output.pdf", pdfBytes);
//IronPDFpattern:
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SaveAs("output.pdf");
// Or if you need bytes:
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;IRON VB CONVERTER ERROR developers@ironsoftware.com線程安全與重複性
NReco PDF Generator 通常會在每次呼叫時建立新的轉換器。IronPDF的<代碼>ChromePdfRenderer</代碼是線程安全且可重複使用的:
//NReco PDF 生成器pattern (creates new each time):
public byte[] Generate(string html)
{
var converter = new HtmlToPdfConverter();
return converter.GeneratePdf(html);
}
//IronPDFpattern (reuse renderer, thread-safe):
private readonly ChromePdfRenderer _renderer = new ChromePdfRenderer();
public byte[] Generate(string html)
{
return _renderer.RenderHtmlAsPdf(html).BinaryData;
}//NReco PDF 生成器pattern (creates new each time):
public byte[] Generate(string html)
{
var converter = new HtmlToPdfConverter();
return converter.GeneratePdf(html);
}
//IronPDFpattern (reuse renderer, thread-safe):
private readonly ChromePdfRenderer _renderer = new ChromePdfRenderer();
public byte[] Generate(string html)
{
return _renderer.RenderHtmlAsPdf(html).BinaryData;
}IRON VB CONVERTER ERROR developers@ironsoftware.com同步支援(新功能)
IronPDF 支援NReco PDF 生成器無法提供的 async/await 模式:
// NReco PDF Generator: No async support available
// IronPDF: Full async support
public async Task<byte[]> GenerateAsync(string html)
{
var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
return pdf.BinaryData;
}// NReco PDF Generator: No async support available
// IronPDF: Full async support
public async Task<byte[]> GenerateAsync(string html)
{
var pdf = await _renderer.RenderHtmlAsPdfAsync(html);
return pdf.BinaryData;
}IRON VB CONVERTER ERROR developers@ironsoftware.com疑難排解
問題 1:HtmlToPdfConverter 未找到
問題:HtmlToPdfConverter class 在IronPDF中不存在。
解決方案:使用ChromePdfRenderer:
// NReco PDF Generator
var converter = new HtmlToPdfConverter();
// IronPDF
var renderer = new ChromePdfRenderer();// NReco PDF Generator
var converter = new HtmlToPdfConverter();
// IronPDF
var renderer = new ChromePdfRenderer();IRON VB CONVERTER ERROR developers@ironsoftware.com問題 2:GeneratePdf 返回錯誤的類型
問題:程式碼預期為 byte[] 但卻得到 PdfDocument.
解決方案:存取 .BinaryData 屬性:
// NReco PDF Generator
byte[] pdfBytes = converter.GeneratePdf(html);
// IronPDF
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;// NReco PDF Generator
byte[] pdfBytes = converter.GeneratePdf(html);
// IronPDF
byte[] pdfBytes = renderer.RenderHtmlAsPdf(html).BinaryData;IRON VB CONVERTER ERROR developers@ironsoftware.com問題 3:未找到 PageMargins 物件
問題:PageMargins 類在IronPDF中不存在。
解決方案:使用個別邊距屬性:
// NReco PDF Generator
converter.Margins = new PageMargins { Top = 10, Bottom = 10, Left = 10, Right = 10 };
// IronPDF
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 10;// NReco PDF Generator
converter.Margins = new PageMargins { Top = 10, Bottom = 10, Left = 10, Right = 10 };
// IronPDF
renderer.RenderingOptions.MarginTop = 10;
renderer.RenderingOptions.MarginBottom = 10;
renderer.RenderingOptions.MarginLeft = 10;
renderer.RenderingOptions.MarginRight = 10;IRON VB CONVERTER ERROR developers@ironsoftware.com問題 4:未顯示頁碼
問題:[page] 和[topage]占位符不工作。
解決方案:更新 IronPdf 占位符語法:
// NReco PDF Generator
converter.PageFooterHtml = "<div>Page [page] of [topage]</div>";
// IronPDF
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div>Page {page} of {total-pages}</div>",
MaxHeight = 20
};// NReco PDF Generator
converter.PageFooterHtml = "<div>Page [page] of [topage]</div>";
// IronPDF
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter
{
HtmlFragment = "<div>Page {page} of {total-pages}</div>",
MaxHeight = 20
};IRON VB CONVERTER ERROR developers@ironsoftware.com遷移清單
預遷移
- [ ] 清點程式碼庫中所有
NReco.PdfGenerator的用法 - [ ] 記錄所有
CustomWkHtmlArgs和CustomWkHtmlPageArgs值 - [ ] 列出所有帶占位符的頁首/頁尾 HTML 模板
- [ ] 識別非同步需求(網路控制器、服務)
- [ ] 檢視縮放與頁邊空白設定
- [ ] 備份現有的 PDF 輸出以供比較
- [ ] 獲得 IronPdf 授權金鑰
套件變更
- [ ] 移除
NReco.PdfGeneratorNuGet 套件 - [ ] 安裝
IronPDFNuGet 套件:dotnet add package IronPdf。 - [ ] 更新命名空間匯入,從
using NReco.PdfGenerator;到using IronPdf;。
程式碼變更
- [ ] 在啟動時加入授權金鑰組態
- [ ] 將<編碼>HtmlToPdfConverter</編碼替換為
ChromePdfRenderer - [ ] 將
GeneratePdf(html)改為RenderHtmlAsPdf(html) - [ ] 將
GeneratePdfFromFile(url, null)改為RenderUrlAsPdf(url) - [ ] 將
PageMargins頁邊距物件轉換為個別的頁邊空白屬性 - [ ] 將縮放值從浮動值更新為百分比
- [ ] 更新占位符語法:
[page]→{page},[topage]→{total-pages} - [ ] 將
File.WriteAllBytes()替換為pdf.SaveAs()。 - [在有利的地方將同步呼叫轉換為動態呼叫
後遷移
- [從專案/部署中移除 wkhtmltopdf 的二進位檔
- [ ] 更新 Docker 檔案以移除 wkhtmltopdf 安裝
- [ ] 執行比較 PDF 輸出的回歸測試
- [ ] 確認頁首/頁尾佔位符能正確呈現
- [ ] 在所有目標平台(Windows、Linux、macOS)上進行測試
- [ ] 更新 CI/CD 管道以移除 wkhtmltopdf 步驟
- [ ] 更新安全掃描以確認 CVE 移除
結論
從NReco PDF 生成器轉換到IronPDF可解決重要的安全漏洞,同時將您的渲染引擎從已淘汰的 2012 WebKit Qt 升級到基於 Chromium 的現代解決方案。 這次遷移消除了 20 多個無法修補的 CVE,增加了完整的 CSS3 和 ES6+JavaScript支援,移除外部二進位依賴,並啟用 async/await 模式以獲得更好的網頁應用程式效能。
本次轉換的主要變更如下 1.安全性:消除 20 多個 CVE → 主動安全更新 2.渲染:WebKit Qt (2012) → Chromium (目前) 3.相依性: 外部 wkhtmltopdf → 自包含 4.Async: 僅同步 → 完全 async/await 5.類別:HtmlToPdfConverter → ChromePdfRenderer. 6.頁邊空白:PageMargins 物件 → 個別屬性 7.Placeholder:[page]/[topage] → {page}/{total-pages}






