[reportlab-users] Absolute coordinates of rendered flowables?

Dinu Gherman gherman at darwin.in-berlin.de
Tue Mar 4 11:03:24 EST 2008


Robin Becker:


> Dinu flowable drawOn methods are the ones that are passed the x, y.

>

> f.drawOn(canvas,x,y,_sW)

>

> _sW is supposed to be the spare width available for purposes of

> horizontal adjustment ie available - flowable width.

>

> Unfortunately the generic version Flowable.drawOn also handles the

> adjustment of x according to the flowable's hAlign attribute so by

> the time the f._drawOn method gets called the translation to x',y

> may have already occurred.

>

> However, the translation is the very last thing done prior to

> _drawOn being called. So the very last thing on the code stack looks

> like 'a b c d e f cm' where a b c d e f are numeric values

> representing the latest transformation. If canvas.py has

> ENABLE_TRACKING = 1 (which is the default) then canv._currentMatrix

> should hold our estimate of the canvas transformation. Since the

> flowable will be 'drawn' at 0,0 in the that frame of reference you

> should be able to use the inverse transformation to map 0, 0 back to

> the 'absolute' position.


I know about drawOn methods, but I'm not sure if they solve my problem.
What want to do is use flowables like the following, which draw some-
thing at absolute coordinates on the page while not consuming any space
in the story themselves:

class AbsoluteRect(Flowable):
"""A rectangle given in absolute canvas coordinates.

Use in a Platypus story like this: AbsoluteRect((x, y, w, h))
(This is mostly like XBox, but with absolute coordinates.)
"""

def __init__(self, rect):
Flowable.__init__(self)
self.width = 0
self.height = 0
self.rect = rect

def __repr__(self):
return "AbsoluteRect(x=%s, y=%s, w=%s, h=%s)" % self.rect

def draw(self):
x, y, w, h = self.rect
self.canv.rect(x, y, w, h)
self.canv.line(x, y, x+w, y+h)
self.canv.line(x, y+h, x+w, y)

Regards,

Dinu


More information about the reportlab-users mailing list