ReportLab Image Link

后端 未结 2 520
傲寒
傲寒 2021-01-05 16:41

Is there a way to add an href/link to a Platypus Image object in ReportLab? I know how to add a link on text in a Paragraph but I can\'t seem to find anything about adding a

相关标签:
2条回答
  • 2021-01-05 17:12

    This can be easily achieved with the HyperlinkedImage class proposed by 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 讨论(0)
  • 2021-01-05 17:12

    Here is a small update to make @Meilo's great answer work with reportlab 3.3.0. It fixes _hAlignAdjust method name and adds 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)
    
    0 讨论(0)
提交回复
热议问题