将 ActiveReports 报表输出为 PDF 文件

更新页 :
页面创建日期 :

操作环境

窗户
  • 视窗 10 专业版 22H2
Visual Studio的
  • Visual Studio 2022 社区版
适用于 .NET 的 ActiveReports
  • 适用于 .NET 16.0J 的 ActiveReports

先决条件

窗户
  • Windows 8.1
  • 视窗 10
  • 窗户11
  • Windows 服务器 2012
  • Windows 服务器 2012 R2
  • Windows 服务器 2016
  • Windows 服务器 2019
  • 视窗服务器 2022
Visual Studio的
  • Visual Studio 2017的
  • Visual Studio 2019 中
  • Visual Studio 2022 中
.NET 框架
  • NET 框架 4.6.2
  • NET 框架 4.7
  • NET 框架 4.8
。网
  • .NET Core 3.1
  • .NET 5
  • .NET 6
适用于 .NET 的 ActiveReports
  • 适用于 .NET 16.0J 的 ActiveReports

如何输出到 PDF 文件

如果用户希望将报表作为 PDF 文件,则提供该报表的最快方法是在查看器中查看报表。 除了显示报表外,查看器还具有打印和输出PDF等文件的功能,因此,如果显示查看器,则可以要求用户输出PDF文件。

但是,在某些情况下,您可能不想打扰用户,或者您可能希望系统地定向 PDF 文件。 本节介绍如何以编程方式直接从报表输出 PDF 文件。

PDF 文件输出方法和限制

有几种方法可以以编程方式输出 PDF 文件,但并非所有方法都可以接受。 这取决于 ActiveReports 的版本、平台、框架和它执行的报告类型。 例如,在 ActiveReports 16 中,节报表和页报表的输出方式不同。 这方面的一个例子也可以在官方页面上找到。

出于这个原因,这里有一些编程 PDF 输出的示例,您可以将其用作参考,以找到适合您的项目的输出。

关于示例报告

新项目模板中包含的报告文件为空,因此我们将使用官方的示例报告。 以下是一些建议,因此请从以下网站之一下载。

在本例中,我们将使用以下示例报告。

  • 页面报告 : Estimate_page_ipa.rdlx
  • 部分报告:Invoice.rpx(包含在 WebSample16 示例项目中)

呈现和生成 PDF(页面报表/RDL 报表)

有一个用于输出 PDF 的“导出过滤器”,但在版本 16 中,它只能用于章节报告。

因此,页面报告/RDL 报告需要使用“绘图扩展”生成,如上页所述。

首先,我将创建一个项目,但这次我将使用一个简单的控制台应用程序来制作它。 它适用于桌面和 Web 版本就像应用于 Web 版本一样容易。

创建项目时,请选择“控制台应用”。

创建项目后,添加所需的包。

以下是您将添加的内容: 请不要获取最新版本,而是使用下面描述的版本。 似乎某些软件包组合在最新版本中无法正常工作。 将显示一个警告标记,但请忽略它,因为依赖项不匹配。 但是,将来可能会随着版本升级而改变,因此请每次进行调整。 GrapeCity.Documents.Imaging GrapeCity.Documents.Pdf 并且需要渲染为 PDF。

  • GrapeCity.ActiveReports.Export.pdf (16.4.0)
  • GrapeCity.Documents.Imaging (6.0.3)
  • 葡萄城.Documents.pdf (6.0.3)

将报告文件添加到项目中。 位置可以在任何地方,但这次我要 Reports 创建一个文件夹并将其放入其中。 此放置位置会影响您稍后指定的路径。

接下来,打开已添加报表的属性。

将生成操作设置为“嵌入资源”。 这意味着将资源嵌入到 EXE (DLL) 中。 报表在桌面上是唯一加载的,就像在 Web 上一样。

接下来,编写代码以加载报表并将其打印为 PDF。 由于它是控制台应用程序,因此应按原样在 Program.cs 中描述,但如果是桌面,则应在按钮事件等中描述,如果是 ASP.NET,则应在发布时在处理的地方进行描述。

// レポートファイルがあるパス
var reportPath = "ConsoleApp1.Reports.Estimate_page_ipa.rdlx";

// 埋め込みリソースを Stream をして取り出す
var stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(reportPath);
if (stream == null) return;

// ページレポートに変換します
using var sr = new StreamReader(stream);
var pageReport = new GrapeCity.ActiveReports.PageReport(sr);

// PDF 描画拡張を定義します
var pdfRenderingExtension = new GrapeCity.ActiveReports.Export.Pdf.Page.PdfRenderingExtension();

// メモリストリームとして出力する定義です
var outputProvider = new GrapeCity.ActiveReports.Rendering.IO.MemoryStreamProvider();

// レポートを PDF にレンダリングします
pageReport.Document.Render(pdfRenderingExtension, outputProvider);

// Stream に変換します
var ps = outputProvider.GetPrimaryStream();
var outputStream = ps.OpenStream();

我不会详细解释它是什么类型的处理,因为它是写在代码的注释中。 关键是在第一行中指定报告文件的位置。 格式如下 <アセンブリ名>.<レポートファイルのパス> ,所有路径分隔符均为句点。

最后一个是Stream,请根据处理内容将其转换为PDF。

例如,如果要将其另存为本地文件,请添加以下内容。

// ファイルにストリームを書き出します
using var fs = new FileStream("Output.pdf", FileMode.Create);
outputStream.CopyTo(fs);

如果要使用 ASP.NET 下载它,请添加以下内容。

return File(outputStream, "application/pdf", "Output.pdf");

尝试打开输出的 PDF 文件,看看是否可以。

使用导出过滤器输出 PDF(部分报告)

使用可用于章节报告的 PDF 导出过滤器。

它在控制台项目中的创建方式与页面报表的创建方式相同。 您在此处创建的代码和设置可以应用于其他项目。

创建项目后,添加所需的包。 这一次,我们将使用导出过滤器进行输出,因此我们只添加一个。

  • GrapeCity.ActiveReports.Export.pdf (16.4.0)

将报告文件添加到项目中。 位置可以在任何地方,但这次我要 Reports 创建一个文件夹并将其放入其中。 此放置位置会影响您稍后指定的路径。

接下来,打开已添加报表的属性。

将生成操作设置为“嵌入资源”。 这意味着将资源嵌入到 EXE (DLL) 中。 报表在桌面上是唯一加载的,就像在 Web 上一样。

接下来,编写代码以加载报表并将其打印为 PDF。 由于它是控制台应用程序,因此应按原样在 Program.cs 中描述,但如果是桌面,则应在按钮事件等中描述,如果是 ASP.NET,则应在发布时在处理的地方进行描述。

// レポートファイルがあるパス
var reportPath = "ConsoleApp1.Reports.Invoice.rpx";

// 埋め込みリソースを Stream をして取り出す
var stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(reportPath);
if (stream == null) return;

// Stream を XML として読み込めるようにします
var xr = System.Xml.XmlReader.Create(stream);

// セクションレポートとして読み込みます
var sectionReport = new GrapeCity.ActiveReports.SectionReport();
sectionReport.LoadLayout(xr);
sectionReport.Run();

// PDF のエクスポートフィルターを作成します
var pdfExport = new GrapeCity.ActiveReports.Export.Pdf.Section.PdfExport();

// メモリストリームに PDF の情報を書き出します
var outputStream = new System.IO.MemoryStream();
pdfExport.Export(sectionReport.Document, outputStream);
outputStream.Seek(0, SeekOrigin.Begin);

我不会详细解释它是什么类型的处理,因为它是写在代码的注释中。 关键是在第一行中指定报告文件的位置。 格式如下 <アセンブリ名>.<レポートファイルのパス> ,所有路径分隔符均为句点。

最后一个是Stream,请根据处理内容将其转换为PDF。

例如,如果要将其另存为本地文件,请添加以下内容。

// ファイルにストリームを書き出します
using var fs = new FileStream("Output.pdf", FileMode.Create);
outputStream.CopyTo(fs);

如果要使用 ASP.NET 下载它,请添加以下内容。

return File(outputStream, "application/pdf", "Output.pdf");

尝试打开输出的 PDF 文件,看看是否可以。