先日の発表資料を、直接 Rabbit で PDF にしようとチャレンジしましたが、残念ながら失敗しました。
まず、libgnomecups-0.1.13 と libgnomeprint-2.8.1 を入れてから ruby-gnome2-0.11.0 を入れました。 次に、以下のように実行しました。
$ rabbit -e euc-jp -w 1024 -h 768 -p -o hiki.pdf hiki.rd (process:14415): GnomePrintCupsPlugin-WARNING **: The ppd file for the CUPS printer XXXX could not be loaded. /usr/lib/ruby/1.8/rabbit/renderer/gnome-print.rb:208:in `init_printers': uninitialized constant Gnome::PrintGPA (NameError)
このエラーはこういう修正でいいのかな?
--- rabbit-0.0.5/lib/rabbit/renderer/gnome-print.rb +++ rabbit-0.0.5/lib/rabbit/renderer/gnome-print.rb @@ -204,7 +204,7 @@ end def init_printers - @printers = Gnome::PrintGPA.printers + @printers = Gnome::GPARoot.printers end def init_paper
ではもう一度実行すると、今度は Segmentation Fault しました。
/usr/lib/ruby/1.8/rabbit/renderer/gnome-print.rb:212: [BUG] Segmentation fault ruby 1.8.2 (2004-11-11) [i586-linux]
gdb で眺めると、こんな感じ (debugging symbols なしですが)。
#0 0xb7f1193e in rb_scan_args () from /usr/lib/libruby.so.1.8 #1 0xb70e2dbf in gnome_print_paper_get_type () from /usr/lib/ruby/1.8/i586-linux/gnomeprint2.so #2 0xb7f23f07 in rb_thread_schedule () from /usr/lib/libruby.so.1.8
うーむ。最小の再現パターンはこんな感じかな。
$ ruby -r gnomeprint2 -e 'Gnome::PrintPaper.get("A4")'
さて、どうしたらいいのかしら?
[追記] Ruby/GnomePrint2 の rb_scan_args の引数の誤りが原因でした。 作者に報告しておきます。
--- ruby-gnome2-all-0.11.0/gnomeprint/src/rbgp-gnome-print-paper.c +++ ruby-gnome2-all-0.11.0/gnomeprint/src/rbgp-gnome-print-paper.c @@ -128,7 +128,7 @@ return gp_paper_get_default(self); } else { VALUE name, width, height, mustfit; - rb_scan_args(argc, argv, "13", &name, &height, &mustfit); + rb_scan_args(argc, argv, "12", &name, &height, &mustfit); if (TYPE(name) == T_STRING) { if (argc > 1)
そういうわけで無事 PDF ができて、フォントもちゃんと埋め込まれていたのですが、'Printing images with alpha has not beein implemented for the PDF backend' という制限がいまのところあるようです。 あと、サイズが 13MB とかなり巨大になってしまいました。 そこで、
$ rabbit -e euc-jp -w 1024 -h 768 -p -o hiki.ps hiki.rd $ ps2pdf14 hiki.ps
とすると、透過画像もちゃんと表示されていて、しかもファイルサイズが 511KB と小さくなりました。 -w や -h の指定が効かずに勝手に A4 サイズでレンダリングされてしまうのがちょっと気になりますが、これはかなり便利です!