迁移指南 如何从 ABCpdf for .NET 迁移到 IronPDF Curtis Chau 已发布:2026年1月11日 下载 IronPDF NuGet 下载 DLL 下载 Windows 安装程序 免费试用 法学硕士副本 法学硕士副本 将页面复制为 Markdown 格式,用于 LLMs 在 ChatGPT 中打开 向 ChatGPT 咨询此页面 在双子座打开 向 Gemini 询问此页面 在 Grok 中打开 向 Grok 询问此页面 打开困惑 向 Perplexity 询问有关此页面的信息 分享 在 Facebook 上分享 分享到 X(Twitter) 在 LinkedIn 上分享 复制链接 电子邮件文章 对于旨在简化许可、现代化文档和原生跨平台支持的开发团队而言,从ABCpdf for .NET切换到IronPDF是一项战略性升级。 本指南提供了循序渐进的迁移路径,包括 API 映射和来自真实场景的代码转换示例。 无论您是使用 .NET Framework 4.6.2 还是计划在 2026 年之前升级到 .NET 9 及更高版本,本 ABCpdf 迁移指南都能确保您轻松过渡到IronPDF基于 Chrome 的渲染引擎。 为什么要考虑 ABCpdf 迁移? WebSupergoo 的 ABCpdf 多年来一直是一个功能强大的 .NET PDF 库。 然而,对于计划在 2025 年和 2026 年开展项目的现代开发团队来说,IronPDF 具有诸多吸引力,使其成为一个不错的选择。 许可复杂性 ABCpdf采用分级许可模式,这种模式可能难以理解。 定价从 349 美元起,但会根据功能、服务器部署和用例而增加。 许多开发人员表示,在编制项目预算时,这种许可迷宫是一个重大的管理负担。 Windows 优先架构 虽然 ABCpdf 已添加了跨平台支持,但其历史上以 Windows 为中心的设计偶尔会在工作流程中出现。 针对 Linux 容器、Docker 环境或 macOS 开发设置的开发人员可能会遇到项目规划时没有预料到的摩擦。 文档风格 ABCpdf 的文档虽然详尽,但其风格较为陈旧,与现代 API 文档标准相比显得过时。 新用户往往很难找到他们需要的确切示例,尤其是在使用较新的 .NET 版本时。 引擎配置开销 ABCpdf 需要明确选择引擎(Gecko、Trident 或 Chrome),并通过调用 Clear() 进行手动资源管理。 这就在每个 PDF 操作中增加了模板代码,而现代开发人员更希望避免这些代码。 IronPDF与 ABCpdf:功能比较 下表比较了两个 .NET PDF 库的主要区别: 特征 ABCpdf for .NET IronPDF 渲染引擎 Gecko/Trident/Chrome (可配置) 完整的 Chromium(CSS3、JavaScript) 跨平台 稍后添加,Windows 优先 本地 Windows、Linux、macOS、Docker 许可模式 复杂的分层定价,349 美元以上起 简单、透明的定价 .NET支持 .NET Framework 重点 Framework 4.6.2 到 .NET 9+ 资源管理 需要手动 doc.Clear() 带有 using 语句的 IDisposable 许可证设置 经常使用注册表 基于代码的简单许可证密钥 文档 过时的风格 带有大量示例的现代文档 开始迁移之前 前提条件 确保您的开发环境符合这些要求: .NET Framework 4.6.2+ 或 .NET Core 3.1+ / .NET 5-9 Visual Studio 2019+ 或 JetBrains Rider 访问 NuGet 包管理器 IronPDF 许可证密钥(可免费试用) 查找所有 ABCpdf 参考资料 在您的解决方案目录下运行这些命令,以查找使用ABCpdf for .NET的所有文件: grep -r "using WebSupergoo" --include="*.cs" . grep -r "ABCpdf" --include="*.csproj" . grep -r "using WebSupergoo" --include="*.cs" . grep -r "ABCpdf" --include="*.csproj" . SHELL 本次审核将确定每个需要修改的文件,确保完整的迁移覆盖范围。 值得期待的重大变化 了解ABCpdf for .NET和IronPDF在架构上的差异,可避免在迁移过程中出现意外: 翻译类别 ABCpdf 行为 IronPdf 行为 迁移行动 对象模型 Doc 类是核心 ChromePdfRenderer</code> + <code>PdfDocument 渲染与文档分离 资源清理 手册 doc.Clear() IDisposable 模式 使用 using 语句 引擎选择 doc.HtmlOptions.Engine = EngineType.Chrome 内置 Chrome 浏览器 删除引擎配置 页面索引 基于 1 (doc.Page = 1) 基于 0 (pdf.Pages[0]) 调整索引参考 坐标 基于点的 doc.Rect 基于 CSS 的边距 使用 CSS 或 RenderingOptions 快速入门:5 分钟迁移 步骤 1:更新 NuGet 软件包 # Remove ABCpdf dotnet remove package ABCpdf # Install IronPDF dotnet add package IronPdf # Remove ABCpdf dotnet remove package ABCpdf # Install IronPDF dotnet add package IronPdf SHELL 步骤 2:设置许可证密钥 在应用程序启动时,在任何IronPDF操作之前添加此内容: // 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"; $vbLabelText $csharpLabel 步骤 3:全局查找和替换 更新整个代码库中的所有命名空间引用: 查找 替换为 使用 WebSupergoo.ABCpdf13; 使用 IronPdf; 使用 WebSupergoo.ABCpdf13.Objects; 使用 IronPdf; 使用 WebSupergoo.ABCpdf12; 使用 IronPdf; 使用 WebSupergoo.ABCpdf11; 使用 IronPdf; 完整的 API 参考 文档创建方法 下表将ABCpdf for .NET方法与IronPDF对应方法进行了映射: ABCpdf 方法 IronPdf 方法 备注 new Doc() new ChromePdfRenderer() 渲染器创建 PDF doc.AddImageUrl(url) renderer.RenderUrlAsPdf(url) 将 URL 转换为 PDF doc.AddImageHtml(html) renderer.RenderHtmlAsPdf(html) 将 HTML 字符串转换为 PDF doc.AddImageFile(路径) renderer.RenderHtmlFileAsPdf(path) HTML 文件转 PDF doc.Read(path) PdfDocument.FromFile(路径) 加载现有 PDF doc.Save(路径) pdf.SaveAs(路径) 保存到文件 doc.GetData() pdf.BinaryData 以字节数组形式获取 doc.Clear() 使用 using 语句 自动处理 页面操作方法 ABCpdf 方法 IronPdf 方法 备注 doc.PageCount pdf.PageCount 相同用法 doc.Page = n pdf.Pages[n-1] ABCpdf 为 1-索引,IronPDF 为 0-索引 doc.Delete(pageId) pdf.RemovePages(index) 删除页面 doc.Append(otherDoc) PdfDocument.Merge(pdf1, pdf2) 静态合并方法 doc.Rect.Inset(x,y) RenderingOptions.MarginTop/Bottom/Left/Right 边距 安全和加密方法 ABCpdf 方法 IronPdf 方法 备注 doc.Encryption.Password pdf.SecuritySettings.OwnerPassword 所有者密码 doc.Encryption.CanPrint pdf.SecuritySettings.AllowUserPrinting 打印许可 doc.Encryption.CanCopy pdf.SecuritySettings.AllowUserCopyPasteContent 复制许可 doc.SetInfo("标题", 值) pdf.MetaData.Title 文档元数据 代码迁移示例 示例 1:从 URL 将 HTML 转换为 PDF. 本示例演示了将网页转换为 PDF,这是最常见的 PDF 生成任务之一。 ABCpdf for .NET 实现: // NuGet: Install-Package ABCpdf using System; using WebSupergoo.ABCpdf13; using WebSupergoo.ABCpdf13.Objects; class Program { static void Main() { Doc doc = new Doc(); doc.HtmlOptions.Engine = EngineType.Chrome; doc.AddImageUrl("https://www.example.com"); doc.Save("output.pdf"); doc.Clear(); } } // NuGet: Install-Package ABCpdf using System; using WebSupergoo.ABCpdf13; using WebSupergoo.ABCpdf13.Objects; class Program { static void Main() { Doc doc = new Doc(); doc.HtmlOptions.Engine = EngineType.Chrome; doc.AddImageUrl("https://www.example.com"); doc.Save("output.pdf"); doc.Clear(); } } $vbLabelText $csharpLabel IronPDF 实现: // NuGet: Install-Package IronPdf using System; using IronPdf; class Program { static void Main() { var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderUrlAsPdf("https://www.example.com"); pdf.SaveAs("output.pdf"); } } // NuGet: Install-Package IronPdf using System; using IronPdf; class Program { static void Main() { var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderUrlAsPdf("https://www.example.com"); pdf.SaveAs("output.pdf"); } } $vbLabelText $csharpLabel IronPDF 的方法无需进行明确的引擎配置和手动清理,降低了代码的复杂性,同时保持了完整的 Chrome 渲染功能。 示例 2:HTML 字符串到 PDF. 将 HTML 字符串转换为 PDF 对于生成动态报告和文档至关重要。 ABCpdf for .NET 实现: // NuGet: Install-Package ABCpdf using System; using WebSupergoo.ABCpdf13; using WebSupergoo.ABCpdf13.Objects; class Program { static void Main() { string html = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>"; Doc doc = new Doc(); doc.HtmlOptions.Engine = EngineType.Chrome; doc.AddImageHtml(html); doc.Save("output.pdf"); doc.Clear(); } } // NuGet: Install-Package ABCpdf using System; using WebSupergoo.ABCpdf13; using WebSupergoo.ABCpdf13.Objects; class Program { static void Main() { string html = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>"; Doc doc = new Doc(); doc.HtmlOptions.Engine = EngineType.Chrome; doc.AddImageHtml(html); doc.Save("output.pdf"); doc.Clear(); } } $vbLabelText $csharpLabel IronPDF 实现: // NuGet: Install-Package IronPdf using System; using IronPdf; class Program { static void Main() { string html = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>"; var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs("output.pdf"); } } // NuGet: Install-Package IronPdf using System; using IronPdf; class Program { static void Main() { string html = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>"; var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs("output.pdf"); } } $vbLabelText $csharpLabel IronPdf 版本所需的代码行数较少,默认使用 Chrome 浏览器渲染,确保在所有平台上输出一致。 示例 3:合并多个 PDF 文件 文档处理工作流程中经常需要合并多个 PDF 文档。 ABCpdf for .NET 实现: // NuGet: Install-Package ABCpdf using System; using WebSupergoo.ABCpdf13; using WebSupergoo.ABCpdf13.Objects; class Program { static void Main() { Doc doc1 = new Doc(); doc1.Read("document1.pdf"); Doc doc2 = new Doc(); doc2.Read("document2.pdf"); doc1.Append(doc2); doc1.Save("merged.pdf"); doc1.Clear(); doc2.Clear(); } } // NuGet: Install-Package ABCpdf using System; using WebSupergoo.ABCpdf13; using WebSupergoo.ABCpdf13.Objects; class Program { static void Main() { Doc doc1 = new Doc(); doc1.Read("document1.pdf"); Doc doc2 = new Doc(); doc2.Read("document2.pdf"); doc1.Append(doc2); doc1.Save("merged.pdf"); doc1.Clear(); doc2.Clear(); } } $vbLabelText $csharpLabel IronPDF 实现: // NuGet: Install-Package IronPdf using System; using System.Collections.Generic; using IronPdf; class Program { static void Main() { var pdf1 = PdfDocument.FromFile("document1.pdf"); var pdf2 = PdfDocument.FromFile("document2.pdf"); var merged = PdfDocument.Merge(pdf1, pdf2); merged.SaveAs("merged.pdf"); } } // NuGet: Install-Package IronPdf using System; using System.Collections.Generic; using IronPdf; class Program { static void Main() { var pdf1 = PdfDocument.FromFile("document1.pdf"); var pdf2 = PdfDocument.FromFile("document2.pdf"); var merged = PdfDocument.Merge(pdf1, pdf2); merged.SaveAs("merged.pdf"); } } $vbLabelText $csharpLabel IronPDF 的静态 Merge 方法提供了更简洁的 API,可接受多个文档,无需跟踪和清除单个 Doc 实例。 示例 4:带边距的完整迁移模式 本示例展示了生成带有自定义页边距的 PDF 的完整前后迁移。 之前(ABCpdf for .NET): using WebSupergoo.ABCpdf13; using WebSupergoo.ABCpdf13.Objects; public byte[] GeneratePdf(string html) { Doc doc = new Doc(); doc.HtmlOptions.Engine = EngineType.Chrome; doc.Rect.Inset(20, 20); doc.AddImageHtml(html); byte[] data = doc.GetData(); doc.Clear(); // Manual cleanup required return data; } using WebSupergoo.ABCpdf13; using WebSupergoo.ABCpdf13.Objects; public byte[] GeneratePdf(string html) { Doc doc = new Doc(); doc.HtmlOptions.Engine = EngineType.Chrome; doc.Rect.Inset(20, 20); doc.AddImageHtml(html); byte[] data = doc.GetData(); doc.Clear(); // Manual cleanup required return data; } $vbLabelText $csharpLabel After (IronPDF): using IronPdf; public byte[] GeneratePdf(string html) { var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.MarginTop = 20; renderer.RenderingOptions.MarginBottom = 20; renderer.RenderingOptions.MarginLeft = 20; renderer.RenderingOptions.MarginRight = 20; using var pdf = renderer.RenderHtmlAsPdf(html); return pdf.BinaryData; // Automatic cleanup with 'using' } using IronPdf; public byte[] GeneratePdf(string html) { var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.MarginTop = 20; renderer.RenderingOptions.MarginBottom = 20; renderer.RenderingOptions.MarginLeft = 20; renderer.RenderingOptions.MarginRight = 20; using var pdf = renderer.RenderHtmlAsPdf(html); return pdf.BinaryData; // Automatic cleanup with 'using' } $vbLabelText $csharpLabel 高级迁移场景 ASP.NET Core Web 应用程序 对于使用 .NET 6 以上版本或计划在 2025-2026 年发布 .NET 10 版本的团队,推荐使用以下模式: ABCpdf模式: [HttpPost] public IActionResult GeneratePdf([FromBody] ReportRequest request) { Doc doc = new Doc(); doc.HtmlOptions.Engine = EngineType.Chrome; doc.AddImageHtml(request.Html); byte[] pdfBytes = doc.GetData(); doc.Clear(); return File(pdfBytes, "application/pdf", "report.pdf"); } [HttpPost] public IActionResult GeneratePdf([FromBody] ReportRequest request) { Doc doc = new Doc(); doc.HtmlOptions.Engine = EngineType.Chrome; doc.AddImageHtml(request.Html); byte[] pdfBytes = doc.GetData(); doc.Clear(); return File(pdfBytes, "application/pdf", "report.pdf"); } $vbLabelText $csharpLabel IronPdf模式: [HttpPost] public IActionResult GeneratePdf([FromBody] ReportRequest request) { var renderer = new ChromePdfRenderer(); using var pdf = renderer.RenderHtmlAsPdf(request.Html); return File(pdf.BinaryData, "application/pdf", "report.pdf"); } [HttpPost] public IActionResult GeneratePdf([FromBody] ReportRequest request) { var renderer = new ChromePdfRenderer(); using var pdf = renderer.RenderHtmlAsPdf(request.Html); return File(pdf.BinaryData, "application/pdf", "report.pdf"); } $vbLabelText $csharpLabel 异步 PDF 生成 ABCpdf 不支持本地异步。IronPDF提供async方法,以提高网络应用程序的性能: using IronPdf; public async Task<byte[]> GeneratePdfAsync(string html) { var renderer = new ChromePdfRenderer(); using var pdf = await renderer.RenderHtmlAsPdfAsync(html); return pdf.BinaryData; } using IronPdf; public async Task<byte[]> GeneratePdfAsync(string html) { var renderer = new ChromePdfRenderer(); using var pdf = await renderer.RenderHtmlAsPdfAsync(html); return pdf.BinaryData; } $vbLabelText $csharpLabel 依赖注入设置 使用与未来 C# 14 版本兼容的 C# 12+ 模式在现代 .NET 应用程序中注册 IronPDF: // Program.cs (.NET 6+) builder.Services.AddSingleton<ChromePdfRenderer>(); // Or create a service wrapper public interface IPdfService { Task<byte[]> GeneratePdfAsync(string html); } public class IronPdfService : IPdfService { private readonly ChromePdfRenderer _renderer; public IronPdfService() { _renderer = new ChromePdfRenderer(); _renderer.RenderingOptions.PaperSize = PdfPaperSize.A4; } public async Task<byte[]> GeneratePdfAsync(string html) { using var pdf = await _renderer.RenderHtmlAsPdfAsync(html); return pdf.BinaryData; } } // Register: builder.Services.AddSingleton<IPdfService, IronPdfService>(); // Program.cs (.NET 6+) builder.Services.AddSingleton<ChromePdfRenderer>(); // Or create a service wrapper public interface IPdfService { Task<byte[]> GeneratePdfAsync(string html); } public class IronPdfService : IPdfService { private readonly ChromePdfRenderer _renderer; public IronPdfService() { _renderer = new ChromePdfRenderer(); _renderer.RenderingOptions.PaperSize = PdfPaperSize.A4; } public async Task<byte[]> GeneratePdfAsync(string html) { using var pdf = await _renderer.RenderHtmlAsPdfAsync(html); return pdf.BinaryData; } } // Register: builder.Services.AddSingleton<IPdfService, IronPdfService>(); $vbLabelText $csharpLabel 性能优化技巧 重复使用渲染器进行批量操作 // Good: Single renderer instance var renderer = new ChromePdfRenderer(); foreach (var html in htmlList) { using var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs($"output_{i}.pdf"); } // Bad: New renderer each time (slower startup) foreach (var html in htmlList) { var renderer = new ChromePdfRenderer(); // Overhead! using var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs($"output_{i}.pdf"); } // Good: Single renderer instance var renderer = new ChromePdfRenderer(); foreach (var html in htmlList) { using var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs($"output_{i}.pdf"); } // Bad: New renderer each time (slower startup) foreach (var html in htmlList) { var renderer = new ChromePdfRenderer(); // Overhead! using var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs($"output_{i}.pdf"); } $vbLabelText $csharpLabel 内存使用对比 情景 ABCpdf for .NET IronPDF 备注 单个 10 页 PDF ~80 MB ~50 MB IronPdf 更高效 批量翻译 100 份 PDF 高(人工清理) ~100 MB 使用 using 语句 大型 HTML(5MB 以上) 变量 ~150 MB 两者都需要对庞大的文档进行分块 常见迁移问题的故障排除 PDF 渲染空白 症状:输出 PDF 在迁移后有空页。 解决方案: JavaScript 内容在呈现前可能未完全加载: var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.WaitFor.RenderDelay(2000); // Wait 2 seconds // Or wait for specific element: renderer.RenderingOptions.WaitFor.HtmlElementById("content-loaded"); var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.WaitFor.RenderDelay(2000); // Wait 2 seconds // Or wait for specific element: renderer.RenderingOptions.WaitFor.HtmlElementById("content-loaded"); $vbLabelText $csharpLabel 页眉/页脚未显示 症状:TextHeader/TextFooter 在输出中不可见。 解决方案:确保页边距为页眉/页脚内容留出空间: var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.MarginTop = 40; // mm - leave room for header renderer.RenderingOptions.MarginBottom = 40; // mm - leave room for footer renderer.RenderingOptions.TextHeader = new TextHeaderFooter { CenterText = "Header Text", FontSize = 12 }; var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.MarginTop = 40; // mm - leave room for header renderer.RenderingOptions.MarginBottom = 40; // mm - leave room for footer renderer.RenderingOptions.TextHeader = new TextHeaderFooter { CenterText = "Header Text", FontSize = 12 }; $vbLabelText $csharpLabel 迁移清单 迁移前 使用grep -r "WebSupergoo" --include="*.cs" . 记录当前的PDF输出要求 创建包含示例 PDF 输出的测试用例以进行比较。 获取IronPDF 许可证密钥 备份代码库 迁移过程中 删除 ABCpdf NuGet 包 安装 IronPdf NuGet 包 将许可证密钥添加到应用程序启动项 更新所有using语句 将Doc实例化转换为ChromePdfRenderer 将doc.Clear()替换为using语句 根据 API 映射更新方法调用 将基于坐标的布局转换为 CSS 边距 后迁移 运行所有现有的 PDF 测试 PDF 输出结果的直观比较(ABCpdf 与 IronPDF) 在测试环境中测试所有 PDF 工作流程 性能基准比较 移除 ABCpdf 许可证配置 更新 CI/CD 流水线依赖项 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 渲染。包括替换图形基元和自动布局的代码示例。 阅读更多 如何从 fo.net 迁移到 IronPDF for .NET从 Fluid(模板化)迁移到 I...
已发布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 渲染。包括替换图形基元和自动布局的代码示例。 阅读更多