ImageMagickでPDFを画像に変換しWebに発行する
Texから出力した数式をHtmlにしたいという需要は多いらしく、様々な変換ツールが出ている。しかし、数式の位置がずれたり、数式の切り出しがうまくいかなかったりして、微妙なものが多い。
PDFのままWebに発行する手もあるが、AdobeReaderのプラグインが起動して時間差が生じるし、ページ下部に余白が多いとスクロールの手間がかかりストレスフルだ。
そこで、Texから出力したPDFをそのまま画面解像度程度の画像に変換してトリミングし、自動的にHtmlに発行するperlスクリプトを書いてみた。
PDFを見られる画質の画像にするのは難しい。AdobeAcrobatから画像として書き出しても、なぜかきれいな画像が得られない。ページごとに画面キャプチャして保存し、htmlを書くしかないのだが、さすがに面倒だ。
上記の自動処理を実行するにはImageMagickが適しているようだ。ただし画質がイマイチとの声が多い。
ここにImageMagickからきれいに画像を出力する方法が書いてあるが、コマンド
convert -density 600 -geometry 1000 in.pdf out.jpg
について、「解像度とピクセルの値が矛盾しているような気がする」と記されている。
このページを読んでみたところ、どうやらdensityというのはサンプリング解像度のことで、geometryは出力画像の幅を意味するらしい。
2ページからなるPDF:sample.pdf
1ページ目
2ページ目
を次のスクリプトで処理し、imgタグを埋め込んだsample.htmlとして出力する。
$|=1;
use Image::Magick;
my $filename = 'sample';
my $before = "$filename.pdf";
my $after = "./img/$filename.gif";
`convert -density 100 -geometry 600 $before -trim +repage -brightness-contrast -5 -contrast-stretch 2% +adjoin $after`;
print "Content-Type: text/plain; charset=utf-8\n\n";
print "$before を $after として保存しました\n";
open HTML, ">sample.html";
print HTML "<html>\n<head>\n</head>\n<body>\n";
foreach(glob "./img/$filename*"){
print HTML "<img src=\"$_\"><br><br>\n";
}
print HTML "</body>\n</html>\n";
close HTML;
exit;
出力結果
sample.htmlをIEで表示
ページ下の余白が削除されて画像が連続表示された。
ただ、トリミングの際に本当に限界まで余白がカットされてしまうので、imgタグの後に<br>を2つ付けて適当な余白を作った。
画像の間には少し余分に余白を設けたほうが、元のPDFのページ構成が保存されて良いかもしれない。
以下、オプションの説明。
convert -density 100 -geometry 600 $before -trim +repage -brightness-contrast -5 -contrast-stretch 2% +adjoin $after
-density 100
サンプリング解像度。Web用画像の品質でよいのなら、100で十分であり、それ以上上げても処理に時間がかかるだけであまり画質は改善しない。
-geometry 600
トリミング前の出力画像の幅。
-trim
トリミングするコマンド。
+repage
ページ情報を削除するコマンド。ページサイズに関するメタ情報が保存されているとトリミングが効かないので指定する。
-brightness-contrast -5
明度とコントラストを同時に指定できるのだが、コントラストがあまり変わらないので、とりあえず明度だけを指定。この値を大きくするほど出力画像が白くなる。
-contrast-stretch 2%
これでコントラストを調整する。こちらは非常によく効く。
ちなみに1%の場合
5%の場合
+adjoin
gif画像に出力する場合、デフォルトで結合されてアニメーションgifになってしまうので結合を解除する。こうするとsample-0.gif,sample-1.gifのように番号を付けて別々のファイルに保存してくれる。
さんざんにいわれているImageMagickであるが、以上のように、オプションを使いこなせばかなりのスグレモノだ。
« Tex:基本8色とColorパッケージで同名の色がPDFにすると異なる件 | トップページ | Tex:丸囲み文字(丸数字)をカスタマイズする »