
如何在C#中合并或拆分PDF文件
FastReport.NET 是专为 .NET 生态系统打造的强大报告解决方案,具有可视化报告设计器和基于频带的架构,可用于创建复杂的数据驱动型报告。 然而,FastReport 对现代 PDF 生成工作流程提出了重大挑战:报表设计器依赖性限制了代码优先开发,围绕基于带的概念(DataBand、PageHeaderBand)的学习曲线陡峭,使用专有格式的 CSS 支持有限,使用 RegisterData() 模板的复杂数据绑定,以及需要多次安装的零散 NuGet 包。 本综合指南提供了从快速报告逐步迁移到IronPDF的路径--IronPDF 是一种通用 PDF 库,利用 HTML/CSS 网络技术实现灵活的程序化文档生成。
为什么要从快速报告迁移到 IronPDF?
FastReport.NET在报告方面的专业性为需要多功能PDF生成的开发团队带来了摩擦。 了解这些架构差异对于规划迁移至关重要。
###快速报告的挑战
1.报表设计器依赖性:创建复杂的布局需要可视化设计器或对 .frx 文件结构有深入的了解——不适合代码优先的开发方法。
2.学习曲线陡峭:快速报告基于带状结构的架构(DataBand、PageHeaderBand、PageFooterBand)需要理解报表特有的概念,这些概念无法转移到其他技术中。
- CSS 支持有限:不支持 Web 标准样式; 样式设计通过快速报告的专有格式完成,而不是熟悉的 CSS。
4.复杂的数据绑定: RegisterData() 和 DataSource 连接为简单的 PDF 生成场景增加了样板代码。
5.分散的包:需要多个 NuGet 包才能实现完整功能(FastReport.OpenSource、FastReport.OpenSource.Export.PdfSimple 等)。 PDFSimpleExport 在OpenSource版本中光栅化页面,因此输出的PDF中包含的是文本的图像而不是可选择的文本。
- 许可复杂性:OpenSource版本(MIT)通过
PDFSimpleExport提供基于图像的PDF备用。 可选择文本PDF导出、加密、数字签名和PDF/A需要商业的https://nuget.fast-report.com/api/v3/index.json)上,而不是在nuget.org上。 只有FastReport.Net.Demo(页面限制,水印)在nuget.org上。
架构比较
| 方面 | 快速报告 | IronPDF |
|---|---|---|
| 设计方法 | 可视化设计器 + .frx 文件 | HTML/CSS (网络技术) |
| 学习曲线 | 陡峭(基于波段的概念) | 温柔(HTML/CSS 知识) |
| 数据绑定 | 注册数据(), 数据带 | 字符串插值、Razor、模板化 |
| CSS支持 | 有限的 | 带有 Flexbox/Grid 的完整 CSS3 |
| 软件包模型 | 多个软件包 | 单个软件包(所有功能) |
| 渲染引擎 | 自定义报告引擎;OpenSource PDF 导出光栅化 | 嵌入式 Chromium |
| PDF 操作 | 注重出口 | 完整(合并、拆分、安全、表单) |
| 现代.NET | .NET Framework 4.6.2+ / .NET 6+ | .NET Framework 4.6.2+ / .NET 6/7/8/9+ |
主要迁移优势
- Web技术:使用熟悉的HTML/CSS,而不是专有的基于频段的布局 2.代码优先开发:无需依赖可视化设计器即可通过编程方式生成 PDF。 3.单个包:一个 NuGet 包包含所有 PDF 功能 4.现代渲染:采用最新的 Chromium 引擎,实现像素级精准的 CSS3 输出 5.完整的 PDF 操作:合并、拆分、安全设置、表单——不仅仅是导出
迁移前准备
前提条件
确保您的环境符合这些要求:
- .NET Framework 4.6.2+ 或 .NET Core 3.1 / .NET 5-9
- Visual Studio 2019+ 或带有 C# 扩展的 VS Code
- 访问 NuGet 包管理器 -IronPDF许可证密钥(可在ironpdf.com免费试用)
审计快速报告的使用
在解决方案目录中运行这些命令,以识别所有快速报告引用:
# Find all快速报告references
grep -r "FastReport\|\.frx\|PDFExport\|PDFSimpleExport\|DataBand\|RegisterData" --include="*.cs" --include="*.csproj" .
# Check NuGet packages
dotnet list package | grep FastReport
记录您的报告模板
迁移之前,列出所有.frx文件及其用途:
- 报告名称和目的
- 使用的数据源
- 页眉/页脚配置
- 页码要求
- 特殊格式或样式
理解范式转变
从快速报告迁移到IronPDF时,最重要的变化是基本设计方法。 FastReport使用基于乐谱的视觉设计,包含.frx模板文件和像DataBand、PageHeaderBand和RegisterData()这样的专有概念。IronPDF使用大多数开发人员已经掌握的 HTML/CSS 网络技术。
这意味着要将快速报告带配置转换为 HTML 模板,通过字符串插值或 Razor 模板将 RegisterData() 替换为直接数据绑定,并将 PageHeaderBand/PageFooterBand 转换为基于 HTML 的页眉和页脚。
逐步迁移过程
步骤 1:更新 NuGet 软件包
删除所有快速报告软件包并安装 IronPDF:
# Remove all快速报告packages
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:更新命名空间引用
用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 迁移参考
核心类映射
| 快速报告类 | IronPDF 同等产品 |
|---|---|
Report | ChromePdfRenderer |
PDFExport | ChromePdfRenderer + SecuritySettings |
PDFSimpleExport | ChromePdfRenderer |
ReportPage | HTML <body> 或 <div> |
TextObject | HTML <div> |
HTMLObject | 直接 HTML 渲染 |
PageHeaderBand | HtmlHeaderFooter |
PageFooterBand | HtmlHeaderFooter |
方法映射
| 快速报告方法 | IronPDF 同等产品 |
|---|---|
report.Load("template.frx") | HTML 模板文件或字符串 |
report.RegisterData(data, "name") | 字符串插值或 Razor |
report.Prepare() | 不适用 |
report.Export(export, stream) | pdf.SaveAs(path) |
页码占位符转换
FastReport 和IronPDF对页码使用不同的占位符语法:
| 快速报告 | IronPDF |
|---|---|
[Page] | {page} |
[TotalPages] | {total-pages} |
代码迁移示例
HTML 到 PDF 转换
本例展示了快速报告的 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())
{
//快速报告renders 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())
{
//快速报告renders 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()
'快速报告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' 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()
'快速报告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 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对象,附加HtmlObject放在具有显式界限的乐谱上,准备报告,并通过流导出。 PDFSimpleExport将输出光栅化,因此生成的PDF中包含的是文本的图像而不是可选择的文本。 IronPDF通过直接HTML渲染和可选择文本输出在三行中实现相同的结果。 有关更多选项,请参阅 HTML 转 PDF 文档。
URL到PDF转换
本示例重点说明了快速报告需要手动下载 HTML,而IronPDF可原生处理 URL 渲染。
FastReport 实现:
// NuGet: Install-Package FastReport.OpenSource
// Install-Package FastReport.OpenSource.Export.PdfSimple
//快速报告has 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
//快速报告has 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 ModuleImports 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 —— 需要您自己用HtmlObject中,然后导出。 HtmlObject 仅处理有限的HTML 4子集,没有JavaScript执行和现代CSS,而PDFSimpleExport将输出光栅化。 IronPDF的RenderUrlAsPdf直接使用嵌入的Chromium引擎渲染实时网页并完整执行JavaScript。欲了解更多选项,请参见URL到PDF文档。
带页码的页眉和页脚
本例展示了快速报告基于带状的系统与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 with快速报告page 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 with快速报告page 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
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快速报告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' 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()
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快速报告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 ModuleIronPDF 实现:
// 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要求加载模板,将PageHeader / TextObject实例到每个乐谱。 IronPDF使用HtmlHeaderFooter与简单的HTML片段——可以用完整的CSS来设置页眉和页脚。 请注意页码语法的更改:[Page] 变为 [TotalPages] 变为 {total-pages}。 有关更多选项,请参阅页眉和页脚文档。
关键迁移说明
无 .frx 模板文件
FastReport 模板 (.frx) 无法与IronPDF一起使用。 将您的布局转换为 HTML/CSS 模板:
//快速报告- loads .frx template
report.Load("report.frx");
//IronPDF- use HTML template
var html = File.ReadAllText("template.html");
var pdf = renderer.RenderHtmlAsPdf(html);//快速报告- loads .frx template
report.Load("report.frx");
//IronPDF- use HTML template
var html = File.ReadAllText("template.html");
var pdf = renderer.RenderHtmlAsPdf(html);'快速报告- loads .frx template
report.Load("report.frx")
'IronPDF- use HTML template
Dim html As String = File.ReadAllText("template.html")
Dim pdf = renderer.RenderHtmlAsPdf(html)'快速报告- 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 模板文件
- 删除与快速报告相关的代码
- 更新文档
其他资源
从快速报告迁移到IronPDF可以消除可视化设计器依赖性、带状学习曲线和分散的软件包模型。 向基于 HTML/CSS 的 PDF 生成过渡利用了熟悉的网络技术,同时在一个软件包中提供了完整的 PDF 操作功能--合并、分割、安全和表单。
Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。
相关文章


