2013-10-25 3 views
3

Есть ли способ добавить ссылку href/link к объекту Image Platypus в ReportLab? Я знаю, как добавить ссылку на текст в абзаце, но я не могу найти ничего о добавлении ссылки для изображения.ReportLab Ссылка на изображение

ответ

3

Это может быть легко достигнуто с HyperlinkedImage class предложенной 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) 
0

Вот небольшое обновление, чтобы сделать @ большой ответ работы Meilo с ReportLab 3.3.0. Он фиксирует имя метода _hAlignAdjust и добавляет 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) 
Смежные вопросы