我的主要目标是让页面上的所有图像可流动,就好像它们是可点击的链接一样。为了做到这一点,我将创建一个canvas.linkRect()并将其放在渲染的Image上。这是我如何使用canvas.linkRect()的一个例子:
canvas.linkURL(
url='url_goes_here',
rect=(x1, y1, x2, y2), #(x1, y1) is the bottom left coordinate of the rectangle, (x2, y2) is the top right
thickness=0, relative=1
)
在查看BaseDocTemplate类之后,我找到了一个名为afterFlowable的方法(self,flowable)。我重写了那个方法并在传入的flowable上调用了dir(),结果是:
['__call__', '__doc__', '__init__', '__module__', '_doctemplateAttr',
'_drawOn', '_fixedHeight', '_fixedWidth', '_frameName', '_hAlignAdjust',
'_showBoundary', '_traceInfo', 'action', 'apply', 'draw', 'drawOn', 'encoding',
'getKeepWithNext', 'getSpaceAfter', 'getSpaceBefore', 'hAlign', 'height',
'identity', 'isIndexing', 'locChanger', 'minWidth', 'split', 'splitOn', 'vAlign',
'width', 'wrap', 'wrapOn', 'wrapped']
它有一个宽度和高度属性我可以用来确定linkRect()应该有多大(x2和y2应该是多少),但是没有关于flowable开始的位置的信息(x1和y1应该是什么?)。
如果所有其他方法都失败了,我想到以某种方式将Frame和Image Flowable配对在一起,因为Frame有我想要创建linkRect()的信息。但是,在知道何时以及如何使用它的各个Flowables列表来排序帧列表似乎是一件麻烦的事情,除了必须确切地知道将这些帧放在图像的哪个位置之外。有没有其他方法可以实现这一目标,还是不可能?
谢谢!
答案 0 :(得分:9)
今天整天工作之后,我终于想出了一个很好的方法来做到这一点!以下是我为其他任何想要在PDF中使用超链接图像流动图功能的人所做的事情。
基本上,reportlab.platypus.flowables
有一个名为Flowable
的类Image
继承自。{1}}。 Flowable有一个名为drawOn(self, canvas, x, y, _sW=0)
的方法,我在我创建的一个名为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)
现在,不要创建一个reportlab.platypus.Image作为您的图像可流动,而是使用新的HyperlinkedImage:)