ReportLab Image Link

¿Hay alguna manera de agregar un href / link a un objeto de Platypus Image en ReportLab? Sé cómo agregar un enlace al texto en un párrafo, pero parece que no puedo encontrar nada sobre cómo agregar un enlace para una imagen.

Esto se puede lograr fácilmente con la clase HyperlinkedImage propuesta por missmely:

 from reportlab.platypus import Image class HyperlinkedImage(Image, object): # The only variable I added to __init__() is hyperlink. I default it to None for the if statement I use later. def __init__(self, filename, hyperlink=None, width=None, height=None, kind='direct', mask='auto', lazy=1): super(HyperlinkedImage, self).__init__(filename, width, height, kind, mask, lazy) self.hyperlink = hyperlink def drawOn(self, canvas, x, y, _sW=0): if self.hyperlink: # If a hyperlink is given, create a canvas.linkURL() x1 = self.hAlignAdjust(x, _sW) # This is basically adjusting the x coordinate according to the alignment given to the flowable (RIGHT, LEFT, CENTER) y1 = y x2 = x1 + self._width y2 = y1 + self._height canvas.linkURL(url=self.hyperlink, rect=(x1, y1, x2, y2), thickness=0, relative=1) super(HyperlinkedImage, self).drawOn(canvas, x, y, _sW) 

Aquí hay una pequeña actualización para hacer que la gran respuesta de @ Meilo funcione con reportlab 3.3.0. _hAlignAdjust nombre del método _hAlignAdjust y agrega hAlign kwarg:

 from reportlab.platypus import Image class HyperlinkedImage(Image, object): """Image with a hyperlink, adopted from http://stackoverflow.com/a/26294527/304209.""" def __init__(self, filename, hyperlink=None, width=None, height=None, kind='direct', mask='auto', lazy=1, hAlign='CENTER'): """The only variable added to __init__() is hyperlink. It defaults to None for the if statement used later. """ super(HyperlinkedImage, self).__init__(filename, width, height, kind, mask, lazy, hAlign=hAlign) self.hyperlink = hyperlink def drawOn(self, canvas, x, y, _sW=0): if self.hyperlink: # If a hyperlink is given, create a canvas.linkURL() # This is basically adjusting the x coordinate according to the alignment # given to the flowable (RIGHT, LEFT, CENTER) x1 = self._hAlignAdjust(x, _sW) y1 = y x2 = x1 + self._width y2 = y1 + self._height canvas.linkURL(url=self.hyperlink, rect=(x1, y1, x2, y2), thickness=0, relative=1) super(HyperlinkedImage, self).drawOn(canvas, x, y, _sW)