reportlab图像到PDF:"请致电tobytes()"

Roy*_*zem 4 python pdf reportlab rhel pillow

我正在尝试使用图像生成PDF.

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

追溯:

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.
Run Code Online (Sandbox Code Playgroud)

第二种方法:

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()
Run Code Online (Sandbox Code Playgroud)

追溯:

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.
Run Code Online (Sandbox Code Playgroud)

所以它似乎与代码无关.

我在服务器上运行python:

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

枕头版:Pillow-3.2.0-py2.6-linux-x86_64.egg

reportlab的版本:reportlab-2.7-py2.6-linux-x86_64.egg

我没有成功搜索这个特殊错误,我该怎么做才能解决这个问题?

fil*_*ton 5

从回溯中,您可以看到reportlab正在调用tostring()方法,该方法已被Pillow 中的提交弃用.

因此,如果将Pillow降级到3.1版,您的代码可能会有效.

但是,您的版本的reportlab已经过时,因为您拥有版本2.7并且版本3.3已发布.我没试过,但我想他们已经解决了这个问题,至少,值得一试!

reportlab的最新版本与Python 2.6不兼容,但你应该至少升级到Python 2.7,甚至升级到Python 3 :)

  • 关于版本,抱歉错误,但2.9而不是3.1应该是好的(你应该有一个警告,但没有例外).关于升级Python,你是对的:如果你不能访问pip,你将不得不重新安装所有模块.我说仍然值得花时间升级,因为Python 2.6变得很旧;) (2认同)

rap*_*pto 5

我已经能够继续通过猴子修补枕头。不要在家里这样做:

from PIL import Image
# Bad hack
Image.Image.tostring = Image.Image.tobytes
Run Code Online (Sandbox Code Playgroud)