Happy My Life

日常とか技術とか

JRubyからJasperReportsを操作してみる

krispy kreme :: annual report JRubyOnRailsから帳票を出力してほしいという依頼があったのでJava界隈で有名らしいJasperReportsを使ってみた。他にも候補あったけど、画面デザインをGUIでできないPDFライブラリは選択肢にも入らないんだよね。

ここ1年ほどJRubyOnRails使っていたけど、JRubyからJavaのライブラリを呼びだすのは今回が初めてだったりする。しかもJavaにあまり慣れてない事もあって、初歩的な所でハマったりしながらもどうにか出力できた(NetBeansのお陰で助かった)

ソースについて

内容はreport.jrxml(iReportsで作成した帳票デザインファイル)をreport.pdfに変換しているだけ。

ライブラリの呼び出し方はJavaのそれと同じ。そりゃそうだわな、Javaのライブラリ呼びだしているんだから。あと、Java::net.sf.から始まるムダの多いコードです。どなたか添削を。

うほっ、これは便利

使ってみるとこんなに簡単にJavaコードが書けるとは知らなかった! 見直したぞJRuby。あと、Javaには疎いので、どんなライブラリがあるかもうちょっと知っておく必要があるなと実感した次第。過去の資産は大切やね。

require 'java'
Dir["/home/user/JasperLib/*.jar"].each {|jar| require jar }

include_class('java.util.HashMap')
include_class('java.util.Map')
include_class('net.sf.jasperreports.engine.JRException')
include_class('net.sf.jasperreports.engine.JRExporterParameter')
include_class('net.sf.jasperreports.engine.JasperCompileManager')
include_class('net.sf.jasperreports.engine.JasperExportManager')
include_class('net.sf.jasperreports.engine.JasperFillManager')
include_class('net.sf.jasperreports.engine.JasperPrint')
include_class('net.sf.jasperreports.engine.data.JRXmlDataSource')

template_path = './report.jrxml'
destPath = './report.pdf'

# コンパイル
compiledDesign = JasperCompileManager.compileReport(template_path);

# 印刷
paramMap = HashMap.new
jasperPrint = Java::net.sf.jasperreports.engine.JasperFillManager.fillReport(compiledDesign,paramMap,Java::net.sf.jasperreports.engine.JREmptyDataSource.new)

#PDFとしてファイル出力
Java::net.sf.jasperreports.engine.JasperExportManager.exportReportToPdfFile(jasperPrint, destPath)