如何在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
# 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
# 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;
// 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 迁移参考
核心类映射
| 快速报告类 | 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);
}
}
}
}
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
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对象,附加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 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 —— 需要您自己用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);
}
}
}
}
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
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要求加载模板,将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)
数据绑定转换
用直接生成 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 模板文件
- 删除与快速报告相关的代码
- 更新文档
其他资源
从快速报告迁移到IronPDF可以消除可视化设计器依赖性、带状学习曲线和分散的软件包模型。 向基于 HTML/CSS 的 PDF 生成过渡利用了熟悉的网络技术,同时在一个软件包中提供了完整的 PDF 操作功能--合并、分割、安全和表单。

