2016-04-13 9 views
3

Я пытаюсь создать PDF-файлы с изображениями.reportlab Изображение в формате PDF: «пожалуйста, назовите tobytes()»

im = ImageReader('00001.png') 
c = canvas.Canvas('networkanalyze.pdf', pagesize=A4) 
c.drawImage(im, 10, 10, mask='auto') 
c.showPage() 
c.save() 

Traceback:

Traceback (most recent call last): 
    File "pdf.py", line 9, in <module> 
    c.drawImage(im, 10, 10, mask='auto') 
    File "/usr/lib/python2.6/site-packages/reportlab-2.7-py2.6-linux-x86_64.egg/reportlab/pdfgen/canvas.py", line 909, in drawImage 
    rawdata = image.getRGBData() 
    File "/usr/lib/python2.6/site-packages/reportlab-2.7-py2.6-linux-x86_64.egg/reportlab/lib/utils.py", line 656, in getRGBData 
    annotateException('\nidentity=%s'%self.identity()) 
    File "/usr/lib/python2.6/site-packages/reportlab-2.7-py2.6-linux-x86_64.egg/reportlab/lib/utils.py", line 653, in getRGBData 
    self._data = im.tostring() 
    File "/usr/lib/python2.6/site-packages/Pillow-3.2.0-py2.6-linux-x86_64.egg/PIL/Image.py", line 699, in tostring 
    "Please call tobytes() instead.") 
Exception: tostring() has been removed. Please call tobytes() instead. 

второй подход:

def generate_pdf(c): 
    """ 
    letter :- (612.0, 792.0) 
    """ 
    im = Image.open("00001.png") 
    c.drawInlineImage(im, 256, 720, width=100, height=60) 

c = canvas.Canvas("report_image.pdf", pagesize=letter) 
generate_pdf(c) 
c.save() 

Traceback:

Traceback (most recent call last): 
    File "pdf2.py", line 14, in <module> 
    generate_pdf(c) 
    File "pdf2.py", line 11, in generate_pdf 
    c.drawInlineImage(im, 256, 720, width=100, height=60) 
    File "/usr/lib/python2.6/site-packages/reportlab-2.7-py2.6-linux-x86_64.egg/reportlab/pdfgen/canvas.py", line 837, in drawInlineImage 
    img_obj = PDFImage(image, x,y, width, height) 
    File "/usr/lib/python2.6/site-packages/reportlab-2.7-py2.6-linux-x86_64.egg/reportlab/pdfgen/pdfimages.py", line 42, in __init__ 
    self.getImageData() 
    File "/usr/lib/python2.6/site-packages/reportlab-2.7-py2.6-linux-x86_64.egg/reportlab/pdfgen/pdfimages.py", line 156, in getImageData 
    imagedata, imgwidth, imgheight = self.PIL_imagedata() 
    File "/usr/lib/python2.6/site-packages/reportlab-2.7-py2.6-linux-x86_64.egg/reportlab/pdfgen/pdfimages.py", line 117, in PIL_imagedata 
    raw = myimage.tostring() 
    File "/usr/lib/python2.6/site-packages/Pillow-3.2.0-py2.6-linux-x86_64.egg/PIL/Image.py", line 699, in tostring 
    "Please call tobytes() instead.") 
Exception: tostring() has been removed. Please call tobytes() instead. 

Так что, кажется, не код относящийся.

Я бегу питона на сервере:

Python 2.6.6 (r266: 84292, 21 ноября 2013, 10:50:32) [GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] на linux2

Версия подушки: Подушка-3.2.0-py2.6-линукс-x86_64.egg

Версия ReportLab: ReportLab-2,7-py2.6-линукс-x86_64.egg

Я искал эту ошибку без ошибок, Что делать, чтобы решить эту проблему ?

ответ

5

С точки зрения трасс, вы можете видеть, что reportlab вызывает метод tostring(), который устарел от that commit в подушке.

Таким образом, ваш код, вероятно, будет работать, если вы понижаете Подушку до версии 3.1.

Тем не менее, ваша версия reportlab довольно устарела, поскольку у вас есть версия 2.7, и выйдет version 3.3. Я не пробовал, но, думаю, они исправили проблему и, по крайней мере, стоит попробовать!

Последняя версия ReportLab не совместим с Python 2.6, но вы, вероятно, следует обновить по крайней мере, Python 2.7, или даже Python 3 :)

+0

понижены до 3,1 таких же ошибки. Я бы обновился до python 2.7, но я боюсь, что мне придется переустановить все мои модули python на 2.6, например, bs4 и т. Д. Я не могу использовать pip, потому что firewall на virtualenv. –

+2

О версии, извините за ошибку, но 2,9 вместо 3.1 должны быть хорошими (у вас должно быть предупреждение, но не исключение). Об обновлении Python вы правы: если вы не можете получить доступ к pip, вам придется переустановить все модули. Я бы сказал, что по-прежнему стоит потратить время на модернизацию, потому что Python 2.6 становится действительно старым;) – filaton

+0

Устранена проблема. Огромное спасибо. Я обновляю свой env, но у меня есть презентация в пятницу, и я не могу рисковать своим приложением. Любой способ скрыть предупреждение? –

1

Я был в состоянии пойти на по-обезьяны заплат подушки. Не делайте этого дома:

from PIL import Image 
# Bad hack 
Image.Image.tostring = Image.Image.tobytes 
+0

гений взломал, работал для меня – spicyramen

+0

Лучшее решение, которое я когда-либо видел. Работал и для меня – cengineer

0

Откат на подушку 2.9.0 работал для меня на Ubuntu 14.04 с помощью Пип. Просто введите:

pip uninstall pillow 
pip install pillow==2.9.0 

Надеется, что это работает для вас

 Смежные вопросы

  • Нет связанных вопросов^_^