Ubuntu 12.10 で、Rabbit で PDF を作成するとボールドフォントが汚くなってしまう問題が発生していて困っていました。
12.04 だとこうだったのが、
12.10 だとこんな残念な感じに…。
細くなってしまっている字が目立ちますが、それ以外の文字も汚くなってます。
まつもとさんも困ってました。
うーん、Rabbitで生成したPDFのタイトルのフォントが変。画面ではちゃんと表示されているのに、PDFではかすれたようになっている。Ubuntuでfontconfigが変化したせいだと思うんだけど、どうやったら戻るんだろう?
— Yukihiro Matsumoto (@yukihiro_matz) January 12, 2013
回避方法
どうやら Ubuntu 12.04 の libcairo と libpoppler-glib を使えば回避できるみたいなので、次のようにして、Rabbit を使うときだけ 12.04 のライブラリを使うようにしました。
- http://packages.ubuntu.com/precise-updates/i386/libcairo2/download の i386 から libcairo2_1.10.2-6.1ubuntu3_i386.deb をダウンロード
- http://packages.ubuntu.com/precise-updates/i386/libpoppler-glib8/download の i386 から libpoppler-glib8_0.18.4-1ubuntu3_i386.deb ダウンロード
dpkg -X で展開
% dpkg -X libcairo2_1.10.2-6.1ubuntu3_i386.deb x % dpkg -X libpoppler-glib8_0.18.4-1ubuntu3_i386.deb x
取り出した lib 配下をどっかにコピー
% cp -r x/usr/lib/i386-linux-gnu $HOME/rabbit-lib
ライブラリのパスを指定して rabbit を実行する
% LD_LIBRARY_PATH=$HOME/rabbit-lib rabbit ...
alias として .zshrc に登録する
alias rabbit='LD_LIBRARY_PATH=$HOME/rabbit-lib rabbit'
どうもこの記事を書く前に原因が判明していたようですが、せっかくなんでこの記事は残しておきます。
Debian GNU/LinuxのsidでRabbitでPDF出力するとボールドの文字が細くなるやつ ( slide.rabbit-shocker.org/authors/tommy/… の「話」みたいな感じ)、FreeTypeを2.4.10にしてみたら直った!(sidのFreeTypeは2.4.9。)
— す (@ktou) January 27, 2013
[追記] メーリングリストに詳細な解説が投稿されました。 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
まあ回避できたんだからよしとします。