1. 帳票ライブラリ

1.1. 概要

本ライブラリでは、JasperReportsを利用したPDF帳票出力機能を提供する。 以下にライブラリの構成と使用方法を示す。

JasperReportsのバージョンについて

URL:  https://community.jaspersoft.com/project/jasperreports-library (2014/12/16時点)

ライブラリ名 バージョン ライセンス体系
JasperReports 5.6.1 GNU LESSER GENERAL PUBLIC LICENSE version 3(GNU LGPL)

重要

本機能は、以下の依存ライブラリが現在入手困難となっているため、今後メンテナンスは行われない。

グループID アーティファクトID バージョン
com.lowagie iTextAsian 1.0.0

帳票出力機能が必要な場合は、以下のような代替手段を検討すること。

  • 商用製品を利用する
  • ブラウザやOfficeのPDF出力機能を利用する

1.2. 要求

1.2.1. 実装済み

  • PDF形式の帳票を作成し、ファイルまたはストリーム形式で出力できる。

  • 用いる帳票テンプレートをプログラム内で指定した言語のものに切り替えることができる。

  • 異なる帳票フォーマットのPDFを連結して一つのファイルとして出力できる。

    補足

    下記の項目についてはPJにて検討すること。

    ディレード処理制御

    同時実行制御

    流量制御

    タイムアウト設計

    利用可能文字集合

    利用フォント

    帳票の参照権限

    帳票テンプレートの管理方式

    帳票データの管理、帳票クリーニング機能

    補足

    帳票出力の基本実装クラス(BasicReportOutputResolver)は、PDFを帳票テンプレートと同一フォルダに一意なファイル名で作成するため、PDFが実行のたびに増えていく。

    そのため、対象システムの帳票出力の頻度とディスク容量より、出力後不要となった帳票ファイルを定期的に削除する処理を検討する必要がある。

    補足

    JasperReportsの標準機能を用いることでPDFにパスワードや暗号化、ブックマーク、作成者などの各種ドキュメントプロパティを設定することが出来る。

    その場合には本ライブラリの修正が必要となる。

1.2.2. 未実装

  • 帳票サーバー機能
帳票の作成・出力を行うWebサービスを公開することができる。
  • プリンター直接印刷機能
PDF出力を介することなく、直接プリンターに印刷要求を発行することができる。

1.2.3. 取り下げ

  • なし

1.3. 構造

1.3.1. クラス図

../../_images/Report_ClassDiagram.png

1.3.2. インターフェース定義

 a) 帳票生成処理パッケージ

クラス名 概要
ReportCreator 帳票生成インタフェース。

 b) 帳票出力処理パッケージ

クラス名 概要
ReportExporter 帳票出力を行うインタフェース。

 c) 帳票出力先解決パッケージ

クラス名 概要
ReportOutputResolver 帳票出力先のパス解決を行うインタフェース。

 d) 帳票テンプレートファイルパス解決パッケージ

クラス名 概要
ReportTemplateResolver 帳票テンプレートのパス解決を行うインタフェース。

1.3.3. クラス定義

 a) 帳票管理パッケージ

クラス名 概要
ReportManager 業務機能からの要求を受付、システムリポジトリ経由でReportCreatorに処理を委譲するクラス。
ReportContext 帳票出力に関する情報を保持するクラス。出力情報のほかに、利用する「帳票ID」や「ReportCreatorのキー」を持つクラス。
ReportParam テンプレート名と帳票テンプレートにバインドする情報を保持するクラス。(バインドの方式については 実装例 を参照。)
ReportException 帳票機能でチェック例外が発生した場合に送出される実行時例外クラス。

 b) データソースパッケージ

クラス名 概要
SqlRowIteratorDataSourceSupport nablarch.core.db.statement.SqlRowを用いて帳票テンプレートのフィールド項目バインド処理を行うサポートクラス。
SqlResultSetDataSource nablarch.core.db.statement.SqlResultSetを利用して、帳票テンプレートのフィールド項目にバインドする実装クラス。
ResultSetIteratorDataSource nablarch.core.db.statement.ResultSetIteratorを利用して、帳票テンプレートのフィールド項目にバインドする実装クラス。

 c) 帳票生成処理パッケージ

クラス名 概要
ReportCreatorSupport 帳票生成のサポートクラス。(実際の帳票出力はReportExporterに委譲する。)
BasicReportCreator 帳票生成の基本実装クラス。帳票出力用データをJasperReportライブラリのインスタンスに変換する。
VirtualizerReportCreator 大量データ出力をサポートするクラス。

 d) 帳票出力処理パッケージ

クラス名 概要
ReportExporterSupport 帳票出力のサポートクラス。
BasicReportExporter 帳票出力の基本実装クラス。

 e) 帳票出力先解決パッケージ

クラス名 概要
BasicReportOutputResolver 帳票出力先のパス解決を行う基本実装クラス。帳票テンプレートと同一フォルダに一意なファイル名を生成し作成する。

 f) 帳票テンプレートファイルパス解決パッケージ

クラス名 概要
BasicReportTemplateResolver 帳票テンプレートのパス解決を行う基本実装クラス。

1.4. 実装例

本ライブラリでは出力帳票のレイアウトおよびデータの埋めこみ箇所を帳票テンプレートにて管理する。

帳票テンプレートの作成については 帳票アプリケーションガイド を参照すること。

1.4.1. 帳票テンプレートのコンパイル

設計時に作成する帳票テンプレート(jrxml)は、実行時にはjasperファイルにコンパイルしておく必要がある。

1.4.2. 帳票テンプレートの配置

実行時の帳票テンプレートファイルの配置と業務アプリ実装の関連を下記に示す。

補足

下記の例は基本実装クラス(BasicReportTemplateResolverなど)がベースとなっているので、PJ側でカスタマイズをすることでマッピングの変更は可能である。

1.4.2.1. リソースの配置と実装

リソースの配置例

sample_application/
   ├─ src/
   │   ├─ main/
   │   │   ├─ java/     # java fileなど
   │   │   │   └─ please/
   │   │   │         └─ change/
   │   │   │           ## 中略 ##
   │   │   │
   │   │   └─ resource/
   │   │       ├─ batch/
   │   │       ├─ web/
   │   │       └─ report/    # 帳票テンプレートのルート。FilePathSettingで指定する。
   │   │            ├─ R001/ # REPORT ID = R001用ディレクトリ。ここからは業務コードにて指定。
   │   │            │      ├─ index.jasper     # デフォルトで利用するテンプレート
   │   │            │      └─ userdata.jasper  # テンプレート名指定で利用できるテンプレート
   │   │          ## 後略 ##

実装例

/**
 * R001/index.jsaperテンプレートを利用して帳票を出力する。
 *
 * @param data 帳票に出力するkeyとdataを持つMap
 * @return 出力した帳票ファイルオブジェクト
 **/
private File printReport(Map<String,String> data) {
    // R001配下の帳票テンプレートを利用。テンプレートの指定がないのでindex.jasperを利用する。
    ReportParam param = new ReportParam(data);
    ReportContext ctx = new ReportContext("R001");
    ctx.addReportParam(param);

    return ReportManager.createReport(ctx);
}

/**
 * R001/userdata.jsaperテンプレートを利用して帳票を出力する。
 *
 * @param data 帳票に出力するkeyとdataを持つMap
 * @return 出力した帳票ファイルオブジェクト
 **/
private File printReport(Map<String,String> data) {
    // テンプレートを指定しているのでuserdata.jasperを利用する。
    ReportParam param = new ReportParam("userdata", data);
    ReportContext ctx = new ReportContext("R001");
    ctx.addReportParam(param);

    return ReportManager.createReport(ctx);
}

補足

帳票のテストは出力結果のPDFファイルを目視で確認すること。

コンポーネントファイル定義設定例(report)

<!-- 帳票作成処理コンポーネントの設定 -->
<!-- デフォルトのコンポーネント名は「reportCreator」 -->
<component name="reportCreator" class="nablarch.integration.report.creator.BasicReportCreator">

 <!-- 帳票テンプレートファイル解決コンポーネントの設定 -->
 <property name="reportTemplateResolver">
   <component class="nablarch.integration.report.templateresolver.BasicReportTemplateResolver" />
 </property>

 <!-- 帳票出力処理コンポーネントの設定 -->
 <property name="reportExporter">
   <component class="nablarch.integration.report.exporter.BasicReportExporter">

     <!-- 帳票出力先解決コンポーネントの設定 -->
     <property name="reportOutputResolver">
       <component class="nablarch.integration.report.outputresolver.BasicReportOutputResolver" />
     </property>

   </component>
 </property>
</component>

コンポーネントファイル定義設定例(FilePathSetting)

# 帳票ベースフォルダ
file.path.report=classpath:report
 <component name="filePathSetting"
            class="nablarch.core.util.FilePathSetting" autowireType="None">
  <property name="basePathSettings">
    <map>
      <entry key="report" value="${file.path.report}" />
    </map>
  </property>
</component>

1.4.3. 帳票テンプレートの言語指定

言語ごとに帳票テンプレートを用意し、プログラム側でjava.util.Localeを指定することで、使用する帳票テンプレートを切り替える仕組みで対応する。

「BasicReportTemplateResolver」では、帳票テンプレートのファイル名に java.util.Locale#getLanguage の値をアンダースコア付きで末尾付与したファイル名を探す。

java.util.Locale.USを指定した場合

 指定前 指定後
index.jasper index_en.jasper

index_en.jasperファイルが見つからない場合は、index.jasperファイルを探す。

java.util.Localeのプログラム側での設定方法に関しては、 帳票アプリケーション開発ガイド を参照すること。

1.4.4. 帳票テンプレートのコンパイルAntタスク

アプリケーションをパッケージングする際、全てのjrxmlはjasperファイルにコンパイルしておく必要がある。

下記に指定ディレクトリ配下に存在するjrxmlを同一フォルダに、jasperファイルとしてコンパイルするAntタスクの実装例を示す。

補足

[...] となっている箇所はプロジェクトに適したパスに置き換えること。

<path id="classpath">
    <fileset dir="[JasperReportsライブラリ格納フォルダ]">
        <include name="**/*.jar" />
    </fileset>
</path>

<target name="compile">
    <taskdef name="jrc" classname="net.sf.jasperreports.ant.JRAntCompileTask">
        <classpath refid="classpath" />
    </taskdef>
    <jrc destdir="[コンパイルファイル出力先]" tempdir="[コンパイルファイル出力先]" keepjava="false">
        <src>
            <fileset dir="[帳票テンプレート(jrxml)格納先ルートフォルダ]">
                <include name="**/*.jrxml" />
            </fileset>
        </src>
        <classpath refid="classpath" />
    </jrc>
</target>