JRubyからSVFを使ってみる

現在、仕事でSVFによる帳票開発をしていますが、簡単なテストスクリプトを書くためにJRubyを使ってみました。

ちょーてきとーですが、こんな感じです。

test.rb

require 'rubygems'
require 'fastercsv'
require 'kconv'
require 'java'
import 'jp.co.fit.vfreport.SvfrClient'
import 'jp.co.fit.vfreport.SvfrException'

begin
  svf = SvfrClient.new()
  ret = svf.VrInit();
  ret = svf.VrSetPrinter("", "PDF");
  ret = svf.VrSetSpoolFileName2("hoge.pdf");
  ret = svf.VrSetForm("hoge.xml", 4);
  FasterCSV.open("hoge.csv", "r").each_with_index do |row, index|
    if index == 0
      @column_names = row.map {|column_name| column_name.toutf8}
    else
      @column_names.each_with_index do |column_name, i|
        ret = svf.VrsOut(column_name, row[i].toutf8);
      end
      ret = svf.VrEndRecord();
    end
  end
  ret = svf.VrPrint();
  ret = svf.VrQuit();
rescue SvfrException => e 
  puts "errorcode: #{ret}"
  puts e
rescue => e2 
  puts e2
end

hoge.xmlというフォーム定義を使い、hoge.csvというファイルを読み込んで、1行目のヘッダ情報から項目名をマッピングし、hoge.pdfを出力します。

Javaのサンプルコードをそのままrubyに移植するだけなので何も難しいことはありませんが、一点つまずいたのは文字コードです。

SvfrClient#VrsOutなどの引数にファイルから読み込んだ文字列をそのまま渡すと文字化けが発生。調べてみたら、こちらのページに行き当たりました。

8. JRuby から Java へのアクセス
http://www.okisoft.co.jp/esc/ruby/tut-08.html

JRubyのソース自体はutf8にしていましたが、CSVファイルのなかがSJISだったため化けてしまっていたようです。Javaモジュールに文字列を渡すとき、utf8に変換してやることで解決しました。CSVファイルの文字コード自体がutf8ならもちろんこの処理は必要ありません。

多少つまづいたもののなんとかJRubyからSVFで帳票を出力することができました。Javaの資産がそのまま使えるのは、今更ながらとても便利ですね。癖になりそうです。まぁ、今回程度のコードならJavaで書いてもあまり変わらないという話もありまする(- -)