[reportlab-users] SimpleDocTemplate & Canvas Access

Robin Becker reportlab-users@reportlab.com
Wed, 14 Apr 2004 18:00:59 +0100


Schollnick, Benjamin wrote:

> Folks,
> 
> 	I just realized that I don't have canvas access when using the
> SimpleDocTemplate? Or am I confused?
> 
> 	Let me elaborate...  I wish to make a "CheckBox", while using the
> Platypus / SimpleDocTemplate usage of Reportlab.  The easiest way to make a
> checkbox, appears to be simply to make a Rectangle using Rect.
> 
> 	This is a manual example, but is the same basic structure of my
> application.
> 
> from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer
> from reportlab.lib.styles import getSampleStyleSheet
> from reportlab.rl_config import defaultPageSize
> from reportlab.lib.units import inch
> 
> PAGE_HEIGHT=defaultPageSize[1]; PAGE_WIDTH=defaultPageSize[0]
> styles = getSampleStyleSheet()
> 
> Title = "Hello world"
> pageinfo = "platypus example"
> 
> def myFirstPage(canvas, doc):
> 	canvas.saveState()
> 	canvas.setFont('Times-Bold',16)
> 	canvas.drawCentredString(PAGE_WIDTH/2.0, PAGE_HEIGHT-108, Title)
> 	canvas.setFont('Times-Roman',9)
> 	canvas.drawString(inch, 0.75 * inch, "First Page / %s" % pageinfo)
> 	canvas.restoreState()
> 
> def myLaterPages(canvas, doc):
> 	canvas.saveState()
> 	canvas.setFont('Times-Roman',9)
> 	canvas.drawString(inch, 0.75 * inch, "Page %d %s" % (doc.page,
> pageinfo))
> 	canvas.restoreState()
> 
> def go():
> 	doc = SimpleDocTemplate("phello.pdf")
> 	Story = [Spacer(1,2*inch)]
> 	style = styles["Normal"]
> 	for i in range(100):
> 		bogustext = ("This is Paragraph number %s. " % i) *20
> 		p = Paragraph(bogustext, style)
> 		Story.append(p)
> 	
> 	Story.append(Spacer(1,0.2*inch))
> 	doc.build(Story, onFirstPage=myFirstPage, onLaterPages=myLaterPages)
> 
> For the check box code, I am planning on using:
> 
>        canvas.rect (x, y, x2, y2, stroke=1) where of course the coords would
> be set.
> 
> But where/when is the canvas actually available outside of the
> myFirstPage/myLaterPages?
> I did not see anything mentioned in the docs regarding the canvas
> availablity...
> 
> I am assuming that the doc.build process actually creates the canvas, so
> I'll have to add the check boxes to the myFirstPages/myLaterPages, but I am
> not sure if that would be usable
> due to the fact that I need the boxes to line up with text that is not
> defined.
> 
> (The text will be read in from a control file, which could be a "infinite"
> number of lines...  So getting the two to line up could be difficult.
> 
> Any suggestions?
> 
> 			- Benjamin

The platypus layout stuff uses flowables. Packers normally set the 
attribute canv onto each flowable when it is being wrapped, split or 
drawn ie around the wrap, split and draw methods. Inside those methods 
you have access to the canvas using the canv attribute of self.

-- 
Robin Becker