跳至页脚内容
迁移指南

如何用 C# 从 Scryber.Core 迁移到 IronPDF

从 Scryber.Core 迁移到 IronPdf:完整的 C# 迁移指南

从 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 对许多开发人员来说是一个可行的选择,这主要是因为它在思想上与开源原则保持一致,并且具有灵活性,但它也并非没有局限性。

迁移的主要原因

1.LGPL 许可证问题:LGPL 许可证要求对库本身的任何修改都必须开源,这可能会限制某些商业应用的发展。 2.自定义模板语法:专有绑定语法需要学习曲线 3.有限的 CSS 支持:不是完全基于浏览器的呈现器 4.较小的社区:文档和社区示例较少 5.无JavaScript执行:仅静态呈现 6.复杂配置:重 XML 的配置方法 7.有限的商业支持:Scryber.Core 主要由社区支持

Scryber.Core 与IronPDF对比

方面Scryber.CoreIronPDF
许可证LGPL(限制性)商业翻译
渲染引擎定制Chromium
CSS 支持有限的完整的 CSS3
JavaScript完整的 ES2024
模板绑定专有 XML标准(Razor 等)
学习曲线自定义语法标准 HTML/CSS
异步支持有限的满的
文档基本的广泛
社区支持较小大型项目
商业支持有限的专业支持包括

与 Scryber.Core 相比,IronPDF 提供企业级的商业支持、广泛的文档和更大的社区。 该库提供更灵活的许可选项,不受 LGPL 限制,因此非常适合商业应用。

对于计划在 2025 年和 2026 年之前采用 .NET 10 和 C# 14 的团队,IronPDF 的现代Chromium引擎提供了与当代网络标准的完全兼容性。


开始之前

前提条件

1..NET环境:.NET Framework 4.6.2+ 或 .NET Core 3.1+ / .NET 5/6/7/8/9+ 2.NuGet 访问:安装 NuGet 软件包的能力 3.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";
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

核心 API 映射

Scryber.CoreIronPDF备注
<代码>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");
        }
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
        }
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
        }
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Scryber.Core 在解析文档后使用 doc.RenderOptions 配置输出设置,如 Compression (设置为 OutputCompressionType.FlateDecode )和 PaperSize (设置为 PaperSize.A4 )。

IronPDF 在渲染前会在渲染器上使用<代码>渲染选项</代码。 属性包括以毫米为单位设置的 PaperSize (设置为 PdfPaperSize.A4 )、MarginTopMarginBottom 。 关键区别在于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);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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");
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

功能对比摘要

特征Scryber.CoreIronPDF
HTML 至 PDF基本的完整的 Chromium
URL 至 PDF手动获取本地支持
CSS 网格有限的全面支持
Flexbox有限的全面支持
JavaScript完整的 ES2024
数据绑定专有 XML使用 Razor/Handlebars
页眉/页脚基于 XMLHTML/CSS
合并 PDF有限的内置
拆分 PDF
水印基本的完整的 HTML
数字签名
PDF/A
密码保护基本的满的
异步支持有限的满的
跨平台

迁移清单

迁移前

  • [审核所有 Scryber 模板的 XML/绑定模式
  • [使用的文档数据绑定模式(<代码>{{model.Property}}</代码)
  • [ ] 确定需要转换 CSS 的自定义样式
  • [ ] 从 ironpdf.com 获取IronPDF许可证密钥

代码更新

  • [ ] 删除 Scryber.Core NuGet 软件包
  • [ ] 安装 IronPdf NuGet 软件包
  • [ ] 更新命名空间导入(使用 Scryber.Core;使用 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 支持)
  • [ ] 使用新模板测试数据绑定
  • [ ] 验证分页符
  • [ ] 测试带页码占位符的页眉/页脚
  • [ ] 性能比较

结论

在 Scryber.Core 和IronPDF之间做出选择时,最终取决于项目要求、预算和所需的支持水平。 对于开源许可与商业模式一致的项目,最好使用 HTML 模板,Scryber.Core 可提供坚实的基础。 对于寻求有广泛社区支持的商业支持平台的企业来说,IronPDF 是首选。

本次迁移的主要变化有 1.呈现引擎:自定义解析器 → 基于 Chromium 2.CSS 支持:有限 → 完全 CSS3 3.JavaScript:不支持 → 满的 ES2024 4.许可:LGPL(限制性) → 商业(灵活) 5.HTML 解析Document.ParseDocument(html, ParseSourceType.DynamicContent)renderer.RenderHtmlAsPdf(html). 6.URL 渲染:手动<代码>HttpClient</代码>获取 → 本地<代码>RenderUrlAsPdf()</代码 7.页面设置doc.RenderOptions.PaperSize=PaperSize.A4renderer.RenderingOptions.PaperSize=PdfPaperSize.A4。 8.边距:XML 样式 → renderer.RenderingOptions.MarginTop = 40(数值毫米) 9.保存方法:<代码>doc.SaveAsPDF()</代码> → <代码>pdf.SaveAs()</代码 10.数据绑定:专有 {{value}} 语法 → 标准 C#/Razor 11.页眉/页脚:使用 {{pagenum}} 的 XML → 使用 {page} 的 HTML 12.新功能:PDF 合并、分割、水印、数字签名、PDF/A、完全安全

探索完整的IronPDF文档教程API参考,加速您的Scryber.Core迁移。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。