AppacheWebサーバーを搭載したWindowsServer2008R2で実行されているWebサイトのpdfファイルのサムネイルを提供するようにsorl-thumbnaildjangoアプリをセットアップしようとしています。
私は、jpeg画像のサムネイル生成のためにPILバックエンドでsorl-thumbnailを機能させましたが、これは正常に機能していました。
PILはPDFファイルを読み取ることができないため、graphicsmagickバックエンドに切り替えたいと思いました。graphicsmagick/ghostscriptの組み合わせをインストールしてテストしました。コマンドラインから
gm convert foo.pdf -resize 400x400 bar.jpg
期待されるjpgサムネイルを生成します。また、jpgからjpgへのサムネイル生成でも機能します。
ただし、sorl-thumbnailから呼び出されると、ghostscriptがクラッシュします。django python shell(python manage.py shell)から、 sorl docsで説明されている低レベルのコマンドを使用し、foo.pdfを指すFieldFileインスタンス(ff)を渡すと、次のエラーが発生します。
In [8]: im = get_thumbnail(ff, '400x400', quality=95)
**** Warning: stream operator isn't terminated by valid EOL.
**** Warning: stream Length incorrect.
**** Warning: An error occurred while reading an XREF table.
**** The file has been damaged. This may have been caused
**** by a problem while converting or transfering the file.
**** Ghostscript will attempt to recover the data.
**** Error: Trailer is not found.
GPL Ghostscript 9.07: Unrecoverable error, exit code 1
ffは、コマンドラインからgmconvertを使用するときに正常に変換される同じファイルを指していることに注意してください。
ImageFieldFileインスタンス(iff)も渡そうとしましたが、次のエラーが発生します。
In [5]: im = get_thumbnail(iff, '400x400', quality=95)
identify.exe: Corrupt JPEG data: 1 extraneous bytes before marker 0xdb `c:\users\thin\appdata\local\temp\tmpxs7m5p' @ warning/jpeg.c/JPEGWarningHandler/348.
identify.exe: Corrupt JPEG data: 1 extraneous bytes before marker 0xc4 `c:\users\thin\appdata\local\temp\tmpxs7m5p' @ warning/jpeg.c/JPEGWarningHandler/348.
identify.exe: Corrupt JPEG data: 1 extraneous bytes before marker 0xda `c:\users\thin\appdata\local\temp\tmpxs7m5p' @ warning/jpeg.c/JPEGWarningHandler/348.
Invalid Parameter - -auto-orient
デフォルトのPILバックエンドを使用するようにバックソル設定を変更し、jpgからjpgへの変換のコマンドを繰り返すと、サムネイル画像がエラー/警告なしで生成され、キャッシュを介して利用できます。
sorlがソースファイルをgmに渡す前に一時ファイルにコピーしているようです。問題は、このコピー操作に起因しているようです。
sorl_thumbnail-11.12-py2.7.egg \ sorl \ thumbnail \ engines \ convert_engine.py行47-55のソースで、コピー操作であると私が信じているものを見つけました。
class Engine(EngineBase):
...
def get_image(self, source):
"""
Returns the backend image objects from a ImageFile instance
"""
handle, tmp = mkstemp()
with open(tmp, 'w') as fp:
fp.write(source.read())
os.close(handle)
return {'source': tmp, 'options': SortedDict(), 'size': None}
問題はここにあるのでしょうか-私にはわかりません!
この問題を克服する方法の提案は大歓迎です!django 1.4、sorl-thumbnail 11.12、memcached、ghostscript9.07を使用しています。