2013-03-04 5 views
0

웹 사이트에서 pdf 파일의 미리보기 이미지를 제공하도록 sorl-thumbnail django 앱을 설정하려고합니다. Windows Server 2008 R2에서 Appache web 섬기는 사람.graphicsmagick backend가 포함 된 sorl-thumbnail Windows7에서 pdf/image 변환 오류가 발생했습니다.

jpeg 이미지의 축소판 생성을 위해 PIL 백엔드에서 사용할 수있는 sorl 축소판 기능이 있습니다. 정상적으로 작동합니다.

PIL은 pdf 파일을 읽을 수 없으므로 graphicsmagick 백엔드로 전환하고 싶었습니다. graphicsmagick/ghostscript 조합을 설치하고 테스트했습니다. 명령 줄에서

gm convert foo.pdf -resize 400x400 bar.jpg 

예상되는 jpg 축소판을 생성합니다. 또한 jpg 썸네일 생성을 위해 jpg에서 작동합니다.

그러나 sorl-thumbnail에서 호출하면 ghostscript가 충돌합니다. 장고 파이썬 쉘 (파이썬 manage.py 쉘) 나는 (FF)를 FieldFile 인스턴스에 통과 sorl docs과 설명 낮은 수준의 명령을 사용에서 는 foo.pdf를 가리키는 다음과 같은 오류 얻을 :

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가 명령 줄에서 gm convert를 사용할 때 잘 변환되는 동일한 파일을 가리키고 있음에 유의하십시오.

나는 ImageFieldFile 인스턴스 (IFF)를 통과하고 다음과 같은 오류 얻을도 시도했다 :의 기본 PIL 백엔드를 사용하는 sorl 설정을 다시 변경

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 

및 JPG 변환에 JPG에 대한 명령을 반복 썸네일 이미지는 오류/경고없이 생성되고 캐시를 통해 사용할 수 있습니다.

sorl이 소스 파일을 gm에 전달하기 전에 임시 파일로 복사하고있는 것으로 보이며이 복사 작업에서 문제가 발생했다고 보입니다.

난의 소스에서 복사 작업으로 믿는 것을 발견했습니다 sorl_thumbnail-11.12-py2.7.egg \ sorl \ 썸네일 \ 엔진 \ 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} 

여기에 문제가있을 수 있습니까? 나는 그것을 보지 못합니다!

이 문제를 극복하는 방법에 대한 제안은 크게 감사하겠습니다. memcached와 ghostscript 9.07에서 django 1.4, sorl-thumbnail 11.12를 사용하고 있습니다.

답변

0

몇 가지 시행 착오 끝에 쓰기 모드를 'w'에서 'wb'로 변경하여 sorl_thumbnail-11.12-py2.7.egg \ sorl \ thumbnail의 소스를 변경하면 문제가 해결 될 수 있음을 발견했습니다. \ 엔진 \ 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, 'wb') as fp: 
      fp.write(source.read()) 
     os.close(handle) 
     return {'source': tmp, 'options': SortedDict(), 'size': None} 

나도 같은 변경이되어야 convert_engine.py 파일에 두 개의 다른 위치가 믿고 있습니다. 그 후, gm convert 명령이 파일을 처리 할 수있었습니다.

그러나 필자의 pdf는 상당히 큰 multipage pdf이므로 다른 문제가 발생했다. 가장 중요한 것은 get_image 메서드가 미리보기 이미지가 생성되기 전에 파일의 전체 복사본을 만드는 것입니다. 따라서 파일 크기가 약 50Mb이므로 매우 느린 프로세스로 밝혀졌습니다. 마침내 나는 sorl을 우회하여 gm을 직접 호출하기로했습니다. 축소판은 표준 ImageField에 저장됩니다.너무 우아하지는 않지만 훨씬 빠릅니다.