¿Es posible obtener una posición de coordenadas de Flowable una vez que se haya procesado utilizando ReportLab.platypus?

Mi objective principal es tener todos los Flujos de imagen en una página para que actúen como si fueran enlaces en los que se puede hacer clic. Para hacer esto, crearía un canvas.linkRect () y lo colocaría sobre la imagen renderizada. Aquí hay un ejemplo de cómo uso 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 ) 

Después de buscar en la clase BaseDocTemplate, encontré un método llamado afterFlowable (self, flowable). Anulé ese método y llamé a dir () en el flujo transmitido, lo que resultó en esto:

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

Tiene un atributo de ancho y alto que podría usar para determinar qué tan grande debe ser el linkRect () (qué deberían ser x2 e y2), pero no hay información sobre dónde comienza el flujo (¿qué deberían ser x1 e y1?).

Si todo lo demás falla, pensé en vincular de alguna manera un Marco y una Imagen que puede fluir juntos ya que un Marco tiene la información que quiero para crear un LinkRect (). Sin embargo, parece que sería una molestia saber cuándo y cómo pedir una lista de Marcos con su respectiva lista de Flowables, además de tener que saber exactamente dónde colocar esos Marcos para las imágenes. ¿Hay otra forma de lograr esto o no es posible?

¡Gracias!

Después de trabajar en esto todo el día de hoy, ¡finalmente descubrí una buena manera de hacer esto! Así es como lo hice para cualquier otra persona que quisiera esta característica de los flujos de imágenes con hipervínculos en sus archivos PDF.

Básicamente, reportlab.platypus.flowables tiene una clase llamada Flowable que se hereda la Image . Flowable tiene un método llamado drawOn(self, canvas, x, y, _sW=0) que drawOn(self, canvas, x, y, _sW=0) en una nueva clase que creé llamada 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) 

Ahora, en lugar de crear un reportlab.platypus.Image como su imagen fluida, use el nuevo HyperlinkedImage en su lugar 🙂