迁移指南 如何用 C# 从 WebView2 迁移到 IronPDF Curtis Chau 已发布:2026年2月1日 下载 IronPDF NuGet 下载 DLL 下载 Windows 安装程序 免费试用 法学硕士副本 法学硕士副本 将页面复制为 Markdown 格式,用于 LLMs 在 ChatGPT 中打开 向 ChatGPT 咨询此页面 在双子座打开 向 Gemini 询问此页面 在 Grok 中打开 向 Grok 询问此页面 打开困惑 向 Perplexity 询问有关此页面的信息 分享 在 Facebook 上分享 分享到 X(Twitter) 在 LinkedIn 上分享 复制链接 电子邮件文章 WebView2 是 Microsoft 的可嵌入 Edge/Chromium 浏览器控件,它为开发人员提供了一种在 Windows 应用程序中显示 Web 内容的方法。 然而,当开发团队尝试使用WebView2生成 PDF 时,他们会遇到严重的架构限制,使其不适合生产环境。WebView2是为用户界面应用程序设计的浏览器嵌入控件,而不是 PDF 生成库。 本指南为需要在应用程序中可靠生成 PDF 的 .NET 专业开发人员提供了从WebView2到IronPDF的完整迁移路径,并附有分步说明、代码比较和实用示例。 重要警告:WebView2 不适合生成 PDF. 在研究迁移路径之前,开发团队必须了解为什么WebView2在用于创建 PDF 时会产生重大问题: 问题 影响 严重性 内存泄露 在长期运行的进程中,WebView2 存在大量记录在案的内存泄漏问题。 您的服务器将崩溃。 关键 仅限窗口 不支持 Linux、macOS、Docker 或云环境 关键 需要用户界面线程 必须在带有消息泵的 STA 线程上运行。不能在网络服务器或 API 中运行。 关键 非专为 PDF 设计 PrintToPdfAsync 是事后想到的,而不是核心功能 高 服务中的不稳定性 Windows 服务和后台工作者中常见的崩溃和挂起现象 高 复杂的异步流 导航事件、完成回调、竞赛条件 高 Edge 运行时依赖性 要求在目标计算机上安装 EdgeWebView2Runtime 中 无头模式 始终创建用户界面元素,即使是隐藏的元素 中 性能 启动速度慢、资源消耗大 中 无专业支持 微软不支持 PDF 生成用例 中 现实世界中的失败场景 这些代码模式会导致生产故障: // DANGER: This code WILL cause problems in production //问题1: Memory leak - creates newWebView2for each PDF public async Task<byte[]> GeneratePdf(string html) // Called 1000x/day = server crash { using var webView = new WebView2(); // Memory not fully released! await webView.EnsureCoreWebView2Async(); webView.CoreWebView2.NavigateToString(html); // ... memory accumulates until OOM } //问题2: UI thread requirement - crashes in ASP.NET public IActionResult GenerateReport() // FAILS - no STA thread { var webView = new WebView2(); // InvalidOperationException } //问题3: Windows Service instability public class PdfService : BackgroundService // Random crashes { protected override async Task ExecuteAsync(CancellationToken token) { //WebView2+ no message pump = hangs, crashes, undefined behavior } } // DANGER: This code WILL cause problems in production //问题1: Memory leak - creates newWebView2for each PDF public async Task<byte[]> GeneratePdf(string html) // Called 1000x/day = server crash { using var webView = new WebView2(); // Memory not fully released! await webView.EnsureCoreWebView2Async(); webView.CoreWebView2.NavigateToString(html); // ... memory accumulates until OOM } //问题2: UI thread requirement - crashes in ASP.NET public IActionResult GenerateReport() // FAILS - no STA thread { var webView = new WebView2(); // InvalidOperationException } //问题3: Windows Service instability public class PdfService : BackgroundService // Random crashes { protected override async Task ExecuteAsync(CancellationToken token) { //WebView2+ no message pump = hangs, crashes, undefined behavior } } $vbLabelText $csharpLabel IronPDF与 WebView2:功能对比 了解架构差异有助于技术决策者评估迁移投资: 方面 WebView2 IronPDF 目的 浏览器控制(用户界面) PDF 库(专为 PDF 设计) 生产就绪 无 是 内存管理 长期运行中的泄漏 稳定、处理得当 平台支持 仅限 Windows Windows、Linux、macOS、Docker 线程要求 STA + 消息泵 任何线程 服务器/云 不支持 全面支持 Azure/AWS/GCP 问题 完美运行 对接程序 不可能 提供官方图片 ASP.NET Core。 不能工作 一流的支持 背景服务 不稳定 稳定 支持的上下文 仅限 WinForms/WPF 任何 .NET 环境:控制台、网络、桌面 HTML 到 PDF 基本的 满的 URL 转 PDF 基本的 满的 页眉/页脚 无 是 (HTML) 水印。 无 是 合并 PDF 文件 无 是 拆分 PDF 文件 无 是 数字签名 无 是 密码保护 无 是 PDF/A合规性 无 是 专业支持 无 PDF 是 文档 有限的 广泛 快速入门:从WebView2迁移到 IronPDF. 迁移工作可以通过以下基本步骤立即开始。 步骤 1:删除WebView2软件包 dotnet remove package Microsoft.Web.WebView2 dotnet remove package Microsoft.Web.WebView2 SHELL 或从您的项目文件中删除: <PackageReference Include="Microsoft.Web.WebView2" Version="*" Remove /> <PackageReference Include="Microsoft.Web.WebView2" Version="*" Remove /> XML 步骤2:安装IronPDF dotnet add package IronPdf dotnet add package IronPdf SHELL 步骤 3:更新命名空间 用 IronPdf 命名空间替换WebView2命名空间: // Before (WebView2) using Microsoft.Web.WebView2.Core; using Microsoft.Web.WebView2.WinForms; // After (IronPDF) using IronPdf; // Before (WebView2) using Microsoft.Web.WebView2.Core; using Microsoft.Web.WebView2.WinForms; // After (IronPDF) using IronPdf; $vbLabelText $csharpLabel 步骤 4:初始化许可证 在应用程序启动时添加许可证初始化: IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"; IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"; $vbLabelText $csharpLabel 代码迁移示例 将HTML转换为PDF 最基本的操作揭示了这些 .NET PDF 方法之间的复杂性差异。 WebView2 方法: // NuGet: Install-Package Microsoft.Web.WebView2.WinForms using System; using System.IO; using System.Threading.Tasks; using Microsoft.Web.WebView2.WinForms; using Microsoft.Web.WebView2.Core; class Program { static async Task Main() { var webView = new WebView2(); await webView.EnsureCoreWebView2Async(); webView.CoreWebView2.NavigateToString("<html><body><h1>Hello World</h1></body></html>"); await Task.Delay(2000); await webView.CoreWebView2.CallDevToolsProtocolMethodAsync( "Page.printToPDF", "{}" ); } } // NuGet: Install-Package Microsoft.Web.WebView2.WinForms using System; using System.IO; using System.Threading.Tasks; using Microsoft.Web.WebView2.WinForms; using Microsoft.Web.WebView2.Core; class Program { static async Task Main() { var webView = new WebView2(); await webView.EnsureCoreWebView2Async(); webView.CoreWebView2.NavigateToString("<html><body><h1>Hello World</h1></body></html>"); await Task.Delay(2000); await webView.CoreWebView2.CallDevToolsProtocolMethodAsync( "Page.printToPDF", "{}" ); } } $vbLabelText $csharpLabel IronPdf 方法: // NuGet: Install-Package IronPdf using IronPdf; class Program { static void Main() { var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Hello World</h1></body></html>"); pdf.SaveAs("output.pdf"); } } // NuGet: Install-Package IronPdf using IronPdf; class Program { static void Main() { var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Hello World</h1></body></html>"); pdf.SaveAs("output.pdf"); } } $vbLabelText $csharpLabel WebView2 版本需要使用EnsureCoreWebView2Async()进行异步初始化,通过 NavigateToString() 进行导航,使用不可靠的 Task.Delay(2000) 等待呈现,以及与 DevTools 协议进行交互。IronPDF完全省去了这一步骤--创建渲染器、渲染 HTML、保存。 有关 HTML 转 PDF 的高级应用场景,请参阅 HTML 转 PDF 指南。 将 URL 转换为 PDF URL 到 PDF 的转换演示了WebView2复杂的异步导航流程。 WebView2 方法: // NuGet: Install-Package Microsoft.Web.WebView2.WinForms using System; using System.IO; using System.Threading.Tasks; using Microsoft.Web.WebView2.WinForms; using Microsoft.Web.WebView2.Core; class Program { static async Task Main() { var webView = new WebView2(); await webView.EnsureCoreWebView2Async(); var tcs = new TaskCompletionSource<bool>(); webView.CoreWebView2.NavigationCompleted += (s, e) => tcs.SetResult(true); webView.CoreWebView2.Navigate("https://example.com"); await tcs.Task; await Task.Delay(1000); var result = await webView.CoreWebView2.CallDevToolsProtocolMethodAsync( "Page.printToPDF", "{\"printBackground\": true}" ); var base64 = System.Text.Json.JsonDocument.Parse(result).RootElement.GetProperty("data").GetString(); File.WriteAllBytes("output.pdf", Convert.FromBase64String(base64)); } } // NuGet: Install-Package Microsoft.Web.WebView2.WinForms using System; using System.IO; using System.Threading.Tasks; using Microsoft.Web.WebView2.WinForms; using Microsoft.Web.WebView2.Core; class Program { static async Task Main() { var webView = new WebView2(); await webView.EnsureCoreWebView2Async(); var tcs = new TaskCompletionSource<bool>(); webView.CoreWebView2.NavigationCompleted += (s, e) => tcs.SetResult(true); webView.CoreWebView2.Navigate("https://example.com"); await tcs.Task; await Task.Delay(1000); var result = await webView.CoreWebView2.CallDevToolsProtocolMethodAsync( "Page.printToPDF", "{\"printBackground\": true}" ); var base64 = System.Text.Json.JsonDocument.Parse(result).RootElement.GetProperty("data").GetString(); File.WriteAllBytes("output.pdf", Convert.FromBase64String(base64)); } } $vbLabelText $csharpLabel IronPdf 方法: // NuGet: Install-Package IronPdf using IronPdf; class Program { static void Main() { var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderUrlAsPdf("https://example.com"); pdf.SaveAs("output.pdf"); } } // NuGet: Install-Package IronPdf using IronPdf; class Program { static void Main() { var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderUrlAsPdf("https://example.com"); pdf.SaveAs("output.pdf"); } } $vbLabelText $csharpLabel WebView2 要求创建 TaskCompletionSource, 订阅 NavigationCompleted 事件, 调用 CallDevToolsProtocolMethodAsync, 解析 JSON 响应和解码 base64 数据。IronPDF提供了一个专用的 RenderUrlAsPdf 方法,可在内部处理所有复杂问题。 请浏览 URL to PDF 文档,了解身份验证和自定义页眉选项。 从 HTML 文件自定义 PDF 设置 配置页面方向、页边距和纸张大小需要采用不同的方法。 WebView2 方法: // NuGet: Install-Package Microsoft.Web.WebView2.WinForms using System; using System.IO; using System.Threading.Tasks; using Microsoft.Web.WebView2.Core; using Microsoft.Web.WebView2.WinForms; class Program { static async Task Main() { var webView = new WebView2(); await webView.EnsureCoreWebView2Async(); string htmlFile = Path.Combine(Directory.GetCurrentDirectory(), "input.html"); webView.CoreWebView2.Navigate(htmlFile); await Task.Delay(3000); var printSettings = webView.CoreWebView2.Environment.CreatePrintSettings(); printSettings.Orientation = CoreWebView2PrintOrientation.Landscape; printSettings.MarginTop = 0.5; printSettings.MarginBottom = 0.5; using (var stream = await webView.CoreWebView2.PrintToPdfAsync("custom.pdf", printSettings)) { Console.WriteLine("Custom PDF created"); } } } // NuGet: Install-Package Microsoft.Web.WebView2.WinForms using System; using System.IO; using System.Threading.Tasks; using Microsoft.Web.WebView2.Core; using Microsoft.Web.WebView2.WinForms; class Program { static async Task Main() { var webView = new WebView2(); await webView.EnsureCoreWebView2Async(); string htmlFile = Path.Combine(Directory.GetCurrentDirectory(), "input.html"); webView.CoreWebView2.Navigate(htmlFile); await Task.Delay(3000); var printSettings = webView.CoreWebView2.Environment.CreatePrintSettings(); printSettings.Orientation = CoreWebView2PrintOrientation.Landscape; printSettings.MarginTop = 0.5; printSettings.MarginBottom = 0.5; using (var stream = await webView.CoreWebView2.PrintToPdfAsync("custom.pdf", printSettings)) { Console.WriteLine("Custom PDF created"); } } } $vbLabelText $csharpLabel IronPdf 方法: // NuGet: Install-Package IronPdf using IronPdf; using IronPdf.Rendering; using System; using System.IO; class Program { static void Main() { var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape; renderer.RenderingOptions.MarginTop = 50; renderer.RenderingOptions.MarginBottom = 50; string htmlFile = Path.Combine(Directory.GetCurrentDirectory(), "input.html"); var pdf = renderer.RenderHtmlFileAsPdf(htmlFile); pdf.SaveAs("custom.pdf"); Console.WriteLine("Custom PDF created"); } } // NuGet: Install-Package IronPdf using IronPdf; using IronPdf.Rendering; using System; using System.IO; class Program { static void Main() { var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.PaperOrientation = PdfPaperOrientation.Landscape; renderer.RenderingOptions.MarginTop = 50; renderer.RenderingOptions.MarginBottom = 50; string htmlFile = Path.Combine(Directory.GetCurrentDirectory(), "input.html"); var pdf = renderer.RenderHtmlFileAsPdf(htmlFile); pdf.SaveAs("custom.pdf"); Console.WriteLine("Custom PDF created"); } } $vbLabelText $csharpLabel WebView2 需要 3 秒的 Task.Delay (不可靠的猜测),通过环境创建打印设置,并使用 PrintToPdfAsync 和流。 IronPdf 直接提供了具有明确名称的 RenderingOptions 属性,并使用毫米进行更精确的测量。 使用 DevTools 协议的高级 PDF 选项 复杂的WebView2配置需要 DevTools 协议的交互。 WebView2 方法: // NuGet: Install-Package Microsoft.Web.WebView2.WinForms using System; using System.IO; using System.Threading.Tasks; using System.Text.Json; using Microsoft.Web.WebView2.WinForms; using Microsoft.Web.WebView2.Core; class Program { static async Task Main() { var webView = new WebView2(); await webView.EnsureCoreWebView2Async(); var htmlPath = Path.GetFullPath("document.html"); var tcs = new TaskCompletionSource<bool>(); webView.CoreWebView2.NavigationCompleted += (s, e) => tcs.SetResult(true); webView.CoreWebView2.Navigate($"file:///{htmlPath}"); await tcs.Task; await Task.Delay(1000); var options = new { landscape = false, printBackground = true, paperWidth = 8.5, paperHeight = 11, marginTop = 0.4, marginBottom = 0.4, marginLeft = 0.4, marginRight = 0.4 }; var result = await webView.CoreWebView2.CallDevToolsProtocolMethodAsync( "Page.printToPDF", JsonSerializer.Serialize(options) ); var base64 = JsonDocument.Parse(result).RootElement.GetProperty("data").GetString(); File.WriteAllBytes("output.pdf", Convert.FromBase64String(base64)); } } // NuGet: Install-Package Microsoft.Web.WebView2.WinForms using System; using System.IO; using System.Threading.Tasks; using System.Text.Json; using Microsoft.Web.WebView2.WinForms; using Microsoft.Web.WebView2.Core; class Program { static async Task Main() { var webView = new WebView2(); await webView.EnsureCoreWebView2Async(); var htmlPath = Path.GetFullPath("document.html"); var tcs = new TaskCompletionSource<bool>(); webView.CoreWebView2.NavigationCompleted += (s, e) => tcs.SetResult(true); webView.CoreWebView2.Navigate($"file:///{htmlPath}"); await tcs.Task; await Task.Delay(1000); var options = new { landscape = false, printBackground = true, paperWidth = 8.5, paperHeight = 11, marginTop = 0.4, marginBottom = 0.4, marginLeft = 0.4, marginRight = 0.4 }; var result = await webView.CoreWebView2.CallDevToolsProtocolMethodAsync( "Page.printToPDF", JsonSerializer.Serialize(options) ); var base64 = JsonDocument.Parse(result).RootElement.GetProperty("data").GetString(); File.WriteAllBytes("output.pdf", Convert.FromBase64String(base64)); } } $vbLabelText $csharpLabel IronPdf 方法: // NuGet: Install-Package IronPdf using IronPdf; using IronPdf.Rendering; class Program { static void Main() { var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter; renderer.RenderingOptions.MarginTop = 40; renderer.RenderingOptions.MarginBottom = 40; renderer.RenderingOptions.MarginLeft = 40; renderer.RenderingOptions.MarginRight = 40; renderer.RenderingOptions.PrintHtmlBackgrounds = true; var pdf = renderer.RenderHtmlFileAsPdf("document.html"); pdf.SaveAs("output.pdf"); } } // NuGet: Install-Package IronPdf using IronPdf; using IronPdf.Rendering; class Program { static void Main() { var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.PaperSize = PdfPaperSize.Letter; renderer.RenderingOptions.MarginTop = 40; renderer.RenderingOptions.MarginBottom = 40; renderer.RenderingOptions.MarginLeft = 40; renderer.RenderingOptions.MarginRight = 40; renderer.RenderingOptions.PrintHtmlBackgrounds = true; var pdf = renderer.RenderHtmlFileAsPdf("document.html"); pdf.SaveAs("output.pdf"); } } $vbLabelText $csharpLabel WebView2 需要构建匿名对象、序列化为 JSON、调用 DevTools 协议方法、解析 JSON 响应并手动解码 base64。IronPdf 提供了类型化属性,具有明确的名称和枚举值,如 PdfPaperSize.Letter 。 WebView2 应用程序接口到IronPDF映射参考 这种映射通过显示直接的 API 对应关系来加速迁移: WebView2 应用程序接口 IronPdf 同等产品 备注 new WebView2()|new ChromePdfRenderer()` 无需 UI 控制 EnsureCoreWebView2Async() 不适用 无需初始化 NavigateToString(html)</code> + <code>PrintToPdfAsync() RenderHtmlAsPdf(html) 单一方法调用 Navigate(url)</code> + <code>PrintToPdfAsync() RenderUrlAsPdf(url) 单一方法调用 PrintSettings.PageWidth RenderingOptions.PaperSize 使用 PdfPaperSize 枚举 PrintSettings.PageHeight RenderingOptions.PaperSize 使用 PdfPaperSize 枚举 PrintSettings.MarginTop RenderingOptions.MarginTop 单位:毫米而非英寸 打印设置.方向 RenderingOptions.PaperOrientation 肖像/风景 ExecuteScriptAsync() HTML 中的 JavaScript 或使用 WaitFor 选项 AddScriptToExecuteOnDocumentCreatedAsync() HTML <script> 标记 完全支持 JS 导航事件 WaitFor.JavaScript() 简洁的等待机制 CallDevToolsProtocolMethodAsync("Page.printToPDF") RenderHtmlAsPdf() 直接渲染 常见迁移问题和解决方案 问题 1:内存泄漏 WebView2 问题:在处置WebView2实例时内存未完全释放。 长期运行的进程会积累内存,直至崩溃。 IronPDF解决方案:正确的垃圾回收,无泄漏: //IronPDF- clean memory management using (var pdf = renderer.RenderHtmlAsPdf(html)) { pdf.SaveAs("output.pdf"); } // Properly disposed //IronPDF- clean memory management using (var pdf = renderer.RenderHtmlAsPdf(html)) { pdf.SaveAs("output.pdf"); } // Properly disposed $vbLabelText $csharpLabel 问题 2:Web 应用程序中没有 UI 线程 WebView2 问题: 需要带有消息泵的 STA 线程。ASP.NET Core 控制器无法创建WebView2实例。 IronPDF解决方案:可在任何线程上运行: // ASP.NET Core - just works public async Task<IActionResult> GetPdf() { var pdf = await renderer.RenderHtmlAsPdfAsync(html); return File(pdf.BinaryData, "application/pdf"); } // ASP.NET Core - just works public async Task<IActionResult> GetPdf() { var pdf = await renderer.RenderHtmlAsPdfAsync(html); return File(pdf.BinaryData, "application/pdf"); } $vbLabelText $csharpLabel 问题 3:导航事件的复杂性 WebView2 问题: 必须使用 TaskCompletionSource 处理异步导航事件、完成回调和竞赛条件。 IronPDF解决方案:同步或异步单方法调用: // Simple and predictable var pdf = renderer.RenderHtmlAsPdf(html); // or var pdf = await renderer.RenderHtmlAsPdfAsync(html); // Simple and predictable var pdf = renderer.RenderHtmlAsPdf(html); // or var pdf = await renderer.RenderHtmlAsPdfAsync(html); $vbLabelText $csharpLabel 问题 4:测量单位 WebView2 使用英寸表示尺寸(8.5 x 11 表示 Letter)。 IronPDF使用毫米进行更精确的测量。 转换方法: // WebView2: PageWidth = 8.27 (inches for A4) // IronPDF: Use enum renderer.RenderingOptions.PaperSize = PdfPaperSize.A4; // Or custom size in mm renderer.RenderingOptions.SetCustomPaperSizeInMillimeters(210, 297); // WebView2: PageWidth = 8.27 (inches for A4) // IronPDF: Use enum renderer.RenderingOptions.PaperSize = PdfPaperSize.A4; // Or custom size in mm renderer.RenderingOptions.SetCustomPaperSizeInMillimeters(210, 297); $vbLabelText $csharpLabel WebView2迁移清单 迁移前任务 在您的代码库中记录所有WebView2PDF 生成代码。 确定WebView2在哪些方面出现问题(内存泄漏、崩溃、部署问题)。 请查看 IronPDF 文档,熟悉其功能。 代码更新任务 1.移除 Microsoft.Web.WebView2 NuGet 软件包 2.安装 IronPdf NuGet 软件包 3.如果仅用于生成 PDF,则移除 WinForms/WPF 依赖性 4.用 ChromePdfRenderer 替换WebView2代码 5.删除 STA 线程要求 6.移除导航事件处理程序和 TaskCompletionSource 模式 7.移除 Task.Delay hacks 8.在启动时添加 IronPdf 许可证初始化功能 迁移后测试 迁移后,验证这些方面: 在目标环境中进行测试(ASP.NET、Docker、Linux(如适用) 验证 PDF 输出质量是否符合预期 测试 JavaScript 较多的页面能否正确呈现 验证页眉和页脚是否能与 IronPdf 的 HTML 功能配合使用 对长时间操作的内存稳定性进行负载测试 测试长期运行场景,无需内存积累 部署更新 更新 Docker 映像(如适用)(移除 EdgeWebView2运行时 从服务器要求中移除 EdgeWebView2Runtime 依赖性 更新服务器要求文档 验证跨平台部署在目标平台上的有效性 迁移到IronPDF的主要优势 从WebView2迁移到IronPDF有几个关键优势: 跨平台支持:与WebView2仅限 Windows 的限制不同,IronPDF 可在 Windows、Linux、macOS 和 Docker 上运行。 这种灵活性使其能够部署到 Azure、AWS、GCP 和任何云环境,而不受平台限制。 无 UI 依赖项:IronPDF不需要 STA 线程、消息循环或 WinForms/WPF 上下文。 它适用于控制台应用程序、网络 API、Windows 服务和后台工作者。 内存稳定性:适当的垃圾回收可以消除WebView2在长时间运行的进程中常见的内存泄漏问题。 生产服务器保持稳定。 简单 API:单个方法调用取代了复杂的导航事件、完成回调、DevTools 协议交互和 base64 解码。 扩展 PDF 功能:页眉、页脚、水印、合并/拆分、数字签名、密码保护和 PDF/A 合规性——WebView2 无法提供的功能。 积极开发:随着 .NET 10 和 C# 14 的普及,IronPDF 将持续更新,确保与当前和未来的 .NET 版本兼容。 Curtis Chau 立即与工程团队聊天 技术作家 Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。 相关文章 已发布2026年2月1日 如何用 C# 从 ZetPDF 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 ZetPDF 到 IronPDF 的迁移。从基于坐标的库转换到现代的 HTML 到 PDF 解决方案。包括 HTML 转换、合并 PDF 和移除 PDFSharp 依赖性的代码示例。 阅读更多 已发布2026年2月1日 如何用 C# 从 Scryber.Core 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 Scryber.Core 迁移到 IronPDF 的方法。从自定义 XML/HTML 解析转换到现代 Chromium 渲染器。包括 HTML 转换、URL 呈现和替换专有绑定的代码示例。 阅读更多 已发布2026年2月1日 如何用 C# 从 XFINIUM.PDF 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 XFINIUM.PDF 到 IronPDF 的迁移。从基于坐标的手动定位切换到声明式 HTML/CSS 渲染。包括替换图形基元和自动布局的代码示例。 阅读更多 如何用 C# 从 Winnovative 迁移到 IronPDF如何用 C# 从 VectSharp 迁移...
已发布2026年2月1日 如何用 C# 从 ZetPDF 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 ZetPDF 到 IronPDF 的迁移。从基于坐标的库转换到现代的 HTML 到 PDF 解决方案。包括 HTML 转换、合并 PDF 和移除 PDFSharp 依赖性的代码示例。 阅读更多
已发布2026年2月1日 如何用 C# 从 Scryber.Core 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 Scryber.Core 迁移到 IronPDF 的方法。从自定义 XML/HTML 解析转换到现代 Chromium 渲染器。包括 HTML 转换、URL 呈现和替换专有绑定的代码示例。 阅读更多
已发布2026年2月1日 如何用 C# 从 XFINIUM.PDF 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 XFINIUM.PDF 到 IronPDF 的迁移。从基于坐标的手动定位切换到声明式 HTML/CSS 渲染。包括替换图形基元和自动布局的代码示例。 阅读更多