如何用 C# 从 Winnovative 迁移到 IronPDF
从Winnovative迁移到 IronPdf:完整的 C# 开发人员指南。
Winnovative 一直是.NET PDF 生成领域公认的知名企业,为 C# 应用程序提供 HTML 到 PDF 的转换功能。 然而,该库依赖于 2016 年的 WebKit 引擎,这给现代网络开发带来了巨大挑战。 网格布局、现代 JavaScript 语法等现代 CSS 功能以及 Bootstrap 5 和 Tailwind CSS 等流行框架经常无法正确呈现,甚至根本无法呈现。
本指南提供了从Winnovative到IronPDF的完整迁移路径,为评估这一过渡的专业 .NET 开发人员提供了分步说明、代码比较和实用示例。
为什么要从Winnovative迁移?
Winnovative 依靠的是 2016 年的 WebKit 引擎,这给现代网络应用带来了严重问题:
不支持 CSS 网格:Bootstrap 5、Tailwind CSS 和现代布局完全中断。 任何使用 CSS 网格的页面都不会按预期呈现。
Buggy Flexbox Implementation:与现代浏览器相比,呈现效果不一致。 开发人员经常要花费数小时来调试只存在于Winnovative中的布局问题。
ES5 JavaScript only:现代 ES6+ JavaScript 功能(箭头函数、async/await、类)无声失效。 这意味着 React、Vue 和其他现代框架经常会产生错误的输出。
停滞不前的开发:尽管 "Winnovative "意味着创新,但近年来该产品的更新却少之又少。
字体渲染问题:网络字体和自定义排版经常会出现渲染不正确或根本无法渲染的情况。
安全问题:2016 年的 WebKit 引擎缺乏多年的安全补丁和漏洞修复。
现实世界的影响
现代 CSS 和 JavaScript 在Winnovative中根本无法运行:
<!-- This modern CSS breaks inWinnovative-->
<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>
<!-- Modern JavaScript fails silently -->
<script>
const items = data.map(item => item.name); // Arrow functions: FAIL
const result = await fetchData(); // Async/await: FAIL
class Report { } // Classes: FAIL
</script><!-- This modern CSS breaks inWinnovative-->
<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>
<!-- Modern JavaScript fails silently -->
<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. | 破译 | 全面支持 |
| Tailwind CSS 尾风 CSS | 不支持 | 全面支持 |
| React/VueSSR | 问题 | 完美运行 |
| 网络字体 | 不可靠 | 全面支持 |
| 更新 | 不经常 | 每月 |
| 价格 | $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;IRON VB CONVERTER ERROR developers@ironsoftware.com步骤 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPdf 方法:
// 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comWinnovative 需要创建一个<代码>HtmlToPdfConverter</代码实例,在该实例上设置许可证密钥,调用 ConvertHtml() 并使用空的基本 URL 参数,接收原始字节并手动写入文件。IronPDF 简化了这一切:创建一个 ChromePdfRenderer, 调用 RenderHtmlAsPdf(), 并使用内置的 SaveAs() 方法。
有关 HTML 转 PDF 的高级应用场景,请参阅 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPdf 方法:
// 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comWinnovative 使用 ConvertUrl() 返回必须手动保存的字节。IronPDF提供了 RenderUrlAsPdf() 与<代码>PDF 文档</代码对象,其中包含 SaveAs() 以方便使用。
请浏览 URL to PDF 文档,了解身份验证和自定义页眉选项。
添加页眉和页脚
页眉和页脚显示了显著的架构差异。Winnovative采用基于元素的编程方法,使用<代码>文本元素</代码对象,而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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comIronPdf 方法:
// 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");
}
}IRON VB CONVERTER ERROR developers@ironsoftware.comWinnovative 要求通过 PdfDocumentOptions.ShowHeader 启用页眉/页脚,设置高度,创建具有坐标位置的<代码>文本元素</代码对象和 System.Drawing.Font 对象,并使用 &p; 和 &P; 占位符。 IronPdf 使用 TextHeaderFooter 对象,该对象具有 CenterText 和 FontSize 等简单属性,以及 {page} 和 {total-pages} 等直观占位符。
有关基于 HTML 并带有完整 CSS 样式的页眉,请参阅 页眉和页脚文档。
创新 API 到IronPDF映射参考
这种映射通过显示直接的 API 对应关系来加速迁移:
| Winnovative Class | IronPdf 同等产品 | 备注 |
|---|---|---|
| <代码>HtmlToPdfConverter</代码 | <代码>ChromePdfRenderer</代码 | 主要转换类 |
| <代码>PDF 文档</代码 | <代码>PDF 文档</代码 | PDF 操作 |
| <代码>PdfDocumentOptions</代码 | <代码>渲染选项</代码 | 配置 |
| <代码>PdfHeaderOptions</代码 | <代码>HtmlHeaderFooter</代码 | 标题 |
| <代码>PdfFooterOptions</代码 | <代码>HtmlHeaderFooter</代码 | 页脚 |
| <代码>文本元素</代码 | HtmlFragment 中的 HTML | 文本定位 |
| <代码>图像元素</代码 | HTML <img> | 图片位置 |
方法映射
| Winnovative 方法 | IronPdf 方法 |
|---|---|
| <代码>ConvertUrl(url)</代码 | <代码>RenderUrlAsPdf(url)</代码 |
| <代码>ConvertUrlToFile(url, 路径)</代码 | <代码>RenderUrlAsPdf(url).SaveAs(path)</代码 |
| <代码>ConvertHtml(html,baseUrl)</代码 | <代码>RenderHtmlAsPdf(html)</代码 |
| <代码>ConvertHtmlToFile(html, 路径)</代码 | <代码>RenderHtmlAsPdf(html).SaveAs(path)</代码 |
| <代码>ConvertHtmlFile(路径)</代码 | <代码>RenderHtmlFileAsPdf(path)</代码 |
| <代码>MergePdf(流)</代码 | <代码>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</代码 | <代码>PdfPaperOrientation = PdfPaperOrientation.Landscape</ 代码 |
| <代码>顶边距 = 20</ 代码 | <代码>MarginTop = 20</ 代码 |
| <代码>BottomMargin = 20</ 代码 | <代码>MarginBottom = 20</ 代码 |
| <代码>LeftMargin = 15</ 代码 | <代码>边距左 = 15</ 代码 |
| <代码>右边距 = 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 存在渲染错误,开发人员正在解决这些问题。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");IRON VB CONVERTER ERROR developers@ironsoftware.com问题 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);IRON VB CONVERTER ERROR developers@ironsoftware.com问题 3:基础 URL 无法使用
症状:图像和 CSS 的相对 URL 无法解析。
原因:IronPDF 需要明确的基础 URL 配置。
解决方案:
renderer.RenderingOptions.BaseUrl = new Uri("https://example.com/");renderer.RenderingOptions.BaseUrl = new Uri("https://example.com/");IRON VB CONVERTER ERROR developers@ironsoftware.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.安装 IronPdf NuGet 软件包 3.将所有名称空间导入从 Winnovative 更新为 IronPdf 4.将<代码>HtmlToPdfConverter</代码替换为 ChromePdfRenderer 5.将 ConvertHtml() 调用转换为 RenderHtmlAsPdf() 调用 6.将 ConvertUrl() 调用转换为 RenderUrlAsPdf() 调用 7.将页面大小/方向设置更新为 RenderingOptions 8.转换保证金配置 9.将基于<代码>文本元素</代码的页眉/页脚迁移为基于 HTML 的 TextHeaderFooter 10.将页码占位符从&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 的页眉和页脚取代了程序化的<代码>文本元素</代码定位。 以 {page} 等直观的占位符取代晦涩难懂的 &p; 语法。 内置的 SaveAs() 方法无需手动处理字节。
主动开发:随着 .NET 10 和 C# 14 在 2026 年之前的采用率不断提高,IronPDF 的每月更新可确保与当前和未来的 .NET 版本兼容。
无变通方法的现代 CSS:CSS Grid、Flexbox 和现代排版无需 webkit 前缀或基于浮动的回退。
现代 JavaScript:正确执行 ES6+ 功能,包括箭头函数、异步/等待、类和模块。
结论
Winnovative 作为 HTML 到 PDF 的转换器服务于 .NET 社区,但它对 2016 年的 WebKit 引擎的依赖给现代网络开发带来了难以克服的挑战。 CSS 网格不起作用。 现代 JavaScript 会无声失效。 Bootstrap 5 和 Tailwind CSS 可生成破损的布局。
IronPDF 利用当前的 Chromium 渲染引擎提供现代 HTML 到 PDF 的转换。迁移路径简单明了:替换 NuGet 包、更新命名空间、使用映射参考转换 API 调用,以及将基于元素的标头迁移为基于 HTML 的对应标头。
今天就开始迁移,免费试用 IronPDF,在 PDF 生成中体验现代 CSS 和 JavaScript 支持。






