2014-09-30 15 views
8

quando provo il seguente:Come si utilizza drawImage di reportlab con un URL immagine?

from reportlab.lib.pagesizes import letter 
from reportlab.pdfgen.canvas import Canvas 
import urllib 
import StringIO 
import PIL.Image 

image_file = urllib.urlopen('https://www.google.com/images/srpr/logo11w.png') 
image_string = StringIO.StringIO(image_file.read()) 
logo = PIL.Image.open(image_string) 

canvas = Canvas('output.pdf', pagesize=letter) 
canvas.drawImage(logo, 10, 10) 
canvas.showPage() 
canvas.save() 

ottengo questo errore:

Traceback (most recent call last): 
    File "imagefromurl.py", line 12, in <module> 
    canvas.drawImage(logo, 10, 10) 
    File "/usr/lib/python2.7/dist-packages/reportlab/pdfgen/canvas.py", line 857, in drawImage 
    imgObj = pdfdoc.PDFImageXObject(name, image, mask=mask) 
    File "/usr/lib/python2.7/dist-packages/reportlab/pdfbase/pdfdoc.py", line 2090, in __init__ 
    ext = string.lower(os.path.splitext(source)[1]) 
    File "/usr/lib/python2.7/posixpath.py", line 96, in splitext 
    return genericpath._splitext(p, sep, altsep, extsep) 
    File "/usr/lib/python2.7/genericpath.py", line 91, in _splitext 
    sepIndex = p.rfind(sep) 
    File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 515, in __getattr__ 
    raise AttributeError(name) 

Reportlab è la versione 2.5.

+0

Penso che manchi il resto del traceback ... – MattDMo

+0

inoltre, ['reportlab'] (https://pypi.python.org/pypi/reportlab) è fino alla versione 3.1.8, ed è distribuito come una ruota, così da avere un 'pip' aggiornato dovresti essere in grado di eseguire l'aggiornamento abbastanza facilmente. – MattDMo

+0

@MattDMo: grazie, corretto – ysth

risposta

14

Lo stavo facendo nel modo più duro. Questo funziona (anche aggiunto la maschera necessaria per evitare trasparente diventare nero):

from reportlab.lib.pagesizes import letter 
from reportlab.pdfgen.canvas import Canvas 
from reportlab.lib.utils import ImageReader 

logo = ImageReader('https://www.google.com/images/srpr/logo11w.png') 

canvas = Canvas('output.pdf', pagesize=letter) 
canvas.drawImage(logo, 10, 10, mask='auto') 
canvas.showPage() 
canvas.save() 

Anche se il modo più duro mi avrebbe permesso di rilevare un fallimento per andare a prendere l'url dell'immagine e gestire (ad esempio sostituendo un'immagine locale), e questo no.