C#에서 jsreport에서 IronPDF로 마이그레이션하는 방법
jsreport에서 IronPDF로의 마이그레이션은 .NET PDF 워크플로우를 외부 바이너리 관리와 별도의 서버 프로세스를 포함하는 Node.js 의존 시스템에서 순수 .NET 라이브러리로 변환합니다. 이 가이드는 전문 .NET 개발자를 위한 인프라 복잡성과 JavaScript 템플릿 요구 사항을 제거하는 포괄적이고 단계적인 마이그레이션 경로를 제공합니다.
왜 jsreport에서 IronPDF로 마이그레이션해야 하는가
jsreport의 문제점
jsreport는 순수한 .NET 환경에 속하지 않는 복잡성을 소개합니다:
-
Node.js 의존성: Node.js 런타임 및 바이너리가 필요하여 단순해 보이는 .NET 애플리케이션에 인프라 복잡성을 추가합니다.
-
외부 바이너리 관리: Windows, Linux, OSX에 맞는 플랫폼 바이너리를 별도의 NuGet 패키지(
jsreport.Binary,jsreport.Binary.Linux,jsreport.Binary.OSX)로 다운로드하고 관리해야 합니다. -
독립 실행형 서버 프로세스: 유틸리티 또는 웹 서버로서 동작하며
StartAsync()및KillAsync()라이프사이클 메서드로 추가적인 프로세스 관리가 필요합니다. -
JavaScript 템플릿: 네이티브 C# 기능 대신 Handlebars, JsRender 또는 기타 JavaScript 템플릿 시스템을 배워야 합니다.
-
복잡한 요청 구조: 간단한 PDF 생성에도 중첩된
Template구성을 가진 장황한RenderRequest객체가 필요합니다. -
라이선스 제한: 무료 티어는 템플릿 수를 제한합니다; 확장은 상업적 라이선스를 요구합니다.
- 스트림 기반 출력: 파일 작업 및 메모리 스트림 관리를 수동으로 요구하는 스트림을 반환합니다.
jsreportvsIronPDF비교
| 기능 | jsreport | IronPDF |
|---|---|---|
| 실행 환경 | Node.js + .NET | 순수 .NET |
| 바이너리 관리 | 수동 (jsreport.Binary 패키지) | 자동 |
| 서버 프로세스 | 필요 (유틸리티 또는 웹 서버) | 인프로세스 |
| 템플릿 | JavaScript (Handlebars 등) | C# (Razor, 문자열 보간) |
| API 스타일 | 자세한 요청 객체 | 깨끗한 유창한 메서드 |
| 출력 | 스트림 | PdfDocument 객체 |
| PDF 조작 | 제한적 | 광범위한 (병합, 분할, 편집) |
| 비동기 지원 | 비동기 전용 | 동기와 비동기 모두 지원 |
2025년과 2026년 동안 .NET 10 및 C# 14 채택을 계획하는 팀을 위해 IronPDF는 외부 런타임 종속성 없이 네이티브 .NET 라이브러리로서 미래보장성을 제공합니다.
마이그레이션 복잡성 평가
기능별 예상 노력
| 기능 | 마이그레이션 복잡성 |
|---|---|
| HTML to PDF | 매우 낮음 |
| URL을 PDF로 변환 | 매우 낮음 |
| 헤더/푸터 | 낮음 |
| 페이지 설정 | 낮음 |
| 서버 수명 주기 | 낮음 |
| 바이너리 관리 | 낮음 |
패러다임 전환
이jsreport마이그레이션의 근본적인 변화는 서버 관리가 있는 상세 요청 객체에서 단순 인프로세스 메서드 호출로의 이동입니다.
jsreport: LocalReporting().UseBinary().AsUtility().Create() → RenderAsync(RenderRequest) → 스트림→ File
IronPDF: ChromePdfRenderer → RenderHtmlAsPdf(html) → SaveAs()
시작하기 전에
필수 조건
- .NET 환경: .NET Framework 4.6.2+ 또는 .NET Core 3.1+ / .NET 5/6/7/8/9+
- NuGet 접근 권한: NuGet 패키지를 설치할 수 있는 능력
- IronPDF 라이선스: ironpdf.com에서 라이선스 키를 획득하세요
NuGet 패키지 변경 사항
# 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
라이선스 구성
// 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사용 식별
# 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 참조
클래스 매핑
| jsreport클래스 | IronPDF 동등 |
|---|---|
LocalReporting |
ChromePdfRenderer |
ReportingService |
ChromePdfRenderer |
RenderRequest |
메서드 매개변수 |
Template |
메서드 매개변수 |
Chrome |
RenderingOptions |
Report |
PdfDocument |
Engine |
(필요 없음) |
메서드 매핑
| jsreport메서드 | IronPDF 동등 |
|---|---|
LocalReporting().UseBinary().AsUtility().Create() |
new ChromePdfRenderer() |
rs.RenderAsync(request) |
renderer.RenderHtmlAsPdf(html) |
rs.StartAsync() |
(필요 없음) |
rs.KillAsync() |
(필요 없음) |
report.Content.CopyTo(stream) |
pdf.SaveAs(path) 또는 pdf.BinaryData |
RenderRequest 속성 매핑
| jsreport템플릿 속성 | IronPDF 동등 |
|---|---|
Template.Content |
RenderHtmlAsPdf()의 첫 번째 매개변수 |
Template.Recipe = Recipe.ChromePdf |
(필요 없음) |
Template.Engine = Engine.None |
(필요 없음) |
Chrome.HeaderTemplate |
RenderingOptions.TextHeader 또는 HtmlHeader |
Chrome.FooterTemplate |
RenderingOptions.TextFooter 또는 HtmlFooter |
Chrome.DisplayHeaderFooter |
(자동) |
Chrome.MarginTop |
RenderingOptions.MarginTop |
플레이스홀더 매핑 (헤더/푸터)
| jsreport 플레이스홀더 | IronPDF 플레이스홀더 |
|---|---|
<span class='pageNumber'></span> |
{page} |
<span class='totalPages'></span> |
{total-pages} |
{#pageNum} |
{page} |
{#numPages} |
{total-pages} |
{#timestamp} |
{date} |
코드 마이그레이션 예제
예제 1: 기본 HTML에서 PDF로
이전 (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
이후 (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 접근 방식은 세 가지 NuGet 패키지(jsreport.Binary, jsreport.Local, jsreport.Types), 세 가지 네임스페이스 가져오기, async 전용 실행, 유창한 빌더 체인(LocalReporting().UseBinary().AsUtility().Create()), 중첩된 Template 객체를 가진 장황한 RenderRequest으로 Recipe와 Engine를 지정하며, using 블록으로 수동 스트림-파일 복사본을 필요로 합니다.
IronPDF는 이를 하나의 NuGet 패키지, 하나의 네임스페이스, 세 줄의 코드 및 동기 실행으로 줄입니다. ChromePdfRenderer.RenderHtmlAsPdf() 메서드는 HTML을 직접 받아 간단한 SaveAs() 메서드를 가진 PdfDocument를 반환합니다. HTML to PDF 문서에서 추가 렌더링 옵션을 참조하십시오.
예제 2: URL을 PDF로
이전 (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
이후 (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의 중요한 제한 사항을 강조합니다: 직접적인 URL-to-PDF 메서드가 없습니다.jsreport코드에서는 HTML 콘텐츠에 포함된 JavaScript 리다이렉트 우회(window.location='https://example.com')를 사용하여 웹페이지를 캡처해야 합니다. 이 간접적인 접근은 특정 웹사이트에서 실패할 수 있으며 불필요한 복잡성을 추가합니다.
IronPDF는 모든 URL을 완전한 JavaScript 실행과 최신 CSS 지원으로 직접 렌더링하는 전용 RenderUrlAsPdf() 메서드를 제공합니다. 우회 방법, 내장 스크립트 없음 - URL만 전달하십시오. URL을 PDF로 변환에 대해 더 알아보세요.
예제 3: 헤더 및 푸터가 있는 PDF
이전 (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
이후 (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 접근 방식은 Chrome 객체를 Template에 추가하고, DisplayHeaderFooter = true를 설정하며, 특수 CSS 클래스 플레이스홀더(<span class='pageNumber'></span>, <span class='totalPages'></span>)가 있는 HTML 템플릿을 사용하는 것을 요구합니다. 헤더 및 푸터 템플릿에는 완전한 인라인 스타일링이 포함되어야 합니다.
IronPDF는 CenterText, LeftText, RightText, FontSize를 위한 전용 속성을 가진 더 깨끗한 TextHeaderFooter 구성을 제공합니다. 페이지 번호 플레이스홀더는 더 간단한 {page} 및 {total-pages} 구문을 사용합니다. 헤더 및 푸터 문서에서 HTML 헤더 옵션을 참조하세요.
중요한 마이그레이션 노트
서버 수명 주기 관리를 제거
jsreport는 명시적 서버 수명 주기 관리를 요구합니다:
//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는 완전히 인프로세스로 실행됩니다 - 서버 시작, 프로세스 관리, 정리가 없습니다:
// IronPDF:
var renderer = new ChromePdfRenderer();
// Just use it—no lifecycle management needed
// IronPDF:
var renderer = new ChromePdfRenderer();
// Just use it—no lifecycle management needed
플랫폼별 바이너리 패키지 제거
jsreport는 각 대상 플랫폼에 대해 별도의 NuGet 패키지가 필요합니다:
# 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는 단일 NuGet 패키지를 통해 모든 플랫폼 요구 사항을 자동으로 처리합니다.
플레이스홀더 문법 업데이트
jsreport는 CSS 클래스 기반 또는 중괄호 플레이스홀더를 사용합니다. IronPDF는 다른 구문을 사용합니다:
//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# 문자열 보간으로 대체
jsreport는 종종 Engine.Handlebars 핸들바 템플릿을 사용합니다:
//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)
스트림 처리 간소화
jsreport는 수동 복사가 필요한 스트림을 반환합니다:
//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
문제 해결
문제 1: LocalReporting을 찾을 수 없음
문제: 코드가 IronPDF에 존재하지 않는 LocalReporting 클래스를 참조합니다.
해결방안: ChromePdfRenderer으로 교체합니다:
// 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()
문제 2: RenderRequest를 찾을 수 없음
문제: 코드가 RenderRequest 및 Template 랩퍼 객체를 사용합니다.
해결책: HTML을 렌더 메서드에 직접 전달하세요:
// 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)
문제 3: 페이지 번호가 나타나지 않음
문제:jsreport플레이스홀더 구문 <span class='pageNumber'></span>을 사용합니다.
솔루션: IronPDF의 플레이스홀더 구문으로 업데이트하십시오:
//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}"
문제 4: JsReportBinary를 찾을 수 없음
문제: 코드가 JsReportBinary.GetBinary()을 참조합니다.
해결책: 전부 삭제하세요—IronPDF는 외부 이진 파일이 필요하지 않습니다.
// 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();
마이그레이션 체크리스트
사전 마이그레이션
- 모든jsreport
using구문을 식별합니다 - Handlebars/JsRender를 사용하는 템플릿 목록(이를 C# 문자열 보간으로 변환)
- 사용 중인 현재 Chrome 옵션 문서화(여백, 용지 크기)
- 웹 서버 대 유틸리티 모드 확인(둘 다 프로세스 내로 전환)
- 플랫폼별 이진 패키지 주의(모두 삭제) -IronPDF라이센스 키를 받으세요
패키지 변경 사항
jsreport.Binary패키지를 제거합니다jsreport.Binary.Linux패키지를 제거합니다jsreport.Binary.OSX패키지를 제거합니다jsreport.Local패키지를 제거합니다jsreport.Types패키지를 제거합니다jsreport.Client패키지를 제거합니다IronPdf패키지를 설치합니다
코드 변경 사항
- 시작 시 라이선스 키 구성 추가
LocalReporting을ChromePdfRenderer으로 교체합니다RenderRequest랩퍼를 제거합니다Template랩퍼를 제거합니다- 플레이스홀더 구문을 갱신합니다(
<span class='pageNumber'>→{page}) - Handlebars를 C# 문자열 보간으로 대체
StartAsync()/KillAsync()호출을 제거합니다- 스트림 복사를
BinaryData또는SaveAs()으로 교체합니다
테스트
- 모든 PDF 생성 경로 테스트
- 헤더/푸터 렌더링 검증
- 페이지 번호 매기기 확인
- 여백 간격 확인
- 복잡한 CSS/JavaScript 페이지로 테스트
- 성능 벤치마크
마이그레이션 이후
-jsreport이진 파일 삭제
- 더 이상 필요 없는 경우 Node.js 종속성 제거
- 배포 스크립트 업데이트
- 문서 업데이트

