2013-08-07 5 views
5

Mein Hauptziel ist es, alle Bild-Flowables auf einer Seite so zu gestalten, als handle es sich um anklickbare Links. Um dies zu tun, würde ich ein canvas.linkRect() erstellen und es über das gerenderte Bild platzieren. Hier ist ein Beispiel dafür, wie ich canvas.linkRect():Ist es möglich, die Koordinatenposition eines Flowables zu erhalten, nachdem es mit ReportLab.platypus gerendert wurde?

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 
) 

Nachdem er in der BaseDocTemplate Klasse suchen, habe ich eine Methode gefunden genannt afterFlowable (self, fließfähig). Ich overrode diese Methode und nannte dir() auf dem fließfähigen gebenen, in dieser resultierenden:

['__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'] 

Es hat eine Breite und Höhe Attribut ich verwenden, um bestimmen könnte, wie groß die linkRect() sein sollte (was für x2 und y2 sollte), aber keine Informationen darüber, wo die fließfähige beginnt (was sollte x1 und y1 sein?).

Wenn alles andere fehlschlägt, habe ich mir überlegt, irgendwie einen Frame und ein Image Flowable miteinander zu paaren, da ein Frame die Information hat, dass ich eine linkRect() erstellen möchte. Wie auch immer, es scheint mühsam zu wissen, wann und wie man eine Liste von Frames mit der entsprechenden Liste von Flowables bestellt, zusätzlich dazu, genau wissen zu müssen, wo diese Frames für Bilder zu platzieren sind. Gibt es einen anderen Weg dies zu erreichen oder ist es nicht möglich?

Danke!

Antwort

8

Nachdem ich heute den ganzen Tag daran gearbeitet habe, habe ich endlich einen guten Weg gefunden, dies zu tun! Hier ist, wie ich es für alle anderen getan habe, die diese Funktion von hyperlinked Image flowables in ihren PDFs mögen.

Grundsätzlich hat reportlab.platypus.flowables eine Klasse namens Flowable, die Image erbt. Flowable hat eine Methode namens drawOn(self, canvas, x, y, _sW=0), die ich in einer neuen Klasse namens HyperlinkedImage überschreiben kann.

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) 

Anstatt nun eine reportlab.platypus.Image als Ihr Bild fließfähig zu schaffen, die neue HyperlinkedImage stattdessen verwenden :)

Verwandte Themen