ActiveReports のレポートを PDF ファイルとして出力する

ページ更新日 :
ページ作成日 :

動作確認環境

Windows
  • Windows 10 Pro 22H2
Visual Studio
  • Visual Studio 2022 Community Edition
ActiveReports for .NET
  • ActiveReports for .NET 16.0J

動作必須環境

Windows
  • Windows 8.1
  • Windows 10
  • Windows 11
  • Windows Server 2012
  • Windows Server 2012 R2
  • Windows Server 2016
  • Windows Server 2019
  • Windows Server 2022
Visual Studio
  • Visual Studio 2017
  • Visual Studio 2019
  • Visual Studio 2022
.NET Framework
  • NET Framework 4.6.2
  • NET Framework 4.7
  • NET Framework 4.8
.NET
  • .NET Core 3.1
  • .NET 5
  • .NET 6
ActiveReports for .NET
  • ActiveReports for .NET 16.0J

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 版でも同じように応用しやすいからです。

プロジェクトを作成する時に「コンソール アプリ」を選択します。

プロジェクトを作成したら必要なパッケージを追加します。

追加するものは以下の通りです。バージョンは最新で取得せず以下に記載したバージョンにして下さい。 パッケージの組み合わせで最新バージョンでは正常に動作しないものもあるようです。 警告マークが表示されますがどうしても依存関係が一致しないので無視してください。 ただ今後バージョンアップで変わる可能性もあるのでその時は都度調整してください。 GrapeCity.Documents.ImagingGrapeCity.Documents.Pdf は PDF への描画の為に必要です。

  • GrapeCity.ActiveReports.Export.Pdf (16.4.0)
  • GrapeCity.Documents.Imaging (6.0.3)
  • GrapeCity.Documents.Pdf (6.0.3)

レポートファイルをプロジェクトに追加します。場所はどこでもいいですが今回は Reports フォルダを作成してそこに入れています。 この配置場所は後で指定するパスに影響します。

次に追加したレポートのプロパティを開きます。

ビルドアクションを「埋め込みリソース」に設定します。これは EXE (DLL) の中にリソースを埋め込むことを意味します。 レポートの取り出し方法は特殊になりますがこうすることによりデスクトップでも Web でも同じように読み込むことができます。

次にレポートを読み込んで PDF に出力するコードを記載します。 コンソールアプリなのでそのまま Program.cs に記載しますが、デスクトップならボタンイベントなど、ASP.NET なら Post されたときに処理される場所などに記述してください。

// レポートファイルがあるパス
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 なら Post されたときに処理される場所などに記述してください。

// レポートファイルがあるパス
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 ファイルを開いて問題ないか確認してみてください。