跳過到頁腳內容
遷移指南

如何在 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.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(路徑)</編碼renderer.RenderHtmlFileAsPdf(path)檔案渲染
doc.SaveAsPDF(path)<代碼>pdf.SaveAs(路徑)</代碼儲存至檔案
doc.SaveAsPDF(stream)pdf.Streampdf.BinaryData取得串流/位元組
<編碼>doc.Info.Title</編碼<編碼>pdf.MetaData.Title</編碼元資料
<編碼>doc.Info.Author</編碼<編碼>pdf.MetaData.Author</編碼元資料
<編碼>PDF 頁面</編碼<代碼>pdf.Pages[i]</代碼頁面存取
<編碼>PDFLayoutDocument</編碼渲染選項版面控制
<編碼>PDFStyle</編碼HTML 中的 CSS造型設計
doc.RenderOptions.PaperSizeRenderingOptions.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.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 使用 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.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), 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>
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 套件
  • [ ] 更新命名空間匯入 (using Scryber.Core;using IronPdf;)
  • [將 Document.ParseDocument(html, ParseSourceType.DynamicContent) 替換為renderer.RenderHtmlAsPdf(html)。。
  • [ ] 將 doc.SaveAsPDF() 替換為 pdf.SaveAs()
  • [ ] 將 XML 模板轉換為 HTML
  • [ ] 以標準模板(Razor/字串插值)取代專有綁定
  • [ ] 更新頁面設定:doc.RenderOptions.PaperSizerenderer.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 (數值 mm) 9.儲存方法doc.SaveAsPDF()pdf.SaveAs() 10.資料綁定:專屬 {{value}} 語法 → 標準 C#/Razor 11.頁首/頁腳:XML 含 {{pagenum}} → HTML 含 {page} 12.新功能:PDF 合併、分割、水印、數位簽署、PDF/A、完全安全性

探索完整的 IronPDF文件教程API參考,以加速您的Scryber.Core遷移。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。