2011-03-04 11:57:02
pdf化された本も溜まってきた。pdfで買った本もある。だたファイルをフォルダに放り込んでおくだけでは、何があるのか判らなくなってしまう。電子書籍閲覧&管理ソフトを使えばいいのかも知れないけれど、どうも私の思うようには動いてくれない。Calibreはいろいろなファイル形式に対応して形式変換もできて素晴らしいのだが、私にもいろいろ事情があるのだ。
文字情報としては、MySQLのデータベースとしてだいたい準備できた。しかし、表紙画像がない。本というものは表紙で覚えていたりするものだ。表紙画像一覧とか出てこないと困る。どうしても困る。そのためには、pdfファイルの第一頁だけをjpegに変換できたらいい。まあ、pngファイルなんかでもいいけれど。難しいのかなと思っていたが、何とImageMagickがインストールされていれば、
convert ebook.pdf[0] bkimg.jpgとするだけでebook.pdfの表紙画像をbkimg.jpgというjpeg画像として出力できる。素晴らしい。
今、私がやりたいことは、あるフォルダ(例えばebooksという名前)の中にあるpdfファイルと別のフォルダ(例えばimagesという名前)の中にあるjpegファイルを照合して、pdfファイルに対応するjpegファイルがなかったら、jpegファイルを作成するというスクリプトを書くということである。だが、私はシェルスクリプトは苦手なのだ。phpかpythonしか使えない。rubyは頑張ろうと思ったけれど、すぐに挫折。というわけでまずは、php5-imagickをインストールする。Ubuntuならapt-get install php5-imagickとするだけでいい。もとのpdfの大きさはさまざまだろうが、出力するjpegファイルは長辺が180pxになるように指定してやる。
foreach (glob("*.pdf") as $filename) { $jname = preg_replace("/\.pdf/",".jpg",$filename); $jnmpath = "/xxx/images/".$jname; if(!file_exists($jnmpath)){ $img = new Imagick($filename); $img->setImageIndex(0); $img->thumbnailimage(180,180,true); $img->writeImage($jnmpath); $img->destroy(); } }
ときどきこんなエラーが出るのだが、どういうことだろう。
Error: /undefined in findresource Operand stack: --dict:9/18(L)-- C2_0 1 --dict:5/5(L)-- --dict:5/5(L)-- MSGothic --dict:11/12(ro)(G)-- --nostringval-- CIDFontObject --dict:7/7(L)-- --dict:7/7(L)-- Adobe-Japan1 Execution stack: %interp_exit .runexec2 --nostringval-- --nostringval-- --nostringval-- 2 %stopped_push --nostringval-- --nostringval-- --nostringval-- false 1 %stopped_push 1878 1 3 %oparray_pop 1877 1 3 %oparray_pop 1861 1 3 %oparray_pop --nostringval-- --nostringval-- 305 1 306 --nostringval-- %for_pos_int_continue --nostringval-- --nostringval-- --nostringval-- --nostringval-- %array_continue --nostringval-- false 1 %stopped_push --nostringval-- %loop_continue --nostringval-- --nostringval-- --nostringval-- --nostringval-- --nostringval-- --nostringval-- %array_continue --nostringval-- --nostringval-- --nostringval-- --nostringval-- --nostringval-- %loop_continue Dictionary stack: --dict:1160/1684(ro)(G)-- --dict:1/20(G)-- --dict:75/200(L)-- --dict:75/200(L)-- --dict:108/127(ro)(G)-- --dict:287/300(ro)(G)-- --dict:22/25(L)-- --dict:6/8(L)-- --dict:26/40(L)-- Current allocation mode is local Last OS error: 2 GPL Ghostscript 8.71: Unrecoverable error, exit code 1 Fatal error: Uncaught exception 'ImagickException' with message 'Postscript delegate failed `/tmp/magick-XX4zKuX7': @ error/pdf.c/ReadPDFImage/645'
仕方がないので、エラーが出たらそのファイルはconvertコマンドで手動で処理している。