Is it possible to get a Flowable's coordinate position once it's rendered using ReportLab.platypus?

后端 未结 1 723
一向
一向 2021-01-02 23:22

My main goal is to have all the Image flowables on a page to act as though they are clickable links. In order to do this, I would create a canvas.linkRect() and place it ove

相关标签:
1条回答
  • 2021-01-03 00:04

    After working on this all day today, I finally figured out a nice way to do this! Here's how I did it for anyone else who would like this feature of hyperlinked Image flowables in their PDFs.

    Basically, reportlab.platypus.flowables has a class called Flowable that Image inherits from. Flowable has a method called drawOn(self, canvas, x, y, _sW=0) that I override in a new class I created called HyperlinkedImage.

    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)
    

    Now instead of creating a reportlab.platypus.Image as your image flowable, use the new HyperlinkedImage instead :)

    0 讨论(0)
提交回复
热议问题