我遇到了一个我无法用PIL和reportlab搞清楚的问题。具体来说,我想在reportlab中使用PIL Image对象在画布上使用drawImage。
过去,我使用原始数据,StringIO和reportlab的ImageReader类将图像插入到web的reportlab文档中。不幸的是,ImageReader采用文件名或文件缓冲区,如object。
最终目标是能够将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)
答案 0 :(得分:5)
虽然看起来确实应该有效,但事实并非如此。我终于能够找到问题,它位于_isPILImage()函数中。问题是“Image.Image”实际上是“来自PIL导入图像”而我的对象实际上只是来自Image。我会假设它们是相同的,但在任何情况下,实例都不会将它们评估为相同。我的黑客解决方案是将_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对象中)让我知道!
答案 1 :(得分:2)
查看ReportLab 2.4的来源,似乎ImageReader将接受PIL Image对象作为“filename”。
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)
答案 2 :(得分:0)
weired 文档声称drawImage和drawInlineImage以相同的方式工作,但是它与开箱即用的drawInlineImage一起使用,并且在drawImage中不起作用