Python Reportlab Page Break

20,610

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

Share:
20,610
Chris Aung
Author by

Chris Aung

Aerospace Student Learning Tkinter & PyQt4

Updated on February 10, 2020

Comments

  • Chris Aung
    Chris Aung over 4 years

    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?