ほんじゃら堂

めんどくさい仕事をラクにする作業自動化レシピ集

【Java】フリーの帳票デザインツールJasperReportsでPDF生成が超楽になった

f:id:piro_suke:20160309002357j:plain

ついこないだまでJavaでのPDF出力にはpdfboxを使っていて、

なんでPDF文書作成っつーのはこんな大変なんだ!

いちいち座標で指定させるんじゃねー!

PDF出力嫌い!大嫌い!

となっていたのだが、JasperReportsと出会って変わった。

何とJasperReportsを使うと、

Wordの図形描画感覚でツールで帳票デザインのテンプレートが作れて、

そこにJSONやらCSVやらでデータを注入してPDFを生成することができる!

一番面倒なデザイン部分がツールでサクっとで作れる!

しかもLGPL&Eclipse Licenseで業務アプリにも使える!

知らなかった…こんな便利なものがあったなんて…。

PHPで開発してた時から、PDFってのは頑張ってコーディングするものだと思ってたよ…。

誰だ最初にpdfboxを進めた奴は!

お世話になったけども!

ということでそんな便利なJasperReportsを紹介する。

JasperReportsを入手する

本家サイトはこちら:

community.jaspersoft.com

(いきなりログインを促すようなダイアログが表示されるかもしれないけど、そのまま閉じて問題ないです)

JasperReportsは

  • 帳票デザインツールの「Jasper Studio」と、
  • JavaからJasperReportsを利用するための「JasperReports Library」

の2部構成で使う。

上述のライセンスについて、 JasperStudioはEclipse License、JasperReports LibraryはLGPLライセンスとなっている。

それぞれ下記のページからダウンロードできる。

Jasper Studio:

http://community.jaspersoft.com/project/jaspersoft-studio

JasperReports Library:

http://community.jaspersoft.com/project/jasperreports-library

JasperReports Libraryはリポジトリが公開されているので、 プロジェクトでMavenとかGradleとか使ってるなら、そちらから落とすと良い。

バージョンはJasperStudioと合わせておくと無難。私が試した時の最新版は「6.1.1」だった。

Mavenの例を載せておく:

...
    <repositories>
        <repository>
            <id>net.sourceforge.jasperreports</id>
            <url>http://jasperreports.sourceforge.net/maven2</url>
        </repository>
        <repository>
            <id>app-local-repo</id>
            <url>file://${basedir}/local-repo</url>
        </repository>
    </repositories>
    ...
    <dependencies>
        ...
        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports</artifactId>
            <version>6.1.1</version>
        </dependency>
        <dependency>
            <groupId>fonts</groupId>
            <artifactId>font-ipagex</artifactId>
            <version>1.0.0</version>
        </dependency>
    </dependencies>
    ...

local-repoというリポジトリを追加してるところと、font-ipagexというライブラリを追加している部分は、 日本語フォント用にローカルリポジトリを作成してそこにJasperStudioからエクスポートしたフォントライブラリを 入れる設定。

JasperReports Libraryから日本語が使えるようにするのにやたら苦労した記憶がある。

リポジトリ用構成を自分で作るのではなく、JasperReportsのフォントエクスポート機能を使うのがおすすめ。

JasperReportsを使う

とりあえず覚えておきたいのは、下記の手順:

  1. JasperStudioで帳票をデザインして、それを「.jrxml」形式のファイルとして保存する。(普通に保存したらjrxmlファイルになる)
  2. jrxmlファイルをPDFを生成するクラスから参照できる場所に置く。(私はsrc/resourcesの下とかに置いてる)
  3. JavaクラスからJasperReports Library経由でjrxmlを読み込み、データを流し込んでPDFを出力する

JasperStudioはEclipseベースのツールなので、Javaプログラマなら何となく使えると思う。(適当)

図形描画ツールと比較すると癖があるけど、他の帳票系ツールを使ったことがあるなら、似たようなものなのでそんなに使いにくくはないはず。

基本的な使い方は下記のページを参照いただくと良い(適当)

本家JasperStudioチュートリアル:

http://community.jaspersoft.com/wiki/jaspersoft-studiodechu-metenorepoto

本家チュートリアル集(英語。困った時はヒントがみつかるかも):

http://community.jaspersoft.com/project/jaspersoft-studio/resources

クラスメソッドさんの記事(ver.5系で説明されてるけど、分かりやすい。)

http://dev.classmethod.jp/server-side/java/jasperreports-tutorial/

データ注入方法は色々用意されている

あらかじめJava側で注入するデータを加工して、加工済みのデータをJasperReports Libraryに渡して、 JasperReports側はそれを出力するだけ、というやり方もあれば、 Java側からはデータベース接続情報だけ渡して、JasperReports側でSQLを流してデータを取得し、 帳票上に出力する、みたいなやり方もある。

私が使った時はJava側でデータを作って、 それをJSONテキストに変換してJasperReportsに渡して使う、という方法をとった。 JSONにしておいたら汎用性あるかな、と思ったけど今のところそんなに活きてない。

おわり

文章だけで説明してみたが、いかがだっただろうか。図が欲しかっただろうか。

ともあれ、JasperReportsはPDF出力専用のツールではなく、 WordやらExcelやらHTMLやら様々な形式のファイルが出力できるので、覚えておいて損はないはず。 便利なので使ってみていただきたい。