I've been doing alot of work with reportlab
recently and a problem that I ran into was creating a pdf with page numbers in the form of page x of y
. After some digging around I found some posts about people talking about using forms to store the page number and referencing those on each page. However I couldn't find a working example and since I didn't have any experience with reportlab forms it took a while to finally get it working how I wanted. Anyways, I thought I'd post my findings as they might be useful to someone else trying to do the same.
Basicly I started by using an example I found in the reportlab user mailing lists to create a flowable which I append to the document at the very end. This creates the form and draws the last page number.
def __init__(self, xoffset = 0, yoffset = 0):
self._xoffset = xoffset
self._yoffset = yoffset
canvas = self.canv
if not canvas.hasForm("lastPageNumber"):
canvas.drawString(PAGE_WIDTH - 2.2 * cm, 2 * cm, "%d" % (doc.page, ))
doc.build(Story, onFirstPage=myFirstPage, onLaterPages=myLaterPages)
Then in the myLaterPages function I call doForm which writes the last page number on the page, and I also write the Page x of
string just before it.
def myLaterPages(canvas, doc):
canvas.drawRightString(PAGE_WIDTH - 2.3 * cm, 2 * cm, "Page %d of" % (doc.page, ))
And I include the same thing in the myFirstPage function as well. This produces a Page x of y string on each page which also formats well enough due to the way the strings get drawn left and right of a specific point (it expands properly with more than single digit page numbers).
I've created a working example which you can download. Run it and provide a filename and it will create a pdf with page x of y page numbers.
posted at: 12:59 | path: /general | permanent link to this entry