2017-11-13 15 views
0

Ubuntu 14.04でImageMagick 6.7.7-10 2017-07-31 Q16を使用しています.Wand 0.4.4、Python 3.4.3、およびDjango 1.11を使用しています。私はpdfファイルのjpgサムネイルを作成しようとしています。wand、Imagemagick、およびDjangoを使用してpdfをjpgに変換する際のエラー

コマンドラインで

、私はエラーなしでこれを行うことができます。

convert -thumbnail x300 -background white -alpha remove Lucy.pdf[0] output_thumbnail.jpg 

しかし、私は、私はこのエラーを取得し、同じ画像に杖を使用しようとすると:

Traceback (most recent call last): 
    File "/home/mark/python-projects/memorabilia-project/memorabilia/models.py", line 24, in make_thumb 
    pages = Image(blob = b) 
    File "/home/mark/.virtualenvs/memorabilia/lib/python3.4/site-packages/wand/image.py", line 2742, in __init__ 
    self.read(blob=blob, resolution=resolution) 
    File "/home/mark/.virtualenvs/memorabilia/lib/python3.4/site-packages/wand/image.py", line 2822, in read 
    self.raise_exception() 
    File "/home/mark/.virtualenvs/memorabilia/lib/python3.4/site-packages/wand/resource.py", line 222, in raise_exception 
    raise e 
wand.exceptions.MissingDelegateError: no decode delegate for this image format `' @ error/blob.c/BlobToImage/367 

私が見て/ etcにあるImageMagicのdelegates.xmlファイル、およびpdfファイル用のエントリがあります。

ワンドを使用してこの変換を行う方法に関するご意見ありがとうございます。

マーク

私はpdfファイルで杖をテストするために私のDjangoのコードから、簡単なPythonスクリプトをハッキングし、それは同じエラーを与えます。また、Ghostscriptがパスに含まれているかどうかをテストし、convert-listデリゲートの結果を出力しました。

from wand.image import Image 
from os.path import splitext 
import uuid 
import os 
import hashlib 

newname = "sam.jpg" 
oldnames = ["16u.jpg", "Lucy.pdf", "Jimbo.tiff", "john_edmonds.pdf", ] 
size = "200" 
RESOLUTION = 200 
test = "4" 
TEST_DATA = "test_data/" 

def test_delegate(): 
    print ("test_delegate") 
    print(os.system("convert -list delegate")) 

def test_gs(): 
    print ("test_gs") 
    retval = os.system("gs --version") 
    print (retval) 

def read_image(file_name): 
    f = open(file_name, 'rb') 
    h = hashlib.sha256() 
    buff_size = 128*1024 
    for b in iter(lambda : f.read(buff_size), b""): 
     h.update(b) 
    computed_sha256 = h.hexdigest() 
    f.close() 
    print ("b="+str(len(b))+", computed_sha256="+computed_sha256) 
    return b 

def create_thumb(names): 
    for img in names: 
     img = TEST_DATA + img 
     print(img) 
     thumb_name, thumb_extension = os.path.splitext(img) 
     thumb_extension = thumb_extension.lower() 
     bytes = read_image(img) 
     if thumb_extension in [".pdf",]: 
      print("found pdf") 
      #pages = Image(filename = img) 
      pages = Image(blob = bytes) 
      first_page = pages.sequence[0] 
      image = Image(first_page) 
     else: 
      print("found image") 
      #image = Image(filename=img) 
      image = Image(blob = bytes) 
     image.transform(resize="x"+size) 
     image.format = "jpg" 
     image.save(filename=thumb_name+"_thumb_"+test+".jpg") 
     print("finished successfully") 

def main(): 
    print("main") 
    test_delegate() 
    test_gs() 
    create_thumb(oldnames) 

if __name__ == '__main__': 
    main() 

このプログラムの出力は次のとおりです。それは同じ欠落デリゲートエラーがあります。同様のエラーは、tiffファイルでも発生しますが、jpgファイルでは発生しません(最初のテストファイルはjpgで、コードはファイルを処理してサムネイルイメージを作成しました)。それはプログラムからアクセスできるようにプログラムは、9.10であるGSのバージョンを印刷し、それはたぶん、この単純なPythonのコードが誰かを助ける

python thumbs.py 
main 
test_delegate 

Path: /etc/ImageMagick/delegates.xml 

Delegate    Command 
------------------------------------------------------------------------------- 
    blender =>   "blender" -b "%i" -F PNG -o "%o""\n"convert" -concatenate "%o*.png" "%o" 
     cdr =>   "uniconvertor" "%i" "%o.svg"; mv "%o.svg" "%o" 
     cgm =>   "ralcgm" -d ps -oC < "%i" > "%o" 2> "%Z" 
dng:decode =>   "ufraw-batch" --silent --create-id=also --out-type=png --out-depth=16 "--output=%u.png" "%i" 
     dot =>   "dot" -Tsvg "%i" -o "%o" 
     dvi =>   "dvips" -q -o "%o" "%i" 
     eps<=>pdf  "gs" -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 "-sDEVICE=pdfwrite" "-sOutputFile=%o" "-f%i" 
     eps<=>ps  "gs" -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=nodevice" "-sOutputFile=%o" "-f%i" 
     fig =>   "fig2dev" -L ps "%i" "%o" 
     hpg =>   "hp2xx" -q -m eps -f `basename "%o"` "%i";  mv -f `basename "%o"` "%o" 
     hpgl =>   "if [ -e hp2xx -o -e /usr/bin/hp2xx ]; then  hp2xx -q -m eps -f `basename "%o"` "%i";  mv -f `basename "%o"` "%o"; else  echo "You need to install hp2xx to use HPGL files with ImageMagick.";  exit 1; fi" 
     htm =>   "html2ps" -U -o "%o" "%i" 
     html =>   "html2ps" -U -o "%o" "%i" 
     https =>   "curl" -s -k -o "%o" "https:%F" 
     ilbm =>   "ilbmtoppm" "%i" > "%o" 
     man =>   "groff" -man -Tps "%i" > "%o" 
     miff<= show  "/usr/bin/display" -delay 0 -window-group %[group] -title "%l " "ephemeral:%i" 
mpeg:decode =>   "ffmpeg" -v -1 -i "%i" -vframes %S -vcodec pam -an -f rawvideo -y "%u.pam" 2> "%Z" 
     pdf<=>eps  "gs" -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=epswrite" "-sOutputFile=%o" "-f%i" 
     pdf<=>ps  "gs" -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=nodevice" "-sOutputFile=%o" "-f%i" 
     pnm<= ilbm  "ppmtoilbm" -24if "%i" > "%o" 
     pov =>   "povray" "+i%i" -D0 "+o%o" +fn%q +w%w +h%h +a -q9 "-kfi%s" "-kff%n";"convert" -concatenate "%o*.png" "%o" 
     ps<=>eps  "gs" -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=epswrite" "-sOutputFile=%o" "-f%i" 
     ps<=>pdf  "gs" -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=pdfwrite" "-sOutputFile=%o" "-f%i" 
     ps<= print  "lpr "%i" 
     rgba<= rle  "rawtorle" -o "%o" -v "%i" 
     scan =>   "scanimage" -d "%i" > "%o" 
     scanx =>   "scanimage" > "%o" 
     shtml =>   "html2ps" -U -o "%o" "%i" 
     sid =>   "mrsidgeodecode" -if sid -i "%i" -of tif -o "%o" > "%u" 
     svg =>   "rsvg-convert" -o "%o" "%i" 
     tiff<= launch "gimp" "%i" 
     txt<=>ps  "enscript" -o "%o" "%i" 
     wmf =>   "wmf2eps" -o "%o" "%i" 
0 
test_gs 
9.10 
0 
test_data/16u.jpg 
b=43597, computed_sha256=0bac89048bbbcfa75ad7d9dbc84eae42ff6b30c0a057dd76e180a205d9021b8d 
found image 
finished successfully 
test_data/Lucy.pdf 
b=61053, computed_sha256=6e108603ad4f6ae2e08b3d2a419a65d3cc1f60b788e9377be15b1926892189f8 
found pdf 
Traceback (most recent call last): 
    File "thumbs.py", line 63, in <module> 
    main() 
    File "thumbs.py", line 60, in main 
    create_thumb(oldnames) 
    File "thumbs.py", line 44, in create_thumb 
    pages = Image(blob = bytes) 
    File "/home/mark/.virtualenvs/memorabilia/lib/python3.4/site-packages/wand/image.py", line 2742, in __init__ 
    self.read(blob=blob, resolution=resolution) 
    File "/home/mark/.virtualenvs/memorabilia/lib/python3.4/site-packages/wand/image.py", line 2822, in read 
    self.raise_exception() 
    File "/home/mark/.virtualenvs/memorabilia/lib/python3.4/site-packages/wand/resource.py", line 222, in raise_exception 
    raise e 
wand.exceptions.MissingDelegateError: no decode delegate for this image format `' @ error/blob.c/BlobToImage/367 
Exception ignored in: <bound method Image.__del__ of <wand.image.Image: (empty)>> 
Traceback (most recent call last): 
    File "/home/mark/.virtualenvs/memorabilia/lib/python3.4/site-packages/wand/resource.py", line 232, in __del__ 
    File "/home/mark/.virtualenvs/memorabilia/lib/python3.4/site-packages/wand/image.py", line 2767, in destroy 
TypeError: object of type 'NoneType' has no len() 

:PDFを含め、それが見つかったデリゲートをプリントアウトこの問題を解決する方向を私に与えてください。しかし、ファイル名の代わりにバイト配列を使用すると、ワンドにバグがあると思われ始めています。

ありがとうございます!

あなたのインストールのImageMagick delegates.xmlファイルでマーク

+0

私は本当にワンドに精通していません。しかし、多くの場合、他のインタフェースでは、Ghostscriptはそのインタフェースで使用されるPATHに存在する必要があります。これは、例えば、PHP Imagickでよく起こります。だからあなたはそのセットを持っていることを確認してください。あるいは、PS用のdelegates.xmlファイルを編集し、Ghostscriptへのフルパスを入れることもできます。コマンドラインコマンドは実際には正しい構文ではありませんが、IM 6はむしろ寛容です。あなたは他のコマンドの前に入力を読むべきです。それは正しく 'convert Lucy.pdf [0] -thumbnail x300 -background white -alpha remove output_thumbnail.jpg'です。あなたのワンドコマンドは何ですか? – fmw42

+0

wandコマンドは、最初のトレースバック行pages = Image(blob = b)にあります。また、私のコンピュータにはdelegates.xmlが1つしかありません。すべてのpdfとpsなどのエントリがあります。 gsは/ usr/binのパス上にもあります。私はgsをテストするための簡単なpythonプログラムを調べました。 – user1045680

答えて

0

、あなたは見つけるでしょう:それはcommand="&quot;gs&quot;を持って

<delegate decode="ps:alpha" stealth="True" command="&quot;gs&quot; -sstdout=%%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=pngalpha&quot; -dTextAlphaBits=%u -dGraphicsAlphaBits=%u &quot;-r%s&quot; %s &quot;-sOutputFile=%s&quot; &quot;-f%s&quot; &quot;-f%s&quot;"/> 

    <delegate decode="ps:cmyk" stealth="True" command="&quot;gs&quot; -sstdout=%%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=pamcmyk32&quot; -dTextAlphaBits=%u -dGraphicsAlphaBits=%u &quot;-r%s&quot; %s &quot;-sOutputFile=%s&quot; &quot;-f%s&quot; &quot;-f%s&quot;"/> 

    <delegate decode="ps:color" stealth="True" command="&quot;gs&quot; -sstdout=%%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=pnmraw&quot; -dTextAlphaBits=%u -dGraphicsAlphaBits=%u &quot;-r%s&quot; %s &quot;-sOutputFile=%s&quot; &quot;-f%s&quot; &quot;-f%s&quot;"/> 

    <delegate decode="ps" encode="eps" mode="bi" command="&quot;gs&quot; -sstdout=%%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=eps2write&quot; &quot;-sOutputFile=%o&quot; &quot;-f%i&quot;"/> 

    <delegate decode="ps" encode="pdf" mode="bi" command="&quot;gs&quot; -sstdout=%%stderr -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 &quot;-sDEVICE=pdfwrite&quot; &quot;-sOutputFile=%o&quot; &quot;-f%i&quot;"/> 

、GSの代わりに、GSへの完全なパスを提供するために、変更を。 command="&quot;path2/gs&quot;

ImageMagickのダウンロードディレクトリではなく、インストールされているファイルでこれを変更してください。再起動し、それが役立つかどうかを確認してください。

申し訳ありませんが、これは私の唯一の提案です。そしてまた、私はWandに本当に精通していません。役に立たなかったら謝罪してください。

P.S. ImageMagickは/ usr/binまたは/ usr/local/binにあります。後者の場合は、PATH環境変数にもあります。申し訳ありませんが、これは明らかです。

+0

上記のプログラムはプログラムがgsにアクセスできることを示しているので、私はgsパスの問題ではないと思います。上記のプログラムは、すべてのImageMagick代理人がpdfにアクセスできることも示しています。私はそれがワンドのバグだと思う。ありがとう! – user1045680

+0

私はワンドの使い方について何も知らないので、正しいかもしれません。しかし、次のエラーメッセージが表示されます。「このイメージフォーマットのデコードデデデートはありません。通常は、必要なデリゲートを見つけることができません。 ImageMagickから直接Ghostscriptを入手することはできませんが、WandからGhostscriptを見つけることはできません。そのため、私はGhostscriptへの完全なパスをdelegates.xmlファイルに入れようと提案しました。 – fmw42

+0

最後のテストを見ると、正しいバージョン(9.10)が表示されるので、プログラムがGSを見つけることができます。テストプログラムは、pdfを含むすべてのデリゲートを出力します。私も同じプログラムを実行しましたが、バイナリブロブとして渡すのではなく、同じファイルをディスクから読み込み、すべての画像を期待どおりに処理しました。そこで、ローカルドライブからファイルを読み込むのではなく、バイナリデータを読み込むときにワンドにバグがあることをより確信しています。コメントしてくれてありがとう! – user1045680

関連する問題