如何用 C# 從 Winnovative 轉移到 IronPDF
Winnovative 一直是 .NET PDF 生成領域的知名品牌,為 C# 應用程式提供 HTML 至 PDF 的轉換功能。 然而,該函式庫依賴 2016 年的 WebKit 引擎,對現代網路開發造成重大挑戰。 現代 CSS 功能(如網格佈局)、現代 JavaScript 語法以及 Bootstrap 5 和 Tailwind CSS 等熱門架構經常無法正確呈現,甚至完全無法呈現。
本指南提供了從Winnovative到IronPDF的完整轉換路徑,並提供分步說明、程式碼比較以及實用範例,可供評估此轉換的 .NET 專業開發人員使用。
為什麼要從Winnovative遷移?
Winnovative 依賴於 2016 年的 WebKit 引擎,對於現代的 Web 應用程式造成嚴重的問題:
不支援 CSS Grid: Bootstrap 5、Tailwind CSS 和現代佈局完全失效。 任何使用 CSS Grid 的頁面將無法如預期般呈現。
Flexbox實作有缺陷:與現代瀏覽器相比,渲染效果不一致。 開發人員經常花費數小時來調試只存在於Winnovative中的排版問題。
僅限 ES5 JavaScript:現代 ES6+ JavaScript 特性(箭頭函數、async/await、類別)會靜默失敗。 這意味著 React、Vue 和其他現代框架經常會產生破損的輸出。
發展停滯:儘管"Winnovative"這個名字暗示著創新,但該產品近年來幾乎沒有更新。
字體渲染問題:網頁字體和自訂字體經常渲染不正確或根本無法渲染。
安全隱患: 2016 年的 WebKit 引擎缺乏多年的安全性修補程式和漏洞修復。
真實世界的影響力
現代的 CSS 和 JavaScript 在Winnovative中根本無法運作:
<div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px;">
<div>Column 1</div>
<div>Column 2</div>
<div>Column 3</div>
</div>
<script>
const items = data.map(item => item.name); // Arrow functions: FAIL
const result = await fetchData(); // Async/await: FAIL
class Report { } // Classes: FAIL
</script>
<div style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 20px;">
<div>Column 1</div>
<div>Column 2</div>
<div>Column 3</div>
</div>
<script>
const items = data.map(item => item.name); // Arrow functions: FAIL
const result = await fetchData(); // Async/await: FAIL
class Report { } // Classes: FAIL
</script>
IronPDFvs Winnovative:功能比較
了解架構上的差異有助於技術決策者評估遷移投資:
| 範疇 | Winnovative | IronPDF |
|---|---|---|
| 渲染引擎 | WebKit (2016) | Chromium (目前) |
| CSS 網格 | 不支援 | 全面支援 |
| <強>Flexbox</強 | 錯誤 | 全面支援 |
| JavaScript。 | 僅限 ES5 | ES2024 |
| Bootstrap 5 | 破損 | 全面支援 |
| 尾風 CSS。 | 不支援 | 全面支援 |
| React/Vue SSR | 問題 | 完美運作 |
| 網路字型 | 不可靠 | 全面支援 |
| 更新 | 不經常 | 每月 |
| 價格 | $750-$1,600 | 競爭力 |
快速入門:Winnovative 到IronPDF的遷移。
只要完成這些基本步驟,就可以立即開始遷移。
步驟 1:取代 NuGet 套件
移除所有Winnovative套件:
# Remove Winnovative
dotnet remove package Winnovative.WebKitHtmlToPdf
dotnet remove package Winnovative.HtmlToPdf
dotnet remove package Winnovative.WebToPdfConverter
# Remove Winnovative
dotnet remove package Winnovative.WebKitHtmlToPdf
dotnet remove package Winnovative.HtmlToPdf
dotnet remove package Winnovative.WebToPdfConverter
安裝 IronPDF:
# Install IronPDF
dotnet add package IronPdf
# Install IronPDF
dotnet add package IronPdf
步驟 2:更新命名空間
用IronPDF命名空間取代Winnovative命名空間:
// Before (Winnovative)
using Winnovative;
using Winnovative.WebKit;
// After (IronPDF)
using IronPdf;
// Before (Winnovative)
using Winnovative;
using Winnovative.WebKit;
// After (IronPDF)
using IronPdf;
Imports IronPdf
步驟 3:初始化授權
在應用程式啟動時加入授權初始化:
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
程式碼遷移範例
將 HTML 轉換為 PDF
最常見的使用案例展示了這些 .NET PDF 函式庫之間的 API 差異。
創新方法:
// NuGet: Install-Package Winnovative.WebToPdfConverter
using Winnovative;
using System;
class Program
{
static void Main()
{
// Create the HTML to PDF converter
HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();
// Set license key
htmlToPdfConverter.LicenseKey = "your-license-key";
// Convert HTML string to PDF
string htmlString = "<html><body><h1>Hello World</h1></body></html>";
byte[] pdfBytes = htmlToPdfConverter.ConvertHtml(htmlString, "");
// Save to file
System.IO.File.WriteAllBytes("output.pdf", pdfBytes);
Console.WriteLine("PDF created successfully");
}
}
// NuGet: Install-Package Winnovative.WebToPdfConverter
using Winnovative;
using System;
class Program
{
static void Main()
{
// Create the HTML to PDF converter
HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();
// Set license key
htmlToPdfConverter.LicenseKey = "your-license-key";
// Convert HTML string to PDF
string htmlString = "<html><body><h1>Hello World</h1></body></html>";
byte[] pdfBytes = htmlToPdfConverter.ConvertHtml(htmlString, "");
// Save to file
System.IO.File.WriteAllBytes("output.pdf", pdfBytes);
Console.WriteLine("PDF created successfully");
}
}
Imports Winnovative
Imports System
Module Program
Sub Main()
' Create the HTML to PDF converter
Dim htmlToPdfConverter As New HtmlToPdfConverter()
' Set license key
htmlToPdfConverter.LicenseKey = "your-license-key"
' Convert HTML string to PDF
Dim htmlString As String = "<html><body><h1>Hello World</h1></body></html>"
Dim pdfBytes As Byte() = htmlToPdfConverter.ConvertHtml(htmlString, "")
' Save to file
System.IO.File.WriteAllBytes("output.pdf", pdfBytes)
Console.WriteLine("PDF created successfully")
End Sub
End Module
IronPDF 方法:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
// Create a PDF renderer
var renderer = new ChromePdfRenderer();
// Convert HTML string to PDF
string htmlString = "<html><body><h1>Hello World</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlString);
// Save to file
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
// Create a PDF renderer
var renderer = new ChromePdfRenderer();
// Convert HTML string to PDF
string htmlString = "<html><body><h1>Hello World</h1></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlString);
// Save to file
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
' Create a PDF renderer
Dim renderer As New ChromePdfRenderer()
' Convert HTML string to PDF
Dim htmlString As String = "<html><body><h1>Hello World</h1></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlString)
' Save to file
pdf.SaveAs("output.pdf")
Console.WriteLine("PDF created successfully")
End Sub
End Class
Winnovative 需要建立一個 HtmlToPdfConverter 實例,在該實例上設定許可證金鑰,呼叫 ConvertHtml() 並傳入一個空的基本 URL 參數,接收原始位元組,然後手動寫入檔案。IronPDF簡化了這個過程:建立一個 ChromePdfRenderer 實例,呼叫 RenderHtmlAsPdf() ,然後使用內建的 SaveAs() 方法。
如需進階的 HTML 至IronPDF情境,請參閱 HTML 至 PDF 轉換指南。
將 URL 轉換為 PDF
URL 到 PDF 的轉換也顯示出類似的模式。
創新方法:
// NuGet: Install-Package Winnovative.WebToPdfConverter
using Winnovative;
using System;
class Program
{
static void Main()
{
// Create the HTML to PDF converter
HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();
// Set license key
htmlToPdfConverter.LicenseKey = "your-license-key";
// Convert URL to PDF
string url = "https://www.example.com";
byte[] pdfBytes = htmlToPdfConverter.ConvertUrl(url);
// Save to file
System.IO.File.WriteAllBytes("webpage.pdf", pdfBytes);
Console.WriteLine("PDF from URL created successfully");
}
}
// NuGet: Install-Package Winnovative.WebToPdfConverter
using Winnovative;
using System;
class Program
{
static void Main()
{
// Create the HTML to PDF converter
HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();
// Set license key
htmlToPdfConverter.LicenseKey = "your-license-key";
// Convert URL to PDF
string url = "https://www.example.com";
byte[] pdfBytes = htmlToPdfConverter.ConvertUrl(url);
// Save to file
System.IO.File.WriteAllBytes("webpage.pdf", pdfBytes);
Console.WriteLine("PDF from URL created successfully");
}
}
Imports Winnovative
Imports System
Module Program
Sub Main()
' Create the HTML to PDF converter
Dim htmlToPdfConverter As New HtmlToPdfConverter()
' Set license key
htmlToPdfConverter.LicenseKey = "your-license-key"
' Convert URL to PDF
Dim url As String = "https://www.example.com"
Dim pdfBytes As Byte() = htmlToPdfConverter.ConvertUrl(url)
' Save to file
System.IO.File.WriteAllBytes("webpage.pdf", pdfBytes)
Console.WriteLine("PDF from URL created successfully")
End Sub
End Module
IronPDF 方法:
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
// Create a PDF renderer
var renderer = new ChromePdfRenderer();
// Convert URL to PDF
string url = "https://www.example.com";
var pdf = renderer.RenderUrlAsPdf(url);
// Save to file
pdf.SaveAs("webpage.pdf");
Console.WriteLine("PDF from URL created successfully");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main()
{
// Create a PDF renderer
var renderer = new ChromePdfRenderer();
// Convert URL to PDF
string url = "https://www.example.com";
var pdf = renderer.RenderUrlAsPdf(url);
// Save to file
pdf.SaveAs("webpage.pdf");
Console.WriteLine("PDF from URL created successfully");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main()
' Create a PDF renderer
Dim renderer As New ChromePdfRenderer()
' Convert URL to PDF
Dim url As String = "https://www.example.com"
Dim pdf = renderer.RenderUrlAsPdf(url)
' Save to file
pdf.SaveAs("webpage.pdf")
Console.WriteLine("PDF from URL created successfully")
End Sub
End Class
Winnovative 使用 ConvertUrl() 傳回必須手動儲存的位元組。IronPDF為 RenderUrlAsPdf() 提供了一個 PdfDocument 對象,其中包含 SaveAs(),以方便起見。
探索URL至PDF文件的認證和自訂標頭選項。
新增頁首與頁尾
頁首和頁尾揭示了顯著的架構差異。Winnovative使用基於元素的程式化方法,使用 TextElement 對象,而IronPDF使用基於 HTML 的標頭和占位符標記。
創新方法:
// NuGet: Install-Package Winnovative.WebToPdfConverter
using Winnovative;
using System;
using System.Drawing;
class Program
{
static void Main()
{
// Create the HTML to PDF converter
HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();
// Set license key
htmlToPdfConverter.LicenseKey = "your-license-key";
// Enable header
htmlToPdfConverter.PdfDocumentOptions.ShowHeader = true;
htmlToPdfConverter.PdfHeaderOptions.HeaderHeight = 60;
// Add header text
TextElement headerText = new TextElement(0, 0, "Document Header", new Font("Arial", 12));
htmlToPdfConverter.PdfHeaderOptions.AddElement(headerText);
// Enable footer
htmlToPdfConverter.PdfDocumentOptions.ShowFooter = true;
htmlToPdfConverter.PdfFooterOptions.FooterHeight = 60;
// Add footer with page number
TextElement footerText = new TextElement(0, 0, "Page &p; of &P;", new Font("Arial", 10));
htmlToPdfConverter.PdfFooterOptions.AddElement(footerText);
// Convert HTML to PDF
string htmlString = "<html><body><h1>Document with Header and Footer</h1><p>Content goes here</p></body></html>";
byte[] pdfBytes = htmlToPdfConverter.ConvertHtml(htmlString, "");
// Save to file
System.IO.File.WriteAllBytes("document.pdf", pdfBytes);
Console.WriteLine("PDF with header and footer created successfully");
}
}
// NuGet: Install-Package Winnovative.WebToPdfConverter
using Winnovative;
using System;
using System.Drawing;
class Program
{
static void Main()
{
// Create the HTML to PDF converter
HtmlToPdfConverter htmlToPdfConverter = new HtmlToPdfConverter();
// Set license key
htmlToPdfConverter.LicenseKey = "your-license-key";
// Enable header
htmlToPdfConverter.PdfDocumentOptions.ShowHeader = true;
htmlToPdfConverter.PdfHeaderOptions.HeaderHeight = 60;
// Add header text
TextElement headerText = new TextElement(0, 0, "Document Header", new Font("Arial", 12));
htmlToPdfConverter.PdfHeaderOptions.AddElement(headerText);
// Enable footer
htmlToPdfConverter.PdfDocumentOptions.ShowFooter = true;
htmlToPdfConverter.PdfFooterOptions.FooterHeight = 60;
// Add footer with page number
TextElement footerText = new TextElement(0, 0, "Page &p; of &P;", new Font("Arial", 10));
htmlToPdfConverter.PdfFooterOptions.AddElement(footerText);
// Convert HTML to PDF
string htmlString = "<html><body><h1>Document with Header and Footer</h1><p>Content goes here</p></body></html>";
byte[] pdfBytes = htmlToPdfConverter.ConvertHtml(htmlString, "");
// Save to file
System.IO.File.WriteAllBytes("document.pdf", pdfBytes);
Console.WriteLine("PDF with header and footer created successfully");
}
}
Imports Winnovative
Imports System
Imports System.Drawing
Module Program
Sub Main()
' Create the HTML to PDF converter
Dim htmlToPdfConverter As New HtmlToPdfConverter()
' Set license key
htmlToPdfConverter.LicenseKey = "your-license-key"
' Enable header
htmlToPdfConverter.PdfDocumentOptions.ShowHeader = True
htmlToPdfConverter.PdfHeaderOptions.HeaderHeight = 60
' Add header text
Dim headerText As New TextElement(0, 0, "Document Header", New Font("Arial", 12))
htmlToPdfConverter.PdfHeaderOptions.AddElement(headerText)
' Enable footer
htmlToPdfConverter.PdfDocumentOptions.ShowFooter = True
htmlToPdfConverter.PdfFooterOptions.FooterHeight = 60
' Add footer with page number
Dim footerText As New TextElement(0, 0, "Page &p; of &P;", New Font("Arial", 10))
htmlToPdfConverter.PdfFooterOptions.AddElement(footerText)
' Convert HTML to PDF
Dim htmlString As String = "<html><body><h1>Document with Header and Footer</h1><p>Content goes here</p></body></html>"
Dim pdfBytes As Byte() = htmlToPdfConverter.ConvertHtml(htmlString, "")
' Save to file
System.IO.File.WriteAllBytes("document.pdf", pdfBytes)
Console.WriteLine("PDF with header and footer created successfully")
End Sub
End Module
IronPDF 方法:
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
class Program
{
static void Main()
{
// Create a PDF renderer
var renderer = new ChromePdfRenderer();
// Configure header and footer
renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
{
CenterText = "Document Header",
FontSize = 12
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
{
CenterText = "Page {page} of {total-pages}",
FontSize = 10
};
// Convert HTML to PDF
string htmlString = "<html><body><h1>Document with Header and Footer</h1><p>Content goes here</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlString);
// Save to file
pdf.SaveAs("document.pdf");
Console.WriteLine("PDF with header and footer created successfully");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
class Program
{
static void Main()
{
// Create a PDF renderer
var renderer = new ChromePdfRenderer();
// Configure header and footer
renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
{
CenterText = "Document Header",
FontSize = 12
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
{
CenterText = "Page {page} of {total-pages}",
FontSize = 10
};
// Convert HTML to PDF
string htmlString = "<html><body><h1>Document with Header and Footer</h1><p>Content goes here</p></body></html>";
var pdf = renderer.RenderHtmlAsPdf(htmlString);
// Save to file
pdf.SaveAs("document.pdf");
Console.WriteLine("PDF with header and footer created successfully");
}
}
Imports IronPdf
Imports IronPdf.Rendering
Imports System
Module Program
Sub Main()
' Create a PDF renderer
Dim renderer As New ChromePdfRenderer()
' Configure header and footer
renderer.RenderingOptions.TextHeader = New TextHeaderFooter() With {
.CenterText = "Document Header",
.FontSize = 12
}
renderer.RenderingOptions.TextFooter = New TextHeaderFooter() With {
.CenterText = "Page {page} of {total-pages}",
.FontSize = 10
}
' Convert HTML to PDF
Dim htmlString As String = "<html><body><h1>Document with Header and Footer</h1><p>Content goes here</p></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(htmlString)
' Save to file
pdf.SaveAs("document.pdf")
Console.WriteLine("PDF with header and footer created successfully")
End Sub
End Module
Winnovative 需要透過 @@--CODE-20474--@@ 啟用頁眉/頁腳,設定高度,建立具有座標位置的 @@--CODE-20475--@@ 物件和 @@--CODE-20476--@@ 對象,並使用 @@--CODE-20477--@@ 和 @@--CODE-20478--@@ 佔位符。IronPDF 使用 @@--CODE-20479--@@ 對象,其屬性簡單,如 @@--CODE-20480--@@ 和 @@--CODE-20481--@@,以及直觀的佔位符,如 @@--CODE-20482--@@ 和 @@--CODE-20483--@@。
如需使用完整 CSS 定型的 HTML 型標頭,請參閱 標頭和頁尾文件。
WinnovativeAPI 到IronPDF的映射參考。
此對應可透過顯示直接的 API 對應關係來加速遷移:
| Winnovative Class | IronPDF 同等級產品 |
|---|---|
HtmlToPdfConverter |
ChromePdfRenderer |
PdfDocument |
PdfDocument |
PdfDocumentOptions |
RenderingOptions |
PdfHeaderOptions |
HtmlHeaderFooter |
PdfFooterOptions |
HtmlHeaderFooter |
TextElement |
HTML 在 HtmlFragment |
ImageElement |
HTML <img> |
方法映射
| Winnovative 方法 | IronPDF 方法 |
|---|---|
ConvertUrl(url) |
RenderUrlAsPdf(url) |
ConvertUrlToFile(url, path) |
RenderUrlAsPdf(url).SaveAs(path) |
ConvertHtml(html, baseUrl) |
RenderHtmlAsPdf(html) |
ConvertHtmlToFile(html, path) |
RenderHtmlAsPdf(html).SaveAs(path) |
ConvertHtmlFile(path) |
RenderHtmlFileAsPdf(path) |
MergePdf(streams) |
PdfDocument.Merge(pdfs) |
AppendPdf(pdf) |
pdf1.AppendPdf(pdf2) |
選項對應
| Winnovative 選項 | IronPDF 選項 |
|---|---|
PdfPageSize.A4 |
PaperSize = PdfPaperSize.A4 |
PdfPageSize.Letter |
PaperSize = PdfPaperSize.Letter |
PdfPageOrientation.Portrait |
PaperOrientation = PdfPaperOrientation.Portrait |
PdfPageOrientation.Landscape |
PaperOrientation = PdfPaperOrientation.Landscape |
TopMargin = 20 |
MarginTop = 20 |
BottomMargin = 20 |
MarginBottom = 20 |
LeftMargin = 15 |
MarginLeft = 15 |
RightMargin = 15 |
MarginRight = 15 |
ShowHeader = true |
設定 HtmlHeader 屬性 |
ShowFooter = true |
設定 HtmlFooter 屬性 |
JavaScriptEnabled = true |
EnableJavaScript = true |
頁碼 &p; |
頁碼 {page} |
總頁數 &P; |
總頁數 {total-pages} |
常見的遷移問題與解決方案
問題 1:CSS 排版看起來不一樣
症狀:在Winnovative中看起來 "還行 "的佈局,現在在IronPDF中看起來不一樣了。
起因:Winnovative的 2016 WebKit 有一些渲染 bug,開發人員都能解決。IronPDF可根據現代標準正確渲染。
解決方案:移除Winnovative特有的 CSS hack,並使用標準 CSS:
// Clean up legacy CSS
string cleanedHtml = html
.Replace("-webkit-flex", "flex")
.Replace("display: -webkit-box", "display: flex");
// Clean up legacy CSS
string cleanedHtml = html
.Replace("-webkit-flex", "flex")
.Replace("display: -webkit-box", "display: flex");
Dim cleanedHtml As String = html _
.Replace("-webkit-flex", "flex") _
.Replace("display: -webkit-box", "display: flex")
問題 2:JavaScript 無法執行
症狀:動態內容未顯示在 PDF 中。
原因:需要明確設定 JavaScript 等待選項。
解決方案:
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.WaitFor.JavaScript(5000);
// Or wait for specific element
renderer.RenderingOptions.WaitFor.HtmlElementById("content-ready", 10000);
renderer.RenderingOptions.EnableJavaScript = true;
renderer.RenderingOptions.WaitFor.JavaScript(5000);
// Or wait for specific element
renderer.RenderingOptions.WaitFor.HtmlElementById("content-ready", 10000);
問題 3:基本 URL 無法運作
症狀:圖片和 CSS 的相對 URL 無法解析。
原因:IronPDF需要明確的基本 URL 設定。
解決方案:
renderer.RenderingOptions.BaseUrl = new Uri("https://example.com/");
renderer.RenderingOptions.BaseUrl = new Uri("https://example.com/");
renderer.RenderingOptions.BaseUrl = New Uri("https://example.com/")
問題 4:不同的分頁符
症狀:內容在與Winnovative不同的地方斷裂。
原因:不同的呈現引擎會以不同的方式處理分頁符號。
解決方案:使用明確的 CSS 分頁控制:
/* Control page breaks explicitly */
.no-break {
page-break-inside: avoid;
}
.page-break-before {
page-break-before: always;
}
.page-break-after {
page-break-after: always;
}
問題 5:字型外觀不同
症狀:文字出現的字型與預期的不同。
原因:IronPDF使用系統字體; 網頁字型需要明確載入。
解決方案:
<style>
@import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
body {
font-family: 'Roboto', Arial, sans-serif;
}
</style>
<style>
@import url('https://fonts.googleapis.com/css2?family=Roboto&display=swap');
body {
font-family: 'Roboto', Arial, sans-serif;
}
</style>
創新遷移清單
遷移前的任務
審核您的程式碼庫,找出所有Winnovative的用法:
# Find allWinnovativereferences
grep -r "Winnovative" --include="*.cs" .
grep -r "HtmlToPdfConverter" --include="*.cs" .
grep -r "PdfDocumentOptions" --include="*.cs" .
grep -r "ConvertUrl\|ConvertHtml" --include="*.cs" .
# Find allWinnovativereferences
grep -r "Winnovative" --include="*.cs" .
grep -r "HtmlToPdfConverter" --include="*.cs" .
grep -r "PdfDocumentOptions" --include="*.cs" .
grep -r "ConvertUrl\|ConvertHtml" --include="*.cs" .
記錄目前的配置,包括頁面大小、邊界和頁首/頁尾設定。 找出可以移除的 CSS 變通方式(webkit 前綴、基於浮動的網格)。 請注意 JavaScript 的相容性要求。
程式碼更新任務
1.移除WinnovativeNuGet 套件 2.安裝IronPDFNuGet 套件
- 將所有命名空間匯入從
Winnovative更新為IronPdf - 將
HtmlToPdfConverter替換為ChromePdfRenderer - 將
ConvertHtml()呼叫轉換為RenderHtmlAsPdf() - 將
ConvertUrl()呼叫轉換為RenderUrlAsPdf() - 將頁面大小/方向設定更新為
RenderingOptions8.轉換邊際配置 - 將基於
TextElement的頁首/頁尾遷移到基於 HTML 的TextHeaderFooter - 將頁碼佔位符從
&p;/&P;更新為{page}/{total-pages}11.在啟動時增加IronPDF授權初始化功能
後遷移測試
轉移後,驗證這些方面:
- 測試基本的 HTML 至 PDF 轉換
- 測試 URL 至 PDF 的轉換
- 驗證 CSS 網格佈局是否能正確呈現 (它們現在可以運作了)
- 驗證 Flexbox 佈局是否能正確呈現 (它們現在可以運作了)
- 使用現代 ES6+ 語法測試 JavaScript 繁重的頁面
- 驗證 Bootstrap 5 的相容性
- 測試頁首/頁尾的呈現
- 驗證分頁
- 比較 PDF 輸出品質
清理任務
- 移除WinnovativeCSS 變通(webkit 前綴)
- 將 ES5 JavaScript 更新為現代語法
- 移除基於浮點的網格回退
- 更新文件
遷移到IronPDF的主要優點。
從Winnovative轉移到IronPDF提供了幾個關鍵的優勢:
現代渲染引擎:IronPDF使用最新的 Chromium 引擎,確保完全支援 CSS3、CSS Grid、Flexbox 和ES2024JavaScript。 Bootstrap 5、Tailwind CSS 和 React/Vue 等現代框架都能正確呈現。
簡化的 API:基於 HTML 的頁首和頁尾取代了程式化的 TextElement 定位。 直覺的佔位符(如 {page})取代了晦澀的 &p; 文法。 內建的 SaveAs() 方法消除了手動位元組處理。
積極開發:隨著 .NET 10 和 C# 14 的普及,IronPDF 的每月更新確保與當前和未來的 .NET 版本相容。
現代 CSS 無需變通方法: CSS Grid、Flexbox 和現代排版無需 webkit 前綴或基於浮動的回退方案即可運作。
現代 JavaScript: ES6+ 特性,包括箭頭函數、async/await、類別和模組,都能正確執行。

