Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

reportlab Image to PDF: "please call tobytes()"

I'm trying to generate PDF's with Images.

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.

2nd Approach:

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.

So it seems to not be code related.

I am running python on a server:

Python 2.6.6 (r266:84292, Nov 21 2013, 10:50:32) [GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2

Version of Pillow: Pillow-3.2.0-py2.6-linux-x86_64.egg

Version of reportlab: reportlab-2.7-py2.6-linux-x86_64.egg

I searched for this particular error without success, what can I do to solve this?

like image 320
Roy Holzem Avatar asked Dec 24 '22 06:12

Roy Holzem


1 Answers

From the traceback, you can see that reportlab is calling the tostring() method, which was deprecated by that commit in Pillow.

Thus, your code would probably work if you downgrade Pillow to version 3.1.

However, your version of reportlab is quite outdated as you have the version 2.7 and the version 3.3 is released. I didn't try it but I guess they fixed the issue and at least, it's worth to try!

The latest version of reportlab is not compatible with Python 2.6 but you should probably upgrade at least to Python 2.7, or even to Python 3 :)

like image 157
filaton Avatar answered Dec 28 '22 06:12

filaton