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)

10
demandé sur philipk 2010-02-09 10:41:17

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!

5
répondu philipk 2010-02-09 16:27:55

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)
2
répondu MattH 2010-02-09 10:38:07

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

0
répondu Ohad Cohen 2013-09-30 19:49:34