迁移指南 如何用 C# 从 Scryber.Core 迁移到 IronPDF Curtis Chau 已发布:2026年2月1日 下载 IronPDF NuGet 下载 DLL 下载 Windows 安装程序 免费试用 法学硕士副本 法学硕士副本 将页面复制为 Markdown 格式,用于 LLMs 在 ChatGPT 中打开 向 ChatGPT 咨询此页面 在双子座打开 向 Gemini 询问此页面 在 Grok 中打开 向 Grok 询问此页面 打开困惑 向 Perplexity 询问有关此页面的信息 分享 在 Facebook 上分享 分享到 X(Twitter) 在 LinkedIn 上分享 复制链接 电子邮件文章 从 Scryber.Core 迁移到IronPDF可将您的 PDF 生成工作流程从自定义 XML/HTML 解析引擎转换为完全支持 CSS3 和JavaScript的现代Chromium驱动的渲染器。 本指南提供了一个完整的、循序渐进的迁移路径,消除了 LGPL 许可问题、专有模板语法和有限的渲染功能。 为什么要从 Scryber.Core 迁移到 IronPDF. 了解 Scryber.Core. Scryber.Core 是一个开源库,可使用 C# 将 HTML 模板转换为 PDF。 对于熟悉网络开发和 HTML 的开发人员来说,这一功能使其成为一款极具吸引力的工具。 与其他需要特定文档编码技能的 PDF 解决方案不同,Scryber.Core 利用 HTML 的多功能性和 CSS 样式功能,提供了一种更直观的 PDF 生成方法。 尽管 Scryber.Core 对许多开发人员来说是一个可行的选择,这主要是因为它在思想上与开源原则保持一致,并且具有灵活性,但它也并非没有局限性。 迁移的主要原因 LGPL 许可问题: LGPL 许可要求对库本身的任何修改都必须开源,这可能会限制某些商业应用程序的使用。 2.自定义模板语法:专有绑定语法需要一定的学习成本 CSS 支持有限:并非完整的基于浏览器的渲染器 4.社区规模较小:文档和社区案例较少 5.不执行 JavaScript:仅静态渲染 6.复杂配置:大量使用 XML 的配置方法 7.商业支持有限: Scryber.Core 主要依靠社区支持。 Scryber.Core 与IronPDF对比 方面 Scryber.Core IronPDF 许可证 LGPL(限制性) 商业翻译 渲染引擎 定制 Chromium CSS 支持 有限的 完整的 CSS3 JavaScript 否 完整的 ES2024 模板绑定 专有 XML 标准(Razor 等) 学习曲线 自定义语法 标准 HTML/CSS 异步支持 有限的 满的 文档 基本的 广泛 社区支持 较小 大型项目 商业支持 有限的 专业支持包括 与 Scryber.Core 相比,IronPDF 提供企业级的商业支持、广泛的文档和更大的社区。 该库提供更灵活的许可选项,不受 LGPL 限制,因此非常适合商业应用。 对于计划在 2025 年和 2026 年之前采用 .NET 10 和 C# 14 的团队,IronPDF 的现代Chromium引擎提供了与当代网络标准的完全兼容性。 开始之前 前提条件 .NET 环境: .NET Framework 4.6.2+ 或 .NET Core 3.1+ / .NET 5/6/7/8/9+ NuGet 访问权限:能够安装 NuGet 包 IronPDF 许可证:请从ironpdf.com获取您的许可证密钥。 NuGet 软件包变更 # Remove Scryber.Core dotnet remove package Scryber.Core # Install IronPDF dotnet add package IronPdf # Remove Scryber.Core dotnet remove package Scryber.Core # Install 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 完整的 API 参考 命名空间变更 // Before: Scryber.Core using Scryber.Components; using Scryber.Components.Pdf; using Scryber.PDF; using Scryber.Styles; using Scryber.Core; using Scryber.Core.Html; using Scryber.Drawing; // After: IronPDF using IronPdf; using IronPdf.Rendering; // Before: Scryber.Core using Scryber.Components; using Scryber.Components.Pdf; using Scryber.PDF; using Scryber.Styles; using Scryber.Core; using Scryber.Core.Html; using Scryber.Drawing; // After: IronPDF using IronPdf; using IronPdf.Rendering; $vbLabelText $csharpLabel 核心 API 映射 Scryber.Core IronPDF 备注 Document.ParseDocument(html) renderer.RenderHtmlAsPdf(html) HTML 渲染 Document.ParseTemplate(path) renderer.RenderHtmlFileAsPdf(path) 文件渲染 doc.SaveAsPDF(路径) pdf.SaveAs(路径) 保存到文件 doc.SaveAsPDF(流) pdf.Stream</code>或pdf.BinaryData` 获取流/字节 doc.Info.Title pdf.MetaData.Title 元数据 doc.Info.作者 pdf.MetaData.Author 元数据 PDF 页 pdf.Pages[i] 页面访问 PDFLayoutDocument 渲染选项 布局控制 PDFStyle HTML 中的 CSS 风格设计 doc.RenderOptions.PaperSize RenderingOptions.PaperSize 纸张大小 数据绑定({{值}}`) Razor/String 插值 模板制作 代码迁移示例 示例 1:基本 HTML 到 PDF 的转换 之前(Scryber.Core): // NuGet: Install-Package Scryber.Core using Scryber.Core; using Scryber.Core.Html; using System.IO; class Program { static void Main() { string html = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>"; using (var doc = Document.ParseDocument(html, ParseSourceType.DynamicContent)) { doc.SaveAsPDF("output.pdf"); } } } // NuGet: Install-Package Scryber.Core using Scryber.Core; using Scryber.Core.Html; using System.IO; class Program { static void Main() { string html = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>"; using (var doc = Document.ParseDocument(html, ParseSourceType.DynamicContent)) { doc.SaveAsPDF("output.pdf"); } } } $vbLabelText $csharpLabel After (IronPDF): // NuGet: Install-Package IronPdf using IronPdf; class Program { static void Main() { var renderer = new ChromePdfRenderer(); string html = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></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><p>This is a PDF document.</p></body></html>"; var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs("output.pdf"); } } $vbLabelText $csharpLabel 本例展示了基本的架构差异。 Scryber.Core 使用带有 ParseSourceType.DynamicContent 参数的 Document.ParseDocument() 来解析 HTML 内容,需要使用 using 块进行正确处理。 然后使用 SaveAsPDF() 保存文档。 IronPDF 使用带有 RenderHtmlAsPdf() 的 ChromePdfRenderer 实例直接渲染 HTML。 PDF 使用 SaveAs() 保存。 无需人工处理,IronPDF 会自动进行清理。 请参阅 HTML 转 PDF 文档,了解全面的示例。 示例 2:URL 到 PDF 的转换 之前(Scryber.Core): // NuGet: Install-Package Scryber.Core using Scryber.Core; using Scryber.Core.Html; using System.Net.Http; using System.Threading.Tasks; class Program { static async Task Main() { using var client = new HttpClient(); string html = await client.GetStringAsync("https://www.example.com"); using (var doc = Document.ParseDocument(html, ParseSourceType.DynamicContent)) { doc.SaveAsPDF("webpage.pdf"); } } } // NuGet: Install-Package Scryber.Core using Scryber.Core; using Scryber.Core.Html; using System.Net.Http; using System.Threading.Tasks; class Program { static async Task Main() { using var client = new HttpClient(); string html = await client.GetStringAsync("https://www.example.com"); using (var doc = Document.ParseDocument(html, ParseSourceType.DynamicContent)) { doc.SaveAsPDF("webpage.pdf"); } } } $vbLabelText $csharpLabel After (IronPDF): // NuGet: Install-Package IronPdf using IronPdf; class Program { static void Main() { var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderUrlAsPdf("https://www.example.com"); pdf.SaveAs("webpage.pdf"); } } // NuGet: Install-Package IronPdf using IronPdf; class Program { static void Main() { var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderUrlAsPdf("https://www.example.com"); pdf.SaveAs("webpage.pdf"); } } $vbLabelText $csharpLabel Scryber.Core 无法直接将 URL 转换为 PDF。 您必须使用 HttpClient.GetStringAsync() 手动获取 HTML 内容,然后使用 Document.ParseDocument() 解析下载的 HTML。 由于自定义解析器不执行脚本,因此这种方法无法执行 JavaScript、动态内容和正确的 CSS 解析。 IronPDF 的 RenderUrlAsPdf() 方法只需一次调用即可处理整个过程,包括使用其Chromium引擎执行完整的JavaScript和 CSS 呈现。了解更多信息,请参阅我们的 教程。 示例 3:自定义页面设置和页边距 之前(Scryber.Core): // NuGet: Install-Package Scryber.Core using Scryber.Core; using Scryber.Core.Html; using Scryber.Drawing; using System.IO; class Program { static void Main() { string html = "<html><body><h1>Custom PDF</h1><p>With custom margins and settings.</p></body></html>"; using (var doc = Document.ParseDocument(html, ParseSourceType.DynamicContent)) { doc.RenderOptions.Compression = OutputCompressionType.FlateDecode; doc.RenderOptions.PaperSize = PaperSize.A4; doc.SaveAsPDF("custom.pdf"); } } } // NuGet: Install-Package Scryber.Core using Scryber.Core; using Scryber.Core.Html; using Scryber.Drawing; using System.IO; class Program { static void Main() { string html = "<html><body><h1>Custom PDF</h1><p>With custom margins and settings.</p></body></html>"; using (var doc = Document.ParseDocument(html, ParseSourceType.DynamicContent)) { doc.RenderOptions.Compression = OutputCompressionType.FlateDecode; doc.RenderOptions.PaperSize = PaperSize.A4; doc.SaveAsPDF("custom.pdf"); } } } $vbLabelText $csharpLabel After (IronPDF): // NuGet: Install-Package IronPdf using IronPdf; using IronPdf.Rendering; class Program { static void Main() { var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.PaperSize = PdfPaperSize.A4; renderer.RenderingOptions.MarginTop = 40; renderer.RenderingOptions.MarginBottom = 40; string html = "<html><body><h1>Custom PDF</h1><p>With custom margins and settings.</p></body></html>"; var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs("custom.pdf"); } } // NuGet: Install-Package IronPdf using IronPdf; using IronPdf.Rendering; class Program { static void Main() { var renderer = new ChromePdfRenderer(); renderer.RenderingOptions.PaperSize = PdfPaperSize.A4; renderer.RenderingOptions.MarginTop = 40; renderer.RenderingOptions.MarginBottom = 40; string html = "<html><body><h1>Custom PDF</h1><p>With custom margins and settings.</p></body></html>"; var pdf = renderer.RenderHtmlAsPdf(html); pdf.SaveAs("custom.pdf"); } } $vbLabelText $csharpLabel Scryber.Core 在解析文档后使用 doc.RenderOptions 配置输出设置,如 Compression (设置为 OutputCompressionType.FlateDecode )和 PaperSize (设置为 PaperSize.A4 )。 IronPDF 在渲染前会在渲染器上使用渲染选项。 属性包括以毫米为单位设置的 PaperSize (设置为 PdfPaperSize.A4 )、MarginTop 和 MarginBottom 。 关键区别在于IronPDF通过数字属性提供直接的页边距控制,而 Scryber.Core 则使用基于 XML 的样式。 模板迁移模式 将专有绑定迁移到标准模板 Scryber.Core 使用基于 XML 的专有绑定语法,必须转换为标准模板: Scryber.Core绑定: <pdf:Para text='{{model.Name}}' /> <pdf:Para text='Total: {{model.Total:C}}' /> <pdf:ForEach on='{{model.Items}}'> <pdf:Para text='{{.Name}}: {{.Price}}' /> </pdf:ForEach> <pdf:Para text='{{model.Name}}' /> <pdf:Para text='Total: {{model.Total:C}}' /> <pdf:ForEach on='{{model.Items}}'> <pdf:Para text='{{.Name}}: {{.Price}}' /> </pdf:ForEach> XML 使用 C# 字符串插值的 IronPDF: var items = model.Items.Select(i => $"<li>{i.Name}: {i.Price:C}</li>"); var html = $@" <p>{model.Name}</p> <p>Total: {model.Total:C}</p> <ul> {string.Join("", items)} </ul>"; var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf(html); var items = model.Items.Select(i => $"<li>{i.Name}: {i.Price:C}</li>"); var html = $@" <p>{model.Name}</p> <p>Total: {model.Total:C}</p> <ul> {string.Join("", items)} </ul>"; var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf(html); $vbLabelText $csharpLabel 主要优势:IronPDF 使用标准 C# 和 HTML,因此您可以使用任何模板引擎(Razor、Handlebars 等),而无需学习专有语法。 页眉和页脚迁移 Scryber.Core(基于 XML 的页眉/页脚): <?xml version='1.0' encoding='utf-8' ?> <pdf:Document xmlns:pdf='http://www.scryber.co.uk/schemas/core/release/v1/Scryber.Components.xsd'> <Pages> <pdf:Section> <Header> <pdf:Para text='Company Report' /> </Header> <Footer> <pdf:Para text='Page {{pagenum}} of {{pagetotal}}' /> </Footer> <Content> <pdf:H1 text='Content Here' /> </Content> </pdf:Section> </Pages> </pdf:Document> <?xml version='1.0' encoding='utf-8' ?> <pdf:Document xmlns:pdf='http://www.scryber.co.uk/schemas/core/release/v1/Scryber.Components.xsd'> <Pages> <pdf:Section> <Header> <pdf:Para text='Company Report' /> </Header> <Footer> <pdf:Para text='Page {{pagenum}} of {{pagetotal}}' /> </Footer> <Content> <pdf:H1 text='Content Here' /> </Content> </pdf:Section> </Pages> </pdf:Document> XML IronPDF(HTML 页眉/页脚): using IronPdf; var renderer = new ChromePdfRenderer(); // HTML header with full CSS support renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter { HtmlFragment = @" <div style='width: 100%; text-align: center; font-size: 12pt; border-bottom: 1px solid #ccc;'> Company Report </div>", MaxHeight = 30 }; // HTML footer with page numbers renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter { HtmlFragment = @" <div style='width: 100%; text-align: center; font-size: 10pt;'> Page {page} of {total-pages} </div>", MaxHeight = 25 }; var pdf = renderer.RenderHtmlAsPdf("<h1>Content Here</h1>"); pdf.SaveAs("report.pdf"); using IronPdf; var renderer = new ChromePdfRenderer(); // HTML header with full CSS support renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter { HtmlFragment = @" <div style='width: 100%; text-align: center; font-size: 12pt; border-bottom: 1px solid #ccc;'> Company Report </div>", MaxHeight = 30 }; // HTML footer with page numbers renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter { HtmlFragment = @" <div style='width: 100%; text-align: center; font-size: 10pt;'> Page {page} of {total-pages} </div>", MaxHeight = 25 }; var pdf = renderer.RenderHtmlAsPdf("<h1>Content Here</h1>"); pdf.SaveAs("report.pdf"); $vbLabelText $csharpLabel Scryber.Core 需要基于 XML 的页眉/页脚定义,并使用 {{pagenum}} 和 {{pagetotal}} 等专有占位符。 IronPdf 使用完整的HTML/CSS作为页眉和页脚,并使用 {page} 和 {total-pages} 占位符。 迁移后的新功能 迁移到IronPDF后,您将获得 Scryber.Core 无法提供的功能: PDF 合并 var pdf1 = PdfDocument.FromFile("chapter1.pdf"); var pdf2 = PdfDocument.FromFile("chapter2.pdf"); var pdf3 = PdfDocument.FromFile("chapter3.pdf"); var merged = PdfDocument.Merge(pdf1, pdf2, pdf3); merged.SaveAs("complete_book.pdf"); var pdf1 = PdfDocument.FromFile("chapter1.pdf"); var pdf2 = PdfDocument.FromFile("chapter2.pdf"); var pdf3 = PdfDocument.FromFile("chapter3.pdf"); var merged = PdfDocument.Merge(pdf1, pdf2, pdf3); merged.SaveAs("complete_book.pdf"); $vbLabelText $csharpLabel 安全性和元数据 var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential</h1>"); // Metadata pdf.MetaData.Title = "My Document"; pdf.MetaData.Author = "John Doe"; pdf.MetaData.Subject = "Annual Report"; pdf.MetaData.Keywords = "report, annual, confidential"; // Security pdf.SecuritySettings.OwnerPassword = "owner123"; pdf.SecuritySettings.UserPassword = "user456"; pdf.SecuritySettings.AllowUserCopyPasteContent = false; pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights; pdf.SaveAs("protected.pdf"); var renderer = new ChromePdfRenderer(); var pdf = renderer.RenderHtmlAsPdf("<h1>Confidential</h1>"); // Metadata pdf.MetaData.Title = "My Document"; pdf.MetaData.Author = "John Doe"; pdf.MetaData.Subject = "Annual Report"; pdf.MetaData.Keywords = "report, annual, confidential"; // Security pdf.SecuritySettings.OwnerPassword = "owner123"; pdf.SecuritySettings.UserPassword = "user456"; pdf.SecuritySettings.AllowUserCopyPasteContent = false; pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights; pdf.SaveAs("protected.pdf"); $vbLabelText $csharpLabel 功能对比摘要 特征 Scryber.Core IronPDF HTML 至 PDF 基本的 完整的 Chromium URL 至 PDF 手动获取 本地支持 CSS 网格 有限的 全面支持 Flexbox 有限的 全面支持 JavaScript 否 完整的 ES2024 数据绑定 专有 XML 使用 Razor/Handlebars 页眉/页脚 基于 XML HTML/CSS 合并 PDF 有限的 内置 拆分 PDF 否 是 水印 基本的 完整的 HTML 数字签名 否 是 PDF/A 否 是 密码保护 基本的 满的 异步支持 有限的 满的 跨平台 是 是 迁移清单 迁移前 审核所有 Scryber 模板的 XML/绑定模式 使用的文档数据绑定模式( {{model.Property}} ) 识别需要进行 CSS 转换的自定义样式 从ironpdf.com获取IronPDF许可证密钥 代码更新 移除Scryber.Core NuGet 包 安装IronPdf NuGet 包 更新命名空间导入( using Scryber.Core; → using IronPdf; ) 将Document.ParseDocument(html, ParseSourceType.DynamicContent)替换为renderer.RenderHtmlAsPdf(html) 将doc.SaveAsPDF()替换为pdf.SaveAs() 将 XML 模板转换为 HTML 将专有绑定替换为标准模板(Razor/字符串插值) 更新页面设置:doc.RenderOptions.PaperSize→ renderer.RenderingOptions.PaperSize 将页眉/页脚转换为带有{page}和{total-pages}占位符的 HTML 格式 在应用程序启动时添加许可证初始化 测试 测试所有文档模板 验证样式是否匹配(充分利用 CSS 支持) 使用新模板测试数据绑定 验证分页符 测试带有页码占位符的页眉/页脚 性能比较 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# 从 XFINIUM.PDF 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 XFINIUM.PDF 到 IronPDF 的迁移。从基于坐标的手动定位切换到声明式 HTML/CSS 渲染。包括替换图形基元和自动布局的代码示例。 阅读更多 已发布2026年2月1日 如何用 C# 从 PdfPig 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 PdfPig 迁移到 IronPDF 的方法。从纯粹的阅读库转换为全面的 PDF 解决方案。包括文本提取、HTML 转换和元数据访问的代码示例。 阅读更多 如何在 C# 中从 SelectPdf 迁移到 IronPDF如何用 C# 从 SAP Crystal Report...
已发布2026年2月1日 如何用 C# 从 ZetPDF 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 ZetPDF 到 IronPDF 的迁移。从基于坐标的库转换到现代的 HTML 到 PDF 解决方案。包括 HTML 转换、合并 PDF 和移除 PDFSharp 依赖性的代码示例。 阅读更多
已发布2026年2月1日 如何用 C# 从 XFINIUM.PDF 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 XFINIUM.PDF 到 IronPDF 的迁移。从基于坐标的手动定位切换到声明式 HTML/CSS 渲染。包括替换图形基元和自动布局的代码示例。 阅读更多
已发布2026年2月1日 如何用 C# 从 PdfPig 迁移到 IronPDF 通过这本完整的 C# 指南,掌握从 PdfPig 迁移到 IronPDF 的方法。从纯粹的阅读库转换为全面的 PDF 解决方案。包括文本提取、HTML 转换和元数据访问的代码示例。 阅读更多