如何用 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.Binary、jsreport.Binary.Linux、jsreport.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的比較
| 特點 | jsreport | IronPDF |
|---|---|---|
| 運行時間 | 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授權組態
// 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辨識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 同等級產品 | 筆記 |
|---|---|---|
本地報告 | <代碼>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.HeaderTemplate | RenderingOptions.TextHeader或HtmlHeader | HTML 標頭 |
Chrome.FooterTemplate | RenderingOptions.TextFooter或HtmlFooter | HTML 頁腳 |
Chrome.DisplayHeaderFooter | (自動) | 標頭自動啟用 |
Chrome.MarginTop | RenderingOptions.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.comAfter (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.comjsreport 方法需要三個 NuGet 套件 (jsreport.Binary、jsreport.Local、jsreport.Types)、三個命名空間匯入、async-only 執行、流暢的建構器鏈 (LocalReporting().UseBinary().AsUtility().Create()),冗長的RenderRequest與嵌套的Template物件指定Recipe和Engine,以及使用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.comAfter (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此範例突顯了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.comAfter (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.comjsreport 方法需要在範本中加入Chrome物件,設定 DisplayHeaderFooter = true,並使用具有特殊 CSS 類別占位符 (<span> class="pageNumber"></span>, <span> class="totalPages"></span>) 的 HTML 模板。 頁頭與頁尾的範本必須包含完整的內嵌式樣。
IronPDF 提供了一個更乾淨的 TextHeaderFooter 設定,具有專用的 CenterText, LeftText, RightText 和 FontSize 屬性。 頁數占位符使用較簡單的{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.comIronPDF 完全在進程中執行 - 無需啟動伺服器、無需進程管理、無需清理:
// IronPDF:
var renderer = new ChromePdfRenderer();
// Just use it—no lifecycle management needed// IronPDF:
var renderer = new ChromePdfRenderer();
// Just use it—no lifecycle management neededIRON VB CONVERTER ERROR developers@ironsoftware.com移除特定平台的二進位套件
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.OSXIronPDF 可透過單一 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使用 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簡化串流處理
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疑難排解
問題 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問題 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問題 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問題 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遷移清單
預遷移
- [ ] 識別所有jsreport
using語句 - [ ] 使用 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()呼叫 - [用
BinaryData或SaveAs()取代流複製
測試
- [ ] 測試所有 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}






