play frameworkからJasper Reportを使用してPDF出力

クッソ迷ったのでメモ。つかれたのでスクリーンショットは載せない。

環境

  • JasperSoft Studio 6.0.1
  • Jasper Reports Library 6.0.0
  • Play Framework 2.3
  • Scala 2.11.2

SBTの依存性・リゾルバ追加

resolvers ++= Seq("Jasper" at "http://jasperreports.sourceforge.net/maven2",
  "Jasper3" at "http://jaspersoft.artifactoryonline.com/jaspersoft/third-party-ce-artifacts/")
libraryDependencies += "net.sf.jasperreports" % "jasperreports" % "6.0.0"

JasperReportはLGPL時代のiTextライブラリを使っているので普通のMavenリポジトリにはない古いライブラリを使ってるとかなんとか。

帳票の作成

Jaspersoft Studioから作成。作成方法は略。

まず、デフォルトのフォント指定ではうまく日本語が出力できないので対処する。

Project -> Properties -> Jaspersoft Studio -> Fontsで日本語が入っているフォントをaddして登録。TureType(.ttf)にフォントファイルを指定、PDF EncodingにIdentity-Hを指定、Embed this font in PDF documentにチェックを入れる。

その後、フォント一覧の設定画面まで戻ったら設定したフォントを選択して「Export」をクリック。jarファイルを作る。ここ凄く重要。

あとは帳票を普通に作ればいいのだけど、日本語が入る部分では必ず先の方法で作成したフォントを設定する。デフォルト設定や、最初からフォントのリストに出てくるものを選択してもうまくいかない。先ほど設定したフォントはセレクトボックスの上の方に出てくる(セパレータで区切られているすぐ上あたり)。

一通りうまく行ったらProject Explorerのjrxmlファイルを右クリックしてCompileする。.jasperファイルが出来上がる。

Playで表示

必要なのはコンパイルしたjasperファイルと、フォント設定をExportしたjarファイル。Playプロジェクトのルートにlibディレクトリを作ってその中にjarを放り込む。jasperファイルはどこでもいいから読める所に置く。

以下のようなアクションを書く。

val params = new util.HashMap[String, Object]()
params.put("MyParameter", "someid")
val report = JasperFillManager.fillReport("path/to/report.jasper", params, jdbcConnection)
Ok(JasperExportManager.exportReportToPdf(report)).as("application/pdf")

今回はJDBC経由で取ってきたデータを表示するパターン。この場合は単にjasperファイルとjdbcコネクション、パラメータ(あれば)を渡してあげればよい。

JasperReportは初めて使ったのだが中々良い。GrapecityのActiveReportを業務では良く使っていたのだが、今回はLinuxサーバで運用することを想定しているのでJava系のライブラリと組み合わせることとした。でも日本語表示がうまく行かなくて数時間悩んだ。PDFのCJK対応はどんなライブラリでも鬼門ですね。

参考サイト

JasperReportsで帳票出力してみた

標準以外のフォントをiReportで使いたい