如何在 C# 中從 Scryber.Core 遷移到 IronPDF
從 Scryber.Core 移植到 IronPdf:完整的 C# 遷移指南。
從 Scryber.Core 轉換到IronPDF可將您的 PDF 生成工作流程從自訂的 XML/HTML 解析引擎轉換為完全支援 CSS3 和JavaScript的現代ChromiumPowered 渲染器。 本指南提供完整的逐步遷移路徑,可消除 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 vsIronPDF比較。
| 範疇 | 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引擎提供了與當代網路標準的完全相容性。
開始之前
先決條件
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授權組態
// 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完整的 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核心 API 對應
| Scryber.Core | IronPDF | 筆記 |
|---|---|---|
Document.ParseDocument(html) | renderer.RenderHtmlAsPdf(html)。 | HTML 渲染 |
| <編碼>Document.ParseTemplate(路徑)</編碼 | renderer.RenderHtmlFileAsPdf(path)。 | 檔案渲染 |
doc.SaveAsPDF(path)。 | <代碼>pdf.SaveAs(路徑)</代碼 | 儲存至檔案 |
doc.SaveAsPDF(stream)。 | pdf.Stream或pdf.BinaryData | 取得串流/位元組 |
| <編碼>doc.Info.Title</編碼 | <編碼>pdf.MetaData.Title</編碼 | 元資料 |
| <編碼>doc.Info.Author</編碼 | <編碼>pdf.MetaData.Author</編碼 | 元資料 |
| <編碼>PDF 頁面</編碼 | <代碼>pdf.Pages[i]</代碼 | 頁面存取 |
| <編碼>PDFLayoutDocument</編碼 | 渲染選項 | 版面控制 |
| <編碼>PDFStyle</編碼 | HTML 中的 CSS | 造型設計 |
doc.RenderOptions.PaperSize | RenderingOptions.PaperSize | 紙張大小 |
資料綁定 ({{value}}) | 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.comAfter (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本範例展示了基本的架構差異。 Scryber.Core 使用 Document.ParseDocument() 搭配 ParseSourceType.DynamicContent 參數來解析 HTML 內容,需要 using 區塊來正確處理。 然後使用 SaveAsPDF() 儲存該文件。
IronPDF 使用 ChromePdfRenderer 實例與 RenderHtmlAsPdf() 來直接渲染 HTML。 PDF 使用 SaveAs() 保存。 不需要手動處理,IronPDF 會自動處理清理工作。 請參閱 HTML to 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.comAfter (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.comScryber.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.comAfter (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.comScryber.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);IRON VB CONVERTER ERROR developers@ironsoftware.com主要優勢: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");IRON VB CONVERTER ERROR developers@ironsoftware.comScryber.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安全性與元資料
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功能比較摘要
| 特點 | 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 支援)
- [ ] 使用新的模板測試資料綁定
- [ ] 核實分頁符號
- [測試頁首/頁尾的頁碼占位符
- [ ] 效能比較
結論
在 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.A4 → renderer.RenderingOptions.PaperSize = PdfPaperSize.A4. 8.邊界:XML樣式 → renderer.RenderingOptions.MarginTop = 40 (數值 mm) 9.儲存方法:doc.SaveAsPDF() → pdf.SaveAs() 10.資料綁定:專屬 {{value}} 語法 → 標準 C#/Razor 11.頁首/頁腳:XML 含 {{pagenum}} → HTML 含 {page} 12.新功能:PDF 合併、分割、水印、數位簽署、PDF/A、完全安全性






