アプリケーションから動的にPDF帳票を作成する - JasperReportsプラグイン
JasperReportsとは、JavaのアプリケーションでPDF帳票を出力するためのライブラリです。入手はJasperForgeより行います。
JasperReportsプラグインはStruts 2で簡単に利用できるようにしたものです。JasperReportsを使ったテンプレート作成については「Java開発メモ - JasperReports」を参考にしてください。今回は、あらかじめJasperReports出力用ファイル(拡張子 jasper)を作成しておいたとします。出力ファイルに対してActionクラスでは、出力する内容を返すのみでPDFをブラウザで表示することができます。
今回は、事前に登録してある住所録から郵便番号や住所などを出力するもので動作を確認してみます。Actionクラスは住所録のデータを取得し、JasperReportsへ渡します。ではそのActionクラスの例を見てみましょう。
@Namespace("/jasper") @ParentPackage("jasperreports-default") @Results( { @Result(name = "success", type = "jasper", location = "/sample_report.jasper", params = {"dataSource", "mysource" }), } ) public class JasperSampleAction extends ActionSupport { @Action("") public String execute() throws Exception { // PDF出力用のデータを取得 mysource = createMySource(); return "success"; } public List<Map<String, Object>> createMySource() { List<Map<String, Object>> list = new ArrayList<Map<String, Object>>(); // キー項目の作成 String[] keys = { "zip", "ken", "shi", "tyo", "kenkana", "shikana", "tyokana" }; for (int i = 0; i < 10; i++) { // プロパティファイルからmysource.[番号]のテキストを取得 String resource = getText("mysource." + i); StringTokenizer stk = new StringTokenizer(resource, ","); int position = 0; Map<String, Object> rowData = new HashMap<String, Object>(); while (stk.hasMoreTokens()) { // 各プロパティファイルの最初の項目は数値なのでInteger、 // それ以外はString。この定義は実際にJasperReports用の設定ファイルに従う。 if (position == 0) { rowData.put(keys[position], new Integer(stk.nextToken())); } else { rowData.put(keys[position], stk.nextToken()); } position++; } list.add(rowData); } return list; } private List<Map<String, Object>> mysource; public void setMysource(List<Map<String, Object>> mysource) { this.mysource = mysource; } public List<Map<String, Object>> getMysource() { return mysource; } }
データは以下のようにプロパティファイルで定義したものを使いました。この内容が出力されます。
mysource.0=1234098,東京都,足立区,笹原,-,-,- mysource.1=1238811,東京都,荒川区,柳田,-,-,- mysource.2=1240098,東京都,板橋区,金剛町,-,-,- mysource.3=1381765,東京都,あきる野市,三間木場,-,-,- mysource.4=1403303,東京都,港区,芝浜,-,-,- mysource.5=1572010,東京都,中央区,問屋町,-,-,- mysource.6=2010822,神奈川県,横浜市,銀嶺町,-,-,- mysource.7=1040515,東京都,品川区,北品川,-,-,- mysource.8=1054570,東京都,大田区,森ヶ縁,-,-,- mysource.9=4001234,山梨県,甲府市,躑躅ヶ岳,-,-,-
なお、JasperReportsプラグインを使ったActionクラスには、次のルールに従います。
- @ParentPackageには jasperreports-default またはこれを継承したパッケージを指定する
- @Resultでtype="jasper"、locationにはjasperファイルの相対パス(例:"/sample_report.jasper")、params内で実際に渡す内容のオブジェクトを指定する
@Result内のparamsで指定するパラメータでは、dataSourceの値を出力するActionクラスのフィールド名にします。
ではサンプルを稼働させて実際にPDFを出力した結果を見てみましょう。http://127.0.0.1:8080/sample/jasper/ をブラウザで開いた結果は以下の図のようになります。実際に表示されるまでにPDFの出力と表示に少し時間がかかります。
注意点
JasperReportsを使って日本語などマルチバイト文字を含んだPDFを出力する場合、テキスト出力ライブラリとフォントライブラリが別途必要になります。jasperreports.jar以外にもiText-rtf-2.1.7.jar、iTextAsian.jarが必須となりますのでlibフォルダへ追加しましょう。それぞれのダウンロードは、以下から行います。