0

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を使用しています。

4

1 に答える 1

0

試行錯誤の結果、書き込みモードを「w」から「wb」に変更することで問題が解決できることがわかりました。 .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, 'wb') as fp:
            fp.write(source.read())
        os.close(handle)
        return {'source': tmp, 'options': SortedDict(), 'size': None}

convert_engine.py ファイルには他に 2 つの場所があり、同じ変更を行う必要があります。その後、gm convert コマンドでファイルを処理できました。

ただし、私のpdfはかなり大きな複数ページのpdfであるため、他の問題に遭遇しました。最も重要なのは、get_imageメソッドがサムネイルが生成される前にファイルの完全なコピーを作成することです。したがって、ファイルサイズが約 50 Mb の場合、プロセスが非常に遅くなることが判明し、最終的に sorl をバイパスして gm を直接呼び出すことを選択しました。次に、サムネイルは標準の ImageField に格納されます。それほどエレガントではありませんが、はるかに高速です。

于 2013-03-08T22:01:52.647 に答える