10

我遇到了一个我似乎无法用 PIL 和 reportlab 解决的问题。具体来说,我想使用 PIL Image 对象在 reportlab 的画布上使用 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()

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

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

谢谢您的帮助。

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

4

3 回答 3

5

尽管它看起来应该可以工作,但实际上并没有。我终于能够找到问题所在,它在 _isPILImage() 函数中。问题是“Image.Image”实际上是“来自 PIL 导入 Image”,而我的对象实际上只是来自 Image。我会假设它们是相同的,但无论如何 isinstance 不会将它们评估为相同。我的黑客解决方案是将 _isPILImage(fileName): ... 更改为

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

这解决了我的错误。由于您为我指明了正确的方向,因此我最初尝试将此作为评论发布,然后接受您的回答,但它不允许使用足够的字符。

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

于 2010-02-09T16:27:55.420 回答
2

查看 ReportLab 2.4 的源代码,ImageReader 似乎将接受 PIL Image 对象作为“文件名”。


def _isPILImage(im):
    try:
        return isinstance(im,Image.Image)
    except ImportError:
        return 0

class ImageReader(object):
    "Wraps up either PIL or Java to get data from bitmaps"
    _cache={}
    def __init__(self, fileName):
        if isinstance(fileName,ImageReader):
            self.__dict__ = fileName.__dict__   #borgize
            return
        #start wih lots of null private fields, to be populated by
        #the relevant engine.
        self.fileName = fileName
        self._image = None
        self._width = None
        self._height = None
        self._transparent = None
        self._data = None
        if _isPILImage(fileName):
            self._image = fileName
            self.fp = getattr(fileName,'fp',None)
            try:
                self.fileName = self._image.fileName
            except AttributeError:
                self.fileName = 'PILIMAGE_%d' % id(self)
于 2010-02-09T10:38:07.880 回答
0

奇怪的文档声称 drawImage 和 drawInlineImage 以相同的方式工作,但它可以与 drawInlineImage 一起使用,并且不适用于 drawImage

于 2013-09-30T19:49:34.037 回答