wkhtmltopdf で Ajax コンテンツを撮影する
なにするものぞ
wkhtmltopdf - Project Hosting on Google Code
は
- WebKit
- Qt
を利用して、コマンドラインで Web ページのレンダリング結果を PDF や画像に変換できるツールです。
今回試したのは static link の OSX(386) 版 0.10.0 beta 4 です。
wkhtmltopdf と wkhtmltoimage ができてた
以前知ったときに、おぉこれはいいなと思ったのですが、うまく撮れるサイトと撮れないサイトがあってちょっと置いておくかーと思っていました。試したバージョンはよく覚えてません。
今回、この中に wkhtmltoimage という文字を見つけたのでこっちを試してみたところ、一部文字組みに凝っているところなどは wkhtmltopdf よりレイアウトの再現性がよいみたいです。1とは言え、PDF なら文書構造も文字情報も保持されるので、テキストベースの再利用性を考えれば wkhtmltopdf の方がいいわけです。
画像さえ撮れればいい場合は wkhtmltoimage で
--format png
などとした方が劣化もなくてきれいです。
ただし全体の見た目はフォントも影響するので、やはり Linux で作るより Mac で作った方がきれいです。
delay を設定すれば Ajax も ok
例えば bijin-tokei(金沢版)official website / Japanese Ver. なんかは肝心の画像の load が遅延実行されるのでそのまま実行しても悲しいことになります。
でも手元の環境では
--javascript-delay 15000
で撮ることができました。たぶんネットワーク環境にもよるので、この数値は一般化できないと思います。
エラー処理
サーバに繋がって 404 が返って来る場合は exit status は 2 になるけど動作は止まらず、スクリーンショット(?)自体も撮れますが、サーバ自体の response がない場合には abort してしまいます。
これは
--load-error-handling
で回避します。これを skip か ignore にすれば大丈夫。( default はabort. ) skip と ignore の違いはよく分かっていません。skip しても ignore しても何かが render されます。
ライセンス
wkhtmltopdf, wkhtmltoimage の実行バイナリのライセンスは GPL v3 or later になります。ただし、libwkhtmltox の部分は LGPL v3 のようです。libwkhtmltox っていうのも以前はなかったのですが、今後はこれをコアにしてアプリや操作は自分で好きなの作ってよ、みたいな展開があるのかも。そうなると面白いですね。
PDF に文字情報として残したうえでレイアウトを凝ろうとすると苦労するのは通常のドキュメントでも一緒ですよね。 ↩