Scryber.Core 与 IronPDF:技术比较指南
Scryber.Core vs IronPDF:.NET PDF 生成比较指南。
当 .NET 开发人员评估 PDF 生成解决方案时,Scryber.Core 和IronPDF代表了具有不同架构理念和许可模式的不同方法。 Scryber.Core 提供了一个使用 XML/HTML 模板和自定义解析引擎的开源库,而IronPDF则提供了一个基于Chromium的渲染引擎,旨在实现 HTML 到 PDF 的高保真转换。 对于专业开发人员和架构师来说,在 2025 年及以后为.NET 应用程序生成 PDF 做决策时,最关心的是这两个库的哪些方面。
了解 Scryber.Core.
Scryber.Core 是一个开源库,可使用 C# 将 HTML 模板转换为 PDF。 该库利用 HTML 的多功能性和 CSS 的样式功能,提供了一种模板驱动的 PDF 生成方法。 Scryber.Core 使用自定义解析引擎而非基于浏览器的渲染器,通过其专有的 Document.ParseDocument() 方法处理文档。
该库在 LGPL 许可下运行,这意味着只要开发人员遵守 LGPL 条款,在项目中使用 Scryber.Core 无需支付任何直接费用。 不过,这种许可模式要求对库本身的任何修改都必须开源,这可能会限制某些商业应用。
主要考虑因素:Scryber.Core 使用专有的数据模板绑定语法和重 XML 的配置方法。 与基于浏览器的解决方案相比,该库不执行 JavaScript,只提供静态渲染和有限的 CSS 支持。
了解IronPDF
IronPDF 提供了一个商业支持的 PDF 生成库,该库使用基于Chromium的渲染引擎。该库可将 HTML、CSS 和JavaScript转换为 PDF 文档,具有完全的浏览器级别保真度,支持包括Flexbox和CSS 网格在内的现代 CSS3 功能,以及完整的JavaScriptES2024 执行。
IronPDF 以 NuGet 软件包的形式安装,不受 LGPL 相关许可的限制。 与开源替代工具相比,该库提供了丰富的文档、专业的支持和更大的社区。
架构比较
Scryber.Core 和IronPDF之间的根本差异会影响渲染功能和开发工作流程:
| 方面 | Scryber.Core | IronPDF |
|---|---|---|
| 许可证 | LGPL(限制性) | 商业翻译 |
| 渲染引擎 | 自定义解析器 | Chromium |
| CSS 支持 | 有限的 | 完整的 CSS3 |
| JavaScript | 否 | 完整的 ES2024 |
| 模板绑定 | 专有 XML | 标准(Razor 等) |
| 学习曲线 | 自定义语法 | 标准 HTML/CSS |
| 异步支持 | 有限的 | 满的 |
| 文档 | 基本的 | 广泛 |
功能比较矩阵
| 特征 | Scryber.Core | IronPDF |
|---|---|---|
| HTML 至 PDF | 基本的 | 完整的 Chromium |
| URL 至 PDF | 需要手动获取 | 本地支持 |
| CSS 网格 | 有限的 | 全面支持 |
| Flexbox | 有限的 | 全面支持 |
| JavaScript | 否 | 完整的 ES2024 |
| 数据绑定 | 专有 XML | 使用 Razor/Handlebars |
| 页眉/页脚 | 基于 XML | HTML/CSS |
| 合并 PDF | 有限的 | 内置 |
| 拆分 PDF | 否 | 是 |
| 水印 | 基本的 | 完整的 HTML |
| 数字签名 | 否 | 是。 |
| PDF/A | 否 | 是 |
| 密码保护 | 基本的 | 满的 |
| 跨平台 | 是 | 是 |
HTML 至 PDF 转换
HTML 到 PDF 的核心工作流程展示了不同库之间的基本 API 差异。
Scryber.Core HTML 转换
Scryber.Core 使用带有自定义解析引擎的 Document.ParseDocument() 方法:
// 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这种方法要求
- 明确的
using声明,以妥善处理资源 - 用于 HTML 字符串解析的
ParseSourceType.DynamicContent参数 - 与标准 HTML 渲染模式不同的基于文档的 API
IronPDFHTML 转换
IronPDF 提供了可直接进行 HTML 转换的 ChromePdfRenderer 类:
// 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.comRenderHtmlAsPdf 方法使用Chromium渲染引擎处理 HTML,并完全支持 CSS 和 JavaScript。 API 采用直接的呈现-保存模式,不需要明确的资源管理语法。
将 URL 转换为 PDF.
将实时网页转换为 PDF 后,发现库与库之间的能力差异很大。
Scryber.Core URL 处理
Scryber.Core 无法直接呈现 URL,开发人员必须手动获取 HTML 内容:
// 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这种变通方法
- 需要明确的 HTTP 客户端管理
- 下载原始 HTML,无需执行 JavaScript
- 无法捕捉动态渲染的内容
- 丢失相关资源引用(图片、样式表)
IronPDFURL 转换
IronPDF 提供原生 URL 到 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");
}
}// 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.comRenderUrlAsPdf 方法使用Chromium引擎导航到 URL,执行 JavaScript,应用 CSS 样式,并将完全渲染的页面捕获为 PDF 文档。
自定义渲染设置
页面配置和渲染选项展示了不同的 API 方法。
Scryber.Core 自定义设置
Scryber.Core 通过文档的 RenderOptions 属性配置设置:
// 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配置发生在文档解析之后、保存之前。 边距配置需要额外的基于 XML 的样式或程序化的页面部分操作。
IronPDF自定义设置
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.comRenderingOptions 属性可通过强类型属性直接访问 纸张大小、页边距和其他 PDF 设置。 渲染器可以一次性配置,并在多次转换中重复使用。
API 映射参考
评估将 Scryber.Core 移植到IronPDF的团队可参考此等价操作映射:
| 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 | 风格设计 |
| 数据绑定(<代码>{{值}}</代码) | Razor/String 插值 | 模板制作 |
| <代码>doc.RenderOptions.PaperSize</代码 | <代码>renderer.RenderingOptions.PaperSize</代码 | 页面大小 |
模板绑定的区别
Scryber.Core 使用基于 XML 的专有绑定语法,需要学习自定义模板语言:
<!-- Scryber proprietary binding -->
<pdf:Para text='{{model.Name}}' />
<pdf:Para text='Total: {{model.Total:C}}' />
<pdf:ForEach on='{{model.Items}}'>
<pdf:Para text='{{.Name}}: {{.Price}}' />
</pdf:ForEach><!-- Scryber proprietary binding -->
<pdf:Para text='{{model.Name}}' />
<pdf:Para text='Total: {{model.Total:C}}' />
<pdf:ForEach on='{{model.Items}}'>
<pdf:Para text='{{.Name}}: {{.Price}}' />
</pdf:ForEach>IronPdf 使用标准 C# 字符串插值或任何模板引擎(Razor、Handlebars):
// Standard C# with 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);// Standard C# with 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);IRON VB CONVERTER ERROR developers@ironsoftware.comIronPdf 的方法利用了现有的 C# 和网络开发技能,而不是要求开发人员学习专有的模板语法。
页眉和页脚的实现
文档页眉和页脚显示了工作流程的显著差异。
Scryber.Core页眉和页脚
Scryber.Core 需要基于 XML 的页眉和页脚定义:
<!-- Scryber XML template -->
<?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><!-- Scryber XML template -->
<?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页眉和页脚
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.comIronPdf 的HtmlHeaderFooter类可通过 {page} 和 {total-pages} 占位符实现完整的HTML/CSS样式,从而实现动态页面编号。
LGPL 许可考虑因素
Scryber.Core 的 LGPL 许可证规定了影响商业应用的特定义务:
LGPL 要求:
- 对 Scryber.Core 库本身的任何修改都必须开源
- 应用程序必须允许用户用修改后的版本替换 LGPL 库
- 在某些商业分发情况下,可能需要披露源代码
IronPDF 商业许可:
- 无源代码披露要求
- 修改或分发不受限制
- 清晰的许可协议,无合规复杂性
- 专业支持包括
对于评估长期商业部署的组织而言,许可模式的差异会对法律和合规性规划产生重大影响。
团队何时考虑迁移 Scryber.Core?
有几个因素促使开发团队评估 Scryber.Core 的替代方案:
LGPL 许可证问题会影响商业应用,因为源代码披露义务与业务要求相冲突。IronPDF的商业许可证消除了这些限制。
当设计使用现代 CSS 功能时,有限的 CSS 支持就会成为问题。 Scryber.Core 的自定义解析器无法呈现 Flexbox、CSS Grid 或基于Chromium引擎的复杂样式。
不执行 JavaScript 阻止动态内容呈现。 单页应用程序、图表和交互式内容需要执行 Scryber.Core 无法提供的 JavaScript。
专有模板语法增加了学习曲线,限制了开发人员的入职。 熟悉HTML/CSS的团队必须学习 Scryber 的自定义绑定语法,而不是利用现有技能。
较小的社区意味着故障排除资源较少,第三方文档也较少。IronPDF的大型社区提供了更多示例和支持资源。
有限的异步支持会影响应用程序的可扩展性。 2026 年,以 .NET 10 和 C# 14 为目标的现代 .NET 应用程序将受益于整个 PDF 生成流水线的完全异步/等待支持。
优势和权衡
Scryber.Core 的优势
- 开源,无直接许可费用(要求符合 LGPL 协议)
- 跨平台支持 .NET 环境
- 针对熟悉网络技术的开发人员的 HTML 模板方法
- 适用于 LGPL 条款与商业模式一致的项目
Scryber.Core 限制
- LGPL 许可限制了某些商业应用
- 自定义解析引擎,支持有限的 CSS
- 不执行 JavaScript(仅限静态渲染)
- 专有的 XML 绑定语法需要学习曲线
- 社区规模较小,文档较少
- 有限的异步支持
- 无本地 URL 转 PDF 功能
- 无 PDF 操作功能(合并、分割、签名)
IronPDF的优势
- 完全Chromium渲染,支持 CSS3 和JavaScriptES2024
- 本机 URL 至 IronPDF 转换
- 标准HTML/CSS模板(使用 Razor、Handlebars 或纯 HTML)
- 无 LGPL 限制的商业许可
- 大量文件和专业支持
- 完全支持异步/等待
- PDF 操作功能(合并、分割、水印)
- 数字签名和安全功能
- 支持PDF/A合规性
IronPDF注意事项
- 需要购买商业许可模式 -Chromium引擎比自定义解析器占用空间更大
结论
Scryber.Core 和IronPDF服务于不同的组织环境和技术要求。 Scryber.Core 为寻求使用 HTML 模板生成 LGPL 许可的 PDF 并愿意在库的自定义语法和渲染限制范围内工作的开发人员提供了一个开源选项。
对于需要现代 CSS 渲染、JavaScript 执行、本地 URL 转换或无 LGPL 义务的商业许可的应用程序,IronPdf 通过其基于Chromium的引擎提供了全面的功能。使用标准HTML/CSS模板的能力、利用现有网络开发技能的能力以及访问 PDF 操作功能的能力解决了团队在使用自定义解析器解决方案时遇到的常见限制。
在评估 Scryber.Core 迁移到IronPDF时,团队应考虑其围绕 CSS 复杂性、JavaScript 需求、License 偏好和模板工作流程偏好的具体要求。 对于使用基于 Web 的设计工作流的现代 .NET 平台的团队来说,IronPDF 的架构与当代开发实践更为自然地保持一致。
有关实施指导,请浏览 IronPDF HTML-to-PDF 教程 和涵盖 .NET 应用程序 PDF 生成模式的 文档。