跳過到頁腳內容
遷移指南

如何用 C# 從 jsreport 轉移到 IronPDF

從jsreport轉移到 IronPDF:完整的 C# 遷移指南。

從jsreport轉換到 IronPDF,可將您的 .NET PDF 工作流程從一個依賴 Node.js 的系統(包含外部二進位管理和獨立的伺服器進程)轉變為一個完全在進程中執行的純 .NET 函式庫。 本指南提供了一個全面、循序漸進的遷移路徑,為專業的 .NET 開發人員消除基礎架構的複雜性和 JavaScript 模板的需求。

為什麼要從jsreport移轉到 IronPDF?

jsreport的挑戰

jsreport 引入了不屬於純 .NET 環境的複雜性:

1.Node.js相依性:需要 Node.js 執行時間和二進位檔,增加基礎架構的複雜性,這應該是一個簡單的 .NET 應用程式。

2.外部二進位管理:必須透過獨立的 NuGet 套件 (jsreport.Binaryjsreport.Binary.Linuxjsreport.Binary.OSX) 下載和管理 Windows、Linux 和 OSX 平台特定的二進位檔。

3.獨立伺服器程序:可作為公用程式或網頁伺服器執行 - 需要使用 StartAsync()KillAsync() 生命週期方法進行額外的流程管理。

4.JavaScript Templating:強迫學習 Handlebars、JsRender 或其他 JavaScript 模板系統,而非使用原生 C# 功能。

5.複雜的請求架構:需要冗長的RenderRequest物件與嵌套的範本配置,即使是簡單的 PDF 產生。

6.授權限制:免費層限制模板數量; 縮放需要商業授權。

7.Stream-Based Output:回傳需要手動檔案操作和記憶體串流管理的串流。

jsreport與IronPDF的比較

特點jsreportIronPDF
運行時間Node.js + .NET純 .NET
二進位管理手冊 (jsreport.Binary 套件)自動化
伺服器流程必需 (公用程式或網路伺服器)處理中
模板製作JavaScript (Handlebars 等)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.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
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";
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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 同等級產品筆記
本地報告<代碼>ChromePdfRenderer</代碼主要呈現器
<編碼>ReportingService</編碼<代碼>ChromePdfRenderer</代碼同類型
RenderRequest方法參數不需要包裝
範本方法參數不需要包裝
Chrome渲染選項Chrome 選項
報告<編碼>PDF 文件</編碼結果物件
<編碼>引擎</編碼(不需要)模板化的 C#

方法對應

jsreport 方法IronPdf 同等級產品筆記
<編碼>LocalReporting().UseBinary().AsUtility().Create()</編碼新的 ChromePdfRenderer()單行本
rs.RenderAsync(request)renderer.RenderHtmlAsPdf(html)直接致電
<編碼>rs.StartAsync()</編碼(不需要)處理中
<編碼>rs.KillAsync()</編碼(不需要)自動清理
report.Content.CopyTo(stream)pdf.SaveAs(path)pdf.BinaryData直接訪問

RenderRequest 屬性對應

jsreport 範本屬性IronPdf 同等級產品筆記
範本內容RenderHtmlAsPdf() 的第一個參數直接 HTML 字串
Template.Recipe = Recipe.ChromePdf(不需要)永遠 ChromePdf
模板.引擎 = 引擎.無(不需要)使用 C# 模板化
Chrome.HeaderTemplateRenderingOptions.TextHeaderHtmlHeaderHTML 標頭
Chrome.FooterTemplateRenderingOptions.TextFooterHtmlFooterHTML 頁腳
Chrome.DisplayHeaderFooter(自動)標頭自動啟用
Chrome.MarginTopRenderingOptions.MarginTop以毫米為單位

占位符對應(頁首/頁腳)

jsreport 占位符IronPdf 占位符筆記
<span> class="pageNumber"></span>{page}目前頁面
<span> class="totalPages"></span>{總頁數}總頁數
<編碼>{#pageNum}</編碼{page}目前頁面
<編碼>{#numPages}</編碼{總頁數}總頁數
{#timestamp}(時間戳記<編碼>{日期}</編碼目前日期

程式碼遷移範例

範例 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!");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

After (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!");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

jsreport 方法需要三個 NuGet 套件 (jsreport.Binaryjsreport.Localjsreport.Types)、三個命名空間匯入、async-only 執行、流暢的建構器鏈 (LocalReporting().UseBinary().AsUtility().Create()),冗長的RenderRequest與嵌套的Template物件指定RecipeEngine,以及使用using區塊手動將串流複製到檔案。

IronPdf 可將其簡化為一個 NuGet 套件、一個命名空間、三行程式碼和同步執行。 ChromePdfRenderer.RenderHtmlAsPdf() 方法直接接受 HTML 並返回一個<編碼>PDF 文件</編碼與一個簡單的 SaveAs() 方法。 請參閱 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!");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

After (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!");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

此範例突顯了jsreport的一大限制:沒有直接的 URL 轉 PDF 方法。jsreport程式碼必須使用嵌入 HTML 內容的 JavaScript 重定向變通 (window.location='https://example.com') 來擷取網頁。 這種間接的方式對某些網站可能會失敗,並增加不必要的複雜性。

IronPDF 提供了專用的 RenderUrlAsPdf() 方法,可直接渲染任何 URL,並提供完整的 JavaScript 執行和現代 CSS 支援。 不需要變通,不需要內嵌腳本,只要傳送 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!");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

After (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!");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

jsreport 方法需要在範本中加入Chrome物件,設定 DisplayHeaderFooter = true,並使用具有特殊 CSS 類別占位符 (<span> class="pageNumber"></span>, <span> class="totalPages"></span>) 的 HTML 模板。 頁頭與頁尾的範本必須包含完整的內嵌式樣。

IronPDF 提供了一個更乾淨的 TextHeaderFooter 設定,具有專用的 CenterText, LeftText, RightTextFontSize 屬性。 頁數占位符使用較簡單的{page}{總頁數}語法。 有關 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();
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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}"
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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;
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

疑難排解

問題 1:LocalReporting 未找到

問題:程式碼引用了本地報告類別,但該類別在IronPDF中並不存在。

解決方案:以<代碼>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();
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

問題 2:未找到 RenderRequest

問題:程式碼使用RenderRequest範本wrapper 物件。

解決方案:直接傳遞 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);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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}"
IRON VB CONVERTER ERROR developers@ironsoftware.com
$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();
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

遷移清單

預遷移

  • [ ] 識別所有jsreportusing 語句
  • [ ] 使用 Handlebars/JsRender 的清單範本 (轉換為 C# 字串插值)
  • [ ] 記錄目前使用的 Chrome 選項(邊距、紙張大小)
  • [ ] 檢查網路伺服器與公用程式模式 (兩者都成為進程中)
  • [ ] 注意特定平台的二進位套件(全部刪除)
  • [ ] 獲得 IronPdf 授權金鑰

套件變更

  • [ ] 移除 jsreport.Binary 套件
  • [ ] 移除 jsreport.Binary.Linux 套件
  • [ ] 移除 jsreport.Binary.OSX 套件
  • [ ] 移除 jsreport.Local 套件
  • [ ] 移除 jsreport.Types 套件
  • [ ] 移除 jsreport.Client 套件
  • [ ] 安裝 IronPdf 套件

程式碼變更

  • [ ] 在啟動時加入授權金鑰組態
  • [ ] 將本地報告替換為 ChromePdfRenderer
  • [ ] 移除RenderRequestwrapper
  • [ ] 移除範本wrapper
  • [ ] 更新占位符語法 (<span> class="pageNumber">{page})
  • [ ] 以 C# 字串插值取代 Handlebars
  • [ ] 移除 StartAsync() / KillAsync() 呼叫
  • [用 BinaryDataSaveAs() 取代流複製

測試

  • [ ] 測試所有 PDF 生成路徑
  • [ ] 確認頁首/頁尾的呈現
  • [ ] 檢查頁碼
  • [ ] 驗證頁邊距離
  • [ ] 使用複雜的 CSS/JavaScript 頁面進行測試
  • [ ] 基準效能

後遷移

  • [ ] 刪除jsreport二進位檔案
  • [如果不再需要,請移除 Node.js 的相依性
  • [ ] 更新部署腳本
  • [ ] 更新文件

結論

從jsreport轉換到 IronPDF,可以消除 Node.js 相依性、外部二進位管理和伺服器生命週期處理的複雜性。 從冗長的RenderRequest物件到簡單的方法呼叫的範式轉換,在維持完整 PDF 產生功能的同時,大幅減少了程式碼的數量。

本次轉換的主要變更如下 1.運行時間:Node.js + .NET → 純 .NET 2.伺服器流程:必填 → 處理中 (已排除) 3.二進位管理:手動平台套件 → 自動化 4.Templating:JavaScript (Handlebars) → C# (string interpolation) 5.API 風格:冗長的請求物件 → 乾淨流暢的方法 6.Placeholder<span> class="pageNumber">{page}

探索完整的 IronPdf文件教學API參考,加速您的jsreport遷移。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。