有没有办法在ReportLab中添加一个href / link到Platypus Image对象?我知道如何在段落中添加文本链接,但我似乎无法找到有关为图像添加链接的任何信息。
答案 0 :(得分:4)
这可以通过missmely提出的HyperlinkedImage class轻松实现:
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)
答案 1 :(得分: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)