7

我的主要目标是让页面上的所有 Image flowables 就像它们是可点击的链接一样。为此,我将创建一个 canvas.linkRect() 并将其放置在渲染的图像上。这是我如何使用 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']

它有一个 width 和 height 属性,我可以用它来确定 linkRect() 应该有多大(x2 和 y2 应该是多少),但没有关于 flowable 开始位置的信息(x1 和 y1 应该是什么?)。

如果一切都失败了,我想以某种方式将 Frame 和 Image Flowable 配对在一起,因为 Frame 具有我想要创建 linkRect() 的信息。但是,除了必须确切知道将这些框架放置在哪里之外,要知道何时以及如何使用其各自的 Flowable 列表来订购框架列表似乎很麻烦。是否有另一种方法可以实现这一目标,还是不可能?

谢谢!

4

1 回答 1

12

经过今天一整天的工作,我终于想出了一个很好的方法来做到这一点!以下是我为其他希望在其 PDF 中使用超链接 Image flowables 功能的其他人所做的。

基本上,reportlab.platypus.flowables有一个继承自的Flowable类。ImageFlowable 有一个名为的方法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 :)

于 2013-08-09T22:33:31.503 回答