Images de bibliothèques d'imagerie ReportLab et Python issues de la mémoire
j'ai rencontré un problème que je n'arrive pas à résoudre avec PIL et reportlab. Plus précisément, j'aimerais utiliser le dessin sur une toile dans reportlab en utilisant un objet Image PIL.
dans le passé, J'ai inséré des images dans les documents reportlab du web en utilisant des données brutes, la classe de StringIO et reportlab ImageReader. Malheureusement, ImageReader prend un nom de fichier ou un fichier tampon comme objet.
le but ultime est de pouvoir mettre des codes QR, (qui sont des objets PIL) dans le reportlab Pdf. Une chose qui fonctionne est la suivante:
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()
permet de sauvegarder l'image et de la lire dans le pdf. Évidemment le faire comme ce n'est pas logique.
mes efforts sont aggravés par le développement relativement long de reportlab qui rend la recherche des réponses pertinentes à la dernière version (2.4).
Merci pour votre aide.
(En passant, je suis en utilisant 1.1.6 PIL)
3 réponses
bien qu'il semble que cela devrait fonctionner, il ne fonctionne vraiment pas. J'ai finalement réussi à trouver le problème, et c'était dans la fonction _isPILImage (). Le problème est que "l'Image.L'Image" est en fait "de PIL import Image" alors que mon but est en fait tout simplement de l'Image. J'aurais cru qu'ils étaient les mêmes, mais en tout cas isinstance ne pas évaluer comme la même. Ma solution de hack était de changer _isPILImage (nom du fichier):...
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
cela résout mon erreur. Puisque vous pointé moi dans la bonne direction j'ai d'abord essayé de poster ceci comme un commentaire puis accepter votre réponse, mais il ne permet pas assez de caractères.
Merci pour l'entrée! Si vous pouvez penser à une façon plus élégante de corriger cela... (J'ai essayé d'envelopper l'Image.L'Image de l'objet dans une Image de PIL objet) faites le moi savoir!
en regardant la source pour ReportLab 2.4, Il semble que ImageReader acceptera un objet Image PIL comme "nom de fichier".
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)
weired la documentation affirme que drawImage et drawInlineImage fonctionnent de la même manière, mais cela fonctionne avec drawInlineImage hors de la boîte, et ne fonctionne pas avec drawImage