Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python Reportlab Page Break

I am trying to generate a pdf report with reportlab in python.

My aim is to have the first page of my pdf file with just a simple title and a table without the actual contents. The actual contents will starts from second page.

After looking through some SO Posts, I found out that afterPage() command can be used to break pages. So, I came up with something like this:

from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer,KeepTogether,tables
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.rl_config import defaultPageSize
from reportlab.lib.pagesizes import A4,landscape
from reportlab.lib.units import inch,cm,mm
from reportlab.pdfgen import canvas

PAGE_HEIGHT = defaultPageSize[1]
PAGE_WIDTH = defaultPageSize[0]
styles = getSampleStyleSheet()
style = styles["Normal"]

def myFirstPage(canvas, doc):
    canvas.saveState()
    canvas.setFont('Times-Bold',15)
    canvas.drawCentredString(PAGE_WIDTH/2.0, PAGE_HEIGHT-38, 'Title 1')
    canvas.drawCentredString(PAGE_WIDTH/2.0, PAGE_HEIGHT-58, 'Title 2')

    NormalStyle = tables.TableStyle([
        ('BOX',(0,0),(-1,-1),0.45,colors.blue),
        ('ALIGN',(0,0),(-1,-1),'LEFT'),
        ('BACKGROUND',(0,0),(-1,-1),colors.lightblue)
        ])

    mytable = tables.Table([('test','test'),('test2','test2'),('test3','test3')],
    colWidths = 1* inch,rowHeights= 0.25 *inch,style = NormalStyle)

    mytable.wrapOn(canvas,PAGE_WIDTH ,PAGE_HEIGHT)
    mytable.drawOn(canvas,(doc.width/2)-20,700)

    doc.afterPage()
    canvas.restoreState()

def myLaterPages(canvas, doc):
    canvas.saveState()
    canvas.setFont('Times-Roman', 9)
    canvas.restoreState()

doc = SimpleDocTemplate("myreport.pdf",
                        leftMargin = 0.75*inch,
                        rightMargin = 0.75*inch,
                        topMargin = 1*inch,
                        bottomMargin = 1*inch)

data = "".join(['this is a test' for i in range(200)])
mydata = Paragraph(data,style)
Story = [Spacer(2.5,0.75*inch)]
Story.append(mydata)

doc.build(Story, onFirstPage=myFirstPage, onLaterPages=myLaterPages)

But instead all my title,table and contents are drawn in the first page and the afterPage() function does not seems to have any real effects on my contents of the document.

How can I change my code so that the contents (data in my code) starts from second page?

like image 621
Chris Aung Avatar asked May 02 '14 07:05

Chris Aung


People also ask

How do I insert a page break in Reportlab?

You can use PageBreak() for this. Just insert Story. append(PageBreak()) and import it from reportlab. platypus .

How do I wrap text in a table cell in Reportlab?

As mentioned, you can use 'VALIGN' to wrap text within the cells, but there is another hack if you want to further control the table elements on the canvas. Now adding two components: rowHeights attribute. _argH for finer editing of the row heights.


1 Answers

You can use PageBreak() for this. Just insert Story.append(PageBreak()) and import it from reportlab.platypus.

like image 134
Fookatchu Avatar answered Oct 06 '22 01:10

Fookatchu