フッターコンテンツにスキップ
移行ガイド

C#でjsreportからIronPDFに移行する方法

jsreportからIronPDFへの移行は、あなた for .NET PDFワークフローを、外部バイナリ管理と個別のサーバープロセスによるNode.js依存のシステムから、完全にプロセス内で実行される純粋な.NETライブラリへと変えます。 このガイドでは、.NETのプロフェッショナルな開発者向けに、インフラの複雑さやJavaScriptのテンプレート要件を排除する包括的な移行パスを、ステップバイステップで提供します。

なぜjsreportからIronPDFに移行するのか

jsreportの課題

jsreportは、純粋な.NET環境にはない複雑さをもたらします:

  1. Node.js の依存関係: Node.jsランタイムとバイナリが必要なため、単純な.NETアプリケーションであるはずのインフラストラクチャが複雑になります。

2.外部バイナリ管理: Windows、Linux、OSX のプラットフォーム固有のバイナリを個別のNuGetパッケージ (jsreport.Binary.OSX) を通じてダウンロードおよび管理する必要があります。

3.個別のサーバー プロセス:ユーティリティまたは Web サーバーとして実行されます。StartAsync() および KillAsync() ライフサイクル メソッドを使用した追加のプロセス管理が必要です。

  1. JavaScriptテンプレート:ネイティブの C# 機能を使用する代わりに、Handlebars、JsRender、またはその他 for JavaScriptテンプレート システムを学習する必要があります。

5.複雑なリクエスト構造:単純な PDF 生成でも、ネストされた Template 構成を持つ詳細な RenderRequest オブジェクトが必要です。

6.ライセンスの制限:無料レベルではテンプレート数が制限されます。 スケーリングには商用ライセンスが必要です。

7.ストリームベースの出力:手動のファイル操作とメモリ ストリーム管理を必要とするストリームを返します。

jsreportとIronPDFの比較

フィーチャー jsreport IronPDF
ランタイム Node.js + .NET 純粋な.NET
バイナリ管理 マニュアル(jsreport.Binaryパッケージ) 自動翻訳
サーバープロセス 必須(ユーティリティまたはウェブサーバ) 進行中
テンプレート作成 JavaScript(ハンドルバーなど) C# (Razor、文字列補間)
APIスタイル 冗長なリクエストオブジェクト クリーンで流暢なメソッド
アウトプット ストリーム PdfDocument オブジェクト
PDF操作 制限的 広範囲(マージ、分割、編集)
非同期サポート 非同期のみ 同期と非同期の両方

2025年、2026年まで.NET 10とC# 14の採用を計画しているチームにとって、IronPDFは外部ランタイムに依存しない.NETネイティブライブラリとして将来を見据えた基盤を提供します。


マイグレーションの複雑さの評価

機能別の見積もり作業

フィーチャー 移行の複雑さ
HTMLからPDFへ 低レベル
URLからPDFへ 低レベル
ヘッダー/フッター 低レベル
ページ設定 低レベル
サーバーライフサイクル 低レベル
バイナリ管理 低レベル

パラダイムシフト

このjsreport移行における基本的な変化は、サーバー管理を伴う冗長なリクエスト オブジェクトから、単純なインプロセス メソッド呼び出しへの変更です。

jsreport:  LocalReporting().UseBinary().AsUtility().Create() → RenderAsync(RenderRequest) →ストリーム→ File
IronPDF:   ChromePdfRenderer → RenderHtmlAsPdf(html) → SaveAs()

始める前に

前提条件

  1. .NET環境: .NET Framework 4.6.2+ または.NET Core 3.1+ / .NET 5/6/7/8/9+
  2. NuGetアクセス: NuGetパッケージをインストールする機能
  3. IronPDFライセンス: IronPDFからライセンスキーを取得します。

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
SHELL

ライセンス構成

// 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"
$vbLabelText   $csharpLabel

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" .
SHELL

完全な 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
$vbLabelText   $csharpLabel

翻訳後(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
$vbLabelText   $csharpLabel

jsreport アプローチには、3 つのNuGetパッケージ (jsreport.Types)、3 つの名前空間インポート、非同期のみの実行、Fluent ビルダー チェーン (Recipe および Engine を指定するネストされた Template オブジェクトを含む詳細な RenderRequest、および using ブロックを使用した手動のストリームからファイルへのコピーが必要です。

IronPDFはこれを1つのNuGetパッケージ、1つの名前空間、3行のコード、そして同期実行に削減します。 ChromePdfRenderer.RenderHtmlAsPdf() メソッドは HTML を直接受け入れ、単純な SaveAs() メソッドを使用して PdfDocument を返します。 その他のレンダリングオプションについては、HTML to PDF documentationを参照してください。

例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
$vbLabelText   $csharpLabel

翻訳後(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
$vbLabelText   $csharpLabel

この例は、jsreportの重要な制限を強調しています。jsreportコードでは、Web ページをキャプチャするために、HTML コンテンツに埋め込まれたJavaScriptリダイレクト回避策 (window.location='https://example.com') を使用する必要があります。 この間接的なアプローチは、特定のウェブサイトで失敗する可能性があり、不必要な複雑さを追加します。

IronPDF は、完全なJavaScript実行と最新の CSS サポートを使用して任意の URL を直接レンダリングする専用の RenderUrlAsPdf() メソッドを提供します。 回避策や埋め込みスクリプトはありません。 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
$vbLabelText   $csharpLabel

翻訳後(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
$vbLabelText   $csharpLabel

jsreport アプローチでは、Chrome オブジェクトを Template に追加し、DisplayHeaderFooter = true を設定し、特殊な CSS クラス プレースホルダー (<span class='totalPages'></span>) を含む HTML テンプレートを使用する必要があります。 ヘッダーとフッターのテンプレートには、完全なインラインスタイルが含まれている必要があります。

IronPDF は、RightText、および FontSize 専用のプロパティを備えた、よりクリーンな TextHeaderFooter 構成を提供します。 ページ番号プレースホルダーでは、より単純な {page} および {total-pages} 構文が使用されます。 HTMLのヘッダーオプションについては、headers and footers documentationを参照してください。


重要な移行に関する注意事項

サーバーのライフサイクル管理をなくす

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()
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

プラットフォーム固有のバイナリ パッケージの削除

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
SHELL

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}"
$vbLabelText   $csharpLabel

C#文字列補間でハンドルバーを置き換える

jsreport は多くの場合、Engine.Handlebars を使用した 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)
$vbLabelText   $csharpLabel

ストリーム処理を簡素化する

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
$vbLabelText   $csharpLabel

トラブルシューティング

問題 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()
$vbLabelText   $csharpLabel

問題 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)
$vbLabelText   $csharpLabel

課題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}"
$vbLabelText   $csharpLabel

課題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();
$vbLabelText   $csharpLabel

移行チェックリスト

移行前

  • すべてのjsreportusing ステートメントを識別します
  • Handlebars/JsRender を使用したリスト テンプレート (C# 文字列補間に変換)
  • 現在使用されている Chrome オプション (余白、用紙サイズ) を文書化します
  • Web サーバーとユーティリティ モードを確認します (両方ともインプロセスになります)
  • プラットフォーム固有のバイナリパッケージをメモする(すべて削除)
  • IronPDFライセンスキーを取得する

パッケージの変更

  • jsreport.Binary パッケージを削除します
  • jsreport.Binary.Linux パッケージを削除します
  • jsreport.Binary.OSX パッケージを削除します
  • jsreport.Local パッケージを削除します
  • jsreport.Types パッケージを削除します
  • jsreport.Client パッケージを削除します
  • IronPdf パッケージをインストールします

コードの変更

  • 起動時にライセンスキー設定を追加する
  • LocalReportingChromePdfRenderer に置き換えます
  • RenderRequest ラッパーを削除します
  • Template ラッパーを削除します
  • プレースホルダー構文を更新します (<span class='pageNumber'>{page})
  • ハンドルバーをC#の文字列補間に置き換える
  • StartAsync() / KillAsync() 呼び出しを削除します
  • ストリームのコピーを BinaryData または SaveAs() に置き換えます

テスティング

  • すべてのPDF生成パスをテストする
  • ヘッダー/フッターのレンダリングを確認する
  • ページ番号を確認する
  • 余白間隔を検証する
  • 複雑なCSS/ JavaScriptページでのテスト
  • ベンチマークパフォーマンス

移行後

  • jsreportバイナリファイルを削除する
  • 不要になった場合はNode.jsの依存関係を削除します
  • デプロイメントスクリプトを更新する
  • ドキュメントの更新

カーティス・チャウ
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。

アイアンサポートチーム

私たちは週5日、24時間オンラインで対応しています。
チャット
メール
電話してね