けこのアプリ開発奮闘記

アプリ開発で得た知見を共有していきます。なるべく文章が堅くならないように意識しています。

2021年にJasper Reportsを導入した男

目次

茶番

上司「けこくん、次の機能開発だけどJasperReportsでPDFを作って出力してほしいんだ。」
私「JasperReportsですか、初めて聞きました。」
上司「うん、参考資料になりそうなURL送るからよろしくね」

私「動かない…」

このブログを開設してはや20時間、早速このブログを見てくださった方がいらっしゃるみたいです。嬉しい。Botかな?クローラかな?きっと人だよヒューマノイドだよ

この記事は私のようにいきなり聞いたことのないOSSで開発を行うことになった方向けの備忘録です。上司が無茶振りをしてきても大丈夫!ソフトが古くても大丈夫!先達の資料を見ましょう!I love Internet!
※本記事はJava + Eclipse + Gradle + JasperReportsの記事になります。

JasperReportsって?

JasperReports (ジャスパーレポート)とは、米Jaspersoft社が開発/販売しているオープンソースの帳票及びビジネスインテリジェンスソフトウエアである。短時間かつ安価でグラフを含む帳票を作成することができるので海外では[どこ?]デファクトスタンダードオープンソース帳票ツールとされている。(Wikipediaより)

いや”どこ?”って書いてるけど不安だな~。さぞかし名のしれた帳簿作成ツールとお見受けした。
Javaやその他の言語でデータから動的にPDFを生成したい…表の長さも決まってないけどいい感じにレイアウトを調整してほしい…。
そんな願いに答えるソフトウェアです。公開は2001年、私がクレヨンしんちゃんと同い年くらいのころでしょうか。

このJasperReports君と付き合うことになったのですが、どうやらEclipse拡張とそうでないもの(JasperStudio)があるようで情報が混在して検索が大変でした。もっと検索上手にならねば。

導入

まずEclipseを用意します。ヘルプ>Eclipseマーケットプレイス>Jasperで検索。はい、出てきません。
昔はEclipseマーケットプレイスにあったみたいですが今はもう無いみたいです。
代わりにヘルプ>新規ソフトウェアのインストール>http://sourceforge.net/projects/jasperstudio/files/updatesite/6.17.0/と操作しましょう。ダウンロードを始めるとしばらく経ってからEclipseを再起動するように促されます。

f:id:keko5342:20211118004626p:plain

スタートページにReport Development~が出てきたら成功です。
f:id:keko5342:20211117145949p:plain

Gradleの設定

今度はプロジェクトの方の設定をしましょう。
Gradleの方はbuild.gradleファイルのdependenciesにimplementation 'net.sf.jasperreports:jasperreports:6.17.0'を入れるだけです。

次にデフォルトのrepositoriesに3行追加します。

repositories {
  mavenCentral()
  maven {                                                                  // 追加
    url "https://jaspersoft.jfrog.io/jaspersoft/third-party-ce-artifacts/" // 追加
  }                                                                        // 追加
}

この3文が重要でMavenはデフォルトだとmavenCentralに登録されているjarファイルしか見に行きません。それを拡張して"https://jaspersoft.jfrog.io/jaspersoft/third-party-ce-artifacts/"にあるjarファイルも見てね。という意味のコードです。

いざJasperReports作成

ファイル>新規>JasperReports
テンプレートの一覧がでてくるので今回はBlank_A4を選択します。

f:id:keko5342:20211118011002p:plain

次へを押して出てくるData AdapterというのはJasperReportsに動的に出力するデータの入力方法を指定するものです。
今回はDBから直入力をするわけではないので、One Empty Recordを選びます。
以下のような画面が出てくると思います。

f:id:keko5342:20211118011541p:plain

左側の先程選んだテンプレートが表示されている領域に、右側のメニューの要素を入れてPDFを作っていく感じです。
注意しないといけないことは、StaticTextには静的な文字を入れてTextFieldには動的な文字を入れる必要があることです。
どういうことかというとTextFieldの内容は常に式として評価されるため、TextFieldは変数を入れる箱になります。普通に文章を入れるとエラーを吐かれます。

PDFを作ってみよう

PDFを作るといっても、今のままPDFを作っても白紙の画面が出てくるだけなのでタイトルを追加します。
右メニューからStatic Textを選んで、ぐぐっと領域指定をしてやります。
f:id:keko5342:20211118012601p:plain

Static Textと書かれた画面になりました。画面左下の小さなタブからプレビューを選択してみましょう。
デザインした通りのレイアウトで文字が出ていますね。成功です。 f:id:keko5342:20211118012846p:plain

あとは適当にPDFを作りましょう。要素をダブルクリックすればプロパティが出てきます。そこから文字のフォントやサイズ、位置揃えまでExcelライクなことが一通りできます。

f:id:keko5342:20211118013706p:plain

こんな感じでしょうか、右側のテキストフィールドにはパラメータを入れます。 Eclipseのアウトラインタブを見てみましょう。パラメータの項目があります。
右クリックしてパラメータを追加します。パラメータの名前の変更は自分で作った既にあるパラメータに名前を変更したいパラメータをドラッグドロップするとできます。意味不明ですね。

f:id:keko5342:20211118014356p:plain
自分で作ったパラメータ君、デフォルトの名前

右クリックをしてもプロパティを見ても名前の変更らしき項目は見当たりません。しかしParameter2をParameter1にドロップすると…

f:id:keko5342:20211118014534p:plain
わ、なんか出た

この名前変更誰が考えたんでしょうか、怒りたいので出てきて下さい。
何度名前を変えてOKを押してもキャンセルするまで名前変更タブがでてきます。ホラーですね、キャンセルしましょう。
ちなみにパラメータを選択してコピペしてもこのタブは出てきます。こっちのほうがいいですね。

次はデザイン上のテキストフィールドをダブルクリックして式を入力します。
パラメータ>VALUE_DATA1>toString()をダブルクリック

f:id:keko5342:20211118015033p:plain f:id:keko5342:20211118015201p:plain

するとデザインタブに見慣れぬ式が出てきます。ここに私達はJavaから動的なデータとして値をセットすることができます。

Javaから印刷

JavaからPDFを作りたい…そのためにはJavaからjrxmlファイルを読み込む必要があります。 参考2番のページのサンプルがわかりやすいです。ここではこのサンプルベースに解説していきます。 b1san-blog.com

@RestController
@RequestMapping("/jasper/sample")
public class JasperSampleController {

  @Autowired
  private ApplicationContext context;

  @GetMapping
  public void getJasperSample(HttpServletResponse response) {
    try {
      //テンプレート読み込み
      Resource resource = context.getResource("classpath:jasperreports/sample.jrxml");
      InputStream in = resource.getInputStream();
      JasperReport report = JasperCompileManager.compileReport(in);
      //パラメーター、データソースの設定
      Map<String, Object> params = new HashMap<>();
      JRDataSource dataSource = new JREmptyDataSource();
      //PDFを作成し、レスポンスボディに設定
      JasperPrint print = JasperFileManager.fillReport(report, params, dataSource);
      response.setContentType(MediaType.APPLICATION_PDF_VALUE);
      JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream());
    } catch (IOException | JRException e) {
      //エラー処理
      e.printStackTrace();
    }
  }
}

注目すべきはtry文中腹の params というハッシュマップオブジェクトです。
こいつに

params.put("VALUE_DATA1", "abcdefg");

というようにデータを入れてやれば後の JasperFileManager.fillReport(report, params, dataSource); によってPDFにデータが入ります。実際にやってみます。

/*
 *  データの挿入
*/
String data4 = "akwodakp";
params.put("VALUE_DATA1", "abcdef");
params.put("VALUE_DATA2", "あいうえお");
params.put("VALUE_DATA3", "💯");
params.put("VALUE_DATA4", data4);

f:id:keko5342:20211118021257p:plain
絵文字はともかく日本語出てない…

Javaから日本語PDFを出力するためには少し手順が必要です。IPAexフォントという日本語の有名フォントをダウンロードして設定する必要があるのですが、こちらも参考2のリンクに詳しくのっています。そちらを参考にしてください。
ひとつ付け加えたいとすれば、例えば ipaexg というフォントを設定した場合それはプロパティのフォント一覧プルダウンに出てきません。直打ちしましょう。

f:id:keko5342:20211118021955p:plain
日本語出た

こんな感じで日本語が出力できるようになります。もう私から教えられることはありません。
ここまで長い長い文章でしたが、最後までお読みいただきありがとうございました。
ぶっちゃけWebページをそのまま印刷したほうが簡単なので、仕事でなければ土下座されても使いたくないですがJasperReportsを使うことになった。興味はある。といった方々の助力になれば幸いです。

参考

  1. Jaspersoft Studioプラグインのインストール | Jaspersoft Community
  2. 【Spring Boot】JasperReportsの導入(Gradle)