2013-08-07 5 views
5

Моя основная цель - иметь все изображения на странице, чтобы они действовали так, как если бы они были интерактивными ссылками. Чтобы сделать это, я бы создал canvas.linkRect() и поместил его поверх визуализированного изображения. Вот пример того, как я использую canvas.linkRect():Возможно ли получить координатную позицию Flowable после ее рендеринга с помощью ReportLab.platypus?

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 (я, текучий). Я отменяю этот метод и под названием директорию() на текучем прошли в, в результате чего в этом:

['__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 должно быть), но нет информации о том, где начинается текучесть (какими должны быть x1 и y1?).

Если все остальное не удается, я подумал о том, чтобы каким-то образом связать Frame и Image Flowable вместе, так как Frame имеет информацию, которую я хочу создать linkRect(). Тем не менее, кажется, было бы непросто узнать, когда и как заказать список фреймов с соответствующим списком Flowables, помимо того, что нужно точно знать, где разместить эти фреймы для изображений. Есть ли другой способ достичь этого или это невозможно?

Спасибо!

ответ

8

После работы над этим весь день сегодня, я, наконец, понял хороший способ сделать это! Вот как я сделал это для тех, кто хотел бы эту функцию гиперссылок Image flowables в своих PDF-файлах.

В принципе, reportlab.platypus.flowables имеет класс Flowable, который Image унаследовал от. Flowable имеет метод под названием drawOn(self, canvas, x, y, _sW=0), который я переопределяю в новом классе I, созданном под именем 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 вместо :)