reportlab Image to PDF: “please call tobytes()”
我正在尝试用图像生成PDF。
1 2 3 4 5 | im = ImageReader('00001.png') c = canvas.Canvas('networkanalyze.pdf', pagesize=A4) c.drawImage(im, 10, 10, mask='auto') c.showPage() c.save() |
回溯:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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(' identity=%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. |
号
第二种方法:
1 2 3 4 5 6 7 8 9 10 | 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() |
回溯:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 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:
python 2.6.6(r266:84292,2013年11月21日,10:50:32)【GCC 4.4.7 20120313(Red Hat 4.4.7-4)】关于Linux2
枕头版本:bellow-3.2.0-py2.6-linux-x86_64.egg
reportlab版本:reportlab-2.7-py2.6-linux-x86_64.egg
我搜索这个错误没有成功,我能做些什么来解决这个问题?
从回溯中,您可以看到
因此,如果您将枕头降级到3.1版,您的代码可能会工作。
但是,您的ReportLab版本已经过时,因为您拥有2.7版和3.3版。我没试过,但我想他们解决了这个问题,至少值得一试!
reportlab的最新版本与python 2.6不兼容,但您应该至少升级到python 2.7,甚至升级到python 3:。
我可以继续用猴子补枕头。不要在家里这样做:
1 2 3 | from PIL import Image # Bad hack Image.Image.tostring = Image.Image.tobytes |
在Ubuntu14.04上,我用PIP把它降到了枕头2.9.0。只需键入:
1 2 | pip uninstall pillow pip install pillow==2.9.0 |
号
希望对你有用