Jasper帳票PDF出力備忘メモ

# 1. はじめに
JavaプロジェクトでJasperによる帳票出力方法についてまとめたメモ。

# 2. Jasper Studioインストールと設定
帳票テンプレート(jrxml)を作成するためにjrxml編集ツールをインストールする必要がある。
編集ツールの利用方法は下記の2通り。

* Jasper Studioを利用する（[リンク](https://community.jaspersoft.com/wiki/jaspersoft-studionoinsutorutosetutoatupu)）
* IDEにJasperプラグインをインストールする

今回はEclipseのJasperプラグインを利用することにする。

Eclipseへのプラグインインストール方法は[Jaspersoftのコミュニテイーページ](https://community.jaspersoft.com/wiki/jaspersoft-studiopuraguinnoinsutoru)に記載されているため、ここでのインストール手順は省略する。

※2021/5時点の最新バージョンは**6.17.0**である。最新版を利用する場合はインストール手順3のリンクを「 https://sourceforge.net/projects/jasperstudio/files/updatesite/6.17.0/ 」に変更すること。

# 3. 依存ライブラリの設定
Javaプロジェクトに依存ライブラリを追加する。

今回はMavenを利用しているため、Mavenプロジェクトの`pom.xml`に下記設定を追加する。

```xml
<dependency>
    <groupId>net.sf.jasperreports</groupId>
    <artifactId>jasperreports</artifactId>
    <version>6.17.0</version>
</dependency>
```
# 4. とりあえずPDFを出力してみる
まず第一段階としてjrxmlのテンプレート作成からJava側でのPDFファイル出力をやってみる。

## 4.1 Jasperテンプレートの作成
Javaプロジェクトの任意のフォルダで右クリックし「New」⇒「Other...」から`Jaspersoft Studio`の`Jasoer Report`を選択しjrxmlファイルをプロジェクトに追加する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177076/557b9deb-2d05-115e-480e-27fb505eb93a.png)

jrxmlファイルを開くと下記画面が表示されるので、静的テキストを追加する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177076/002d34a3-8297-e251-615d-f7c0bddb55d7.png)


`Palette`から`Static Text`を選択し、ドラッグ&ドロップでエディタ画面に配置する。

配置後、右クリックで「Show Properties」を選択しテキストの編集画面を表示させ、`Static Text`でフォントや文字サイズを設定する。

その後、緑丸のボタンを押すことでjrxmlをコンパイルし、jasperファイルを作成する。

## 4.2 PDF出力の実装


```java
String jasperFilePath =  getClass().getResource("/META-INF/jasper-template.jasper").getPath();
        
HashMap<String, Object> parameterMap = new HashMap<String, Object>();
JasperPrint jasperPrint= JasperFillManager.fillReport(jasperFilePath, parameterMap, new JREmptyDataSource());
JasperExportManager.exportReportToPdfFile(jasperPrint, "jasper.pdf");
```

上記の実装でMavenプロジェクト直下に`jasper.pdf`が作成されたので、第一段階はゴール。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177076/40270d06-f8b2-bea5-fb4a-9714f6a8a27b.png)


# 5. 帳票テンプレート作成からPDF出力
出力したい帳票のイメージは下図のとおり。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177076/a7135337-353b-0010-c600-ea896726a42b.png)

## 5.1 帳票データEntityクラスの作成
プロジェクトに帳票項目のEntityクラスを追加する。

```java
@Getter
@Setter
@AllArgsConstructor
public class TableEntity {

    private int columnNo;

    private String param01;

    private String param02;

    private int param03;
}
```

## 5.2 帳票テンプレートの作成
帳票テンプレートを作成する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177076/7e02f36e-76d8-2fa1-39f6-df241f1794e3.png)

* ①：`Outline`の`Fields`からフィールドを追加する。
  - `Fields`を右クリックし「Create Field」を選択する。
  - 作成したフィールドの「Show Properties」を選択しフィールド名および「5.1 帳票テーブルデータEntityクラスの作成」で定義した変数の型を指定する。
* ②：`Outline`の`Column Header`にテーブルのカラム部を`Detail`に出力項目を追加する。
  - ①で作成したフィールドをドラッグ&ドロップでjrxml編集画面にに配置する。
  - `Static Text`と`Field`の両方が画面上に置かれるため、位置を調整する。
  - 枠線や文字位置の調整は`Properies`から調整する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177076/c270ec44-f127-09f5-2d75-d6f829b5dac2.png)


* ③：`Outline`から`Column Footer`/`Page Footer`/`Las Page Footer`を削除する。
  - 右クリックで`Delete`を選択する。
* ④：`Palette`から`Static Text`を選択し`Summary`に配置後、表示文字を編集し「Sum」とする。
* ⑤：`Palette`から「Create Parameter」で新規パラメータを作成し、`Summary`の`Static Text`「Sum」の横に配置する。
  - パラメータ名を`sum`に設定し、Classに数値型を設定する。

Sumの部分はJasper側で計算して出力することも可能([リンク](https://www.compiere-distribution-lab.net/2016/03/28/jasper-lab-0005-%E6%98%8E%E7%B4%B0%E8%A1%8C%E3%81%AE%E5%90%88%E8%A8%88%E5%80%A4%E3%82%92%E8%A8%88%E7%AE%97%E3%81%97%E8%A1%A8%E7%A4%BA%E3%81%99%E3%82%8B/)を参照)だが、メンテナンス性やバグの解析の手間を考えると処理はJava側に寄せたほうが良いので、Java側でParameter03の合計値を計算して`Parameter`に埋め込む方針とする。

## 5.2 帳票PDF出力処理の実装
帳票出力Javaプロジェクトに下記クラスト処理を追記する。

* 帳票作成処理部分

```java 
//jasperファイルのパス取得
String jasperFilePath =  getClass().getResource("/META-INF/jasper-template2.jasper").getPath();

//帳票データ作成
TableEntity te01 = new TableEntity(1, "XX", "XX", 100);
TableEntity te02 = new TableEntity(2, "YY", "YY", 200);
TableEntity te03 = new TableEntity(2, "ZZ", "ZZZ", 3000);
List<TableEntity> list= new ArrayList<TableEntity>();
list.add(te01);
list.add(te02);
list.add(te03);

//Collectionデータソースの設定
JRBeanCollectionDataSource jrBeanCollectionDataSource = new JRBeanCollectionDataSource(list);

//parameterの設定        
HashMap<String, Object> parameterMap = new HashMap<String, Object>();
parameterMap.put("author", "Test Author");
parameterMap.put("createDate", "2021/05/21");
parameterMap.put("sum", te01.getParam03() + te02.getParam03() + te03.getParam03());

JasperPrint jasperPrint = JasperFillManager.fillReport(jasperFilePath, parameterMap, jrBeanCollectionDataSource);
JasperExportManager.exportReportToPdfFile(jasperPrint, "jasper.pdf");
```

上記実装でイメージ通りの帳票PDFが出力された。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/177076/45adad95-8b03-171c-2ffc-ecce1f7dd687.png)

また、現時点では日本語（マルチバイト文字）はPDF化した際に表示されないので、[こちら](http://memo.eightban.com/jasperreports/japanese_pdf)の内容を参考にフォント設定を行う必要がある。


https://qiita.com/yuuman/items/6309428dc3dc1380ac3b

に続く

# 参考
* Jaspersoft Studioプラグインのインストール手順：[リンク](https://community.jaspersoft.com/wiki/jaspersoft-studiopuraguinnoinsutoru)
* 帳票作成に関す諸々：[リンク](https://qiita.com/nakani1210/items/d42d8360c69b9a9b38a5)
* 帳票出力でJavaBeanから値を取得して出力する方法：[リンク](https://qiita.com/gisystemexe/items/b2462bd5e9fc42b08d98)
* パラメータとフィールドの使い方：[リンク](http://gungnir-odin.hatenablog.com/entry/20121228/1356695440)
* Tableの使い方：[リンク](https://www.youtube.com/watch?v=fZtnoQpPzaw)
* JasperライブラリのJavaDoc：[リンク](http://jasperreports.sourceforge.net/api/net/sf/jasperreports/engine/package-summary.html)