PDFmyURL與IronPDF:技術比較指南
當.NET開發者評估PDF產生解決方案時,Scryber.Core和IronPDF代表了不同的方法,具有不同的架構哲學和許可模式。 Scryber.Core提供了一個使用XML/HTML模板的開源程式庫,具有自訂的解析引擎,而IronPDF則提供了基於Chromium的渲染引擎,設計用於高保真的HTML到PDF轉換。 這次技術比較將檢視兩個程式庫在2025年及以後的.NET應用程式中,對專業開發者和架構師來說最重要的維度。
了解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文件,具有完整的瀏覽器級別保真度,支持現代CSS3特性,包括Flexbox和CSS Grid,以及完整的JavaScript ES2024執行。
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 Grid | 有限 | 支持 |
| Flexbox | 有限 | 支持 |
| JavaScript | 無 | 完整的ES2024 |
| 資料綁定 | 專有XML | 使用Razor/Handlebars |
| 頁眉/頁腳 | 基於XML | HTML/CSS |
| 合併PDFs | 有限 | 內建支持 |
| 切分PDF | 無 | 是 |
| 水印 | 基本 | 完整的HTML |
| 數位簽名 | 無 | Yes |
| 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");
}
}
}Imports Scryber.Core
Imports Scryber.Core.Html
Imports System.IO
Class Program
Shared Sub Main()
Dim html As String = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>"
Using doc = Document.ParseDocument(html, ParseSourceType.DynamicContent)
doc.SaveAsPDF("output.pdf")
End Using
End Sub
End Class此方法需要:
- 使用
using語句明確處理資源 - HTML字串解析的
ParseSourceType.DynamicContent參數 - 文件基礎的API,與標準HTML渲染模式不同
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");
}
}Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim html As String = "<html><body><h1>Hello World</h1><p>This is a PDF document.</p></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("output.pdf")
End Sub
End ClassRenderHtmlAsPdf方法使用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");
}
}
}Imports Scryber.Core
Imports Scryber.Core.Html
Imports System.Net.Http
Imports System.Threading.Tasks
Module Program
Async Function Main() As Task
Using client As New HttpClient()
Dim html As String = Await client.GetStringAsync("https://www.example.com")
Using doc = Document.ParseDocument(html, ParseSourceType.DynamicContent)
doc.SaveAsPDF("webpage.pdf")
End Using
End Using
End Function
End Module這種工作區塊方法:
- 需要明確的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");
}
}Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://www.example.com")
pdf.SaveAs("webpage.pdf")
End Sub
End ClassRenderUrlAsPdf方法使用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");
}
}
}Imports Scryber.Core
Imports Scryber.Core.Html
Imports Scryber.Drawing
Imports System.IO
Class Program
Shared Sub Main()
Dim html As String = "<html><body><h1>Custom PDF</h1><p>With custom margins and settings.</p></body></html>"
Using doc = Document.ParseDocument(html, ParseSourceType.DynamicContent)
doc.RenderOptions.Compression = OutputCompressionType.FlateDecode
doc.RenderOptions.PaperSize = PaperSize.A4
doc.SaveAsPDF("custom.pdf")
End Using
End Sub
End Class配置在文件解析後但在保存前發生。 邊距配置需要額外的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");
}
}Imports IronPdf
Imports IronPdf.Rendering
Class Program
Shared Sub Main()
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.PaperSize = PdfPaperSize.A4
renderer.RenderingOptions.MarginTop = 40
renderer.RenderingOptions.MarginBottom = 40
Dim html As String = "<html><body><h1>Custom PDF</h1><p>With custom margins and settings.</p></body></html>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SaveAs("custom.pdf")
End Sub
End ClassRenderingOptions屬性提供紙張大小、邊距和其他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 | CSS在HTML中 |
資料綁定 ({{value}}) | Razor/字串插值 |
doc.RenderOptions.PaperSize | renderer.RenderingOptions.PaperSize |
模板綁定差異
Scryber.Core使用專有的基於XML的綁定語法,需要學習一種自訂模板語言:
<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>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);Imports IronPdf
Dim items = model.Items.Select(Function(i) $"<li>{i.Name}: {i.Price:C}</li>")
Dim html = $"
<p>{model.Name}</p>
<p>Total: {model.Total:C}</p>
<ul>
{String.Join("", items)}
</ul>"
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)IronPDF的方法利用現有的C#和網頁開發技能,而不是要求開發者學習專有的模板語法。
頁眉和頁腳的實現
文件頁眉和頁腳揭示了顯著的工作流程差異。
Scryber.Core頁眉和頁腳
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");Imports IronPdf
Dim renderer As New ChromePdfRenderer()
' HTML header with full CSS support
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter With {
.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 With {
.HtmlFragment = "
<div style='width: 100%; text-align: center; font-size: 10pt;'>
Page {page} of {total-pages}
</div>",
.MaxHeight = 25
}
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Content Here</h1>")
pdf.SaveAs("report.pdf")IronPDF的HtmlHeaderFooter類支持使用完整的HTML/CSS樣式,並包含用於動態頁碼的{total-pages}佔位符。
LGPL許可考量
Scryber.Core的LGPL許可創造了影響商業應用的特定義務:
LGPL要求:
- 對Scryber.Core程式庫本身的任何修改必須開源
- 應用程式必須允許使用者用修改過的版本替換LGPL程式庫
- 在某些商業發佈情景中可能需要源程式碼公開
IronPDF商業許可:
- 沒有源程式碼公開要求
- 沒有修改或發佈限制
- 許可清晰,沒有合規複雜性
- 包括專業支持
對於評估長期商業部署的組織,許可模式差異會顯著影響法律和合規規劃。
當團隊考慮Scryber.Core遷移時
開發團隊評估Scryber.Core替代方案的若干因素包括:
LGPL許可問題影響著要求源程式碼公開義務與業務需求相衝突的商業應用。 IronPDF的商業授權消除了這些限制。
有限的CSS支持成為設計中使用現代CSS功能的問題。 Scryber.Core的自訂解析器無法渲染Flexbox、CSS Grid或Chromium引擎本地處理的複雜樣式。
無JavaScript執行阻礙動態內容渲染。 單頁應用程式、圖表和互動內容需要JavaScript執行,而Scryber.Core無法提供。
專有模板語法增加了學習曲線,限制了開發者入門。 了解HTML/CSS的團隊必須學習Scryber的自訂綁定語法,而不是利用現有技能。
社群較小意味著故障排除資源較少,第三方文件較少。 IronPDF更大的社群提供更多範例和支持資源。
有限的非同步支持影響應用程式擴展性。 將目標定位於.NET 10和C# 14的現代.NET應用程式,從完整的非同步/等待支持中受益,遍及PDF生成管線。
優勢與取捨
Scryber.Core的優勢
- 開源且無直接授權費用(需遵循LGPL合規)
- 支持.NET環境的跨平台
- 對熟悉網路技術的開發者適用的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通過其基於Chromium的引擎提供了全面的功能。使用標準HTML/CSS模板、利用現有的網頁開發技能以及進行PDF操作的能力解決了團隊面臨的自訂解析器解決方案常見的限制。
在評估從Scryber.Core遷移到IronPDF時,團隊應考慮其關於CSS複雜性、JavaScript需求、授權偏好和模板工作流程偏好的具體需求。 對於以現代.NET平台為目標並具有基於網頁設計工作流程的團隊,IronPDF的架構與當代開發實踐更加自然地契合。
有關實施指導,請探索IronPDF HTML到PDF教程和文件,涵蓋.NET應用程式的PDF生成模式。
