C#'ta Scryber.Core'den IronPDF'ye Nasıl Geçilir
Scryber.Core'dan IronPDF'ye geçmek, PDF oluşturma iş akışınızı özel bir XHTML+CSS düzen motorundan tam CSS3 veJavaScriptdesteği olan birChromiumtabanlı render motoruna geçirir. Bu kılavuz, LGPL v3lisanslama hususları, Scryber'in XHTML-katılıkta şablon modeli ve iki motor arasındaki render farklılıklarını kapsayan adım-adım bir geçiş yolu sağlar.
Scryber.Core'dan IronPDF'ye Neden Geçiş Yapmalı
Scryber.Core'yi Anlamak
Scryber.Core (Richard Hewitson tarafından bakım yapılan, mevcut sürüm 9.3.1) kendi düzen motorunu kullanarak XHTML+CSS şablonlarını ayrıştıran, açık kaynağı bir kütüphanedir — bir tarayıcı değil. CSS stilini, Handlebars stilindeki {{ }} veri bağlamasını doc.Params üzerinden ve SVG'yi destekler, bu sayede tarayıcı bağımlılığı olmadan HTML odaklı PDF'ler isteyen gelişticiler için çekici hale gelir.
Scryber.Core, HTML-şablon tabanlı PDF oluşturma için uygun bir seçenek olmasına rağmen, birkaç kısıtlama ekipleri göç etmeye itiyor.
Göç Etmenin Temel Nedenleri
- LGPL v3 Lisans Endişeleri: Scryber'i kendiniz değiştirirseniz kaynak açıklama zorunlulukları uygulanır; kapalı kaynak uygulamalarda statik bağlantı izinlidir, ancak bu koşullar modifikasyonları nasıl dağıtacağınızı kısıtlar.
- XHTML-katılık Giriş: Şablonlar geçerli XML olmalıdır — çoğu gerçek dünya HTML'si, Scryber'ın bunu ayrıştırmadan önce temizlenmeye ihtiyaç duyar.
- Tarayıcı Dışı İşleyici: Özel bir XHTML/CSS düzen motoru — modern CSS (Grid, tam Flexbox, konteyner sorguları) ve herhangi birJavaScriptçalıştırılmaz.
- Daha Küçük Topluluk: Ana akım kütüphanelerden daha az çalışılmış örnek.
- JavaScript Çalıştırılmıyor: Yalnızca statik render — grafikler, SPA'lar ve dinamik widget'lar önceden işlenmelidir.
- Yerel URL'den PDF'e Özelliği Yok: HTML'i kendiniz almanız gerekiyor (örneğin,
HttpClientile) ve içeriye yedirmeniz gerekiyor. - Topluluk Desteği: Ticari destek seçenekleri sınırlıdır.
Scryber.Core ve IronPDF Karşılaştırması
| Aspekt | Scryber.Core | IronPDF |
|---|---|---|
| Lisans | LGPL v3 | Ticari |
| Oluşturma Motoru | Özel XHTML/CSS düzen motoru | Chromium |
| CSS Desteği | Alt küme (Grid yok, kısmi Flexbox) | Tam CSS3 |
| JavaScript | Yürütülmez | Tam (Chromium V8) |
| Şablon Bağlama | Handlebars stilinde {{ }} + <template> |
Standard (Razor, RazorLight, etc.) |
| Giriş Katılığı | İyi yapılandırılmış XHTML gerektirir | Gerçek dünya HTML'sini kabul eder |
| Asenkron Destek | PDFAsync MVC yardımcısı; sync core |
Tam asenkron API |
| Dokümantasyon | Belgeleri oku sitesi + örnekler | Kapsamlı |
| Topluluk Desteği | Daha küçük | Daha büyük |
| Ticari Destek | Topluluk destekli | Ticari destek mevcut |
IronPDF, Scryber.Core'a kıyasla ticari destek, dokümantasyon ve daha geniş bir kullanıcı tabanı sunar. Kütüphane, LGPL yükümlülükleri olmaksızın ticari kullanım için lisanslanmıştır.
Başlamadan Önce
Ön Koşullar
- .NET Ortamı: .NET Framework 4.6.2+ veya .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet Erişimi: NuGet paketlerini yükleyebilme
- IronPDF Lisansı: Lisans anahtarınızı ironpdf.com adresinden edinin
NuGet Paket Değişiklikleri
# 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
Lisans Yapılandırması
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Tam API Referansı
Ad Alanı Değişiklikleri
// Before: Scryber.Core
using Scryber.Components; // Document, Page, etc.
using Scryber.Drawing; // Units, colours
using Scryber.PDF; // RenderOptions / OutputCompressionType
using Scryber.Styles; // Style elements (older XML template usage)
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
// Before: Scryber.Core
using Scryber.Components; // Document, Page, etc.
using Scryber.Drawing; // Units, colours
using Scryber.PDF; // RenderOptions / OutputCompressionType
using Scryber.Styles; // Style elements (older XML template usage)
// After: IronPDF
using IronPdf;
using IronPdf.Rendering;
Imports Scryber.Components ' Document, Page, etc.
Imports Scryber.Drawing ' Units, colours
Imports Scryber.PDF ' RenderOptions / OutputCompressionType
Imports Scryber.Styles ' Style elements (older XML template usage)
' After: IronPDF
Imports IronPdf
Imports IronPdf.Rendering
Temel API Eşlemeleri
| Scryber.Core | IronPDF |
|---|---|
Document.ParseDocument(reader, "", ParseSourceType.DynamicContent) |
renderer.RenderHtmlAsPdf(html) |
Document.ParseDocument(path) |
renderer.RenderHtmlFileAsPdf(path) |
doc.SaveAsPDF(path) |
pdf.SaveAs(path) |
doc.SaveAsPDF(stream) |
pdf.BinaryData (byte[]) |
doc.Info.Title |
pdf.MetaData.Title |
doc.Info.Author |
pdf.MetaData.Author |
@page şablon içinde CSS |
renderer.RenderingOptions.PaperSize / kenar boşlukları |
doc.RenderOptions |
renderer.RenderingOptions |
Handlebars {{value}} + doc.Params |
Razor / dize değişmezleri |
Kod Göç Örnekleri
Örnek 1: Temel HTML'den PDF'ye Dönüştürme
Önce (Scryber.Core):
// NuGet: Install-Package Scryber.Core
using Scryber.Components;
using System.IO;
class Program
{
static void Main()
{
// Scryber requires well-formed XHTML wrapped in an html root with the xhtml namespace
string html = @"<html xmlns='http://www.w3.org/1999/xhtml'>
<body><h1>Hello World</h1><p>This is a PDF document.</p></body>
</html>";
using (var reader = new StringReader(html))
using (var doc = Document.ParseDocument(reader, string.Empty, ParseSourceType.DynamicContent))
using (var stream = new FileStream("output.pdf", FileMode.Create))
{
doc.SaveAsPDF(stream);
}
}
}
// NuGet: Install-Package Scryber.Core
using Scryber.Components;
using System.IO;
class Program
{
static void Main()
{
// Scryber requires well-formed XHTML wrapped in an html root with the xhtml namespace
string html = @"<html xmlns='http://www.w3.org/1999/xhtml'>
<body><h1>Hello World</h1><p>This is a PDF document.</p></body>
</html>";
using (var reader = new StringReader(html))
using (var doc = Document.ParseDocument(reader, string.Empty, ParseSourceType.DynamicContent))
using (var stream = new FileStream("output.pdf", FileMode.Create))
{
doc.SaveAsPDF(stream);
}
}
}
Imports Scryber.Components
Imports System.IO
Class Program
Shared Sub Main()
' Scryber requires well-formed XHTML wrapped in an html root with the xhtml namespace
Dim html As String = "<html xmlns='http://www.w3.org/1999/xhtml'>" &
"<body><h1>Hello World</h1><p>This is a PDF document.</p></body>" &
"</html>"
Using reader As New StringReader(html),
doc As Document = Document.ParseDocument(reader, String.Empty, ParseSourceType.DynamicContent),
stream As New FileStream("output.pdf", FileMode.Create)
doc.SaveAsPDF(stream)
End Using
End Sub
End Class
Sonrası (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
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()
{
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
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()
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
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 Class
Scryber.Core, XHTML dizesini bir StringReader içine alır, Document.ParseDocument ile beraber ParseSourceType.DynamicContent gönderir ve bir FileStream üzerinden PDF'i SaveAsPDF ile yazar. XHTML ad alanı bildirimi gereklidir — Scryber iyi yapılandırılmamış XML olan HTML'yi reddeder.
IronPDF, HTML'i doğrudan işlemek için ChromePdfRenderer örneği ile RenderHtmlAsPdf() kullanır ve SaveAs() ile kaydeder. Gerçek dünya HTML5 olduğu gibi kabul edilir. HTML'den PDF'e belgeler için daha fazla örneğe bakın.
Örnek 2: URL'den PDF'ye Dönüştürme
Önce (Scryber.Core):
// NuGet: Install-Package Scryber.Core
// Scryber has no native URL-to-PDF method — fetch the HTML yourself, then parse.
using Scryber.Components;
using System.IO;
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");
// Most live HTML is not valid XHTML; expect to clean it
// (e.g., HtmlAgilityPack) before Scryber will parse it.
using (var reader = new StringReader(html))
using (var doc = Document.ParseDocument(reader, string.Empty, ParseSourceType.DynamicContent))
using (var stream = new FileStream("webpage.pdf", FileMode.Create))
{
doc.SaveAsPDF(stream);
}
}
}
// NuGet: Install-Package Scryber.Core
// Scryber has no native URL-to-PDF method — fetch the HTML yourself, then parse.
using Scryber.Components;
using System.IO;
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");
// Most live HTML is not valid XHTML; expect to clean it
// (e.g., HtmlAgilityPack) before Scryber will parse it.
using (var reader = new StringReader(html))
using (var doc = Document.ParseDocument(reader, string.Empty, ParseSourceType.DynamicContent))
using (var stream = new FileStream("webpage.pdf", FileMode.Create))
{
doc.SaveAsPDF(stream);
}
}
}
Imports Scryber.Components
Imports System.IO
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")
' Most live HTML is not valid XHTML; expect to clean it
' (e.g., HtmlAgilityPack) before Scryber will parse it.
Using reader As New StringReader(html)
Using doc As Document = Document.ParseDocument(reader, String.Empty, ParseSourceType.DynamicContent)
Using stream As New FileStream("webpage.pdf", FileMode.Create)
doc.SaveAsPDF(stream)
End Using
End Using
End Using
End Using
End Function
End Module
Sonrası (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
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()
{
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://www.example.com");
pdf.SaveAs("webpage.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
Dim renderer As New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://www.example.com")
pdf.SaveAs("webpage.pdf")
End Sub
End Class
Scryber.Core'un yerel URL'den PDF'ye girişi yoktur. HTML'i kendiniz HttpClient.GetStringAsync() ile alırsınız ve Document.ParseDocument() içine yedirirsiniz. Scryber iyi yapılandırılmış XHTML gerektirdiğinden, çoğu canlı sayfanın ayrıştırılmadan önce temizlenmesi gerekir (örneğin HtmlAgilityPack aracılığıyla).JavaScriptçalıştırılmaz, bu nedenle dinamik olarak oluşturulan içerik eksik olacaktır.
IronPDF'nin RenderUrlAsPdf() bileşeni,Chromiummotoru üzerinden tek bir çağrı ile alımı,JavaScriptyürütülmesini ve CSS işlenmesini sağlar. Daha fazla bilgi için eğitimlerimize göz atın.
Örnek 3: Özel Sayfa Ayarları ve Kenarlar
Önce (Scryber.Core):
// NuGet: Install-Package Scryber.Core
// Page size and margins are normally declared in the XHTML/CSS template;
// the runtime RenderOptions object exposes output-side settings such as compression.
using Scryber.Components;
using Scryber.PDF;
using System.IO;
class Program
{
static void Main()
{
// Page size and margins go in CSS @page; this is the Scryber idiom.
string html = @"<html xmlns='http://www.w3.org/1999/xhtml'>
<head>
<style>
@page { size: A4 portrait; margin: 40pt; }
</style>
</head>
<body><h1>Custom PDF</h1><p>With custom margins and settings.</p></body>
</html>";
using (var reader = new StringReader(html))
using (var doc = Document.ParseDocument(reader, string.Empty, ParseSourceType.DynamicContent))
using (var stream = new FileStream("custom.pdf", FileMode.Create))
{
// Output-side options (compression / conformance) are on RenderOptions.
doc.RenderOptions.Compression = OutputCompressionType.FlateDecode;
doc.SaveAsPDF(stream);
}
}
}
// NuGet: Install-Package Scryber.Core
// Page size and margins are normally declared in the XHTML/CSS template;
// the runtime RenderOptions object exposes output-side settings such as compression.
using Scryber.Components;
using Scryber.PDF;
using System.IO;
class Program
{
static void Main()
{
// Page size and margins go in CSS @page; this is the Scryber idiom.
string html = @"<html xmlns='http://www.w3.org/1999/xhtml'>
<head>
<style>
@page { size: A4 portrait; margin: 40pt; }
</style>
</head>
<body><h1>Custom PDF</h1><p>With custom margins and settings.</p></body>
</html>";
using (var reader = new StringReader(html))
using (var doc = Document.ParseDocument(reader, string.Empty, ParseSourceType.DynamicContent))
using (var stream = new FileStream("custom.pdf", FileMode.Create))
{
// Output-side options (compression / conformance) are on RenderOptions.
doc.RenderOptions.Compression = OutputCompressionType.FlateDecode;
doc.SaveAsPDF(stream);
}
}
}
Imports Scryber.Components
Imports Scryber.PDF
Imports System.IO
Module Program
Sub Main()
' Page size and margins go in CSS @page; this is the Scryber idiom.
Dim html As String = "<html xmlns='http://www.w3.org/1999/xhtml'>" &
"<head>" &
"<style>" &
"@page { size: A4 portrait; margin: 40pt; }" &
"</style>" &
"</head>" &
"<body><h1>Custom PDF</h1><p>With custom margins and settings.</p></body>" &
"</html>"
Using reader As New StringReader(html),
doc As Document = Document.ParseDocument(reader, String.Empty, ParseSourceType.DynamicContent),
stream As New FileStream("custom.pdf", FileMode.Create)
' Output-side options (compression / conformance) are on RenderOptions.
doc.RenderOptions.Compression = OutputCompressionType.FlateDecode
doc.SaveAsPDF(stream)
End Using
End Sub
End Module
Sonrası (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
class Program
{
static void Main()
{
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
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()
{
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
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()
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
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 Class
Scryber.Core içinde, sayfa boyutu ve kenar boşlukları @page CSS üzerinden şablonda tanımlanırken, doc.RenderOptions sıkıştırma gibi çıkış tarafı ayarlarını (OutputCompressionType.FlateDecode) ortaya çıkarır.
IronPDF sayfa geometrisini işleyici üzerinde RenderingOptions taşıyor: PaperSize (olarak ayarlanmış PdfPaperSize.A4), MarginTop ve MarginBottom milimetre cinsinden. Sayfa geometrisi şablonun içinde değil, API yüzeyinde bulunur.
Şablon Göç Modelleri
Scryber Bağlamadan Standart Şablonlara Geçiş
Scryber.Core, Handlebars stilinde {{ }} bağlamaları (doc.Params ile çözülmüş) ve tekrarlayan bölümler için bir <template data-bind='...'> yapısı ile XHTML kullanır. Geçiş yapmak için bunları standart .NET şablonlamada tekrar ifade edin:
Scryber Binding (XHTML + Handlebars):
<p>{{model.Name}}</p>
<p>Total: {{model.Total}}</p>
<template data-bind='{{model.Items}}'>
<p>{{.Name}}: {{.Price}}</p>
</template>
<p>{{model.Name}}</p>
<p>Total: {{model.Total}}</p>
<template data-bind='{{model.Items}}'>
<p>{{.Name}}: {{.Price}}</p>
</template>
IronPDF ile C# Dize İnterpolasyonu:
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);
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 = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf(html)
IronPDF sade HTML kabul ettiğinden, Scryber'ın {{ }} + <template> yapılarının aksine herhangi bir .NET şablon motorunu — Razor, RazorLight, Handlebars.Net — kullanabilirsiniz.
Üstbilgiler ve Altbilgiler Göçü
Scryber.Core (XHTML + @page kenar kutuları):
<html xmlns='http://www.w3.org/1999/xhtml'>
<head>
<style>
@page {
@top-center { content: 'Company Report'; }
@bottom-center { content: 'Page ' counter(page) ' of ' counter(pages); }
}
</style>
</head>
<body>
<h1>Content Here</h1>
</body>
</html>
<html xmlns='http://www.w3.org/1999/xhtml'>
<head>
<style>
@page {
@top-center { content: 'Company Report'; }
@bottom-center { content: 'Page ' counter(page) ' of ' counter(pages); }
}
</style>
</head>
<body>
<h1>Content Here</h1>
</body>
</html>
IronPDF (HTML üstbilgiler/altbilgiler):
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")
Scryber.Core, CSS'de @page kenar kutuları üzerinden başlıklar ve alt bilgi tanımlar ve sayfa numaraları için counter(page) ve counter(pages) kullanır. IronPDF, başlıklar ve alt bilgileri için tam HTML/CSS ile HtmlHeaderFooter ve yer tutucular {page} ve {total-pages} kullanır.
Geçiş Sonrası Yeni Özellikler
IronPDF'ye geçtikten sonra, Scryber.Core'un sunamayacağı yetenekler kazanırsınız:
PDF Birleştirme
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");
Dim pdf1 = PdfDocument.FromFile("chapter1.pdf")
Dim pdf2 = PdfDocument.FromFile("chapter2.pdf")
Dim pdf3 = PdfDocument.FromFile("chapter3.pdf")
Dim merged = PdfDocument.Merge(pdf1, pdf2, pdf3)
merged.SaveAs("complete_book.pdf")
Güvenlik ve Meta Veri
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");
Dim renderer = New ChromePdfRenderer()
Dim 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")
Özellik Karşılaştırması Özeti
| Özellik | Scryber.Core | IronPDF |
|---|---|---|
| HTML'den PDF'ye | Özel düzen motoruyla XHTML+CSS | Tam Chromium |
| URL'yi PDF'ye çevir | Sadece manuel veri çekme | Yerel RenderUrlAsPdf |
| CSS Izgarası | Desteklenmiyor | Tam destek |
| Flexbox | Kısmi | Tam destek |
| JavaScript | Yürütülmez | Tam (V8) |
| Veri Bağlama | {{ }} Handlebars + doc.Params |
Razor / RazorLight / değişmezler |
| Başlıklar/Altbilgiler | @page kenar kutuları / şablon bölümleri |
HtmlHeaderFooter ile {page} {total-pages} |
| PDF'leri birleştir | Desteklenmiyor | Yerleşik PdfDocument.Merge |
| PDF Ayırma | Desteklenmiyor | Evet |
| Filigranlar | Şablonda yerleşik HTML üzerinden | Yerel ApplyStamp / ApplyWatermark |
| Dijital İmzalar | Desteklenmiyor | Evet |
| PDF/A | Desteklenmiyor | Evet (PDF/A-1b, PDF/A-3) |
| Şifre Koruması | Desteklenmiyor | Tam (kullanıcı/sahip + izinler) |
| Asenkron Destek | PDFAsync MVC yardımcısı; sync core |
Tam async yüzey |
| Platformlar Arası | Evet(.NET Std 2.0/2.1, .NET 8/9/10) | Evet |
Geçiş Kontrol Listesi
Öncesi-Geçiş
- Tüm Scryber şablonlarını XHTML/bağlama düzenleri için denetleyin
- Kullanılan doküman veri bağlama desenleri (
{{model.Property}}) - CSS dönüşümü gerektiren özel stilleri belirleyin
- ironpdf.com adresinden IronPDF lisans anahtarını edinin
Kod Güncellemeleri
Scryber.CoreNuGet paketini kaldırIronPdfNuGet paketini yükle- Namespace içe aktarımlarını güncelle (
using Scryber.Components;/Scryber.Drawing;/Scryber.PDF;→using IronPdf;) Document.ParseDocument(reader, "", ParseSourceType.DynamicContent)'irenderer.RenderHtmlAsPdf(html)ile değiştirdoc.SaveAsPDF(stream)'ipdf.SaveAs(path)veyapdf.BinaryDataile değiştir- XHTML şablonlarını düz HTML5'e dönüştürün (ad alanı gerekliliği yoktur)
{{ }}Handlebars bağlamasını standart şablonla (Razor / dize interpolasyonu) değiştir@pageCSS'irenderer.RenderingOptions(PaperSize, MarginTop, vb.)'ye taşı@pagekenar kutusu başlıklarını/alt bilgileriniHtmlHeaderFooter'a,{page}ve{total-pages}yer tutucularla birlikte dönüştür- Uygulama başlangıcında lisans başlatma ekle
Test Etme
- Tüm belge şablonlarını test edin
- Stil eşlemeleri doğrulayın (tam CSS desteğinden yararlanın)
- Yeni şablonlama ile veri bağlamayı test edin
- Sayfa kesilmelerini doğrulayın
- Yer tutucuları içeren üstbilgileri/altbilgileri test edin
- Performans karşılaştırması

