jsreport'tan IronPDF'e C# ile Nasıl Geçilir
jsreport'tan IronPDF'a geçiş, Node.js'e bağımlı bir sistemle dışsal ikili yönetim ve ayrı sunucu süreçlerine sahip bir .NET PDF iş akışınızı, tamamen süreç içi çalışacak saf bir .NET kütüphanesine dönüştürür. Bu rehber, yapı gereksizliği ve profesyonel .NET geliştiricileri için JavaScript şablonlama gerekliliklerini ortadan kaldıran kapsayıcı, adım adım bir geçiş yolu sağlar.
jsreport'tan IronPDF'a Neden Göç Edilmeli
jsreportZorlukları
jsreport, saf bir .Net ortamında olmaması gereken karmaşıklıkları tanıtır:
-
Node.js Bağımlılığı: Node.js çalışma zamanı ve ikilileri gerektirir, bu da basit bir .NET uygulaması olması gereken bir yere altyapı karmaşıklığı ekler.
-
Harici İkili Dosya Yönetimi: Platforma özgü ikili dosyaların Windows, Linux ve OSX için ayrı NuGet paketleri (
jsreport.Binary,jsreport.Binary.Linux,jsreport.Binary.OSX) aracılığıyla indirilmesi ve yönetilmesi gereklidir. -
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: Yerli C# yeteneklerini kullanmak yerine Handlebars, JsRender veya diğer JavaScript şablon sistemlerini öğrenmeyi zorunlu kılar.
-
Karmaşık İstek Yapısı: Basit PDF oluşturma için bile iç içe geçmiş
Templateyapılandırmalarına sahip detaylıRenderRequestnesneleri gerektirir. -
Lisanslama Kısıtlamaları: Ücretsiz katman şablon sayısını sınırlar; ölçeklendirme, ticari lisans gerektirir.
- Akış Tabanlı Çıkış: Manuel dosya işlemleri ve bellek akışı yönetimi gerektiren akışlar döndürür.
jsreport vsIronPDFKarşılaştırması
| Özellik | jsreport | IronPDF |
|---|---|---|
| Çalışma Zamanı | Node.js + .NET | Saf .NET |
| Ikili Yonetim | Manuel (jsreport.Binary paketleri) | Otomatik |
| Sunucu Süreci | Gerekli (yardımcı program veya web sunucusu) | Süreç içi |
| Şablonlama | JavaScript (Handlebars, vb.) | C# (Razor, string interpolation) |
| API Stili | Ayrıntılı istek nesneleri | Temiz akıcı metodlar |
| Çıkış | Akış | PdfDocument nesnesi |
| PDF Manipülasyonu | Sınırlı | Kapsamlı (Birlestirme, bölme, düzenleme) |
| Async Destegi | Sadece Async | Hem senkron hem de asenkron |
.NET 10 ve C# 14'ün 2025 ve 2026 boyunca benimsenmesini planlayan ekipler için, IronPDF, dışsal çalışma zamanı bağımlılıkları olmadan yerel bir .NET kütüphanesi olarak geleceğe uygun bir temel sağlar.
Göç Karmaşıklık Değerlendirmesi
Özelliklere Göre Tahmini Çaba
| Özellik | Göç Karmaşıklığı |
|---|---|
| HTML'den PDF'ye | Çok Düşük |
| URL'den PDF'ye | Çok Düşük |
| Üstbilgi/Altbilgi | Low |
| Sayfa Ayarları | Low |
| Sunucu Yaşam Döngüsü | Low |
| Ikili Yonetim | Low |
Paradigma Değişikliği
Bujsreportgeçişindeki temel değişiklik, sunucu yönetimi olan ayrıntılı istek nesnelerinden basit işlem içi metod çağrılarına: geçmektir.
jsreport: LocalReporting().UseBinary().AsUtility().Create() → RenderAsync(RenderRequest) →Akış→ File
IronPDF: ChromePdfRenderer → RenderHtmlAsPdf(html) → SaveAs()
Başlamadan Önce
Önkoş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ükleme yeteneği
- IronPDF Lisansı: Lisans anahtarınızı ironpdf.com adresinden edinin
NuGet Paket Değişiklikleri
# Removejsreportpackages
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
# Removejsreportpackages
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"
jsreportKullanımını Belirleyin
# Find alljsreportreferences
grep -r "using jsreport\|LocalReporting\|RenderRequest\|RenderAsync" --include="*.cs" .
grep -r "JsReportBinary\|Template\|Recipe\|Engine\." --include="*.cs" .
# Find alljsreportreferences
grep -r "using jsreport\|LocalReporting\|RenderRequest\|RenderAsync" --include="*.cs" .
grep -r "JsReportBinary\|Template\|Recipe\|Engine\." --include="*.cs" .
API Referansının Tamamı
Sınıf Eslemeleri
| jsreport Sınıfı | IronPDF Eşdeğeri |
|---|---|
LocalReporting |
ChromePdfRenderer |
ReportingService |
ChromePdfRenderer |
RenderRequest |
Yöntem parametreleri |
Template |
Yöntem parametreleri |
Chrome |
RenderingOptions |
Report |
PdfDocument |
Engine |
(gerekmez) |
Metot Eşlemeleri
| jsreport Metodu | IronPDF Eşdeğeri |
|---|---|
LocalReporting().UseBinary().AsUtility().Create() |
new ChromePdfRenderer() |
rs.RenderAsync(request) |
renderer.RenderHtmlAsPdf(html) |
rs.StartAsync() |
(gerekmez) |
rs.KillAsync() |
(gerekmez) |
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 birinci parametre |
Template.Recipe = Recipe.ChromePdf |
(gerekmez) |
Template.Engine = Engine.None |
(gerekmez) |
Chrome.HeaderTemplate |
RenderingOptions.TextHeader veya HtmlHeader |
Chrome.FooterTemplate |
RenderingOptions.TextFooter veya HtmlFooter |
Chrome.DisplayHeaderFooter |
(otomatik) |
Chrome.MarginTop |
RenderingOptions.MarginTop |
Yer Tutucu Eşlemeleri (Başlıklar/Alt Bilgiler)
| 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 Geçiş Ö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
Sonra (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ı ithalatı, yalnızca asenkron yürütme, bir akıcı yapı zinciri (LocalReporting().UseBinary().AsUtility().Create()), iç içe geçmiş Template nesnesiyle RenderRequest ve Engine belirten detaylı Recipe ve Engine gerektirir, ve elle akıştan dosyaya kopyalama using bloğu ile yapılır.
IronPDF, bunu tek bir NuGet paketi, bir namespace, üç satır kod ve senkron yürütmeyle azaltır. ChromePdfRenderer.RenderHtmlAsPdf() yöntemi HTML doğrudan kabul eder ve basit bir SaveAs() yöntemi ile PdfDocument döner. Daha fazla işleme seçeneği için HTML'den PDF'ye dokümantasyonuna bakın.
Ö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
Sonra (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
Bu örnek, jsreport'taki önemli bir sınırlamayı vurgular: doğrudan URL-to-PDF metodu yoktur.jsreportkodu web sayfasını yakalamak için HTML içeriğine gömülü bir JavaScript yönlendirme geçici çözümü (window.location='https://example.com') kullanmalıdır. Bu dolaylı yaklaşım belirli web sitelerinde başarısız olabilir ve gereksiz karmaşıklık ekler.
IronPDF, tam JavaScript yürütümü ve modern CSS desteği ile herhangi bir URL'yi doğrudan işleyen özel bir RenderUrlAsPdf() yöntemi sağlar. Çözümler veya gömülü betikler yok—sadece URL'yi geçirmeniz yeterlidir. URL'den PDF'ye dönüşüm hakkında daha fazla bilgi edinin.
Örnek 3: Başlıklı ve Alt Başlıklı 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
Sonra (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ı Chrome nesnesini Template eklemeyi, DisplayHeaderFooter = true ayarlamayı ve özel CSS sınıfı yer tutucuları (<span class='pageNumber'></span>, <span class='totalPages'></span>) ile HTML şablonları kullanmayı gerektirir. Başlık ve alt başlık şablonları tam iç satır stilini içermelidir.
IronPDF gözden geçirme TextHeaderFooter yapılandırması CenterText, LeftText, RightText ve FontSize için atanmış özelliklerle sağlar. Sayfa numarası yer tutucuları daha basit {page} ve {total-pages} sözdizimi kullanır. HTML başlık seçenekleri için header ve footer dokümantasyonunu inceleyin.
Kritik Geçiş Notları
Sunucu Yaşam Döngüsü Yönetimini Ortadan Kaldırın
jsreport, açık sunucu yaşam döngüsü yönetimini 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 süreç içi çalışır—sunucu başlatma, süreç yönetimi, temizlik yoktur:
// 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ın
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 tüm platform gereksinimlerini otomatik olarak tek bir NuGet paketi aracılığıyla yönetir.
Yer Tutucu Söz Dizimini Güncelleyin
jsreport CSS sınıf tabanlı veya süslü ayraçla yer tutucuları kullanır.IronPDFfarklı bir söz dizimi kullanır:
//jsreportplaceholders:
"<span class='pageNumber'></span>" // or {#pageNum}
"<span class='totalPages'></span>" // or {#numPages}
//IronPDFplaceholders:
"{page}"
"{total-pages}"
"{date}"
"{html-title}"
//jsreportplaceholders:
"<span class='pageNumber'></span>" // or {#pageNum}
"<span class='totalPages'></span>" // or {#numPages}
//IronPDFplaceholders:
"{page}"
"{total-pages}"
"{date}"
"{html-title}"
'jsreportplaceholders:
"<span class='pageNumber'></span>" ' or {#pageNum}
"<span class='totalPages'></span>" ' or {#numPages}
'IronPDFplaceholders:
"{page}"
"{total-pages}"
"{date}"
"{html-title}"
Handlebars'ı C# Dizi Enterpolasyonu ile Değiştirin
jsreport genellikle Engine.Handlebars ile Handlebars şablonlaması kullanır:
//jsreportHandlebars (DELETE THIS):
Template = new Template
{
Content = "<h1>Hello, {{name}}</h1>",
Engine = Engine.Handlebars
},
Data = new { name = "World" }
//IronPDFwith C# string interpolation:
string name = "World";
string html = $"<h1>Hello, {name}</h1>";
var pdf = renderer.RenderHtmlAsPdf(html);
//jsreportHandlebars (DELETE THIS):
Template = new Template
{
Content = "<h1>Hello, {{name}}</h1>",
Engine = Engine.Handlebars
},
Data = new { name = "World" }
//IronPDFwith C# string interpolation:
string name = "World";
string html = $"<h1>Hello, {name}</h1>";
var pdf = renderer.RenderHtmlAsPdf(html);
Imports IronPdf
' jsreportHandlebars (DELETE THIS):
Dim template As 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ış İşleme İşlemini Basitleştirin
jsreport manuel kopyalama gerektiren bir akış döndürür:
//jsreportstream 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();
}
//IronPDFdirect access:
pdf.SaveAs("output.pdf");
// Or:
byte[] bytes = pdf.BinaryData;
//jsreportstream 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();
}
//IronPDFdirect access:
pdf.SaveAs("output.pdf");
// Or:
byte[] bytes = pdf.BinaryData;
Imports System.IO
'jsreportstream 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
'IronPDFdirect access:
pdf.SaveAs("output.pdf")
' Or:
Dim bytes As Byte() = pdf.BinaryData
Ariza Giderme
Konu 1: LocalReporting Bulunamadı
Sorun: Kod,IronPDFiçinde bulunmayan LocalReporting sınıfına referans veriyor.
Çö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()
Konu 2: RenderRequest Bulunamadı
Sorun: Kod RenderRequest ve Template sarmalayıcı nesneleri kullanıyor.
Çözüm: HTML'yi doğrudan render yöntemlerine geçirin:
// 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)
Konu 3: Sayfa Numaraları Görünmüyor
Sorun:jsreportyer tutucu sözdizimi <span class='pageNumber'></span> kullanılıyor.
Çözüm:IronPDFyer tutucu sözdizimine güncelleyin:
//jsreportsyntax (won't work)
"Page <span class='pageNumber'></span> of <span class='totalPages'></span>"
//IronPDFsyntax
"Page {page} of {total-pages}"
//jsreportsyntax (won't work)
"Page <span class='pageNumber'></span> of <span class='totalPages'></span>"
//IronPDFsyntax
"Page {page} of {total-pages}"
'jsreportsyntax (won't work)
"Page <span class='pageNumber'></span> of <span class='totalPages'></span>"
'IronPDFsyntax
"Page {page} of {total-pages}"
Konu 4: JsReportBinary Bulunamadı
Sorun: Kod JsReportBinary.GetBinary() referans veriyor.
Çözüm: Tamamen silin—IronPDF harici ikili dosyalar gerektirmez:
// DELETE thisjsreportpattern:
.UseBinary(JsReportBinary.GetBinary())
//IronPDFneeds nothing—just create the renderer:
var renderer = new ChromePdfRenderer();
// DELETE thisjsreportpattern:
.UseBinary(JsReportBinary.GetBinary())
//IronPDFneeds nothing—just create the renderer:
var renderer = new ChromePdfRenderer();
Goc Kontrol Listesi
Geçiş Öncesi
- Tümjsreport
usingifadelerini tespit edin - Handlebars/JsRender kullanan şablonları listeleyin (C# dizi enterpolasyonuna dönüştürün)
- Kullanılan mevcut Chrome seçeneklerini belgeleyin (marjlar, kağıt boyutu)
- Web sunucusu ve yardımcı program modu için kontrol edin (her ikisi de süreç içi olur)
- Platforma özgü ikili paketleri not edin (hepsini silin) -IronPDFlisans 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ı 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}) - Handlebars'ı C# dizi 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/alt bilgi görüntülemeyi doğrulayın
- Sayfa numaralandırmayı kontrol edin
- Marj boşluklarını doğrulayın
- Karmaşık CSS/JavaScript sayfalarıyla test edin
- Performansı benchmark yapin
Geçişten Sonra
-jsreportikili dosyalarını silin
- Node.js bağımlılıklarını artık gerekliyse kaldırın
- Dağıtım betiklerini güncelleyin
- Belgeleri güncelleyin

