Rabbit で PDF 出力時のフォントが汚くなるのを回避

Ubuntu 12.10 で、Rabbit で PDF を作成するとボールドフォントが汚くなってしまう問題が発生していて困っていました。

12.04 だとこうだったのが、

f:id:tmtms:20130127193403p:plain

12.10 だとこんな残念な感じに…。

f:id:tmtms:20130127193348p:plain

細くなってしまっている字が目立ちますが、それ以外の文字も汚くなってます。

まつもとさんも困ってました。

回避方法

どうやら Ubuntu 12.04 の libcairo と libpoppler-glib を使えば回避できるみたいなので、次のようにして、Rabbit を使うときだけ 12.04 のライブラリを使うようにしました。

どうもこの記事を書く前に原因が判明していたようですが、せっかくなんでこの記事は残しておきます。

[追記] メーリングリストに詳細な解説が投稿されました。 http://www.cozmixng.org/~w3ml/index.rb/rabbit-shocker/msg/1079

以下、試行錯誤の過程

上記の回避方法に至るまでの試行錯誤の過程をメモとして残しておきます。

ゲストアカウントで試す

自分の個人環境(ホーム配下のドットファイル等)がいけないのかと思って、ゲストアカウントで試してみました。

結果、変わりませんでした。

Ubuntu 12.10 をクリーンインストール

OS がいけないのかと思って、Ubuntu 12.10 を VMware Player で Ubuntu 12.10 をインストールして、Ruby と Rabbit をインストールして試してみました。

結果、変わりませんでした。

Ubuntu 12.04 で試す

本当に 12.04 では問題なかったのかを確かめるために、VMware Player で Ubuntu 12.04 をインストールして、Ruby と Rabbit をインストールして試してみました。

結果、12.04 では綺麗なフォントで PDF が作られました。

Ubuntu Server 12.10 で試す

デスクトップ環境の何かがまずいのかと思って、VMware Player で Ubuntu Server 12.10 をインストールして、Ruby と Rabbit をインストールして試してみました。

結果、綺麗な PDF が作成されました。

Ubuntu Server 12.10 にデスクトップ環境をインストール

やっぱりデスクトップ環境でインストールされる何かが原因だったのか…。確かめるために、Ubuntu Server 12.10 に Ubuntu Desktop 12.10 でインストールされるパッケージを追加インストールしてみました。

結果は綺麗なままでした。パッケージを合わせたのに結果が違うのが謎です。

Ubuntu Desktop 12.10 (64bit) をインストール

最初に試した Ubuntu Desktop は 32bit で、Ubuntu Server は 64bit なので、もしかしたらそれの違いかと思って、VMware Player で Ubuntu Desktop 12.10 の 64bit 版をインストールしてみました。

結果、綺麗なフォントで作成されました。

何の都合かわかりませんが、Ubuntu 12.10 の 32bit 版でだけ汚くなってしまうようです。

Ubuntu 12.04 のライブラリをコピー

64bit にすれば問題ないことがわかっても、自分の PC を 64bit にするのはやりたくなかったので、別の方法を考えます。

フォントファイルやフォントまわりの設定等は 32bit と 64bit の違いはないはずなので、おそらく原因はライブラリです。

12.04 では 32bit でも問題ないことがわかってるので、12.04 から /usr/lib/i386-linux-gnu 配下を丸ごと 12.10 にコピーして、それを使って Rabbit を動かしてみました。

% LD_LIBRARY_PATH=/tmp/lib1204 rabbit -p hoge.rd

結果、フォントが汚くなることはありませんでした。やはりライブラリの問題のようです。

どのライブラリが問題かを調べるために strace で rabbit 実行時に読み込んでいるライブラリを調べてみます。

% LD_LIBRARY_PATH=/tmp/lib1204 strace -e open rabbit -p hoge.rd 2>&1 | grep /tmp/lib1204 | grep -v ENOENT | ruby -lne 'puts $_[/".*"/]' | sort | uniq

表示されるライブラリを一個ずつ削除して PDF 作成を繰り替えして、どのライブラリが問題なのかを突き止めます。

これで、問題は libcairo.so.2 と libpoppler-glib.so.8 であることがわかりました。

ということで一番最初に書いた回避方法で解決できるようになりました。

おわり

本当は原因のライブラリが分かったところで、コードを読んで問題を解決すべきなのでしょうけど、フォントまわりはさっぱりなので、手が出せません… orz

まあ回避できたんだからよしとします。