迁移指南 如何用 C# 从 Apryse PDF 迁移到 IronPDF Curtis Chau 已发布:2026年1月11日 下载 IronPDF NuGet 下载 DLL 下载 Windows 安装程序 免费试用 法学硕士副本 法学硕士副本 将页面复制为 Markdown 格式,用于 LLMs 在 ChatGPT 中打开 向 ChatGPT 咨询此页面 在双子座打开 向 Gemini 询问此页面 在 Grok 中打开 向 Grok 询问此页面 打开困惑 向 Perplexity 询问有关此页面的信息 分享 在 Facebook 上分享 分享到 X(Twitter) 在 LinkedIn 上分享 复制链接 电子邮件文章 Apryse PDF(前身为 PDFTron)是一款优质的企业级 PDF SDK,以其全面的文档处理能力而著称。 然而,其溢价定价模式(每位开发人员每年超过 1,500 美元)、复杂的集成要求和 C++ 传统为寻求直接 PDF 功能的开发团队制造了障碍。 本综合指南提供了从Apryse PDF逐步迁移到IronPDF的路径--IronPDF for .NET 是一个本地 .NET PDF 库,具有现代 C# 习惯、更简单的集成和一次性永久许可。 为什么要从Apryse PDF迁移? 虽然Apryse PDF提供了强大的功能,但仍有一些因素促使开发团队寻求替代方案来满足其 PDF 生成需求。 高级定价和订阅模式 Apryse PDF 的目标客户是企业客户,其定价可能会让中小型项目望而却步: 方面 Apryse PDF (PDFTron) IronPDF 起始价格 1,500+美元/开发人员/年(已报告) 一次性 749 美元(Lite) 许可模式 年度订购 永久许可证 查看器许可 单独额外费用 不适用(使用标准查看器) 服务器许可证 要求企业定价 包含在许可证层级中 3年总成本 每位开发人员 4 500 美元以上 一次性 749 美元 集成的复杂性 Apryse PDF 的 C++ 传统带来了复杂性,影响了开发速度: 特征 Apryse PDF IronPDF 设置 模块路径、外部二进制文件 单个 NuGet 软件包 初始化 PDFNet.Initialize() 带许可证 简单的属性分配 HTML 渲染 需要外部 html2pdf 模块 内置 Chromium 引擎 API 风格 C++ 遗产,复杂 现代 C# 惯例 依赖关系 多个 DLL,特定平台 自带软件包 何时考虑迁移 迁移到 IronPDF,如果: 您主要需要将 HTML/URL 转换为 PDF 您希望 API 更简单,模板更少 对于您的使用情况而言,高级定价并不合理 您不需要 PDFViewCtrl 浏览器控件 您更偏好一次性许可,而不是订阅 如果出现以下情况,请继续使用 Apryse PDF: 您需要他们的本地查看器控件 (PDFViewCtrl) 您广泛使用 XOD 或专有格式 您需要特定的企业功能(高级编辑等) 您的组织已经拥有企业许可证 迁移前准备 前提条件 确保您的环境符合这些要求: .NET Framework 4.6.2+ 或 .NET Core 3.1 / .NET 5-9 Visual Studio 2019+ 或带有 C# 扩展的 VS Code 访问 NuGet 包管理器 -IronPDF许可证密钥(可在ironpdf.com免费试用) 审计Apryse PDF的使用 在解决方案目录中运行这些命令以识别所有 Apryse 引用: # Find all pdftron using statements grep -r "using pdftron" --include="*.cs" . # Find PDFNet initialization grep -r "PDFNet.Initialize\|PDFNet.SetResourcesPath" --include="*.cs" . # Find PDFDoc usage grep -r "new PDFDoc\|PDFDoc\." --include="*.cs" . # Find HTML2PDF usage grep -r "HTML2PDF\|InsertFromURL\|InsertFromHtmlString" --include="*.cs" . # Find ElementReader/Writer usage grep -r "ElementReader\|ElementWriter\|ElementBuilder" --include="*.cs" . # Find all pdftron using statements grep -r "using pdftron" --include="*.cs" . # Find PDFNet initialization grep -r "PDFNet.Initialize\|PDFNet.SetResourcesPath" --include="*.cs" . # Find PDFDoc usage grep -r "new PDFDoc\|PDFDoc\." --include="*.cs" . # Find HTML2PDF usage grep -r "HTML2PDF\|InsertFromURL\|InsertFromHtmlString" --include="*.cs" . # Find ElementReader/Writer usage grep -r "ElementReader\|ElementWriter\|ElementBuilder" --include="*.cs" . SHELL 值得期待的重大变化 Apryse PDF 样式 更改要求 PDFNet.Initialize() 替换为 IronPdf.License.LicenseKey HTML2PDF</code>模块|内置ChromePdfRenderer` 元素读取器/元素写入器` IronPdf 内部处理内容 SDFDoc.SaveOptions 简单的 SaveAs() 方法 PDFViewCtrl 使用外部 PDF 查看器 XOD 格式 转换为 PDF 或图像 模块路径配置 不需要 逐步迁移过程 步骤 1:更新 NuGet 软件包 删除 Apryse/PDFTron 软件包并安装 IronPdf: # Remove Apryse/PDFTron packages dotnet remove package PDFTron.NET.x64 dotnet remove package PDFTron.NET.x86 dotnet remove package pdftron # Install IronPDF dotnet add package IronPdf # Remove Apryse/PDFTron packages dotnet remove package PDFTron.NET.x64 dotnet remove package PDFTron.NET.x86 dotnet remove package pdftron # Install IronPDF dotnet add package IronPdf SHELL 或通过软件包管理器控制台: Uninstall-Package PDFTron.NET.x64 Install-Package IronPdf 步骤 2:更新命名空间引用 用IronPDF替换 Apryse 命名空间: // Remove these using pdftron; using pdftron.PDF; using pdftron.PDF.Convert; using pdftron.SDF; using pdftron.Filters; // Add these using IronPdf; using IronPdf.Rendering; // Remove these using pdftron; using pdftron.PDF; using pdftron.PDF.Convert; using pdftron.SDF; using pdftron.Filters; // Add these using IronPdf; using IronPdf.Rendering; $vbLabelText $csharpLabel 步骤 3:删除初始化模板 Apryse PDF 需要复杂的初始化。 IronPdf 完全解决了这一问题。 Apryse PDF 实现: // Complex initialization PDFNet.Initialize("YOUR_LICENSE_KEY"); PDFNet.SetResourcesPath("path/to/resources"); // Plus module path for HTML2PDF... // Complex initialization PDFNet.Initialize("YOUR_LICENSE_KEY"); PDFNet.SetResourcesPath("path/to/resources"); // Plus module path for HTML2PDF... $vbLabelText $csharpLabel IronPDF 实现: // Simple license assignment (optional for development) IronPdf.License.LicenseKey = "YOUR_LICENSE_KEY"; // Simple license assignment (optional for development) IronPdf.License.LicenseKey = "YOUR_LICENSE_KEY"; $vbLabelText $csharpLabel 使用IronPDF时无需调用 PDFNet.Terminate() - 资源会自动管理。 完整的 API 迁移参考 核心类映射 Apryse PDF 类 IronPdf 同等产品 备注 PDFDoc PDF 文档 主要文件类型 HTML2PDF ChromePdfRenderer HTML 转换为 PDF 文本提取器 PdfDocument.ExtractAllText() 文本提取 Stamper PdfDocument.ApplyWatermark() 水印和印章 PDFDraw PdfDocument.ToBitmap() 光栅化 安全处理程序 PdfDocument.SecuritySettings 加密/密码 PDFNet IronPdf.License 许可和配置 文档操作 Apryse PDF 方法 IronPdf 方法 备注 new PDFDoc() new PdfDocument() 空文档 new PDFDoc(path) PdfDocument.FromFile(路径) 从文件加载 new PDFDoc(buffer) PdfDocument.FromBinaryData(字节) 从字节加载 doc.Save(路径, 选项) pdf.SaveAs(路径) 保存到文件 doc.Save(缓冲区) pdf.BinaryData 以字节形式获取 doc.Close() pdf.Dispose() 清理(或使用 `using</code) doc.GetPageCount()|pdf.PageCount` 页数 doc.AppendPages(doc2, start, end) PdfDocument.Merge(pdfs) 合并文档 HTML 到 PDF 转换 Apryse PDF 方法 IronPdf 方法 备注 HTML2PDF.Convert(doc) renderer.RenderHtmlAsPdf(html) 返回 PdfDocument converter.InsertFromURL(url) renderer.RenderUrlAsPdf(url) URL 转换。 converter.InsertFromHtmlString(html) renderer.RenderHtmlAsPdf(html) HTML 字符串 converter.SetModulePath(路径) 不需要 内置引擎 converter.SetPaperSize(宽度, 高度) RenderingOptions.PaperSize 纸张大小 converter.SetLandscape(true) RenderingOptions.PaperOrientation 定位 代码迁移示例 HTML字符串到PDF 最常见的操作展示了模板代码的大幅减少。 Apryse PDF 实现: using pdftron; using pdftron.PDF; class Program { static void Main() { PDFNet.Initialize("YOUR_LICENSE_KEY"); PDFNet.SetResourcesPath("path/to/resources"); string html = "<html><body><h1>Hello World</h1><p>Content here</p></body></html>"; using (PDFDoc doc = new PDFDoc()) { HTML2PDF converter = new HTML2PDF(); converter.SetModulePath("path/to/html2pdf"); converter.InsertFromHtmlString(html); HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings(); settings.SetPrintBackground(true); settings.SetLoadImages(true); if (converter.Convert(doc)) { doc.Save("output.pdf", SDFDoc.SaveOptions.e_linearized); Console.WriteLine("PDF created successfully"); } else { Console.WriteLine($"Conversion failed: {converter.GetLog()}"); } } PDFNet.Terminate(); } } using pdftron; using pdftron.PDF; class Program { static void Main() { PDFNet.Initialize("YOUR_LICENSE_KEY"); PDFNet.SetResourcesPath("path/to/resources"); string html = "<html><body><h1>Hello World</h1><p>Content here</p></body></html>"; using (PDFDoc doc = new PDFDoc()) { HTML2PDF converter = new HTML2PDF(); converter.SetModulePath("path/to/html2pdf"); converter.InsertFromHtmlString(html); HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings(); settings.SetPrintBackground(true); settings.SetLoadImages(true); if (converter.Convert(doc)) { doc.Save("output.pdf", SDFDoc.SaveOptions.e_linearized); Console.WriteLine("PDF created successfully"); } else { Console.WriteLine($"Conversion failed: {converter.GetLog()}"); } } PDFNet.Terminate(); } } $vbLabelText $csharpLabel IronPDF 实现: // NuGet: Install-Package IronPdf using IronPdf; class Program { static void Main() { var renderer = new ChromePdfRenderer(); string html = "<html><body><h1>Hello World</h1></body></html>"; var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs("output.pdf"); } } // NuGet: Install-Package IronPdf using IronPdf; class Program { static void Main() { var renderer = new ChromePdfRenderer(); string html = "<html><body><h1>Hello World</h1></body></html>"; var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs("output.pdf"); } } $vbLabelText $csharpLabel IronPdf 消除了初始化、模块路径和清理代码,将 35 行以上的代码减少到 5 行。 URL到PDF转换 Apryse PDF 实现: using pdftron; using pdftron.PDF; PDFNet.Initialize("YOUR_LICENSE_KEY"); using (PDFDoc doc = new PDFDoc()) { HTML2PDF converter = new HTML2PDF(); converter.SetModulePath("path/to/html2pdf"); HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings(); settings.SetLoadImages(true); settings.SetAllowJavaScript(true); settings.SetPrintBackground(true); converter.InsertFromURL("https://example.com", settings); if (converter.Convert(doc)) { doc.Save("webpage.pdf", SDFDoc.SaveOptions.e_linearized); } } PDFNet.Terminate(); using pdftron; using pdftron.PDF; PDFNet.Initialize("YOUR_LICENSE_KEY"); using (PDFDoc doc = new PDFDoc()) { HTML2PDF converter = new HTML2PDF(); converter.SetModulePath("path/to/html2pdf"); HTML2PDF.WebPageSettings settings = new HTML2PDF.WebPageSettings(); settings.SetLoadImages(true); settings.SetAllowJavaScript(true); settings.SetPrintBackground(true); converter.InsertFromURL("https://example.com", settings); if (converter.Convert(doc)) { doc.Save("webpage.pdf", SDFDoc.SaveOptions.e_linearized); } } PDFNet.Terminate(); $vbLabelText $csharpLabel IronPDF 实现: // NuGet: Install-Package IronPdf using IronPdf; class Program { static void Main() { var renderer = new ChromePdfRenderer(); string url = "https://www.example.com"; var pdf = renderer.RenderUrlAsPdf(url); pdf.SaveAs("webpage.pdf"); } } // NuGet: Install-Package IronPdf using IronPdf; class Program { static void Main() { var renderer = new ChromePdfRenderer(); string url = "https://www.example.com"; var pdf = renderer.RenderUrlAsPdf(url); pdf.SaveAs("webpage.pdf"); } } $vbLabelText $csharpLabel 合并多个 PDF 文件 Apryse PDF 实现: using pdftron; using pdftron.PDF; PDFNet.Initialize("YOUR_LICENSE_KEY"); using (PDFDoc mainDoc = new PDFDoc()) { string[] files = { "doc1.pdf", "doc2.pdf", "doc3.pdf" }; foreach (string file in files) { using (PDFDoc doc = new PDFDoc(file)) { mainDoc.AppendPages(doc, 1, doc.GetPageCount()); } } mainDoc.Save("merged.pdf", SDFDoc.SaveOptions.e_linearized); } PDFNet.Terminate(); using pdftron; using pdftron.PDF; PDFNet.Initialize("YOUR_LICENSE_KEY"); using (PDFDoc mainDoc = new PDFDoc()) { string[] files = { "doc1.pdf", "doc2.pdf", "doc3.pdf" }; foreach (string file in files) { using (PDFDoc doc = new PDFDoc(file)) { mainDoc.AppendPages(doc, 1, doc.GetPageCount()); } } mainDoc.Save("merged.pdf", SDFDoc.SaveOptions.e_linearized); } PDFNet.Terminate(); $vbLabelText $csharpLabel IronPDF 实现: // NuGet: Install-Package IronPdf using IronPdf; using System.Collections.Generic; class Program { static void Main() { var pdf1 = PdfDocument.FromFile("document1.pdf"); var pdf2 = PdfDocument.FromFile("document2.pdf"); var merged = PdfDocument.Merge(new List<PdfDocument> { pdf1, pdf2 }); merged.SaveAs("merged.pdf"); } } // NuGet: Install-Package IronPdf using IronPdf; using System.Collections.Generic; class Program { static void Main() { var pdf1 = PdfDocument.FromFile("document1.pdf"); var pdf2 = PdfDocument.FromFile("document2.pdf"); var merged = PdfDocument.Merge(new List<PdfDocument> { pdf1, pdf2 }); merged.SaveAs("merged.pdf"); } } $vbLabelText $csharpLabel IronPdf 的静态 Merge 方法可直接接受多个文档,消除了页面迭代模式。 文本提取 Apryse PDF 实现: using pdftron; using pdftron.PDF; PDFNet.Initialize("YOUR_LICENSE_KEY"); using (PDFDoc doc = new PDFDoc("document.pdf")) { TextExtractor extractor = new TextExtractor(); for (int i = 1; i <= doc.GetPageCount(); i++) { Page page = doc.GetPage(i); extractor.Begin(page); string pageText = extractor.GetAsText(); Console.WriteLine($"Page {i}:"); Console.WriteLine(pageText); } } PDFNet.Terminate(); using pdftron; using pdftron.PDF; PDFNet.Initialize("YOUR_LICENSE_KEY"); using (PDFDoc doc = new PDFDoc("document.pdf")) { TextExtractor extractor = new TextExtractor(); for (int i = 1; i <= doc.GetPageCount(); i++) { Page page = doc.GetPage(i); extractor.Begin(page); string pageText = extractor.GetAsText(); Console.WriteLine($"Page {i}:"); Console.WriteLine(pageText); } } PDFNet.Terminate(); $vbLabelText $csharpLabel IronPDF 实现: using IronPdf; var pdf = PdfDocument.FromFile("document.pdf"); // Extract all text at once string allText = pdf.ExtractAllText(); Console.WriteLine(allText); // Extract from specific page string page1Text = pdf.ExtractTextFromPage(0); // 0-indexed Console.WriteLine($"Page 1: {page1Text}"); using IronPdf; var pdf = PdfDocument.FromFile("document.pdf"); // Extract all text at once string allText = pdf.ExtractAllText(); Console.WriteLine(allText); // Extract from specific page string page1Text = pdf.ExtractTextFromPage(0); // 0-indexed Console.WriteLine($"Page 1: {page1Text}"); $vbLabelText $csharpLabel 添加水印 Apryse PDF 实现: using pdftron; using pdftron.PDF; PDFNet.Initialize("YOUR_LICENSE_KEY"); using (PDFDoc doc = new PDFDoc("document.pdf")) { Stamper stamper = new Stamper(Stamper.SizeType.e_relative_scale, 0.5, 0.5); stamper.SetAlignment(Stamper.HorizontalAlignment.e_horizontal_center, Stamper.VerticalAlignment.e_vertical_center); stamper.SetOpacity(0.3); stamper.SetRotation(45); stamper.SetFontColor(new ColorPt(1, 0, 0)); stamper.SetTextAlignment(Stamper.TextAlignment.e_align_center); stamper.StampText(doc, "CONFIDENTIAL", new PageSet(1, doc.GetPageCount())); doc.Save("watermarked.pdf", SDFDoc.SaveOptions.e_linearized); } PDFNet.Terminate(); using pdftron; using pdftron.PDF; PDFNet.Initialize("YOUR_LICENSE_KEY"); using (PDFDoc doc = new PDFDoc("document.pdf")) { Stamper stamper = new Stamper(Stamper.SizeType.e_relative_scale, 0.5, 0.5); stamper.SetAlignment(Stamper.HorizontalAlignment.e_horizontal_center, Stamper.VerticalAlignment.e_vertical_center); stamper.SetOpacity(0.3); stamper.SetRotation(45); stamper.SetFontColor(new ColorPt(1, 0, 0)); stamper.SetTextAlignment(Stamper.TextAlignment.e_align_center); stamper.StampText(doc, "CONFIDENTIAL", new PageSet(1, doc.GetPageCount())); doc.Save("watermarked.pdf", SDFDoc.SaveOptions.e_linearized); } PDFNet.Terminate(); $vbLabelText $csharpLabel IronPDF 实现: using IronPdf; using IronPdf.Editing; var pdf = PdfDocument.FromFile("document.pdf"); // HTML-based watermark with full styling control string watermarkHtml = @" <div style=' color: red; opacity: 0.3; font-size: 72px; font-weight: bold; text-align: center; '>CONFIDENTIAL</div>"; pdf.ApplyWatermark(watermarkHtml, rotation: 45, verticalAlignment: VerticalAlignment.Middle, horizontalAlignment: HorizontalAlignment.Center); pdf.SaveAs("watermarked.pdf"); using IronPdf; using IronPdf.Editing; var pdf = PdfDocument.FromFile("document.pdf"); // HTML-based watermark with full styling control string watermarkHtml = @" <div style=' color: red; opacity: 0.3; font-size: 72px; font-weight: bold; text-align: center; '>CONFIDENTIAL</div>"; pdf.ApplyWatermark(watermarkHtml, rotation: 45, verticalAlignment: VerticalAlignment.Middle, horizontalAlignment: HorizontalAlignment.Center); pdf.SaveAs("watermarked.pdf"); $vbLabelText $csharpLabel IronPDF 使用基于 HTML/CSS 的水印技术,通过熟悉的 Web 技术提供完整的样式控制。 密码保护 Apryse PDF 实现: using pdftron; using pdftron.PDF; using pdftron.SDF; PDFNet.Initialize("YOUR_LICENSE_KEY"); using (PDFDoc doc = new PDFDoc("document.pdf")) { SecurityHandler handler = new SecurityHandler(); handler.ChangeUserPassword("user123"); handler.ChangeMasterPassword("owner456"); handler.SetPermission(SecurityHandler.Permission.e_print, false); handler.SetPermission(SecurityHandler.Permission.e_extract_content, false); doc.SetSecurityHandler(handler); doc.Save("protected.pdf", SDFDoc.SaveOptions.e_linearized); } PDFNet.Terminate(); using pdftron; using pdftron.PDF; using pdftron.SDF; PDFNet.Initialize("YOUR_LICENSE_KEY"); using (PDFDoc doc = new PDFDoc("document.pdf")) { SecurityHandler handler = new SecurityHandler(); handler.ChangeUserPassword("user123"); handler.ChangeMasterPassword("owner456"); handler.SetPermission(SecurityHandler.Permission.e_print, false); handler.SetPermission(SecurityHandler.Permission.e_extract_content, false); doc.SetSecurityHandler(handler); doc.Save("protected.pdf", SDFDoc.SaveOptions.e_linearized); } PDFNet.Terminate(); $vbLabelText $csharpLabel IronPDF 实现: using IronPdf; var pdf = PdfDocument.FromFile("document.pdf"); // Set passwords pdf.SecuritySettings.UserPassword = "user123"; pdf.SecuritySettings.OwnerPassword = "owner456"; // Set permissions pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint; pdf.SecuritySettings.AllowUserCopyPasteContent = false; pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit; pdf.SaveAs("protected.pdf"); using IronPdf; var pdf = PdfDocument.FromFile("document.pdf"); // Set passwords pdf.SecuritySettings.UserPassword = "user123"; pdf.SecuritySettings.OwnerPassword = "owner456"; // Set permissions pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.NoPrint; pdf.SecuritySettings.AllowUserCopyPasteContent = false; pdf.SecuritySettings.AllowUserEdits = PdfEditSecurity.NoEdit; pdf.SaveAs("protected.pdf"); $vbLabelText $csharpLabel 页眉和页脚 IronPDF 实现: using IronPdf; var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter { HtmlFragment = "<div style='text-align:center; font-size:12px;'>Company Header</div>", DrawDividerLine = true, MaxHeight = 30 }; renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter { HtmlFragment = "<div style='text-align:center; font-size:10px;'>Page {page} of {total-pages}</div>", DrawDividerLine = true, MaxHeight = 25 }; var pdf = renderer.RenderHtmlAsPdf("<h1>Content</h1>"); pdf.SaveAs("with_headers.pdf"); using IronPdf; var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter { HtmlFragment = "<div style='text-align:center; font-size:12px;'>Company Header</div>", DrawDividerLine = true, MaxHeight = 30 }; renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter { HtmlFragment = "<div style='text-align:center; font-size:10px;'>Page {page} of {total-pages}</div>", DrawDividerLine = true, MaxHeight = 25 }; var pdf = renderer.RenderHtmlAsPdf("<h1>Content</h1>"); pdf.SaveAs("with_headers.pdf"); $vbLabelText $csharpLabel IronPdf 支持占位符标记,如用于动态页码的 {page} 和 {total-pages} 。 有关更多选项,请参阅页眉和页脚文档。 ASP.NET Core 集成 Apryse PDF 的初始化要求使网络应用程序集成变得复杂。 IronPdf 简化了这种模式。 IronPdf模式: [ApiController] [Route("[controller]")] public class PdfController : ControllerBase { [HttpGet("generate")] public IActionResult GeneratePdf() { var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1>"); return File(pdf.BinaryData, "application/pdf", "report.pdf"); } [HttpGet("generate-async")] public async Task<IActionResult> GeneratePdfAsync() { var renderer = new ChromePdfRenderer(); var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Report</h1>"); return File(pdf.Stream, "application/pdf", "report.pdf"); } } [ApiController] [Route("[controller]")] public class PdfController : ControllerBase { [HttpGet("generate")] public IActionResult GeneratePdf() { var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf("<h1>Report</h1>"); return File(pdf.BinaryData, "application/pdf", "report.pdf"); } [HttpGet("generate-async")] public async Task<IActionResult> GeneratePdfAsync() { var renderer = new ChromePdfRenderer(); var pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Report</h1>"); return File(pdf.Stream, "application/pdf", "report.pdf"); } } $vbLabelText $csharpLabel 依赖注入配置 // Program.cs public void ConfigureServices(IServiceCollection services) { // Set license once IronPdf.License.LicenseKey = Configuration["IronPdf:LicenseKey"]; // Register renderer as scoped service services.AddScoped<ChromePdfRenderer>(); // Or create a wrapper service services.AddScoped<IPdfService, IronPdfService>(); } // IronPdfService.cs public class IronPdfService : IPdfService { private readonly ChromePdfRenderer _renderer; public IronPdfService() { _renderer = new ChromePdfRenderer(); _renderer.RenderingOptions.PaperSize = PdfPaperSize.A4; _renderer.RenderingOptions.PrintHtmlBackgrounds = true; } public PdfDocument GenerateFromHtml(string html) => _renderer.RenderHtmlAsPdf(html); public Task<PdfDocument> GenerateFromHtmlAsync(string html) => _renderer.RenderHtmlAsPdfAsync(html); } // Program.cs public void ConfigureServices(IServiceCollection services) { // Set license once IronPdf.License.LicenseKey = Configuration["IronPdf:LicenseKey"]; // Register renderer as scoped service services.AddScoped<ChromePdfRenderer>(); // Or create a wrapper service services.AddScoped<IPdfService, IronPdfService>(); } // IronPdfService.cs public class IronPdfService : IPdfService { private readonly ChromePdfRenderer _renderer; public IronPdfService() { _renderer = new ChromePdfRenderer(); _renderer.RenderingOptions.PaperSize = PdfPaperSize.A4; _renderer.RenderingOptions.PrintHtmlBackgrounds = true; } public PdfDocument GenerateFromHtml(string html) => _renderer.RenderHtmlAsPdf(html); public Task<PdfDocument> GenerateFromHtmlAsync(string html) => _renderer.RenderHtmlAsPdfAsync(html); } $vbLabelText $csharpLabel 性能比较 指标 Apryse PDF IronPDF 冷启动 快速(本地代码) ~2s (Chromium init) 后续渲染 快速 快速 复杂的 HTML 变量(html2pdf 模块) 优秀(Chromium) CSS 支持。 有限的 完整的 CSS3 JavaScript语言 有限的 全面支持 性能优化技巧 // 1. Reuse renderer instance private static readonly ChromePdfRenderer SharedRenderer = new ChromePdfRenderer(); // 2. Disable unnecessary features for speed var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.EnableJavaScript = false; // If not needed renderer.RenderingOptions.WaitFor.RenderDelay(0); // No delay renderer.RenderingOptions.Timeout = 30000; // 30s max // 3. Proper disposal using (var pdf = renderer.RenderHtmlAsPdf(html)) { pdf.SaveAs("output.pdf"); } // 1. Reuse renderer instance private static readonly ChromePdfRenderer SharedRenderer = new ChromePdfRenderer(); // 2. Disable unnecessary features for speed var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.EnableJavaScript = false; // If not needed renderer.RenderingOptions.WaitFor.RenderDelay(0); // No delay renderer.RenderingOptions.Timeout = 30000; // 30s max // 3. Proper disposal using (var pdf = renderer.RenderHtmlAsPdf(html)) { pdf.SaveAs("output.pdf"); } $vbLabelText $csharpLabel 常见迁移问题的故障排除 问题:模块路径错误 移除所有模块路径配置-IronPDF 的 Chromium 引擎是内置的: // Remove this converter.SetModulePath("path/to/html2pdf"); // Just use the renderer var renderer = new ChromePdfRenderer(); // Remove this converter.SetModulePath("path/to/html2pdf"); // Just use the renderer var renderer = new ChromePdfRenderer(); $vbLabelText $csharpLabel 问题:PDFNet.Initialize() 未找到 替换为 IronPdf 许可证设置: // Remove this PDFNet.Initialize("KEY"); PDFNet.SetResourcesPath("path"); // Use this (optional for development) IronPdf.License.LicenseKey = "YOUR-KEY"; // Remove this PDFNet.Initialize("KEY"); PDFNet.SetResourcesPath("path"); // Use this (optional for development) IronPdf.License.LicenseKey = "YOUR-KEY"; $vbLabelText $csharpLabel 问题:PDFViewCtrl 替换 IronPdf 不包含查看器控件。 选项: 使用 PDF.js 制作网络浏览器 使用系统 PDF 查看器 考虑使用第三方查看器组件 迁移后核对表 完成代码迁移后,请验证以下内容: 验证 PDF 输出质量是否符合预期 测试所有极端情况(大型文档、复杂的 CSS) 比较性能指标 如果需要,更新 Docker 配置 移除 Apryse 许可证及相关配置 记录所有IronPDF特有的配置 培训团队掌握新的 API 模式 如有需要,更新 CI/CD 流水线 未来保护您的 PDF 基础架构 .NET10即将推出,C# 14也将引入新的语言特性,因此选择具有现代约定的本地.NET PDF 库可以确保与不断发展的运行时功能兼容。IronPDFfor .NET 承诺支持最新的 .NET 版本,这意味着您的迁移投资将在项目扩展到 2025 年和 2026 年时获得回报--无需每年续订。 其他资源 IronPDF文档 HTML转PDF教程 API 参考 NuGet软件包 许可选项 从Apryse PDF迁移到IronPDF可将您的 PDF 代码库从复杂的 C++ 模式转换为惯用的 C#。 消除初始化模板、模块路径配置和基于订阅的许可可立即提高生产率,同时降低长期成本。 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# 从 Aspose.PDF 迁移到 IronPDF如何用 C# 从 Api2pdf 迁移到 ...
已发布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 渲染。包括替换图形基元和自动布局的代码示例。 阅读更多