
如何在 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
記錄您的報告模板
在遷移之前,編目所有 .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
步驟 2:更新命名空間引用
將FastReport名稱空間替換為 IronPDF:
// Remove these
using FastReport;
using FastReport.Export.PdfSimple;
using System.IO;
// Add this
using IronPdf;Imports IronPdfImports 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"' 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);
}
}
}
}' NuGet: Install-Package FastReport.OpenSource
' Install-Package FastReport.OpenSource.Export.PdfSimple
Imports FastReport
Imports FastReport.Export.PdfSimple
Imports System.Drawing
Imports System.IO
Module Program
Sub Main()
Using report As New Report()
'FastReportrenders 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' NuGet: Install-Package FastReport.OpenSource
' Install-Package FastReport.OpenSource.Export.PdfSimple
Imports FastReport
Imports FastReport.Export.PdfSimple
Imports System.Drawing
Imports System.IO
Module Program
Sub Main()
Using report As New Report()
'FastReportrenders 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 ModuleIronPDF實現:
// 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 ClassImports 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 ClassFastReport 需要建立一個 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);
}
}
}
}' 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.
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' 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.
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 ModuleIronPDF實現:
// 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 ClassImports IronPdf
Class Program
Shared Sub Main()
Dim renderer = New ChromePdfRenderer()
Dim pdf = renderer.RenderUrlAsPdf("https://example.com")
pdf.SaveAs("webpage.pdf")
End Sub
End ClassFastReport 沒有原生的 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
Class Program
Shared 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 withFastReportpage 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 ClassImports FastReport
Imports FastReport.Export.PdfSimple
Imports System.Drawing
Imports System.IO
Class Program
Shared 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 withFastReportpage 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 ClassIronPDF實現:
// 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");
}
}' NuGet: Install-Package IronPdf
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' NuGet: Install-Package IronPdf
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 ClassFastReport 需要載入模板,將 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)' 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())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'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 操作功能——合併、拆分、安全性和表單。
Curtis Chau擁有Carleton大學的電腦科學學士學位,專精於前端開發,擁有Node.js、TypeScript、JavaScript和React的專業知識。Curtis熱衷於建立直觀且美觀的使用者介面,喜愛使用現代框架並建立結構良好、視覺吸引力的手冊。
相關文章


