There's an echo in my head

日々のメモ。

ImageMagickでpdfをjpegに変換しようとしたらGhostscriptでpdfinflt.psが必要になった話

pdfをjpegに変換しようとしたらこんなエラーが出た:

$ convert -limit memory 512 -density 600 -quality 80 -resize 800x /path/to/001.pdf /path/to/001.jpg
   **** Error reading a content stream. The page may be incomplete.
   **** Error reading a content stream. The page may be incomplete.
Error: /typecheck in --run--
Operand stack:
   --dict:3/3(L)--   13787   1   1   --nostringval--   --nostringval--   --nostringval--   0   3   1   1   --nostringval--
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--   %loop_continue   --nostringval--   1   1   0   --nostringval--   %for_pos_int_continue   --nostringval--
Dictionary stack:
   --dict:1166/1684(ro)(G)--   --dict:1/20(G)--   --dict:82/200(L)--   --dict:82/200(L)--   --dict:109/127(ro)(G)--   --dict:292/300(ro)(G)--   --dict:25/32(L)--
Current allocation mode is local
GPL Ghostscript 9.07: Unrecoverable error, exit code 1
convert: Postscript delegate failed `/path/to/001.pdf': No such file or directory @ error/pdf.c/ReadPDFImage/678.
convert: no images defined `/path/to/tmp.jpg' @ error/convert.c/ConvertImageCommand/3078.

散々ググった結果、Ghostscriptでpdfinflt.psで処理してから再度convertすればいいことがわかった:

$ gs -sDEVICE=bbox -- /path/to/pdfinflt.ps /path/to/001.pdf /path/to/001_inflt.pdf
GPL Ghostscript 9.07 (2013-02-14)
Copyright (C) 2012 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
   **** Error reading a content stream. The page may be incomplete.
Converting 001.pdf to 001_inflt.pdf
   **** Error reading a content stream. The page may be incomplete.
Done.

$ convert -limit memory 512 -density 600 -quality 80 -resize 800x /path/to/001_inflt.pdf /path/to/001.jpg

使用したGhostscriptは9.07。

Linuxの場合、本家サイトからバイナリがダウンロードできるけど、lib/pdfwrite.psが必要になるのでソースを取ってきてビルドしたほうがいい。*1pdfwrite.psがない(gsが発見できない)場合には次のようなエラーが出る:

$ gs -sDEVICE=bbox -- /path/to/pdfinflt.ps 001.pdf 001_inflt.pdf
GPL Ghostscript 9.07 (2013-02-14)
Copyright (C) 2012 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Error: /undefinedfilename in (pdfwrite.ps)
Operand stack:
   --nostringval--
Execution stack:
   %interp_exit   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--   --nostringval--   false   1   %stopped_push   1900   1   3   %oparray_pop   1899   1   3   %oparray_pop   1883   1   3   %oparray_pop   1771   1   3   %oparray_pop   --nostringval--   %errorexec_pop   .runexec2   --nostringval--   --nostringval--   --nostringval--   2   %stopped_push   --nostringval--   --nostringval--
Dictionary stack:
   --dict:1160/1684(ro)(G)--   --dict:0/20(G)--   --dict:80/200(L)--
Current allocation mode is local
Last OS error: No such file or directory
Current file position is 5151
GPL Ghostscript 9.07: Unrecoverable error, exit code 1

pdfinflt.psはソースからインストールした場合(Homebrew含む)でもそれだけでは手に入らないので、リポジトリから落としてきて適当な場所に保存する必要がある。

参考

*1:yumとかapt-getとかの対応状況はわからない

このブログに出てくるコードスニペッツは、引用あるいは断りがない限りMITライセンスです。