jsreport'tan IronPDF'e C# ile Nasıl Geçilir
jsreport'den IronPDF'ye geçiş yapmak, .NET PDF iş akışınızı dışa bağımlı ikili yönetimi ve ayrı sunucu süreçleri olan Node.js bağımlı bir sistemden, tamamen işlem içinde çalışan saf bir .NET kütüphanesine dönüştürür. Bu kılavuz, profesyonel .NET geliştiricileri için altyapı karmaşıklığını ve JavaScript şablonlama gerekliliklerini ortadan kaldıran kapsamlı, adım adım bir geçiş yolu sağlar.
jsreport'den IronPDF'ye Neden Geçiş Yapmalısınız
jsreport Zorlukları
jsreport, saf bir .NET ortamında yeri olmayan karmaşıklıklar ekler:
-
Node.js Bağımlılığı: Basit bir .NET uygulamasının gerektirmemesi gereken altyapı karmaşıklığını artıran Node.js çalışma zamanı ve ikilileri gerektirir.
-
Dış İkili Yönetimi: Windows, Linux ve OSX için platforma özgü ikili dosyaları ayrı NuGet paketleri (
jsreport.Binary,jsreport.Binary.Linux,jsreport.Binary.OSX) aracılığıyla indirilmeli ve yönetilmelidir. -
Ayrı Sunucu Süreci: Bir yardımcı program veya web sunucusu olarak çalışır—
StartAsync()veKillAsync()yaşam döngüsü yöntemleri ile ek süreç yönetimi gereklidir. -
JavaScript Şablonlama: Yerel C# yeteneklerini kullanmak yerine Handlebars, JsRender veya diğer JavaScript şablonlama sistemlerini öğrenmeye zorlar.
-
Karmaşık İstek Yapısı: Basit bir PDF oluşturma için bile iç içe geçmiş
Templateyapılandırmaları içeren ayrıntılıRenderRequestnesneleri gerektirir. -
Lisanslama Sınırlamaları: Ücretsiz katman, örnek başına 5 şablonla sınırlıdır; bundan öte ticari kullanım bir Enterprise lisansı ($395/yıl örnek başına) veya Enterprise Ölçek ($1,295/yıl, örnekler arasında telif ücretsiz) gerektirir. jsreport.net/buy adresine bakın.
- Akış Tabanlı Çıktı: Elle dosya işlemleri ve bellek akışı yönetimi gerektiren akışlar döndürür.
jsreport vs IronPDF Karşılaştırması
| Özellik | jsreport | IronPDF |
|---|---|---|
| Çalışma Zamanı | Node.js + .NET | Saf .NET |
| İkili Yönetim | Manuel (jsreport.Binary paketleri) | Otomatik |
| Sunucu Süreci | Gerekli (yardımcı program veya web sunucusu) | İşlem içi |
| Şablonlama | JavaScript (Handlebars, vb.) | C# (Razor, dize interpolasyonu) |
| API Tarzı | Ayrıntılı istek nesneleri | Temiz akıcı yöntemler |
| Çıktı | Akış | PdfDocument nesnesi |
| PDF Manipülasyonu | Sınırlı | Kapsamlı (birleştir, ayır, düzenle) |
| Asenkron Destek | Sadece Async | Hem senkron hem asenkron |
.NET 10 ve C# 14'e geçmeyi planlayan ekipler için IronPDF, harici çalışma zamanı bağımlılıkları olmadan yerel bir .NET temeli sağlar.
Göç Karmaşıklığı Değerlendirmesi
Özelliklere Göre Tahmini Çaba
| Özellik | Göç Karmaşıklığı |
|---|---|
| HTML'den PDF'ye | Çok Düşük |
| URL'yi PDF'ye çevir | Çok Düşük |
| Başlıklar/Altbilgiler | Düşük |
| Sayfa Ayarları | Düşük |
| Sunucu Yaşam Döngüsü | Düşük |
| İkili Yönetim | Düşük |
Paradigma Değişimi
Bu jsreport geçişindeki temel değişim, sunucu yönetimi ile ayrıntılı istek nesnelerinden basit işlem içi yöntem çağrılarına geçiştir:
jsreport: LocalReporting().UseBinary().AsUtility().Create() → RenderAsync(RenderRequest) → Akış→ File
IronPDF: ChromePdfRenderer → RenderHtmlAsPdf(html) → SaveAs()
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 jsreport packages
dotnet remove package jsreport.Binary
dotnet remove package jsreport.Binary.Linux
dotnet remove package jsreport.Binary.OSX
dotnet remove package jsreport.Local
dotnet remove package jsreport.Types
dotnet remove package jsreport.Client
# Install IronPDF
dotnet add package IronPdf
# Remove jsreport packages
dotnet remove package jsreport.Binary
dotnet remove package jsreport.Binary.Linux
dotnet remove package jsreport.Binary.OSX
dotnet remove package jsreport.Local
dotnet remove package jsreport.Types
dotnet remove package jsreport.Client
# Install IronPDF
dotnet add package IronPdf
Lisans Yapılandırması
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
// Add at application startup (Program.cs or Startup.cs)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY";
' Add at application startup (Program.vb or Startup.vb)
IronPdf.License.LicenseKey = "YOUR-LICENSE-KEY"
jsreport Kullanımını Belirleme
# Find all jsreport references
grep -r "using jsreport\|LocalReporting\|RenderRequest\|RenderAsync" --include="*.cs" .
grep -r "JsReportBinary\|Template\|Recipe\|Engine\." --include="*.cs" .
# Find all jsreport references
grep -r "using jsreport\|LocalReporting\|RenderRequest\|RenderAsync" --include="*.cs" .
grep -r "JsReportBinary\|Template\|Recipe\|Engine\." --include="*.cs" .
Tam API Referansı
Sınıf Eşlemeleri
| jsreport Sınıfı | IronPDF Eşdeğeri |
|---|---|
LocalReporting |
ChromePdfRenderer |
ReportingService |
ChromePdfRenderer |
RenderRequest |
Metot parametreleri |
Template |
Metot parametreleri |
Chrome |
RenderingOptions |
Report |
PdfDocument |
Engine |
(gerekli değil) |
Yöntem Eşlemeleri
| jsreport Yöntemi | IronPDF Eşdeğeri |
|---|---|
LocalReporting().UseBinary().AsUtility().Create() |
new ChromePdfRenderer() |
rs.RenderAsync(request) |
renderer.RenderHtmlAsPdf(html) |
rs.StartAsync() |
(gerekli değil) |
rs.KillAsync() |
(gerekli değil) |
report.Content.CopyTo(stream) |
pdf.SaveAs(path) veya pdf.BinaryData |
RenderRequest Özellik Eşlemeleri
| jsreport Şablon Özelliği | IronPDF Eşdeğeri |
|---|---|
Template.Content |
RenderHtmlAsPdf() için ilk parametre |
Template.Recipe = Recipe.ChromePdf |
(gerekli değil) |
Template.Engine = Engine.None |
(gerekli değil) |
Chrome.HeaderTemplate |
RenderingOptions.TextHeader veya HtmlHeader |
Chrome.FooterTemplate |
RenderingOptions.TextFooter veya HtmlFooter |
Chrome.DisplayHeaderFooter |
(otomatik) |
Chrome.MarginTop |
RenderingOptions.MarginTop |
Yer Tutucu Eşlemeleri (Üstbilgi/Altbilgi)
| jsreport Yer Tutucu | IronPDF Yer Tutucu |
|---|---|
<span class='pageNumber'></span> |
{page} |
<span class='totalPages'></span> |
{total-pages} |
{#pageNum} |
{page} |
{#numPages} |
{total-pages} |
{#timestamp} |
{date} |
Kod Göç Örnekleri
Örnek 1: Temel HTML'den PDF'ye
Önce (jsreport):
// NuGet: Install-Package jsreport.Binary
// NuGet: Install-Package jsreport.Local
// NuGet: Install-Package jsreport.Types
using jsreport.Binary;
using jsreport.Local;
using jsreport.Types;
using System;
using System.IO;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
var rs = new LocalReporting()
.UseBinary(JsReportBinary.GetBinary())
.AsUtility()
.Create();
var report = await rs.RenderAsync(new RenderRequest()
{
Template = new Template()
{
Recipe = Recipe.ChromePdf,
Engine = Engine.None,
Content = "<h1>Hello from jsreport</h1><p>This is a PDF document.</p>"
}
});
using (var fileStream = File.Create("output.pdf"))
{
report.Content.CopyTo(fileStream);
}
Console.WriteLine("PDF created successfully!");
}
}
// NuGet: Install-Package jsreport.Binary
// NuGet: Install-Package jsreport.Local
// NuGet: Install-Package jsreport.Types
using jsreport.Binary;
using jsreport.Local;
using jsreport.Types;
using System;
using System.IO;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
var rs = new LocalReporting()
.UseBinary(JsReportBinary.GetBinary())
.AsUtility()
.Create();
var report = await rs.RenderAsync(new RenderRequest()
{
Template = new Template()
{
Recipe = Recipe.ChromePdf,
Engine = Engine.None,
Content = "<h1>Hello from jsreport</h1><p>This is a PDF document.</p>"
}
});
using (var fileStream = File.Create("output.pdf"))
{
report.Content.CopyTo(fileStream);
}
Console.WriteLine("PDF created successfully!");
}
}
Imports jsreport.Binary
Imports jsreport.Local
Imports jsreport.Types
Imports System
Imports System.IO
Imports System.Threading.Tasks
Module Program
Async Function Main(args As String()) As Task
Dim rs = (New LocalReporting()) _
.UseBinary(JsReportBinary.GetBinary()) _
.AsUtility() _
.Create()
Dim report = Await rs.RenderAsync(New RenderRequest() With {
.Template = New Template() With {
.Recipe = Recipe.ChromePdf,
.Engine = Engine.None,
.Content = "<h1>Hello from jsreport</h1><p>This is a PDF document.</p>"
}
})
Using fileStream = File.Create("output.pdf")
report.Content.CopyTo(fileStream)
End Using
Console.WriteLine("PDF created successfully!")
End Function
End Module
Sonrası (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello from IronPDF</h1><p>This is a PDF document.</p>");
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully!");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello from IronPDF</h1><p>This is a PDF document.</p>");
pdf.SaveAs("output.pdf");
Console.WriteLine("PDF created successfully!");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main(args As String())
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Hello from IronPDF</h1><p>This is a PDF document.</p>")
pdf.SaveAs("output.pdf")
Console.WriteLine("PDF created successfully!")
End Sub
End Class
jsreport yaklaşımı üç NuGet paketi (jsreport.Binary, jsreport.Local, jsreport.Types), üç ad alanı içe aktarması, yalnızca eşzamanlı yürütme, akıcı bir oluşturucu zinciri (LocalReporting().UseBinary().AsUtility().Create()), ayrıca iç içe geçmiş Template nesneleri ile sabitlenmiş ayrıntılı RenderRequest ve bir using bloğu ile manuel akıştan dosyaya kopyalamayı gerektirir.
IronPDF bunu bir NuGet paketi, bir namespace, üç satır kod ve senkron çalışma olarak indirir. ChromePdfRenderer.RenderHtmlAsPdf() yöntemi HTML'yi doğrudan kabul eder ve basit bir SaveAs() yöntemiyle bir PdfDocument döndürür. HTML'den PDF'ye belgelemeyi ek işleme seçenekleri için inceleyin.
Örnek 2: URL'den PDF'e
Önce (jsreport):
// NuGet: Install-Package jsreport.Binary
// NuGet: Install-Package jsreport.Local
// NuGet: Install-Package jsreport.Types
using jsreport.Binary;
using jsreport.Local;
using jsreport.Types;
using System;
using System.IO;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
var rs = new LocalReporting()
.UseBinary(JsReportBinary.GetBinary())
.AsUtility()
.Create();
var report = await rs.RenderAsync(new RenderRequest()
{
Template = new Template()
{
Recipe = Recipe.ChromePdf,
Engine = Engine.None,
Content = "<html><body><script>window.location='https://example.com';</script></body></html>"
}
});
using (var fileStream = File.Create("webpage.pdf"))
{
report.Content.CopyTo(fileStream);
}
Console.WriteLine("Webpage PDF created successfully!");
}
}
// NuGet: Install-Package jsreport.Binary
// NuGet: Install-Package jsreport.Local
// NuGet: Install-Package jsreport.Types
using jsreport.Binary;
using jsreport.Local;
using jsreport.Types;
using System;
using System.IO;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
var rs = new LocalReporting()
.UseBinary(JsReportBinary.GetBinary())
.AsUtility()
.Create();
var report = await rs.RenderAsync(new RenderRequest()
{
Template = new Template()
{
Recipe = Recipe.ChromePdf,
Engine = Engine.None,
Content = "<html><body><script>window.location='https://example.com';</script></body></html>"
}
});
using (var fileStream = File.Create("webpage.pdf"))
{
report.Content.CopyTo(fileStream);
}
Console.WriteLine("Webpage PDF created successfully!");
}
}
Imports jsreport.Binary
Imports jsreport.Local
Imports jsreport.Types
Imports System
Imports System.IO
Imports System.Threading.Tasks
Module Program
Async Function Main(args As String()) As Task
Dim rs = (New LocalReporting()) _
.UseBinary(JsReportBinary.GetBinary()) _
.AsUtility() _
.Create()
Dim report = Await rs.RenderAsync(New RenderRequest() With {
.Template = New Template() With {
.Recipe = Recipe.ChromePdf,
.Engine = Engine.None,
.Content = "<html><body><script>window.location='https://example.com';</script></body></html>"
}
})
Using fileStream = File.Create("webpage.pdf")
report.Content.CopyTo(fileStream)
End Using
Console.WriteLine("Webpage PDF created successfully!")
End Function
End Module
Sonrası (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://example.com");
pdf.SaveAs("webpage.pdf");
Console.WriteLine("Webpage PDF created successfully!");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using System;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://example.com");
pdf.SaveAs("webpage.pdf");
Console.WriteLine("Webpage PDF created successfully!");
}
}
Imports IronPdf
Imports System
Class Program
Shared Sub Main(ByVal args As String())
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://example.com")
pdf.SaveAs("webpage.pdf")
Console.WriteLine("Webpage PDF created successfully!")
End Sub
End Class
jsreport, istekte Chrome.Url ayarlayarak URL'yi oluşturabilir, ancak üst düzey bir kolaylık yöntemi yoktur — ve mevcut koddaki yaygın bir kalıp, yukarıda gösterildiği gibi JavaScript yönlendirme çözümüdür (window.location='https://example.com') ve komut dosyasıyla gezinmeyi engelleyen sitelerde başarısız olabilir.
IronPDF, URL'yi doğrudan argüman olarak alan, tam JavaScript yürütme ve modern CSS desteği sunan özel bir RenderUrlAsPdf() yöntemi sağlar. URL'den PDF'e dönüştürme hakkında daha fazla bilgi edinin.
Örnek 3: Üstbilgi ve Altbilgili PDF
Önce (jsreport):
// NuGet: Install-Package jsreport.Binary
// NuGet: Install-Package jsreport.Local
// NuGet: Install-Package jsreport.Types
using jsreport.Binary;
using jsreport.Local;
using jsreport.Types;
using System;
using System.IO;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
var rs = new LocalReporting()
.UseBinary(JsReportBinary.GetBinary())
.AsUtility()
.Create();
var report = await rs.RenderAsync(new RenderRequest()
{
Template = new Template()
{
Recipe = Recipe.ChromePdf,
Engine = Engine.None,
Content = "<h1>Document with Header and Footer</h1><p>Main content goes here.</p>",
Chrome = new Chrome()
{
DisplayHeaderFooter = true,
HeaderTemplate = "<div style='font-size:10px; text-align:center; width:100%;'>Custom Header</div>",
FooterTemplate = "<div style='font-size:10px; text-align:center; width:100%;'>Page <span class='pageNumber'></span> of <span class='totalPages'></span></div>"
}
}
});
using (var fileStream = File.Create("document_with_headers.pdf"))
{
report.Content.CopyTo(fileStream);
}
Console.WriteLine("PDF with headers and footers created successfully!");
}
}
// NuGet: Install-Package jsreport.Binary
// NuGet: Install-Package jsreport.Local
// NuGet: Install-Package jsreport.Types
using jsreport.Binary;
using jsreport.Local;
using jsreport.Types;
using System;
using System.IO;
using System.Threading.Tasks;
class Program
{
static async Task Main(string[] args)
{
var rs = new LocalReporting()
.UseBinary(JsReportBinary.GetBinary())
.AsUtility()
.Create();
var report = await rs.RenderAsync(new RenderRequest()
{
Template = new Template()
{
Recipe = Recipe.ChromePdf,
Engine = Engine.None,
Content = "<h1>Document with Header and Footer</h1><p>Main content goes here.</p>",
Chrome = new Chrome()
{
DisplayHeaderFooter = true,
HeaderTemplate = "<div style='font-size:10px; text-align:center; width:100%;'>Custom Header</div>",
FooterTemplate = "<div style='font-size:10px; text-align:center; width:100%;'>Page <span class='pageNumber'></span> of <span class='totalPages'></span></div>"
}
}
});
using (var fileStream = File.Create("document_with_headers.pdf"))
{
report.Content.CopyTo(fileStream);
}
Console.WriteLine("PDF with headers and footers created successfully!");
}
}
Imports jsreport.Binary
Imports jsreport.Local
Imports jsreport.Types
Imports System
Imports System.IO
Imports System.Threading.Tasks
Module Program
Async Function Main(args As String()) As Task
Dim rs = New LocalReporting() _
.UseBinary(JsReportBinary.GetBinary()) _
.AsUtility() _
.Create()
Dim report = Await rs.RenderAsync(New RenderRequest() With {
.Template = New Template() With {
.Recipe = Recipe.ChromePdf,
.Engine = Engine.None,
.Content = "<h1>Document with Header and Footer</h1><p>Main content goes here.</p>",
.Chrome = New Chrome() With {
.DisplayHeaderFooter = True,
.HeaderTemplate = "<div style='font-size:10px; text-align:center; width:100%;'>Custom Header</div>",
.FooterTemplate = "<div style='font-size:10px; text-align:center; width:100%;'>Page <span class='pageNumber'></span> of <span class='totalPages'></span></div>"
}
}
})
Using fileStream = File.Create("document_with_headers.pdf")
report.Content.CopyTo(fileStream)
End Using
Console.WriteLine("PDF with headers and footers created successfully!")
End Function
End Module
Sonrası (IronPDF):
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
{
CenterText = "Custom Header",
FontSize = 10
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
{
CenterText = "Page {page} of {total-pages}",
FontSize = 10
};
var pdf = renderer.RenderHtmlAsPdf("<h1>Document with Header and Footer</h1><p>Main content goes here.</p>");
pdf.SaveAs("document_with_headers.pdf");
Console.WriteLine("PDF with headers and footers created successfully!");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
using IronPdf.Rendering;
using System;
class Program
{
static void Main(string[] args)
{
var renderer = new ChromePdfRenderer();
renderer.RenderingOptions.TextHeader = new TextHeaderFooter()
{
CenterText = "Custom Header",
FontSize = 10
};
renderer.RenderingOptions.TextFooter = new TextHeaderFooter()
{
CenterText = "Page {page} of {total-pages}",
FontSize = 10
};
var pdf = renderer.RenderHtmlAsPdf("<h1>Document with Header and Footer</h1><p>Main content goes here.</p>");
pdf.SaveAs("document_with_headers.pdf");
Console.WriteLine("PDF with headers and footers created successfully!");
}
}
Imports IronPdf
Imports IronPdf.Rendering
Imports System
Module Program
Sub Main(args As String())
Dim renderer As New ChromePdfRenderer()
renderer.RenderingOptions.TextHeader = New TextHeaderFooter() With {
.CenterText = "Custom Header",
.FontSize = 10
}
renderer.RenderingOptions.TextFooter = New TextHeaderFooter() With {
.CenterText = "Page {page} of {total-pages}",
.FontSize = 10
}
Dim pdf = renderer.RenderHtmlAsPdf("<h1>Document with Header and Footer</h1><p>Main content goes here.</p>")
pdf.SaveAs("document_with_headers.pdf")
Console.WriteLine("PDF with headers and footers created successfully!")
End Sub
End Module
jsreport yaklaşımı, Template üzerine bir Chrome nesnesi eklenmesini, DisplayHeaderFooter = true ayarlanmasını ve özel CSS sınıf yer tutucuları (<span class='pageNumber'></span>, <span class='totalPages'></span>) ile HTML şablonlarının kullanılmasını gerektirir. Üstbilgi ve altbilgi şablonları tam satır içi stil içerir.
IronPDF, CenterText, LeftText, RightText ve FontSize için özel özellikler içeren daha temiz bir TextHeaderFooter yapılandırması sağlar. Sayfa numarası yer tutucuları daha basit {page} ve {total-pages} söz dizimini kullanır. Üstbilgi ve altbilgi dokümantasyonunda HTML üstbilgi seçeneklerini görün.
Kritik Taşıma Notları
Sunucu Yaşam Döngüsü Yönetimi Ortadan Kaldır
Jsreport, açık sunucu yaşam döngüsü yönetimi gerektirir:
// jsreport (DELETE THIS):
var rs = new LocalReporting()
.UseBinary(JsReportBinary.GetBinary())
.AsUtility()
.Create();
// Or for web server mode:
var rs = new LocalReporting()
.UseBinary(JsReportBinary.GetBinary())
.AsWebServer()
.Create();
await rs.StartAsync();
// ... use rs ...
await rs.KillAsync();
// jsreport (DELETE THIS):
var rs = new LocalReporting()
.UseBinary(JsReportBinary.GetBinary())
.AsUtility()
.Create();
// Or for web server mode:
var rs = new LocalReporting()
.UseBinary(JsReportBinary.GetBinary())
.AsWebServer()
.Create();
await rs.StartAsync();
// ... use rs ...
await rs.KillAsync();
' jsreport (DELETE THIS):
Dim rs = (New LocalReporting()) _
.UseBinary(JsReportBinary.GetBinary()) _
.AsUtility() _
.Create()
' Or for web server mode:
rs = (New LocalReporting()) _
.UseBinary(JsReportBinary.GetBinary()) _
.AsWebServer() _
.Create()
Await rs.StartAsync()
' ... use rs ...
Await rs.KillAsync()
IronPDF tamamen işlem içi çalışır—sunucu başlatma yok, süreç yönetimi yok, temizlik yok:
// IronPDF:
var renderer = new ChromePdfRenderer();
// Just use it—no lifecycle management needed
// IronPDF:
var renderer = new ChromePdfRenderer();
// Just use it—no lifecycle management needed
Platforma Özgü İkili Paketleri Kaldır
Jsreport, her hedef platform için ayrı NuGet paketleri gerektirir:
# DELETE these platform-specific packages:
dotnet remove package jsreport.Binary
dotnet remove package jsreport.Binary.Linux
dotnet remove package jsreport.Binary.OSX
# DELETE these platform-specific packages:
dotnet remove package jsreport.Binary
dotnet remove package jsreport.Binary.Linux
dotnet remove package jsreport.Binary.OSX
IronPDF, tek bir NuGet paketi aracılığıyla tüm platform gereksinimlerini otomatik olarak halleder.
Yer Tutucu Sözdizimini Güncelleyin
Jsreport, CSS sınıf tabanlı veya süslü ayraç yer tutucuları kullanır.IronPDF farklı bir sözdizimi kullanır:
// jsreport placeholders:
"<span class='pageNumber'></span>" // or {#pageNum}
"<span class='totalPages'></span>" // or {#numPages}
//IronPDF placeholders:
"{page}"
"{total-pages}"
"{date}"
"{html-title}"
// jsreport placeholders:
"<span class='pageNumber'></span>" // or {#pageNum}
"<span class='totalPages'></span>" // or {#numPages}
//IronPDF placeholders:
"{page}"
"{total-pages}"
"{date}"
"{html-title}"
' jsreport placeholders:
"<span class='pageNumber'></span>" ' or {#pageNum}
"<span class='totalPages'></span>" ' or {#numPages}
' IronPDF placeholders:
"{page}"
"{total-pages}"
"{date}"
"{html-title}"
Handlebars'ı C# Dize Interpolasyonu ile Değiştirin
jsreport sıkça Engine.Handlebars ile Handlebars şablonlamayı kullanır:
// jsreport Handlebars (DELETE THIS):
Template = new Template
{
Content = "<h1>Hello, {{name}}</h1>",
Engine = Engine.Handlebars
},
Data = new { name = "World" }
//IronPDF with C# string interpolation:
string name = "World";
string html = $"<h1>Hello, {name}</h1>";
var pdf = renderer.RenderHtmlAsPdf(html);
// jsreport Handlebars (DELETE THIS):
Template = new Template
{
Content = "<h1>Hello, {{name}}</h1>",
Engine = Engine.Handlebars
},
Data = new { name = "World" }
//IronPDF with C# string interpolation:
string name = "World";
string html = $"<h1>Hello, {name}</h1>";
var pdf = renderer.RenderHtmlAsPdf(html);
Imports IronPdf
' jsreport Handlebars (DELETE THIS):
Dim Template = New Template With {
.Content = "<h1>Hello, {{name}}</h1>",
.Engine = Engine.Handlebars
}
Dim Data = New With {.name = "World"}
' IronPDF with VB.NET string interpolation:
Dim name As String = "World"
Dim html As String = $"<h1>Hello, {name}</h1>"
Dim pdf = renderer.RenderHtmlAsPdf(html)
Akış Yönetimini Basitleştirin
Jsreport, manuel kopyalama gerektiren bir akış döndürür:
// jsreport stream handling (DELETE THIS):
using (var fileStream = File.Create("output.pdf"))
{
report.Content.CopyTo(fileStream);
}
// Or for byte array:
using (var memoryStream = new MemoryStream())
{
await report.Content.CopyToAsync(memoryStream);
return memoryStream.ToArray();
}
//IronPDF direct access:
pdf.SaveAs("output.pdf");
// Or:
byte[] bytes = pdf.BinaryData;
// jsreport stream handling (DELETE THIS):
using (var fileStream = File.Create("output.pdf"))
{
report.Content.CopyTo(fileStream);
}
// Or for byte array:
using (var memoryStream = new MemoryStream())
{
await report.Content.CopyToAsync(memoryStream);
return memoryStream.ToArray();
}
//IronPDF direct access:
pdf.SaveAs("output.pdf");
// Or:
byte[] bytes = pdf.BinaryData;
Imports System.IO
' jsreport stream handling (DELETE THIS):
Using fileStream As FileStream = File.Create("output.pdf")
report.Content.CopyTo(fileStream)
End Using
' Or for byte array:
Using memoryStream As New MemoryStream()
Await report.Content.CopyToAsync(memoryStream)
Return memoryStream.ToArray()
End Using
'IronPDF direct access:
pdf.SaveAs("output.pdf")
' Or:
Dim bytes As Byte() = pdf.BinaryData
Hata Ayıklama
Sorun 1: LocalReporting Bulunamadı
Sorun: Kod, IronPDF'de mevcut olmayan LocalReporting sınıfını referans alıyor.
Çözüm: ChromePdfRenderer ile değiştirin:
// jsreport
var rs = new LocalReporting().UseBinary().AsUtility().Create();
// IronPDF
var renderer = new ChromePdfRenderer();
// jsreport
var rs = new LocalReporting().UseBinary().AsUtility().Create();
// IronPDF
var renderer = new ChromePdfRenderer();
' jsreport
Dim rs = New LocalReporting().UseBinary().AsUtility().Create()
' IronPDF
Dim renderer = New ChromePdfRenderer()
Sorun 2: RenderRequest Bulunamadı
Sorun: Kod, RenderRequest ve Template sarmalayıcı nesnelerini kullanıyor.
Çözüm: HTML'i doğrudan render yöntemlerine gönderin:
// jsreport
await rs.RenderAsync(new RenderRequest { Template = new Template { Content = html } });
// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);
// jsreport
await rs.RenderAsync(new RenderRequest { Template = new Template { Content = html } });
// IronPDF
var pdf = renderer.RenderHtmlAsPdf(html);
Imports System.Threading.Tasks
' jsreport
Await rs.RenderAsync(New RenderRequest With {.Template = New Template With {.Content = html}})
' IronPDF
Dim pdf = renderer.RenderHtmlAsPdf(html)
Sorun 3: Sayfa Numaraları Görünmüyor
Sorun: jsreport yer tutucu sözdizimi <span class='pageNumber'></span> kullanılıyor.
Çözüm:IronPDF yer tutucu sözdizimine güncelleyin:
// jsreport syntax (won't work)
"Page <span class='pageNumber'></span> of <span class='totalPages'></span>"
//IronPDF syntax
"Page {page} of {total-pages}"
// jsreport syntax (won't work)
"Page <span class='pageNumber'></span> of <span class='totalPages'></span>"
//IronPDF syntax
"Page {page} of {total-pages}"
' jsreport syntax (won't work)
"Page <span class='pageNumber'></span> of <span class='totalPages'></span>"
' IronPDF syntax
"Page {page} of {total-pages}"
Sorun 4: JsReportBinary Bulunamadı
Sorun: Kod, JsReportBinary.GetBinary() referans alıyor.
Çözüm: Tamamen silin—IronPDF dışsal ikililere ihtiyaç duymaz:
// DELETE this jsreport pattern:
.UseBinary(JsReportBinary.GetBinary())
//IronPDF needs nothing—just create the renderer:
var renderer = new ChromePdfRenderer();
// DELETE this jsreport pattern:
.UseBinary(JsReportBinary.GetBinary())
//IronPDF needs nothing—just create the renderer:
var renderer = new ChromePdfRenderer();
Geçiş Kontrol Listesi
Öncesi-Geçiş
- Tüm jsreport
usingifadelerini belirleyin Handlebars/JsRender kullanan şablonları listeleyin (C# dize eklemeye dönüştürün) Kullanılan mevcut Chrome seçeneklerini belgeleyin (kenar boşlukları, kağıt boyutu) Web sunucusu ve yardımcı program modu için kontrol edin (her ikisi de işlem içi olur) Platforma özgü ikili paketleri not alın (hepsini silin) -IronPDF lisans anahtarını edinin
Paket Değişiklikleri
jsreport.Binarypaketini kaldırınjsreport.Binary.Linuxpaketini kaldırınjsreport.Binary.OSXpaketini kaldırınjsreport.Localpaketini kaldırınjsreport.Typespaketini kaldırınjsreport.Clientpaketini kaldırınIronPdfpaketini yükleyin
Kod Değişiklikleri
Başlangıçta lisans anahtarı yapılandırmasını ekleyin
LocalReportingileChromePdfRendererdeğiştirinRenderRequestsarmalayıcısını kaldırınTemplatesarmalayıcısını kaldırın- Yer tutucu sözdizimini güncelleyin (
<span class='pageNumber'>→{page}) - Handlebar'ları C# dize enterpolasyonu ile değiştirin
StartAsync()/KillAsync()çağrılarını kaldırın- Akış kopyalamayı
BinaryDataveyaSaveAs()ile değiştirin
Test Etme
Tüm PDF oluşturma yollarını test edin
- Başlık/altbilgi render'ını doğrulayın.
- Sayfa numaralandırmayı kontrol edin
- Kenar boşluğu aralıklarını doğrulayın
- Karmaşık CSS/JavaScript sayfalarıyla test edin Performansı karşılaştırın
Geçiş Sonrası
- jsreport ikili dosyalarını silin
- Node.js bağımlılıklarını artık gerekli değilse kaldırın
- Dağıtım betiklerini güncelleyin
- Belgeleri güncelleyin

