page_adsence

2013年8月9日金曜日

PDFからJpeg画像に変換時に発生するエラーに関して

あるpdf画像をjpeg画像に変換しようと思ったところ、検証用に使用しているサーバや本番用のサーバでエラーが出てしまった。

コマンドは以下の通り。
convert -quality 75 -density 600 -geometry 858x1215 1375856384.pdf 1375856384.jpg


エラーの内容は以下の通り。
   **** Warning: can't process font stream, loading font by the name.
   **** Error reading a content stream. The page may be incomplete.
Error: /typecheck in --run--
Operand stack:
   --dict:16/16(L)--   1.0   1.0
   --dict:16/16(L)--   1   10   HiraKakuPro-W6   8.5
   --dict:5/5(L)--
   --dict:5/5(L)--   HiraKakuPro-W6
   --dict:10/12(ro)(G)--   --nostringval--   CIDFontObject
   --dict:7/7(L)--
   --dict:7/7(L)--   12   Adobe-Japan1
Execution stack:
   %interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--
   2   %stopped_push   --nostringval--   --nostringval--   --nostringval--   false   1   %stopped_push   1894   1   3   %oparray_pop   1893   1   3   %oparray_pop   1877   1   3   %oparray_pop   --nostringval--   --nostringval--   2   1   1   --nostringval--   %for_pos_int_continue   --nostringval--   --nostringval--   --nostringval--   --nostringval--   %array_continue   --nostringval--   --nostringval--   --nostringval--   --nostringval--   --nostringval--
Dictionary stack:
   --dict:1161/1684(ro)(G)--   --dict:1/20(G)--   --dict:82/200(L)--   --dict:82/200(L)--   --dict:108/127(ro)(G)--   --dict:291/300(ro)(G)--   --dict:23/30(L)--   --dict:6/8(L)--   --dict:25/40(L)--   --dict:20/25(L)--   --dict:5/5(L)--   --dict:10/15(L)--
Current allocation mode is local
Last OS error: 2
GPL Ghostscript 9.04: Unrecoverable error, exit code 1
convert: Postscript delegate failed `/hogehoge/1375856384.pdf': そのようなファイルやディレクトリはありません @ pdf.c/ReadPDFImage/611.
convert: missing an image filename `/hogehoge/1375856384-000001.jpg' @ convert.c/ConvertImageCommand/2806.


他のpdf画像では全く問題なく変換されているので、そのpdfに問題があるかと思い、色々調べてみました。
とりあえずエラーの内容としては 「Ghostscript 9.04: Unrecoverable error」と書かれていたので、
Ghostscrip周りを調べてみたら、以下のようなサイトがあった。

http://bugs.ghostscript.com/show_bug.cgi?id=692499

Ghostscriptのバグっぽい内容の記述があるのですが、
英語で書いてあってよくわからず、とりあえず一番最後にアップグレードしろと書かれていたので、
ローカルサーバで試してみた。
現状入っていたGhostscriptのバージョンが8.15と大分古かったので、一気に最新版である9.07にアップデート。
最初はyumからアップデートしようとしたが、なかったのでrpmを探してみたが、
md5のチェックサムが一致しないと。。。 リビルドの仕方がよくわからなかったので、ソースだけ抜き出してインストールするはめに。
どうやらconfigureオプションに「--disable-compile-inits」と記述をしておかないとインストール後に設定変更できなくなるらしいです。
実際に指定したオプションは以下の通り。

./configure --disable-compile-inits --with-x --with-drivers=ALL --without-luratech --with-libiconv=gnu


で、makeしてmake installしたら入った。

gs -v

Ghostscriptのバージョンを確認し9.07に変わっていることを確認。

同じコマンドを実行。
問題なく変換出来た。
この時点で最初の8.15で変換出来るかどうか試しておけばよかったと激しく後悔。

とはいえもう遅いので、とりあえずバージョンを9.05に落としてみた。
こちらもソースから落としてきて、同様のconfigureオプションを指定しインストール。
バージョンが変わったことを確認して同じコマンドを実行。

変換出来てしまった・・・。

こうなってくると問題はImageMagickの方かもということで、ImageMagickをアップデート。
現状自分のローカルサーバに入っているImageMagickのバージョンは6.2.8。
検証、本番サーバに入っているImageMagickのバージョンは6.5.5-6。
なので、とりあえず検証サーバと同じバージョンにアップデート。
こちらもソースからインストール。configureオプションは特に指定していません。

convert -version


バージョンが変わっているかを確認。
そして変換!
エラー。
再現出来ました。
やはりImageMagickのバージョンのせいらしい。
ImageMagickを最新のバージョン(6.8.6-8)にアップデートしてみる。

変換→エラー。

どうやら最新のバージョンでも変換出来ないらしい。
バージョンを一番最初にインストールされていたバージョンに落とすしか対応方法は無さそうな・・・。

ちなみに変換出来なかった原因はpdfファイルの中に編集可能なテキストエリアがあったため、変換出来なかったっぽいです。その部分を削除し変換コマンドをかけたら問題のバージョンでも問題なく変換出来ました。

結果的に対応不要となりましたが、本当に対応が必要になった時にダウングレードして対応出来るのかは引き続き調べてみる。