2010-02-09 11 views
9

PIL ve reportlab ile anlamayacağım bir sorunla karşılaştım. Özellikle, bir PIL Image nesnesini kullanarak rapor dosyasında bir tuval üzerine drawImage kullanmak istiyorum. Ben ham verileri kullanarak web'den reportlab belgeler içine görüntüleri ekledikten Geçmişte ReportLab ve Python Görüntüleme Kitaplıktan hafıza görüntüleri sorunu

, StringIO ve reportlab en ImageReader sınıfı. Ne yazık ki, ImageReader bir dosya adı veya nesne gibi bir dosya tamponu alır.

nihai amaç reportlab PDF QR kodları, (PIL nesneleri olan) koymak mümkün olmaktır. İş yapan bir şey şu şekildedir:

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() 
Bu, görüntüyü kaydeder ve daha sonra pdf'ye okur. Açıkçası bunu böyle yapmak mantıklı değil.

çabalarım son sürümü (2.4) ile ilgili cevaplar bulmasını sağlar ReportLab nispeten uzun geliştirme tarihinin daha da ağırlaşmaktadır. Yardım için

teşekkürler.

Reportlab 2.4 için kaynak baktığımızda

cevap

4

Çalışmak gibi gözükse de, gerçekten işe yaramıyor. Sonunda sorunu takip edebildim ve _isPILImage() fonksiyonundaydı. Sorun şu ki, "Image.Image" aslında "PIL içe aktarma görüntüsünden" iken, nesnem aslında sadece Image'den. Onların aynı olduklarını varsayıyordum, ama her durumda dayanaksızlık onları aynı şekilde değerlendirmiyor. Benim kesmek çözüm _isPILImage (fileName) değiştirmekti: ... benim hata çözer

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 

için. Beni doğru yönde işaret ettiğinden beri, bunu bir yorum olarak göndermeye çalıştım, sonra cevabını kabul ettim, ama yeterli karaktere sahip olmadı.

Giriş için teşekkürler! Bunu düzeltmek için daha zarif bir yol düşünebilirseniz ... (PIL Image nesnesinde Image.Image nesnesini sarmaya çalıştım) bana haber verin! ,

+1

Bu arada, yukarıdaki işlev raporlab içinde lib/utils.py dizinindedir. – philipk

+3

+1 iyi yakalama. PIL modülünü PIL klasörüne site yolundan ayırmak PIL klasörünü sorgulanabilir bir karardır, ancak ReportLab buna güvenerek daha kötü bir hata yapar. Sadece Görüntüyü içe aktarıyor olmalı. Sorunun etrafından maymun-yamayla çalıştım: kendimi içe aktar ve “reportlab.lib.utils.Image = Image”. – bobince

+0

@bobince burada doğru bir fikir var. ReportLab, PIL konumuyla ilgili gerçekten çok kötü varsayımlar yapar, ancak ReportLab koduyla uğraşmaktan ve dağıtımınızı karmaşıklaştırmaktan 'reportlab.lib.utils.Image = Resim' ile içe aktarma işleminden sonra yama yapmak daha temizdir. – dkamins

2

(Bu arada, 1.1.6 PIL kullanıyorum), ImageReader "dosya adı" gibi bir PIL Görüntü nesnesi kabul olacak gibi görünüyor.


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

Yani 'self.pdf.drawImage (ImageReader (qrcode) çalışmıyor 25, 25, genişlik = 125, yükseklik = 125) 'nin çalışması gerekiyor, argümanların geri kalanının' drawImage 'olması uygun. – MattH

0

dokümantasyon drawImage ve drawInlineImage aynı şekilde çalışır iddia weired ama kutudan çıktığı drawInlineImage çalışır ve drawImage