2017-11-13 13 views
0

우분투 14.04에서 Wand 0.4.4, Python 3.4.3 및 Django 1.11을 통해 ImageMagick 6.7.7-10 2017-07-31 Q16을 사용하고 있습니다. 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 파일로 지팡이를 테스트하기 위해 내 장고 코드에서 간단한 파이썬 스크립트를 해킹하고 같은 오류를 제공합니다. 또한 Ghostscript가 경로에 있는지 여부를 테스트하고 변환 목록 위임자의 결과를 인쇄했습니다.

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의 버전을 인쇄, 그래서 프로그램에서 액세스 할 수 있습니다, 그것은 어쩌면이 간단한 파이썬 코드가 사람을 도움이 될 것입니다 PDF 파일 :

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() 

포함이 발견 된 대표를 출력한다 이 문제를 해결하기위한 방향을 알려주십시오. 그러나 파일 이름 대신 바이트 배열을 사용하면 막대에 버그가있는 것으로 의심됩니다.

감사합니다.

마크

설치된 ImageMagick과의 delegates.xml 파일에서
+0

저는 Wand에 익숙하지 않습니다. 그러나 종종 다른 인터페이스와 함께 Ghostscript는 해당 인터페이스에서 사용되는 PATH에 있어야합니다. 이것은 종종 PHP Imagick에서 발생합니다. 그래서 당신은 그 세트를 가지고 있는지 확인하십시오. 또는 PS 용 delegates.xml 파일을 편집하고 Ghostscript에 대한 전체 경로를 입력 할 수 있습니다. IM 6은 다소 용서가되지만 명령 행 명령은 실제로 적절한 구문이 아닙니다. 다른 명령보다 먼저 입력을 읽어야합니다. 'Lucy.pdf [0] -thumbnail x300 -background white -alpha remove output_thumbnail.jpg'을 올바르게 변환해야합니다.당신의 완드 명령은 무엇입니까? – fmw42

+0

wand 명령은 첫 번째 추적 라인 인 pages = Image (blob = b)에 있습니다. 또한 내 컴퓨터에는 하나의 delegates.xml 만 있으며 모든 pdf 및 ps 등의 항목이 있습니다. gs는/usr/bin에있는 경로에도 있습니다. 나는 또한 간단한 파이썬 프로그램으로 gs를 테스트했다. – user1045680

답변

0

, 당신은 발견 할 것이다 :

<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;"/> 

을가 command="&quot;gs&quot;을 갖는 경우, 즉 GS 대신에 GS의 전체 경로를 제공하기 위해 변경; 즉, command="&quot;path2/gs&quot;

ImageMagick 다운로드 디렉토리가 아닌 설치된 파일에서이 설정을 변경해야합니다. 재부팅하고 도움이되는지 확인하십시오.

죄송합니다. 이것은 유일한 제안입니다. 그리고 저는 다시 Wand에 익숙하지 않습니다. 사과하지 않으면 사과드립니다.

P. ImageMagick은/usr/bin 또는/usr/local/bin에 있습니다. 후자의 경우, PATH 환경 변수에서도 마찬가지입니다. 미안하다.

+0

위의 프로그램은 프로그램이 gs에 액세스 할 수 있음을 보여주기 때문에 gs 경로 문제는 아닌 것 같습니다. 위의 프로그램은 pdf에 대한 모든 ImageMagick 대리자에 액세스 할 수 있음을 보여줍니다. 나는 그것이 지팡이의 버그라고 생각한다. 감사! – user1045680

+0

완드의 사용법에 대해 잘 모르기 때문에 정확할 수도 있습니다. 하지만 다음과 같은 오류 메시지가 나타납니다. '이 이미지 형식에 대해 대리자를 디코딩하지 않습니다.'라는 메시지가 나타납니다. 이는 대개 필요한 대리자를 찾을 수 없다는 것을 의미합니다. 나는 그것이 ImageMagick에서 직접 할 수 있지만 그것은 완드에서 고스트 스크립트를 찾을 수 없다고 가정하고 있습니다. 그래서 Ghostscript에 대한 전체 경로를 delegates.xml 파일에 넣으려고 제안했습니다. – fmw42

+0

마지막 테스트를 보면 프로그램이 올바른 버전 (9.10)을 인쇄하기 때문에 GS를 찾을 수 있음을 알 수 있습니다. 테스트 프로그램은 pdf를 포함하여 찾을 수있는 모든 대리인을 인쇄합니다. 또한 동일한 프로그램을 실행했지만, Wand가 디스크에서 동일한 파일을 읽었을 때, 바이너리 블롭으로 전달하는 것과는 대조적으로 모든 이미지가 예상대로 처리됩니다. 따라서 로컬 드라이브에서 파일을 읽는 것과는 대조적으로 이진 데이터를 읽을 때 지팡이에 버그가 있음을 확신합니다. 귀하의 의견에 감사드립니다! – user1045680