Проблемы с изображениями в ReportLab и Python Library из памяти - PullRequest
10 голосов
/ 09 февраля 2010

Я столкнулся с проблемой, которую не могу решить с помощью PIL и reportlab. В частности, я хотел бы использовать drawImage на холсте в reportlab, используя объект PIL Image.

В прошлом я вставлял изображения в документы reportlab из Интернета с использованием необработанных данных, StringIO и класса ImageReader reportlab. К сожалению, ImageReader принимает имя файла или файловый буфер как объект.

Конечная цель состоит в том, чтобы иметь возможность помещать QR-коды (которые являются объектами PIL) в 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)

Ответы [ 3 ]

5 голосов
/ 09 февраля 2010

Хотя это выглядит так, как будто это должно работать, на самом деле это не так. Я наконец смог отследить проблему, и это было в функции _isPILImage (). Проблема в том, что «Image.Image» на самом деле «из PIL import Image», тогда как мой объект на самом деле просто из 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), дайте мне знать!

2 голосов
/ 09 февраля 2010

Глядя на источник ReportLab 2.4, кажется, что ImageReader примет объект изображения PIL как «имя файла».


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)
0 голосов
/ 30 сентября 2013

weired в документации утверждается, что drawImage и drawInlineImage работают одинаково, но работают с drawInlineImage из коробки и не работают в drawImage

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...