JasperReports で CSV から PDF 帳票 (1)
(見出し画像は,Wikimedia Commons にあった Jasper Forest の写真)
1. はじめに
業務で CSV から PDF 帳票を作るタスクに遭遇しました.センスがないせいか苦労したので,ここに記録を残します.最終的には,バッチプログラムの中でこの変換作業を行うことをゴールとしますので,コマンドライン一発で変換できるようになることが目標です.
どうも PDF 帳票出力で無料で利用できるツールは JasperReports (Community Edition) と相場が決まっているようです.20年くらいの歴史があり,ネットにナレッジも結構載ってはいますが,なかなか体系的に仕組みを理解するのが難しいと感じました.
JasperReports では,帳票レイアウトをデザインして,データソースからレイアウトにデータを流しはめて帳票を生成します.(年賀状の宛名ソフトが大体そのままのイメージです)
よって作業は大まかに
1. Jaspersoft Studio (GUI) で帳票レイアウトをデザインする
2. JasperReports ライブラリを使用したプログラムを組んで,データはめ込み,PDF 生成を行う
という手順で行います.JasperReports ライブラリを駆動できるプログラミング言語はいくつかあるようですが,ここでは Java を使用します.また例題は,
にある,町田市の名産品オープンデータ CSV を PDF にしてみる,ということにします.
2. 帳票レイアウトのデザイン
使用するものは以下です.
環境: Windows 10 Pro + Jaspersoft Studio (JSS) 6.12.2
CSV データ: Z:\datacrat\Machida\meisanhin.csv
JSS を起動します.以降は手順をずらずらと…
1. File -> New -> Project
2. "Select a wizard" ウインドウで,"Jaspersoft Studio" 内の "JasperReports Project" を選んで "Next"
3. "Name" 欄に "Machida" を入力して "Finish"
Project Explorer に "Machida" ができました.次に,CSV ファイルをデータソースとして定義します.
4. "Machida" を右クリック -> "New" -> "Data Adapter"
5. "DataAdapter File" ウインドウで,"parent folder" を "Machida" にした状態で,"File name" 欄を入力(ここでは "meisanhin.xml" とする)して,"Next"
6. "Data Adapters" ウインドウで,"CSV File" を選んで "Next"
7. "Name" に "meisanhin","File/URL" を "File" ボタンにより "Z:\datacrat\Machida\meisanhin.csv" に設定.(勝手に,カラム情報が入ってくる)
8. "Skip the first line (the column names...)" のチェックボックスを1回外す
9. "Encoding" 欄は,"UTF-8" を選択
10. "Skip the first line (the column names...)" のチェックボックスを再度つけて "Finish"
結果,上のような画面になりました.次にいよいよ帳票レイアウトを定義します.
11. "Project Explorer" の "Machida" を右クリック -> "New" -> "Jasper Report"
12. "Report Templates" ウインドウで "Blank A4" を選んで "Next"
13. "DataAdapter File" ウインドウで,"parent folder" を "Machida" にした状態で,"File name" 欄を入力(ここでは "meisanhin.jrxml" とする)して,"Next"
14. "Data Source" ウインドウで,"Data Adapter" に先ほど作った "meisanhin - [meisanhin.xml]" を指定して "Next"
15. "Fields" ウインドウで,PDF 上に表示したいカラムを ">" で右に持っていき(ここでは,"店舗名","商品名","品名" の3つを選択),"Next"
16. "Group by" ウインドウでは何もせず "Next"
17. 最後に "Finish"
結果,上のような画面になります.ここから,次の手順で表を組んでいきます.画面の中にペインがたくさんあってややこしげですが,進めていきます.
18. "Outline" ペインの "Fields" を展開.「店舗名」「商品名」「品名」の3つを選択して,"Main Report" ペーンの "Detail 1" エリア(バンドという)にドラッグ&ドロップ
19. 上の図のように,勝手に "Column Header" バンドにカラム名が付きます.データが入るところは,$F{店舗名} などとなっており,ここに該当するカラム値がずらずら繰り返し入っていきます.ここで,もうプレビューをしてしまえば,どういうことになっているかがすぐわかります."Main Report" の下,"Design","Source","Preview" と並んでいるタブのうち,"Preview" をクリックします.
はい,一目瞭然です.あとは,行間隔を狭めたり,罫線を書いたり…なんてことは,"Design" タブで画面をいじれば可能です.
また,タイトルやページ番号も簡単に付けられます.
以上で,帳票デザインを一旦完了します."File" -> "Save" で "meisanhin.jrxml" を保存します.
実は,この状態でも PDF 出力は可能です."Preview" でフロッピーディスクアイコンをクリックすると,"Export As ..." がたくさん出てきます."Export As PDF" を選択し,PDF ファイルへの出力を行ってみます…できたファイルは…
こんなことになってしまいます.日本語部分が全く表示されていません.ネットに情報が出回っていますが,日本語フォントを設定する必要があります(プレビューで表示されているんだから,ここで何らかのフォントを使っているはずで,それをそのまま使ってくれても良い気がするが…).
20. https://ipafont.ipa.go.jp/node193#jp から IPAexfont00401.zip をダウンロードする
21. zip を任意のフォルダに展開する.ここでは,"Z:\datacrat\Machida\IPAexfont00401\ipaex[gm].ttf" が配されるように展開
22. JSS で "Project Explorer" ペインの "Machida" を右クリック -> "Properties"
23. "Properties for Machida" ウインドウで "Jaspersoft Studio" を展開して出てくる "Fonts" を選択
24. 右ペインの "Fonts" で "Use Project Settings" を選び "Add" ボタンを押す
25. "Font Family" ウインドウで,"Family Name" を入力(ここでは IPAexm とした),"TrueType (.ttf)" 欄を "Browse..." ボタンを押して,先ほどの zip 展開して得られた TTF (今回は "ipaexm.ttf" - 明朝)に設定. "PDF Encoding" 欄を "Identity-H (Unicode with horizontal writing)" にし,"Embed this font in PDF document" にチェックして "Finish"
26. "Properties for Machida" で "Apply and Close"
27. "meisanhin.jrxml" の "Design" タブに戻り,全要素を選択して,フォントを "IPAexm" に設定
これで再度 PDF に Export すると,日本語部分も表示されるようになりました.
3. Java プログラムの作成
JSS の操作で,PDF 1片は作成できましたが,作成したフォーマットに同じ形式の CSV ファイルを食わせて,帳票を大量に生成するには,やはりプログラム化する必要があります.
Java プログラムを作成するにあたっては,いろんな方針があると思いますが,ここでは,稼働環境で種々のクラス JAR を入れたり,クラスパスで悩まなくて済むようにすべく,all-in-one の Fat JAR を作成します.このあたりのことを便利に行うために,ここでは Maven を使用することにしました.筆者は Java およびそのビルド環境を使う経験がないため,以降は手探りのヨチヨチ歩きです.また,慣れない VSCode を使ってみることにしました.VSCode には Maven のプラグインが入っています.
プログラムは以下のように実行できることとします.
java -jar <Fat JAR> <CSVファイル名> <PDFファイル名>
また,帳票フォーマットファイル (JRXML) は,Far JAR の中にリソースとして組み込むことにします.
1. "MAVEN-PROJECTS" で "+"(CREATE MAVEN PROJECT)
2. "maven-archetype-quickstart" を選ぶ
3. "1.4" を選ぶ
4. フォルダーを "D:\maven-projects\Machida" に設定する
5. "Define value for property 'groupId': " には "dev.datacrat[RET]"
6. "Define value for property 'artifactId': " には "meisanhin[RET]"
7. "Define value for property 'version' 1.0-SNAPSHOT: " にはそのまま "[RET]"
8. "Define value for property 'package' dev.datacrat:" にはそのまま "[RET]"
9. "Y: " にもそのまま "[RET]"
以降,"D:\maven-projects\Machida\meisanhin\src\main\java\dev\datacrat\App.java" と "D:\maven-projects\Machida\meisanhin\pom.xml" の編集作業などを行います.
Java ソースの作成
1. java ファイル名を "App.java" から "meisanhin.java" に変更.内容は以下としました.
ちょっと違和感を感じたのは(もうないですが),JSS で CSV 読み込み定義をしましたが,これがプログラムで全く利用されないことです.
CSV データソースをプログラム内で完全に定義し直してやる必要があります.
ちなみに JSS で,"Skip the first line (the column names...)" の定義をしましたが,これに相応するところは,csvDataSource.setUseFirstRowAsHeader(true) です.
2. "meisanhin.jrxml" ファイルを,"D:\maven-projects\Machida\meisanhin\src\main\resources\meisanhin.jrxml" にコピー
日本語フォント関連作業
3. "D:\maven-projects\Machida\meisanhin\src\main\resources\fonts" フォルダを作成し,その中にフォント "ipaexm.ttf" をコピー
4. 同じフォルダに,"ipaexm.xml" ファイルを作成.内容は以下の通り.
<?xml version="1.0" encoding="UTF-8"?>
<fontFamilies>
<fontFamily name="IPAexm">
<normal>fonts/ipaexm.ttf</normal>
<pdfEncoding>Identity-H</pdfEncoding>
<pdfEmbedded>true</pdfEmbedded>
</fontFamily>
</fontFamilies>
5. "D:\maven-projects\Machida\meisanhin\src\main\resources" フォルダに,"jasperreports_extension.properties" ファイルを作成.内容は以下の通り.
net.sf.jasperreports.extension.registry.factory.fonts=net.sf.jasperreports.engine.fonts.SimpleFontExtensionsRegistryFactory
net.sf.jasperreports.extension.simple.font.families.ipaex=fonts/ipaexm.xml
6. pom.xml を編集.MAVEN-PROJECT を作成した時に,"D:\maven-projects\Machida\meisanhin\pom.xml" が自動的にできています.ここに追記しました(コメントで「ここから」「ここまで」の範囲2箇所).やっていることは,
1) 依存ライブラリ jasperreports ライブラリの追加
2) maven-shade-plugin で Fat JAR の作成と,"jasperreports_extension.properties" への上記日本語フォント対応内容追記(Fat JAR を作成するだけなら,maven-assembly-plugin で良かったが,"jasperreports_extension.properties" への内容追記操作ができなかった)
最後に,"D:\maven-projects\Machida\meisanhin" フォルダで,
> mvn compile
> mvn package shade:shade
を実行すると,"D:\maven-projects\Machida\meisanhin\target" に,Fat JAR "meisanhin-1.0-SNAPSHOT.jar" ができています.
この JAR ファイルを,java-11-openjdk を入れただけ(追加ライブラリ何もなし)の CentOS7 マシンで実行してみると,
$ java --illegal-access=deny \
> -jar /mnt/landisk1/datacrat/Machida/meisanhin-1.0-SNAPSHOT.jar \
> /mnt/landisk1/datacrat/Machida/meisanhin.csv \
> /mnt/landisk1/datacrat/Machida/meisanhin.pdf
上記のコマンドで,meisanhin.pdf ファイルが生成できました.これで,可搬性のある JAR ファイルができたことが確認できました.また,上記コマンドラインで CSV ファイルや PDF ファイルのパラメーターを変えていくことによって,バッチ処理で大量の帳票作成を自動実行できそうです.
なお,同じような名産品 CSV データが町田市以外にもあると思っていましたので,それをダウンロードして食わせようと目論んでいましたが,探してみると,無くて…自治体のオープンデータは,めいめいで好き勝手に公開しているだけの,ばらばらデータでありました…