ReportLab和Python Imaging Library图像来自内存问题

phi*_*ipk 10 python reportlab python-imaging-library

我遇到了一个我无法用PIL和reportlab搞清楚的问题.具体来说,我想在reportlab中使用PIL Image对象在画布上使用drawImage.

在过去,我使用原始数据,StringIO和reportlab的ImageReader类将图像插入到web的reportlab文档中.不幸的是,ImageReader采用文件名或文件缓冲区之类的对象.

最终目标是能够将QR码(即PIL对象)放入reportlab PDF中.有效的一点是:

    size, qrcode = PyQrcodec.encode('http://www.google.com')
    qrcode.save("img.jpeg")
    self.pdf.drawImage(ImageReader("img.jpeg"), 25, 25, width=125, height=125)
    self.pdf.showPage()
Run Code Online (Sandbox Code Playgroud)

这将保存图像,然后将其读入pdf.显然这样做是没有意义的.

reportlab的相对较长的发展历史使我的努力更加复杂,这使得找到与最新版本(2.4)相关的答案.

谢谢您的帮助.

(顺便说一句,我使用的是1.1.6 PIL)

phi*_*ipk 5

虽然看起来确实应该有效,但事实并非如此.我终于能够找到问题,它位于_isPILImage()函数中.问题是"Image.Image"实际上是"来自PIL导入图像",而我的对象实际上只是来自Image.我会假设它们是相同的,但在任何情况下,实例都不会将它们评估为相同.我的黑客解决方案是更改_isPILImage(fileName):... to

519 def _isPILImage(im):
520     import Image as PIL_Image
521     try:
522         return isinstance(im,Image.Image) or isinstance(im, PIL_Image.Image)
523     except ImportError:
524         return 0
Run Code Online (Sandbox Code Playgroud)

这解决了我的错误.既然你指出了我正确的方向我最初试图将其作为评论发布然后接受你的答案,但它不允许足够的字符.

谢谢你的反馈!如果你能想出更优雅的方法来解决这个问题...(我试图将Image.Image对象包装在PIL Image对象中)让我知道!

  • +1好抓.PIL安装程序将PIL模块放在站点路径下的PIL文件夹中是一个值得怀疑的决定,但ReportLab依靠它做出了更糟糕的错误.它应该只是导入图像.我通过外部的猴子修补解决了这个问题:自己导入图像,然后说`reportlab.lib.utils.Image = Image`. (4认同)