読者です 読者をやめる 読者になる 読者になる

悪あがきプログラマー

悪あがきを続けていきたい技術と書評なブログです。トレタでiOSエンジニアやってます。

Rjb経由でPOI使ってパワーポイントに画像を貼り付けてみた

はてブロでまだrubyのシンタックスハイライトが使えないので、gist貼りつけてみた。


これで、rubyでPOIを使ってパワーポイントに画像を貼り付けられます。(需要あるんだろか?)


途中の、

idx = ppt._invoke('addPicture', 'Ljava.io.File;I', file_class.new("./github.png"), picture_class.PNG)

が悩みました。

普通に呼ぶとエラー。

1.8.7-p352 :026 > idx = ppt.addPicture(file_class.new("./github.png"), picture_class.PNG)
RuntimeError: can't coerce to byte array
	from (irb):26:in `method_missing'
	from (irb):26

正直まだよくわかっていないのだけれど、

rubyにはbyte[]型がないため、明示的に型を指定する必要があるらしい。
http://www.artonx.org/collabo/backyard/?BridgeBetweenStrongAndLoose
http://www.artonx.org/collabo/backyard/?InvokingMethodWithoutTypeSignature

指定の仕方は上記の通り。

型の部分はppt.java_methodsとすればaddPicture()の定義が見つかる。
addPicture([[BI, Ljava.io.File;I])

なんか見慣れないやつ
[[BI, Ljava.io.File;I]

これは多分、
「[BI」 と 「Ljava.io.File;I」 の配列で、オーバーロードを表現しているのかなと思います。
それで、今回はファイルクラスを指定する必要があるので、
「Ljava.io.File;I」を使う、、のかなと。


あ、ちなみに環境はMac Lionで、
Rjbロード時に、'-Djava.awt.headless=true'を付けないとエラーになったりもします。