如何用 C# 从 Scryber.Core 迁移到 IronPDF
从 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许可配置
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";完整的 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;核心 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</代码>或<代码>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");
}
}
}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");
}
}本例展示了基本的架构差异。 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");
}
}
}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");
}
}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");
}
}
}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");
}
}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>使用 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);主要优势: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>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");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");安全性和元数据
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");功能对比摘要
| 特征 | 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.CoreNuGet 包 安装IronPdfNuGet 包 - 更新命名空间导入(
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 支持)
- 使用新模板测试数据绑定
- 验证分页符
- 测试带有页码占位符的页眉/页脚
- 性能比较






