Writing your own
Flowables are intended to be an open standard for creating reusable report content, and you can easily create your own objects. We hope that over time we will build up a library of contributions, giving reportlab users a rich selection of charts, graphics and other "report widgets" they can use in their own reports. This section shows you how to create your own flowables.
A very simple
hand function from the
pdfgen section of this user guide which
generated a drawing of a hand as a closed figure composed from Bezier curves.
To embed this or any other drawing in a Platypus flowable we must define a
with at least a
wrap method and a
from reportlab.platypus.flowables import Flowable from reportlab.lib.colors import tan, green class HandAnnotation(Flowable): '''A hand flowable.''' def __init__(self, xoffset=0, size=None, fillcolor=tan, strokecolor=green): from reportlab.lib.units import inch if size is None: size=4*inch self.fillcolor, self.strokecolor = fillcolor, strokecolor self.xoffset = xoffset self.size = size # normal size is 4 inches self.scale = size/(4.0*inch) def wrap(self, *args): return (self.xoffset, self.size) def draw(self): canvas = self.canv canvas.setLineWidth(6) canvas.setFillColor(self.fillcolor) canvas.setStrokeColor(self.strokecolor) canvas.translate(self.xoffset+self.size,0) canvas.rotate(90) canvas.scale(self.scale, self.scale) hand(canvas, debug=0, fill=1)
wrap method must provide the size of the drawing -- it is used by
the Platypus mainloop to decide whether this element fits in the space remaining
on the current frame. The
draw method performs the drawing of the object after
the Platypus mainloop has translated the
(0,0) origin to an appropriate location
in an appropriate frame.
Below are some example uses of the
from reportlab.lib.colors import blue, pink, yellow, cyan, brown from reportlab.lib.units import inch
Just one inch high.
One inch high with blue and cyan.
Modifying a Built in
To modify an existing flowable, you should create a derived class and override the methods you need to change to get the desired behaviour As an example to create a rotated image you need to override the wrap and draw methods of the existing Image class
import os from reportlab.platypus import * I = '../images/replogo.gif' EmbeddedCode(""" class RotatedImage(Image): def wrap(self,availWidth,availHeight): h, w = Image.wrap(self,availHeight,availWidth) return w, h def draw(self): self.canv.rotate(90) Image.draw(self) I = RotatedImage('%s') I.hAlign = 'CENTER' """ % I,'I')