10

PIL と reportlab では理解できない問題に遭遇しました。具体的には、PIL Image オブジェクトを使用して reportlab のキャンバスで drawImage を使用したいと考えています。

過去に、生データ、StringIO、および reportlab の ImageReader クラスを使用して、web から reportlab ドキュメントに画像を挿入しました。残念ながら、ImageReader はファイル名またはファイル バッファのようなオブジェクトを取ります。

最終的な目標は、QR コード (PIL オブジェクト) を reportlab PDF に挿入できるようにすることです。機能することの1つは次のとおりです。

    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 に読み込まれます。当然、こんなことをしても意味がありません。

私の努力は、最新バージョン (2.4) に関連する答えを見つけるために、reportlab の比較的長い開発履歴によって複雑になります。

助けてくれてありがとう。

(ちなみに、私は1.1.6 PILを使用しています)

4

3 に答える 3

5

機能するように見えますが、実際には機能しません。私は最終的に問題を追跡することができました.それは _isPILImage() 関数にありました. 問題は、「Image.Image」が実際には「from PIL import 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 に答える