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?
You can use PageBreak() for this. Just insert Story. append(PageBreak()) and import it from reportlab. platypus .
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.
You can use PageBreak()
for this. Just insert Story.append(PageBreak())
and import it from
reportlab.platypus
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With