迁移指南 如何用 C# 从 QuestPDF 迁移到 IronPDF Curtis Chau 已发布:2026年2月1日 下载 IronPDF NuGet 下载 DLL 下载 Windows 安装程序 免费试用 法学硕士副本 法学硕士副本 将页面复制为 Markdown 格式,用于 LLMs 在 ChatGPT 中打开 向 ChatGPT 咨询此页面 在双子座打开 向 Gemini 询问此页面 在 Grok 中打开 向 Grok 询问此页面 打开困惑 向 Perplexity 询问有关此页面的信息 分享 在 Facebook 上分享 分享到 X(Twitter) 在 LinkedIn 上分享 复制链接 电子邮件文章 从QuestPDF迁移到IronPDF可将您的 PDF 生成工作流程从专有的 C# 流畅 API 转变为基于 HTML/CSS 的标准方法,并具有全面的 PDF 操作能力。 本指南提供了一个完整的、循序渐进的迁移路径,使您能够利用现有的网络技能,重复使用 HTML 模板,并获得QuestPDF无法提供的功能。 为什么要从QuestPDF迁移到 IronPDF. 了解 QuestPDF QuestPDF 是一个现代、流畅的 API,专门用于用 C# 编程生成 PDF。QuestPDF与某些提供全面 HTML 到 PDF 转换功能的同行不同,仅限于编程布局 API 功能。 在开发人员需要使用 C# 代码从头开始生成文档,而不依赖 HTML 的场景中,QuestPDF 表现出色。 收入低于 100 万美元的企业可以免费使用该库,但需要证明这一收入水平,这对某些企业来说可能是一个合规负担。 超过这一门槛的用户需要购买许可证,在将QuestPDF作为潜在解决方案进行评估时,必须将这一因素考虑到长期规划中。 核心问题:不支持 HTML. QuestPDF 通常被推荐用于 HTML 到 PDF 的转换,但它完全不支持 HTML。 尽管QuestPDF在开发人员论坛上大肆宣传,但它使用自己专有的布局语言,需要学习全新的 DSL,而不是利用现有的网络技能。 特征 QuestPDF IronPDF HTML-to-PDF 不支持 全面支持 CSS样式 不支持 完整的 CSS3 现有模板 必须从头开始 重复使用 HTML/CSS 资产 设计工具兼容性 无 任何网页设计工具 学习曲线 新的专有 DSL 网络技能转移 布局预览 需要 IDE 插件 在任何浏览器中预览 PDF 操作 无 合并、拆分、编辑 IronPDF 提供了QuestPDF完全缺乏的原生 HTML 到 PDF 渲染功能,无需在 C# 代码中手动重构文档。 它包括QuestPDF无法执行的全面 PDF 操作功能(合并、分割、编辑、安全)。 QuestPDF许可模式 QuestPDF 的 "社区许可 "只有在贵公司年总收入低于 100 万美元时才免费。 如果您的客户(不仅仅是作为开发人员的您)的收入超过阈值,他们可能需要购买许可证。 与简单的按开发者付费的商业许可不同,QuestPDF 的模式要求收入披露和合规跟踪。 IronPdf 提供简单的许可方式:每个开发人员一个许可,没有收入审计,没有客户许可要求,而且成本清晰、可预测。 对于计划在 2025 年和 2026 年之前采用 .NET 10 和 C# 14 的团队,IronPDF 提供透明的 License,无需基于收入的审计,并采用标准的 HTML/CSS 方法,充分利用现有的网络开发技能。 开始之前 前提条件 .NET 环境: .NET Framework 4.6.2+ 或 .NET Core 3.1+ / .NET 5/6/7/8/9+ NuGet 访问权限:能够安装 NuGet 包 IronPDF 许可证:请从ironpdf.com获取您的许可证密钥。 NuGet 软件包变更 # Remove QuestPDF dotnet remove package QuestPDF # Add IronPDF dotnet add package IronPdf # Remove QuestPDF dotnet remove package QuestPDF # Add IronPDF dotnet add package IronPdf SHELL 许可配置 // Add at application startup IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"; // Add at application startup IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"; $vbLabelText $csharpLabel 查找QuestPDF使用情况 # Find allQuestPDFusages in your codebase grep -r "QuestPDF\|Document.Create\|\.GeneratePdf" --include="*.cs" . # Find allQuestPDFusages in your codebase grep -r "QuestPDF\|Document.Create\|\.GeneratePdf" --include="*.cs" . SHELL 完整的 API 参考 命名空间变更 // Before: QuestPDF using QuestPDF.Fluent; using QuestPDF.Helpers; using QuestPDF.Infrastructure; // After: IronPDF using IronPdf; // Before: QuestPDF using QuestPDF.Fluent; using QuestPDF.Helpers; using QuestPDF.Infrastructure; // After: IronPDF using IronPdf; $vbLabelText $csharpLabel 核心 API 映射 QuestPDF 概念 IronPdf 同等产品 备注 Document.Create() new ChromePdfRenderer() 创建渲染器 .Page() RenderHtmlAsPdf() 将 HTML 渲染成 PDF .Text() HTML <p>, <h1>, <span> 标准 HTML 标记 .Bold() CSS font-weight: bold 标准 CSS .FontSize(24) CSS font-size: 24px 标准 CSS .Image() HTML <img src="..."> 标准 HTML .Table() HTML <table> 标准 HTML .Column() CSS display: flex; flex-direction: column CSS Flexbox .Row() CSS display: flex; flex-direction: row CSS Flexbox 页面大小.A4 RenderingOptions.PaperSize 纸张尺寸 .Margin() RenderingOptions.Margin* 页边距 .GeneratePdf() pdf.SaveAs() 文件输出 不适用 PdfDocument.Merge() 合并 PDF 不适用 PdfDocument.FromFile() 加载现有 PDF 不适用 pdf.SecuritySettings PDF 加密 代码迁移示例 示例 1:基本文档创建(HTML 转 PDF) 之前 (QuestPDF): // NuGet: Install-Package QuestPDF using QuestPDF.Fluent; using QuestPDF.Helpers; using QuestPDF.Infrastructure; class Program { static void Main() { QuestPDF.Settings.License = LicenseType.Community; Document.Create(container => { container.Page(page => { page.Size(PageSizes.A4); page.Margin(2, Unit.Centimetre); page.Content().Column(column => { column.Item().Text("Hello World").FontSize(20).Bold(); column.Item().Text("This is a paragraph of text."); }); }); }).GeneratePdf("output.pdf"); } } // NuGet: Install-Package QuestPDF using QuestPDF.Fluent; using QuestPDF.Helpers; using QuestPDF.Infrastructure; class Program { static void Main() { QuestPDF.Settings.License = LicenseType.Community; Document.Create(container => { container.Page(page => { page.Size(PageSizes.A4); page.Margin(2, Unit.Centimetre); page.Content().Column(column => { column.Item().Text("Hello World").FontSize(20).Bold(); column.Item().Text("This is a paragraph of text."); }); }); }).GeneratePdf("output.pdf"); } } $vbLabelText $csharpLabel After (IronPDF): // NuGet: Install-Package IronPdf using IronPdf; class Program { static void Main() { var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a paragraph of text.</p>"); pdf.SaveAs("output.pdf"); } } // NuGet: Install-Package IronPdf using IronPdf; class Program { static void Main() { var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1><p>This is a paragraph of text.</p>"); pdf.SaveAs("output.pdf"); } } $vbLabelText $csharpLabel 这个例子展示了基本范式的差异。QuestPDF需要学习其流畅的 API:Document.Create()、container.Page()、page.Content().Column()、column.Item().Text(),并通过方法链(如 .FontSize(20).Bold() )进行样式设计。 您还必须使用 QuestPDF.Settings.License = LicenseType.Community 设置许可证类型。 IronPdf 使用任何网络开发人员都知道的标准 HTML:<h1> 表示标题,<p> 表示段落。无需学习专有的 DSL。IronPDF的方法提供了更简洁的语法和与现代 .NET 应用程序更好的集成。 请参阅 HTML 转 PDF 文档,了解全面的示例。 示例 2:发票生成 之前 (QuestPDF): // NuGet: Install-Package QuestPDF using QuestPDF.Fluent; using QuestPDF.Helpers; using QuestPDF.Infrastructure; class Program { static void Main() { QuestPDF.Settings.License = LicenseType.Community; Document.Create(container => { container.Page(page => { page.Size(PageSizes.A4); page.Margin(2, Unit.Centimetre); page.Content().Column(column => { column.Item().Text("INVOICE").FontSize(24).Bold(); column.Item().Text("Invoice #: 12345").FontSize(12); column.Item().PaddingTop(20); column.Item().Text("Customer: John Doe"); column.Item().Text("Total: $100.00").Bold(); }); }); }).GeneratePdf("invoice.pdf"); } } // NuGet: Install-Package QuestPDF using QuestPDF.Fluent; using QuestPDF.Helpers; using QuestPDF.Infrastructure; class Program { static void Main() { QuestPDF.Settings.License = LicenseType.Community; Document.Create(container => { container.Page(page => { page.Size(PageSizes.A4); page.Margin(2, Unit.Centimetre); page.Content().Column(column => { column.Item().Text("INVOICE").FontSize(24).Bold(); column.Item().Text("Invoice #: 12345").FontSize(12); column.Item().PaddingTop(20); column.Item().Text("Customer: John Doe"); column.Item().Text("Total: $100.00").Bold(); }); }); }).GeneratePdf("invoice.pdf"); } } $vbLabelText $csharpLabel After (IronPDF): // NuGet: Install-Package IronPdf using IronPdf; class Program { static void Main() { var htmlContent = @" <h1>INVOICE</h1> <p>Invoice #: 12345</p> <br/> <p>Customer: John Doe</p> <p><strong>Total: $100.00</strong></p> "; var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf(htmlContent); pdf.SaveAs("invoice.pdf"); } } // NuGet: Install-Package IronPdf using IronPdf; class Program { static void Main() { var htmlContent = @" <h1>INVOICE</h1> <p>Invoice #: 12345</p> <br/> <p>Customer: John Doe</p> <p><strong>Total: $100.00</strong></p> "; var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf(htmlContent); pdf.SaveAs("invoice.pdf"); } } $vbLabelText $csharpLabel QuestPDF 使用.Column()和 .Item() 进行布局,并使用.PaddingTop(20)进行间距。 IronPdf 使用标准 HTML:<h1> 表示标题,<p> 表示段落,<br/> 表示间距,<strong> 表示加粗文本。 真正的优势:使用 IronPDF,设计人员可以独立创建和修改 HTML 模板。 使用 QuestPDF,每次设计变更都需要 C# 开发人员修改代码。 在我们的教程中了解更多信息。 示例 3:带页码的页眉和页脚 之前 (QuestPDF): // NuGet: Install-Package QuestPDF using QuestPDF.Fluent; using QuestPDF.Helpers; using QuestPDF.Infrastructure; class Program { static void Main() { QuestPDF.Settings.License = LicenseType.Community; Document.Create(container => { container.Page(page => { page.Size(PageSizes.A4); page.Margin(2, Unit.Centimetre); page.Header().Text("Document Header").FontSize(14).Bold(); page.Content().Text("Main content of the document."); page.Footer().AlignCenter().Text(text => { text.Span("Page "); text.CurrentPageNumber(); }); }); }).GeneratePdf("document.pdf"); } } // NuGet: Install-Package QuestPDF using QuestPDF.Fluent; using QuestPDF.Helpers; using QuestPDF.Infrastructure; class Program { static void Main() { QuestPDF.Settings.License = LicenseType.Community; Document.Create(container => { container.Page(page => { page.Size(PageSizes.A4); page.Margin(2, Unit.Centimetre); page.Header().Text("Document Header").FontSize(14).Bold(); page.Content().Text("Main content of the document."); page.Footer().AlignCenter().Text(text => { text.Span("Page "); text.CurrentPageNumber(); }); }); }).GeneratePdf("document.pdf"); } } $vbLabelText $csharpLabel After (IronPDF): // NuGet: Install-Package IronPdf using IronPdf; class Program { static void Main() { var htmlContent = "<p>Main content of the document.</p>"; var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf(htmlContent); pdf.Header = new TextHeaderFooter() { CenterText = "Document Header", FontSize = 14 }; pdf.Footer = new TextHeaderFooter() { CenterText = "Page {page}" }; pdf.SaveAs("document.pdf"); } } // NuGet: Install-Package IronPdf using IronPdf; class Program { static void Main() { var htmlContent = "<p>Main content of the document.</p>"; var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf(htmlContent); pdf.Header = new TextHeaderFooter() { CenterText = "Document Header", FontSize = 14 }; pdf.Footer = new TextHeaderFooter() { CenterText = "Page {page}" }; pdf.SaveAs("document.pdf"); } } $vbLabelText $csharpLabel QuestPDF 使用 page.Header() 和 page.Footer() 以及.AlignCenter()和 .CurrentPageNumber() 等流畅的方法。 IronPdf 使用具有 CenterText 和 FontSize 等属性的 TextHeaderFooter 对象。 {page} 占位符会自动插入当前页码。 关键迁移说明 范式转变 根本的变化是从专有的 C# DSL 转向标准的 HTML/CSS: // QuestPDF: Proprietary fluent API container.Page(page => { page.Content().Column(column => { column.Item().Text("Invoice").Bold().FontSize(24); column.Item().Row(row => { row.RelativeItem().Text("Customer:"); row.RelativeItem().Text("Acme Corp"); }); }); }); // IronPDF: Standard HTML/CSS var html = @" <div style='font-family: Arial; padding: 40px;'> <h1>Invoice</h1> <div style='display: flex; justify-content: space-between;'> <span>Customer:</span> <span>Acme Corp</span> </div> </div>"; var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf(html); // QuestPDF: Proprietary fluent API container.Page(page => { page.Content().Column(column => { column.Item().Text("Invoice").Bold().FontSize(24); column.Item().Row(row => { row.RelativeItem().Text("Customer:"); row.RelativeItem().Text("Acme Corp"); }); }); }); // IronPDF: Standard HTML/CSS var html = @" <div style='font-family: Arial; padding: 40px;'> <h1>Invoice</h1> <div style='display: flex; justify-content: space-between;'> <span>Customer:</span> <span>Acme Corp</span> </div> </div>"; var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf(html); $vbLabelText $csharpLabel 布局模式转换 QuestPDF 模式 HTML/CSS 同等内容 .Column() 显示:flex; flex-direction: column` .Row() 显示:flex; flex-direction: row` .RelativeItem() flex:1 .Table() <table> 元素 .PaddingTop(20) padding-top: 20px</code> 或 <code><br/> .AlignCenter() text-align: center .FontSize(24) 字体大小:24px .Bold() 字体加粗或<strong> 页面设置转换 // QuestPDF page.Size(PageSizes.A4); page.Margin(2, Unit.Centimetre); // IronPDF var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.PaperSize = PdfPaperSize.A4; renderer.RenderingOptions.MarginTop = 20; // mm (2cm = 20mm) renderer.RenderingOptions.MarginBottom = 20; renderer.RenderingOptions.MarginLeft = 20; renderer.RenderingOptions.MarginRight = 20; // QuestPDF page.Size(PageSizes.A4); page.Margin(2, Unit.Centimetre); // IronPDF var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.PaperSize = PdfPaperSize.A4; renderer.RenderingOptions.MarginTop = 20; // mm (2cm = 20mm) renderer.RenderingOptions.MarginBottom = 20; renderer.RenderingOptions.MarginLeft = 20; renderer.RenderingOptions.MarginRight = 20; $vbLabelText $csharpLabel 迁移后的新功能 迁移到IronPDF后,您将获得QuestPDF无法提供的功能: PDF 合并 var cover = renderer.RenderHtmlAsPdf("<h1>Cover</h1>"); var content = renderer.RenderHtmlAsPdf(reportHtml); var existing = PdfDocument.FromFile("appendix.pdf"); var merged = PdfDocument.Merge(cover, content, existing); merged.SaveAs("complete.pdf"); var cover = renderer.RenderHtmlAsPdf("<h1>Cover</h1>"); var content = renderer.RenderHtmlAsPdf(reportHtml); var existing = PdfDocument.FromFile("appendix.pdf"); var merged = PdfDocument.Merge(cover, content, existing); merged.SaveAs("complete.pdf"); $vbLabelText $csharpLabel PDF安全 var pdf = renderer.RenderHtmlAsPdf(html); pdf.SecuritySettings.OwnerPassword = "admin"; pdf.SecuritySettings.UserPassword = "reader"; pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights; pdf.SaveAs("protected.pdf"); var pdf = renderer.RenderHtmlAsPdf(html); pdf.SecuritySettings.OwnerPassword = "admin"; pdf.SecuritySettings.UserPassword = "reader"; pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights; pdf.SaveAs("protected.pdf"); $vbLabelText $csharpLabel URL到PDF var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.EnableJavaScript = true; var pdf = renderer.RenderUrlAsPdf("https://example.com/report"); pdf.SaveAs("webpage.pdf"); var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.EnableJavaScript = true; var pdf = renderer.RenderUrlAsPdf("https://example.com/report"); pdf.SaveAs("webpage.pdf"); $vbLabelText $csharpLabel 加载和编辑现有 PDF 文件 var pdf = PdfDocument.FromFile("existing.pdf"); // Modify, merge, add security, etc. pdf.SaveAs("modified.pdf"); var pdf = PdfDocument.FromFile("existing.pdf"); // Modify, merge, add security, etc. pdf.SaveAs("modified.pdf"); $vbLabelText $csharpLabel 功能对比摘要 特征 QuestPDF IronPDF HTML-to-PDF 不支持 主要特点 学习曲线 专有 DSL 标准网络技能 模板预览 所需插件 任何浏览器 设计协作 仅限开发人员 设计师 + 开发人员 现有资产 必须重建 重复使用 HTML/CSS PDF 操作 不支持 全面支持 安全/签名 不支持 全面支持 许可模式 基于收入 每个开发人员 客户影响 可能需要许可证 无 Bootstrap/Tailwind(尾风 不支持 全面支持 URL 转 PDF 不支持 全面支持 迁移清单 迁移前 识别所有QuestPDF文档模板( Document.Create 、 .GeneratePdf ) 记录所使用的DSL模式(.Column()、..Row()、..Table()、..Text()`) 将样式方法映射到等效的 CSS 样式 从ironpdf.com获取IronPDF许可证密钥 软件包变更 删除QuestPDF NuGet 包 安装IronPdf NuGet 包: dotnet add package IronPdf 代码更改 更新命名空间导入 移除QuestPDF.Settings.License = LicenseType.Community 将Document.Create()模式转换为ChromePdfRenderer + HTML 将.Column() / .Row()替换为 CSS Flexbox 将.Table()替换为 HTML<table>元素 将.Text().Bold().FontSize(24)转换为<h1 style="..."> 将page.Header() / page.Footer()替换为TextHeaderFooter 将.CurrentPageNumber()替换为{page}占位符 将.GeneratePdf()转换为pdf.SaveAs() 在应用程序启动时添加许可证初始化 后迁移 PDF 输出的视觉比较 测试多页文档的分页符是否正确 根据需要添加新功能(安全性、合并、URL 转 PDF) 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# 从 RawPrint 迁移到 IronPDF如何用 C# 从 PuppeteerSharp 迁...
已发布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 渲染。包括替换图形基元和自动布局的代码示例。 阅读更多