如何在 C# 中合併或分割 PDF 文件
FastReport.NET 是一款專為 .NET 生態系統而建的強大報告解決方案,具有可視化報告設計器和基於帶狀架構的特性,用於建立複雜的資料驅動報告。 但是,FastReport 為現代 PDF 生成工作流帶來了顯著挑戰:報告設計器的依賴性限制了先編寫程式碼的開發,圍繞帶狀概念(DataBand, PageHeaderBand)的陡峭學習曲線,使用專有格式的有限 CSS 支援、複雜的資料綁定需使用 RegisterData() 樸素模板,以及需多次安裝的零散 NuGet 套件。 此綜合指南提供從FastReport遷移到IronPDF的逐步方法——一個通用的 PDF 程式庫,利用 HTML/CSS 網頁技術來進行靈活的程式化文件生成。
為何從FastReport遷移到 IronPDF?
FastReport.NET 在報告方面的專業化對需要多用途 PDF 生成的開發團隊造成了摩擦。 了解這些架構差異對於規劃您的遷移至關重要。
FastReport的挑戰
-
報告設計器依賴:建立複雜佈局需要使用可視化設計器或對 .frx 文件結構有深入知識——不適合先編寫程式碼的開發方法。
-
陡峭的學習曲線:FastReport 的基於帶狀架構(DataBand, PageHeaderBand, PageFooterBand)需了解報告特定概念,這些概念無法轉移到其他技術中。
-
有限的 CSS 支援:網頁標準樣式不被原生支持; 樣式是通過FastReport的專有格式而非熟悉的 CSS 實現的。
-
複雜的資料綁定:RegisterData() 和 DataSource 連接為簡單的 PDF 生成場景新增了樣板程式碼。
-
零散的套件:完整功能需要多個 NuGet 套件(FastReport.OpenSource, FastReport.OpenSource.Export.PdfSimple 等)。 在 OpenSource 版本中,
PDFSimpleExport會光柵化頁面,因此輸出 PDF 含有文字圖像而非選擇性文字。 - 授權複雜性:開源版本(MIT)通過
PDFSimpleExport配備了基於圖像的 PDF 當後備方案。 可選擇性文字的 PDF 匯出、加密、數位簽章和 PDF/A 需要商業FastReport.Net套件,該套件在FastReport的私有 NuGet 提要上發佈 (https://nuget.fast-report.com/api/v3/index.json),而不是在 nuget.org 上。 只有FastReport.Net.Demo(頁面限制,帶水印)在 nuget.org 上。
架構比較
| 方面 | FastReport | IronPDF |
|---|---|---|
| 設計方法 | 可視化設計器 + .frx 文件 | HTML/CSS(網頁技術) |
| 學習曲線 | 陡峭的(基於帶狀的概念) | 緩和(HTML/CSS知識) |
| 資料綁定 | RegisterData(), DataBand | 字串插值、Razor、模板 |
| CSS 支援 | 有限 | 全部 CSS3 支援,含 Flexbox/Grid |
| 套件模型 | 多個套件 | 單一套件(所有功能) |
| 渲染引擎 | 自定報告引擎;OpenSource PDF 匯出會光柵化 | 嵌入的Chromium |
| PDF 操作 | 以匯出為重點 | 完整(合併、拆分、安全性、表單) |
| 現代 .NET | .NET Framework 4.6.2+ / .NET 6+ | .NET Framework 4.6.2+ / .NET 6/7/8/9+ |
主要遷移利益
- 網頁技術:使用熟悉的 HTML/CSS 而非專有的基於帶狀佈局
- 程式碼優先開發:程式化生成 PDF,而無需依賴可視化設計器
- 單一套件:一個 NuGet 套件包含所有 PDF 功能
- 現代渲染:最新的 Chromium 引擎提供完美像素的 CSS3 輸出
- 完整的 PDF 操作:合併、拆分、安全性、表單——不僅僅是匯出
遷移前準備
前提條件
確保您的環境符合以下要求:
- .NET Framework 4.6.2+ or .NET Core 3.1 / .NET 5-9
- Visual Studio 2019+或VS Code與C#擴展
- NuGet包管理器存取 -IronPDF許可證金鑰(免費試用可在 ironpdf.com 獲得)
審計FastReport的使用
在您的解決方案目錄中運行這些命令以識別所有FastReport參考:
# Find allFastReportreferences
grep -r "FastReport\|\.frx\|PDFExport\|PDFSimpleExport\|DataBand\|RegisterData" --include="*.cs" --include="*.csproj" .
# Check NuGet packages
dotnet list package | grep FastReport
# Find allFastReportreferences
grep -r "FastReport\|\.frx\|PDFExport\|PDFSimpleExport\|DataBand\|RegisterData" --include="*.cs" --include="*.csproj" .
# Check NuGet packages
dotnet list package | grep FastReport
記錄您的報告模板
在遷移之前,編目所有 .frx 文件及其目的:
- 報告名稱和用途
- 使用的資料源
- 頁眉/頁腳配置
- 頁碼要求
- 特殊格式或樣式
了解範式轉變
從FastReport遷移到IronPDF時,最顯著的變化是基本的設計方法。FastReport使用帶狀的可視化設計,採用 .frx 模板文件以及像 DataBand, PageHeaderBand 和 RegisterData() 這樣的專有概念。IronPDF使用 HTML/CSS——大多數開發者已經熟悉的網頁技術。
這意味著要將FastReport的帶狀配置轉換為 HTML 模板,用字串插值或 Razor 模板直接進行資料綁定以替換 RegisterData(),並將 PageHeaderBand/PageFooterBand 轉換為基於 HTML 的頁眉和頁腳。
逐步遷移過程
步驟1:更新NuGet包
移除所有FastReport套件並安裝 IronPDF:
# Remove allFastReportpackages
dotnet remove package FastReport.OpenSource
dotnet remove package FastReport.OpenSource.Export.PdfSimple
dotnet remove package FastReport.OpenSource.Web
dotnet remove package FastReport.OpenSource.Data.MsSql
# InstallIronPDF(includes all features)
dotnet add package IronPdf
# Remove allFastReportpackages
dotnet remove package FastReport.OpenSource
dotnet remove package FastReport.OpenSource.Export.PdfSimple
dotnet remove package FastReport.OpenSource.Web
dotnet remove package FastReport.OpenSource.Data.MsSql
# InstallIronPDF(includes all features)
dotnet add package IronPdf
步驟 2:更新命名空間引用
將FastReport名稱空間替換為 IronPDF:
// Remove these
using FastReport;
using FastReport.Export.PdfSimple;
using System.IO;
// Add this
using IronPdf;
// Remove these
using FastReport;
using FastReport.Export.PdfSimple;
using System.IO;
// Add this
using IronPdf;
Imports IronPdf
步驟3:配置授權
// 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"
完整 API 遷移參考
核心類映射
| FastReport 類 | IronPDF等價 |
|---|---|
Report |
ChromePdfRenderer |
PDFExport |
ChromePdfRenderer + SecuritySettings |
PDFSimpleExport |
ChromePdfRenderer |
ReportPage |
HTML <body> 或 <div> |
TextObject |
HTML <p>, <span>, <div> |
HTMLObject |
直接 HTML 渲染 |
PageHeaderBand |
HtmlHeaderFooter |
PageFooterBand |
HtmlHeaderFooter |
方法映射
| FastReport 方法 | IronPDF等價 |
|---|---|
report.Load("template.frx") |
HTML 模板文件或字串 |
report.RegisterData(data, "name") |
字串插值或 Razor |
report.Prepare() |
無 |
report.Export(export, stream) |
pdf.SaveAs(path) |
頁碼佔位符轉換
FastReport 和IronPDF使用不同的頁碼佔位符語法:
| FastReport | IronPDF |
|---|---|
[Page] |
{page} |
[TotalPages] |
{total-pages} |
程式碼遷移範例
HTML到PDF轉換
此範例展示了FastReport的 HTMLObject 方法和IronPDF的直接渲染之間的基本區別。
FastReport 實現:
// NuGet: Install-Package FastReport.OpenSource
// Install-Package FastReport.OpenSource.Export.PdfSimple
using FastReport;
using FastReport.Export.PdfSimple;
using System.Drawing;
using System.IO;
class Program
{
static void Main()
{
using (Report report = new Report())
{
//FastReportrenders nothing unless objects live on a band that lives on a ReportPage.
ReportPage page = new ReportPage();
report.Pages.Add(page);
page.ReportTitle = new ReportTitleBand { Height = Units.Millimeters * 100 };
// Create HTML object (FastReport class is HtmlObject)
HtmlObject htmlObject = new HtmlObject();
htmlObject.Bounds = new RectangleF(0, 0, Units.Millimeters * 190, Units.Millimeters * 100);
htmlObject.Text = "<html><body><h1>Hello World</h1><p>This is a test PDF</p></body></html>";
page.ReportTitle.Objects.Add(htmlObject);
report.Prepare();
// PDFSimpleExport rasterizes each page — text is not selectable
PDFSimpleExport pdfExport = new PDFSimpleExport();
using (FileStream fs = new FileStream("output.pdf", FileMode.Create))
{
report.Export(pdfExport, fs);
}
}
}
}
// NuGet: Install-Package FastReport.OpenSource
// Install-Package FastReport.OpenSource.Export.PdfSimple
using FastReport;
using FastReport.Export.PdfSimple;
using System.Drawing;
using System.IO;
class Program
{
static void Main()
{
using (Report report = new Report())
{
//FastReportrenders nothing unless objects live on a band that lives on a ReportPage.
ReportPage page = new ReportPage();
report.Pages.Add(page);
page.ReportTitle = new ReportTitleBand { Height = Units.Millimeters * 100 };
// Create HTML object (FastReport class is HtmlObject)
HtmlObject htmlObject = new HtmlObject();
htmlObject.Bounds = new RectangleF(0, 0, Units.Millimeters * 190, Units.Millimeters * 100);
htmlObject.Text = "<html><body><h1>Hello World</h1><p>This is a test PDF</p></body></html>";
page.ReportTitle.Objects.Add(htmlObject);
report.Prepare();
// PDFSimpleExport rasterizes each page — text is not selectable
PDFSimpleExport pdfExport = new PDFSimpleExport();
using (FileStream fs = new FileStream("output.pdf", FileMode.Create))
{
report.Export(pdfExport, fs);
}
}
}
}
Imports FastReport
Imports FastReport.Export.PdfSimple
Imports System.Drawing
Imports System.IO
Module Program
Sub Main()
Using report As New Report()
' FastReport renders nothing unless objects live on a band that lives on a ReportPage.
Dim page As New ReportPage()
report.Pages.Add(page)
page.ReportTitle = New ReportTitleBand With {.Height = Units.Millimeters * 100}
' Create HTML object (FastReport class is HtmlObject)
Dim htmlObject As New HtmlObject()
htmlObject.Bounds = New RectangleF(0, 0, Units.Millimeters * 190, Units.Millimeters * 100)
htmlObject.Text = "<html><body><h1>Hello World</h1><p>This is a test PDF</p></body></html>"
page.ReportTitle.Objects.Add(htmlObject)
report.Prepare()
' PDFSimpleExport rasterizes each page — text is not selectable
Dim pdfExport As New PDFSimpleExport()
Using fs As New FileStream("output.pdf", FileMode.Create)
report.Export(pdfExport, fs)
End Using
End Using
End Sub
End Module
IronPDF實現:
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Hello World</h1><p>This is a test PDF</p></body></html>");
pdf.SaveAs("output.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Hello World</h1><p>This is a test PDF</p></body></html>");
pdf.SaveAs("output.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Hello World</h1><p>This is a test PDF</p></body></html>")
pdf.SaveAs("output.pdf")
End Sub
End Class
FastReport 需要建立一個 Report 物件,附加一個 ReportPage 和一個 ReportTitleBand,在帶狀中放置一個有明確邊界的 HtmlObject,準備報告,並通過流匯出。 PDFSimpleExport 將輸出進行光柵化,因此生成的 PDF 包含文字圖像而不是可選擇的文字。IronPDF用直接 HTML 渲染和可選擇文字輸出三行程式碼即可實現相同效果。 有關更多選項,請參閱HTML轉PDF文件。
URL 到 PDF 轉換
此範例突顯了FastReport需要手動下載 HTML,而IronPDF則可以自然地處理 URL 渲染。
FastReport 實現:
// NuGet: Install-Package FastReport.OpenSource
// Install-Package FastReport.OpenSource.Export.PdfSimple
//FastReporthas no native URL-to-PDF. You must download the HTML yourself
// and feed it into HtmlObject — which handles only a limited HTML 4 subset,
// no JavaScript and no modern CSS.
using FastReport;
using FastReport.Export.PdfSimple;
using System.Drawing;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// Download HTML content from URL
string htmlContent;
using (var client = new HttpClient())
{
htmlContent = await client.GetStringAsync("https://example.com");
}
using (Report report = new Report())
{
ReportPage page = new ReportPage();
report.Pages.Add(page);
page.ReportTitle = new ReportTitleBand { Height = Units.Millimeters * 250 };
HtmlObject htmlObject = new HtmlObject();
htmlObject.Bounds = new RectangleF(0, 0, Units.Millimeters * 190, Units.Millimeters * 250);
htmlObject.Text = htmlContent;
page.ReportTitle.Objects.Add(htmlObject);
report.Prepare();
PDFSimpleExport pdfExport = new PDFSimpleExport();
using (FileStream fs = new FileStream("webpage.pdf", FileMode.Create))
{
report.Export(pdfExport, fs);
}
}
}
}
// NuGet: Install-Package FastReport.OpenSource
// Install-Package FastReport.OpenSource.Export.PdfSimple
//FastReporthas no native URL-to-PDF. You must download the HTML yourself
// and feed it into HtmlObject — which handles only a limited HTML 4 subset,
// no JavaScript and no modern CSS.
using FastReport;
using FastReport.Export.PdfSimple;
using System.Drawing;
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
class Program
{
static async Task Main()
{
// Download HTML content from URL
string htmlContent;
using (var client = new HttpClient())
{
htmlContent = await client.GetStringAsync("https://example.com");
}
using (Report report = new Report())
{
ReportPage page = new ReportPage();
report.Pages.Add(page);
page.ReportTitle = new ReportTitleBand { Height = Units.Millimeters * 250 };
HtmlObject htmlObject = new HtmlObject();
htmlObject.Bounds = new RectangleF(0, 0, Units.Millimeters * 190, Units.Millimeters * 250);
htmlObject.Text = htmlContent;
page.ReportTitle.Objects.Add(htmlObject);
report.Prepare();
PDFSimpleExport pdfExport = new PDFSimpleExport();
using (FileStream fs = new FileStream("webpage.pdf", FileMode.Create))
{
report.Export(pdfExport, fs);
}
}
}
}
Imports FastReport
Imports FastReport.Export.PdfSimple
Imports System.Drawing
Imports System.IO
Imports System.Net.Http
Imports System.Threading.Tasks
Module Program
Async Function Main() As Task
' Download HTML content from URL
Dim htmlContent As String
Using client As New HttpClient()
htmlContent = Await client.GetStringAsync("https://example.com")
End Using
Using report As New Report()
Dim page As New ReportPage()
report.Pages.Add(page)
page.ReportTitle = New ReportTitleBand With {.Height = Units.Millimeters * 250}
Dim htmlObject As New HtmlObject()
htmlObject.Bounds = New RectangleF(0, 0, Units.Millimeters * 190, Units.Millimeters * 250)
htmlObject.Text = htmlContent
page.ReportTitle.Objects.Add(htmlObject)
report.Prepare()
Dim pdfExport As New PDFSimpleExport()
Using fs As New FileStream("webpage.pdf", FileMode.Create)
report.Export(pdfExport, fs)
End Using
End Using
End Function
End Module
IronPDF實現:
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://example.com");
pdf.SaveAs("webpage.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
var pdf = renderer.RenderUrlAsPdf("https://example.com");
pdf.SaveAs("webpage.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://example.com")
pdf.SaveAs("webpage.pdf")
End Sub
End Class
FastReport 沒有原生的 URL 到 PDF ——您需要使用 HttpClient 自行下載 HTML,將其嵌入在帶狀中的 HtmlObject,然後匯出。 HtmlObject 只能處理有限的 HTML 4 子集,不支持 JavaScript 執行,也不支持現代 CSS,並且 PDFSimpleExport 會光柵化輸出。IronPDF的 RenderUrlAsPdf 使用嵌入的 Chromium 引擎直接渲染現場網頁,支持完整的 JavaScript 執行。更多選項,請參見URL 到 PDF 文件。
帶有頁碼的頁眉和頁腳
此範例展示了FastReport的帶狀系統和IronPDF的 HTML 方法之間的複雜性差異。
FastReport 實現:
// NuGet: Install-Package FastReport.OpenSource
// Install-Package FastReport.OpenSource.Export.PdfSimple
using FastReport;
using FastReport.Export.PdfSimple;
using System.Drawing;
using System.IO;
class Program
{
static void Main()
{
using (Report report = new Report())
{
report.Load("template.frx");
// Cast to ReportPage (Report.Pages can hold dialog pages too)
ReportPage page = report.Pages[0] as ReportPage;
// Page header — assigned to the band slot on the page
page.PageHeader = new PageHeaderBand { Height = Units.Millimeters * 15 };
TextObject headerText = new TextObject
{
Bounds = new RectangleF(0, 0, Units.Millimeters * 190, Units.Millimeters * 10),
Text = "Document Header",
HorzAlign = HorzAlign.Center
};
page.PageHeader.Objects.Add(headerText);
// Page footer withFastReportpage tokens [Page] and [TotalPages]
page.PageFooter = new PageFooterBand { Height = Units.Millimeters * 15 };
TextObject footerText = new TextObject
{
Bounds = new RectangleF(0, 0, Units.Millimeters * 190, Units.Millimeters * 10),
Text = "Page [Page] of [TotalPages]",
HorzAlign = HorzAlign.Right
};
page.PageFooter.Objects.Add(footerText);
report.Prepare();
PDFSimpleExport pdfExport = new PDFSimpleExport();
using (FileStream fs = new FileStream("report.pdf", FileMode.Create))
{
report.Export(pdfExport, fs);
}
}
}
}
// NuGet: Install-Package FastReport.OpenSource
// Install-Package FastReport.OpenSource.Export.PdfSimple
using FastReport;
using FastReport.Export.PdfSimple;
using System.Drawing;
using System.IO;
class Program
{
static void Main()
{
using (Report report = new Report())
{
report.Load("template.frx");
// Cast to ReportPage (Report.Pages can hold dialog pages too)
ReportPage page = report.Pages[0] as ReportPage;
// Page header — assigned to the band slot on the page
page.PageHeader = new PageHeaderBand { Height = Units.Millimeters * 15 };
TextObject headerText = new TextObject
{
Bounds = new RectangleF(0, 0, Units.Millimeters * 190, Units.Millimeters * 10),
Text = "Document Header",
HorzAlign = HorzAlign.Center
};
page.PageHeader.Objects.Add(headerText);
// Page footer withFastReportpage tokens [Page] and [TotalPages]
page.PageFooter = new PageFooterBand { Height = Units.Millimeters * 15 };
TextObject footerText = new TextObject
{
Bounds = new RectangleF(0, 0, Units.Millimeters * 190, Units.Millimeters * 10),
Text = "Page [Page] of [TotalPages]",
HorzAlign = HorzAlign.Right
};
page.PageFooter.Objects.Add(footerText);
report.Prepare();
PDFSimpleExport pdfExport = new PDFSimpleExport();
using (FileStream fs = new FileStream("report.pdf", FileMode.Create))
{
report.Export(pdfExport, fs);
}
}
}
}
Imports FastReport
Imports FastReport.Export.PdfSimple
Imports System.Drawing
Imports System.IO
Module Program
Sub Main()
Using report As New Report()
report.Load("template.frx")
' Cast to ReportPage (Report.Pages can hold dialog pages too)
Dim page As ReportPage = TryCast(report.Pages(0), ReportPage)
' Page header — assigned to the band slot on the page
page.PageHeader = New PageHeaderBand With {.Height = Units.Millimeters * 15}
Dim headerText As New TextObject With {
.Bounds = New RectangleF(0, 0, Units.Millimeters * 190, Units.Millimeters * 10),
.Text = "Document Header",
.HorzAlign = HorzAlign.Center
}
page.PageHeader.Objects.Add(headerText)
' Page footer with FastReport page tokens [Page] and [TotalPages]
page.PageFooter = New PageFooterBand With {.Height = Units.Millimeters * 15}
Dim footerText As New TextObject With {
.Bounds = New RectangleF(0, 0, Units.Millimeters * 190, Units.Millimeters * 10),
.Text = "Page [Page] of [TotalPages]",
.HorzAlign = HorzAlign.Right
}
page.PageFooter.Objects.Add(footerText)
report.Prepare()
Dim pdfExport As New PDFSimpleExport()
Using fs As New FileStream("report.pdf", FileMode.Create)
report.Export(pdfExport, fs)
End Using
End Using
End Sub
End Module
IronPDF實現:
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
// Configure header and footer
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center'>Document Header</div>"
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center'>Page {page} of {total-pages}</div>"
};
var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Report Content</h1><p>This is the main content.</p></body></html>");
pdf.SaveAs("report.pdf");
}
}
// NuGet: Install-Package IronPdf
using IronPdf;
class Program
{
static void Main()
{
var renderer = new ChromePdfRenderer();
// Configure header and footer
renderer.RenderingOptions.HtmlHeader = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center'>Document Header</div>"
};
renderer.RenderingOptions.HtmlFooter = new HtmlHeaderFooter()
{
HtmlFragment = "<div style='text-align:center'>Page {page} of {total-pages}</div>"
};
var pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Report Content</h1><p>This is the main content.</p></body></html>");
pdf.SaveAs("report.pdf");
}
}
Imports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
' Configure header and footer
renderer.RenderingOptions.HtmlHeader = New HtmlHeaderFooter() With {
.HtmlFragment = "<div style='text-align:center'>Document Header</div>"
}
renderer.RenderingOptions.HtmlFooter = New HtmlHeaderFooter() With {
.HtmlFragment = "<div style='text-align:center'>Page {page} of {total-pages}</div>"
}
Dim pdf = renderer.RenderHtmlAsPdf("<html><body><h1>Report Content</h1><p>This is the main content.</p></body></html>")
pdf.SaveAs("report.pdf")
End Sub
End Class
FastReport 需要載入模板,將 Pages[0] 投射為 ReportPage,將頭部和底部的帶狀實例分配給頁面的 PageHeader / PageFooter 插槽,然後將 TextObject 實例與明確的 Bounds 附加到每個帶狀。IronPDF使用 HtmlHeaderFooter 和簡單的 HTML 片段——您可以使用完整的 CSS 樣式化頁眉和頁腳。 注意頁碼語法更改:[Page] 變為 [TotalPages] 變為 {total-pages}。 欲了解更多選項,請參見 頁眉和頁腳文件。
關鍵遷移注意事項
無 .frx 模板文件
FastReport 模板 (.frx) 將無法與IronPDF一起工作。 將您的佈局轉換為 HTML/CSS 模板:
//FastReport- loads .frx template
report.Load("report.frx");
//IronPDF- use HTML template
var html = File.ReadAllText("template.html");
var pdf = renderer.RenderHtmlAsPdf(html);
//FastReport- loads .frx template
report.Load("report.frx");
//IronPDF- use HTML template
var html = File.ReadAllText("template.html");
var pdf = renderer.RenderHtmlAsPdf(html);
' FastReport - loads .frx template
report.Load("report.frx")
' IronPDF - use HTML template
Dim html As String = File.ReadAllText("template.html")
Dim pdf = renderer.RenderHtmlAsPdf(html)
資料綁定轉換
用直接 HTML 生成替換 RegisterData():
// FastReport
report.RegisterData(dataSet, "Data");
report.GetDataSource("Data").Enabled = true;
//IronPDF- use string interpolation or StringBuilder
var html = new StringBuilder();
foreach (var item in data)
{
html.Append($"<tr><td>{item.Name}</td><td>{item.Value}</td></tr>");
}
var pdf = renderer.RenderHtmlAsPdf(html.ToString());
// FastReport
report.RegisterData(dataSet, "Data");
report.GetDataSource("Data").Enabled = true;
//IronPDF- use string interpolation or StringBuilder
var html = new StringBuilder();
foreach (var item in data)
{
html.Append($"<tr><td>{item.Name}</td><td>{item.Value}</td></tr>");
}
var pdf = renderer.RenderHtmlAsPdf(html.ToString());
Imports System.Text
' FastReport
report.RegisterData(dataSet, "Data")
report.GetDataSource("Data").Enabled = True
' IronPDF - use string interpolation or StringBuilder
Dim html As New StringBuilder()
For Each item In data
html.Append($"<tr><td>{item.Name}</td><td>{item.Value}</td></tr>")
Next
Dim pdf = renderer.RenderHtmlAsPdf(html.ToString())
安全設置
//IronPDFsecurity
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SecuritySettings.UserPassword = "password";
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
//IronPDFsecurity
var pdf = renderer.RenderHtmlAsPdf(html);
pdf.SecuritySettings.UserPassword = "password";
pdf.SecuritySettings.OwnerPassword = "ownerPassword";
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights;
'IronPDFsecurity
Dim pdf = renderer.RenderHtmlAsPdf(html)
pdf.SecuritySettings.UserPassword = "password"
pdf.SecuritySettings.OwnerPassword = "ownerPassword"
pdf.SecuritySettings.AllowUserPrinting = PdfPrintSecurity.FullPrintRights
欲了解全面的安全選項,請參閱 加密文件。
後遷移檢查清單
完成程式碼遷移後,請驗證以下內容:
- 生成的PDF文件的視覺比較
- 驗證頁眉/頁腳和頁碼
- 使用生產資料量進行測試
- 驗證安全/加密功能
- 性能基準測試
- 移除未使用的 .frx 模板文件
- 刪除與FastReport有關的程式碼
- 更新文件
其他資源
從FastReport到IronPDF的遷移消除了對可視化設計器的依賴,帶狀學習曲線及零散的套件模型。 轉變為基於 HTML/CSS 的 PDF 生成利用熟悉的網頁技術,同時在單個套件中提供完整的 PDF 操作功能——合併、拆分、安全性和表單。

