2013-08-07 50 views
5

私の主な目標は、ページ上のすべてのイメージフローラベルをクリック可能なリンクであるかのように動作させることです。これを行うために、私はcanvas.linkRect()を作成し、それをレンダリングされたImageの上に置きます。ここで私はcanvas.linkRect()の使用方法の例です:BaseDocTemplateクラスで見た後ReportLab.platypusを使用してFlowableの座標位置をレンダリングしても、その位置を取得することはできますか?

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 
) 

が、私はafterFlowable(自己流動性)と呼ばれる方法を見つけました。 )

['__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と:私は、メソッドと呼ばれるDIR()は、この結果として、渡された流動性の上ですることをオーバーライドy2はあるはずです)、フロー可能な場所についての情報はありません(x1とy1はどうなりますか?)。

他のすべてが失敗した場合、FrameにはlinkRect()を作成する情報があるため、何らかの形でFrameとImage Flowableをペアにすることを考えました。しかし、フレームのリストをいつ、どのように注文するかは、Flowableのそれぞれのリストで把握するのが面倒であるように思えます。これを達成する別の方法がありますか、それは不可能ですか?

ありがとうございます!

答えて

8

今日この1日中作業した後、私はついにこれを行う良い方法を考え出しました!ここでは、ハイパーリンクされたImage Flowablesのこの機能をPDFで利用したいと考えている他の誰かのために私がどのようにしたのかを説明します。

reportlab.platypus.flowablesは、が継承するFlowableというクラスを基本的に持ちます。 FlowableにはdrawOn(self, canvas, x, y, _sW=0)というメソッドがあり、これをHyperlinkedImageという新しいクラスでオーバーライドしました。代わりにあなたの画像の流動性などreportlab.platypus.Imageを作成する

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) 

は今、代わりに新しいHyperlinkedImageを使用:)

関連する問題