JRubyでPDF帳票作成

パッケージJava製品開発担当の大です。こんにちは。

今回は、JRubyを使用してPDF帳票を作成してみたいと思います。JRubyは、JVM上で動くRuby実装です。オリジナルのRubyと高い互換性を保ち、Javaとの親和性も高い、素敵な処理系です。

JRubyではJavaで作成されたクラスを利用することが簡単に出来るため、シーオーリポーツ for Javaで帳票出力をすることも可能です。

JRuby 開発・実行環境の準備

JRubyの開発・実行環境を手っ取り早く作るなら、NetBeansがおすすめです。まずはNetBeansのサイトから、最新版のIDEをダウンロードします。ダウンロードサイトにはいくつかのダウンロードパッケージがありますが、「Ruby」あるいは「すべて」を選んでください。これらには、JRubyが最初から同梱されています。

NetBeansのサイトからIDEをダウンロード

NetBeansのサイトからIDEをダウンロード(クリックで拡大)

ダウンロードしたインストーラを起動し、ウィザードの指示に従ってインストール先等を選べば、あっという間にインストールは完了します。起動してみましょう。

ファイルメニューの「新規プロジェクト」を選ぶとウィザードが起動します。

新規プロジェクトウィザード

新規プロジェクトウィザード(クリックで拡大)

カテゴリはRubyを選択、プロジェクトは「Rubyアプリケーション」を選択してください。

次のページでプロジェクト名を設定し、完了を押してウィザードを終了すると、「main.rb」をひとつ持つプロジェクトが作成されます。

Hello, World!

Hello World(クリックで拡大)

実行ボタンを押すと、main.rbが実行されます。main.rbにデフォルトで書かれているとおり、"Hello World"がコンソールに出力されます。

JRubyでシーオーリポーツ for Javaを使う

シーオーリポーツ for Javaを使うには、プロジェクトの右クリックメニューから「プロパティー」を選び、カテゴリ「Java」を開いて「JAR/フォルダを追加」でシーオーリポーツのjarファイルを追加します。

coreports.jarを選択

coreports.jarを選択(クリックで拡大)

これで、JRubyからシーオーリポーツを使う準備は完了です。
main.rbに最初から書かれていた「Hello World」を消して、かわりに以下のように書いてみましょう。

module CoReportsSample
  include Java
  include_package 'jp.co.hos.coreports'
  include_package 'jp.co.hos.coreports.constants'

  # このサンプルではPDFを作成します
  def self.create_pdf
    path = 'c:/CrHokenSample/'
    report = Report.new
    report.job =
      CrFileOutJob.new(CorFileType::PDF, path + 'sample.pdf')
    report.form_file = path + 'HokenSample.cfx'
    report.data_file = path + 'HokenSample.csv'
    report.output
  end

  # 帳票出力を行うクラスです
  class Report
    attr_accessor :job, :form_file, :data_file

    # 帳票を出力します
    def output
      begin
        draw = CoReportsSample::CrDraw.new
        form = CoReportsSample::CrForm.open(draw, form_file)
        begin
          job.start(draw)
          create_pages(form)
          job.end
        ensure
          form.close
        end
      ensure
        draw.deleteInstance
      end
    end

    # ページを作成します
    def create_pages(form)
      header = nil
      require 'csv'
      CSV.open(data_file, 'r') do |row|
        unless header
          # 最初の1行はヘッダ
          header = row
        else
          # データ行を読み込んでフィールドに値をセット
          row.each_index do |index|
            form.get_cr_object(header[index].to_s).text =
              row[index].to_s
          end
          form.print_out
        end
      end
    end
  end
end

CoReportsSample.create_pdf

このコードは、シーオーリポーツ for Javaの描画ライブラリユーザーズマニュアルに入っているサンプル「実践的な帳票出力処理(1)単票出力」の、フォームファイル(HokenSample.cfx)とCSVファイル(HokenSample.csv)を使って、PDF帳票を出力します(ただし、処理を簡略化するため、CSVファイルのエンコーディングはUTF-8に変更してあります)。これらのファイルを、8行目で指定している場所に置いてください。

書き終えたら実行してみましょう。以下のようなPDFが作成されたでしょうか?

出力結果

出力結果(クリックで拡大)