2012-01-31 7 views
7

Estoy usando ReportLab para imprimir un gráfico producido por matplotlib.IOError: "zip del decodificador no está disponible" usando matplotlib PNG en ReportLab en Linux, funciona en Windows

Puedo hacer esto en mi máquina de desarrollo de Windows sin problemas. Sin embargo, cuando despliegue en un servidor Ubuntu, la representación falla con el error descrito. Supongo que me falta un módulo de Python, pero no sé cuál. Creo que las versiones de Python, matplotlib, ReportLab y PIL son las mismas tanto en mi máquina de desarrollo como en el servidor.

Código para convertir la figura matplotlib (llamado gráfico) a PNG y devolverlo:

img_stream = StringIO.StringIO() 
chart.savefig(img_stream, format = 'png') 
img_stream.seek(0) 

return img_stream 

código para utilizar la imagen:

res_img = charts.CreateProjectionChart(doc.fund) #calls above code 
    if res_img: 
     img = ImageReader(res_img) 
     canvas.drawImage(img, FromLeft(first_col), FromTop(3.5, 2), width - (.1 * inch), 1.75 * inch, preserveAspectRatio=True, anchor='c') 

Cuando se ejecuta en Windows, esto funciona. Cuando se ejecuta en Linux que produce este error:

File "/home/web-server/reports.py", line 913, in FirstPageSetup 
    canvas.drawImage(img, FromLeft(first_col), FromTop(3.5, 2), width - (.1 * inch), 1.75 * inch, preserveAspectRatio=True, anchor='c') 
    File "/usr/local/lib/python2.7/dist-packages/reportlab-2.5-py2.7-linux-x86_64.egg/reportlab/pdfgen/canvas.py", line 840, in drawImage 
    rawdata = image.getRGBData() 
    File "/usr/local/lib/python2.7/dist-packages/reportlab-2.5-py2.7-linux-x86_64.egg/reportlab/lib/utils.py", line 658, in getRGBData 
    annotateException('\nidentity=%s'%self.identity()) 
    File "/usr/local/lib/python2.7/dist-packages/reportlab-2.5-py2.7-linux-x86_64.egg/reportlab/lib/utils.py", line 648, in getRGBData 
    if Image.VERSION.startswith('1.1.7'): im.load() 
    File "/usr/local/lib/python2.7/dist-packages/PIL-1.1.7-py2.7-linux-x86_64.egg/ImageFile.py", line 189, in load 
    d = Image._getdecoder(self.mode, d, a, self.decoderconfig) 
    File "/usr/local/lib/python2.7/dist-packages/PIL-1.1.7-py2.7-linux-x86_64.egg/Image.py", line 385, in _getdecoder 
    raise IOError("decoder %s not available" % decoder_name) 
IOError: decoder zip not available 
identity=[[email protected]] 
    handle_pageBegin args=() 
+1

Parece que se están perdiendo módulo zlib. Echa un vistazo aquí http://www.foxhop.net/ubuntu-python-easy_install-pil-does-not-install-zlib-support – RanRag

+0

¿Hiciste una compilación automática de PIL? ¿O es PIL administrado por 'apt'? – sarnold

+0

@sarnold: Creo que PIL fue instalado por ReportLab. En cualquier caso, no lo construí, lo conseguí como parte de algo más o con easy_install en Windows y apt-get en Ubuntu. –

Respuesta

12

setup.py Al parecer PIL no sabe cómo encontrar libz.so. PIL espera que libz.so se encuentre en /usr/lib y no en /usr/lib/i386-linux-gnu/libz.so.

para solucionar el problema

1) Encontrar la ubicación de los sistemas de libz.so usando find . -name libz.so.

2) Cree un enlace suave de libz.so a/usr/lib usando sudo ln -s /usr/lib/i386-linux-gnu/libz.so /usr/lib.

3) Y como @Larry sugirió que tenía que volver a instalar PIL después de sym-linking the so para zlib.

Para resolver este problema para el sistema de 64 bits echar un vistazo aquí http://www.foxhop.net/ubuntu-python-easy_install-pil-does-not-install-zlib-support

+0

Tengo el mismo problema pero me falta libz.so. Ejecutando Linux mint y el arco me da i686 – ralphtheninja

+1

Esto corrige el mismo error con la biblioteca Pillow también. – Druska

Cuestiones relacionadas