Scryber.Core vs IronPDF:技術比較指南
當.NET開發人員評估 PDF 產生解決方案時,Scryber.Core 和IronPDF代表了不同的方法,具有不同的架構理念和授權模式。 Scryber.Core 提供了一個使用 XML/HTML 範本和自訂解析引擎的開源函式庫,而IronPDF提供了一個基於 鉻 的渲染引擎,專為高保真 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 生成庫,該庫使用基於 鉻 的渲染引擎。該程式庫可以將 HTML、CSS 和JavaScript轉換為 PDF 文檔,並保持瀏覽器層級的完整保真度,支援包括 Flexbox 和 CSS Grid 在內的現代 CSS3 特性,以及完整的JavaScript ES2024 執行。
IronPDF以NuGet套件的形式安裝,不受 LGPL 許可限制。 與開源替代方案相比,該程式庫提供豐富的文件、專業的支援和更大的社群。
建築比較
Scryber.Core 和IronPDF之間的根本差異會影響渲染功能和開發工作流程:
| 方面 | Scryber.Core | IronPDF |
|---|---|---|
| 執照 | LGPL(限制性) | 商業的 |
| 渲染引擎 | 自訂解析器 | 鉻 |
| CSS 支援 | 有限的 | 完整的 CSS3 |
| JavaScript | 不 | 完整版 ES2024 |
| 模板綁定 | 專有 XML | 標準型(Razor等) |
| 學習曲線 | 自訂語法 | 標準 HTML/CSS |
| 非同步支援 | 有限的 | 滿的 |
| 文件 | 基本的 | 廣泛的 |
特徵比較矩陣
| 特徵 | Scryber.Core | IronPDF |
|---|---|---|
| HTML 轉 PDF | 基本的 | 全鉻 |
| PDF檔案的URL | 需要手動獲取 | 原生支援 |
| CSS Grid | 有限的 | 支援 |
| Flexbox | 有限的 | 支援 |
| JavaScript | 不 | 完整版 ES2024 |
| 資料綁定 | 專有 XML | 使用Razor/車把 |
| 頁首/頁尾 | 基於 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");
}
}
}這種方法需要:
- 明確
using語句以正確處置資源 - HTML 字串解析的
ParseSourceType.DynamicContent參數 - 與標準 HTML 渲染模式不同的基於文件的 API
IronPDF HTML 轉換
IronPDF提供 ChromePdfRenderer 類,可直接進行 HTML 轉換:
// 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");
}
}RenderHtmlAsPdf方法使用 鉻 渲染引擎處理 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");
}
}
}這種變通方法:
- 需要明確的 HTTP 用戶端管理
- 下載原始 HTML 而不執行JavaScript 無法捕捉動態渲染的內容
- 遺失相對資源參考(圖像、樣式表)
IronPDF URL轉換
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");
}
}RenderUrlAsPdf方法使用 鉻 引擎導覽至 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");
}
}
}配置操作發生在文件解析之後、儲存之前。 邊距配置需要額外的基於 XML 的樣式設定或程式化的頁面部分操作。
IronPDF自訂設定
IronPDF在轉換之前透過渲染器的 RenderingOptions 屬性配置設定:
// 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");
}
}RenderingOptions 屬性透過強類型屬性提供對紙張大小、邊距和其他 PDF 設定的直接存取。 渲染器可以配置一次,並可重複用於多次轉換。
API對應參考
評估 Scryber.Core 遷移到IronPDF 的團隊可以參考以下等效操作映射:
| Scryber.Core | IronPDF |
|---|---|
Document.ParseDocument(html) | renderer.RenderHtmlAsPdf(html) |
Document.ParseTemplate(path) | renderer.RenderHtmlFileAsPdf(path) |
doc.SaveAsPDF(path) | pdf.SaveAs(path) |
doc.SaveAsPDF(stream) | pdf.Stream 或 pdf.BinaryData |
doc.Info.Title | pdf.MetaData.Title |
doc.Info.Author | pdf.MetaData.Author |
PDFPage | pdf.Pages[i] |
PDFLayoutDocument | RenderingOptions |
PDFStyle | HTML中的CSS |
資料綁定({{value}}) | Razor/字串插值 |
doc.RenderOptions.PaperSize | renderer.RenderingOptions.PaperSize |
模板綁定差異
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 的頁首和頁尾
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");IronPDF 的HtmlHeaderFooter類別支援完整的 HTML/CSS 樣式,並附有 {page} 和 {total-pages} 佔位符,用於動態頁碼。
LGPL許可考慮因素
Scryber.Core 的 LGPL 授權協議規定了一些會影響商業應用的具體義務:
LGPL 需求: 對 Scryber.Core 函式庫本身的任何修改都必須開源。 應用程式必須允許使用者將 LGPL 函式庫替換為修改後的版本。 在某些商業分銷場景中,可能需要揭露來源資訊。
IronPDF商業許可:
- 無資訊來源揭露要求
- 對修改或散佈無任何限制 清晰的許可流程,無需複雜的合規要求
- 包含專業支持
對於正在評估長期商業部署的組織而言,授權模式的差異將對法律和合規規劃產生重大影響。
團隊考慮 Scryber.Core 遷移時
促使開發團隊評估 Scryber.Core 的替代方案的因素有很多:
LGPL 授權問題會影響商業應用,因為原始碼揭露義務與業務需求衝突。 IronPDF的商業許可取消了這些限制。
當設計中使用現代 CSS 功能時,有限的 CSS 支援就會成為一個問題。 Scryber.Core 的自訂解析器無法渲染 Flexbox、CSS Grid 或基於 鉻 的引擎原生處理的複雜樣式。
JavaScript執行不會阻止動態內容渲染。 單頁應用程式、圖表和互動式內容需要執行 Scryber.Core 無法提供的JavaScript功能。
專有模板語法增加了學習難度,限制了開發人員的上手。 熟悉 HTML/CSS 的團隊必須學習 Scryber 的自訂綁定語法,而不是利用現有的技能。
社群規模較小意味著故障排除資源較少,第三方文件也較少。 IronPDF 的龐大社區提供了更多範例和支援資源。
非同步支援不足會影響應用程式的可擴展性。 面向.NET 10 和 C# 14 的現代.NET應用程式在 2026 年將受益於整個 PDF 生成管道中完整的 async/await 支援。
優勢與權衡
Scryber.核心優勢
- 開源,無直接授權費用(需符合LGPL協議)
- 跨.NET環境的跨平台支持
- 針對熟悉 Web 技術的開發人員的 HTML 範本方法
- 適用於LGPL條款與商業模式相符的項目
Scryber.Core 的限制
LGPL 授權限制了一些商業應用
- 自訂解析引擎,CSS 支援有限
- 不執行JavaScript (僅靜態渲染)
- 專有 XML 綁定語法需要一定的學習曲線 較小的社區,文件較少。
- 非同步支援有限
- 不具備原生 URL 轉 PDF 功能
- 不具備PDF操作功能(合併、分割、簽名)
IronPDF 的優勢
IronPDF注意事項
商業授權模式需要購買 Chromium 引擎比自訂解析器佔用更多資源。
結論
Scryber.Core 和IronPDF服務於不同的組織環境和技術要求。 Scryber.Core 為尋求使用 HTML 範本產生 LGPL 授權 PDF 的開發人員提供了一個開源選項,並且願意接受該程式庫的自訂語法和渲染限制。
對於需要現代 CSS 渲染、 JavaScript執行、原生 URL 轉換或無需 LGPL 許可的商業授權的應用, IronPDF透過其基於 鉻 的引擎提供全面的功能。它能夠使用標準的 HTML/CSS 模板,充分利用現有的 Web 開發技能,並存取 PDF 操作功能,從而解決了團隊在使用自訂解析器解決方案時遇到的常見限制。
在評估 Scryber.Core 遷移到IronPDF時,團隊應考慮其在 CSS 複雜性、 JavaScript需求、授權偏好和範本工作流程偏好方面的具體要求。 對於採用基於 Web 的設計工作流程的現代.NET平台的團隊而言,IronPDF 的架構與當代開發實踐更加自然契合。
有關實施指導,請參閱IronPDF HTML 轉 PDF 教程和文檔,其中涵蓋了.NET應用程式的 PDF 生成模式。
