2014-05-02 15 views
7

Sto provando a generare un report in pdf con reportlab in python.Python Reportlab Page Break

Il mio obiettivo è quello di avere la prima pagina del mio file pdf con un semplice titolo e una tabella senza i contenuti effettivi. I contenuti effettivi inizieranno dalla seconda pagina.

Dopo aver consultato alcuni post SO, ho scoperto che il comando afterPage() può essere utilizzato per interrompere le pagine. Quindi, mi si avvicinò con qualcosa di simile:

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) 

Ma invece tutto il mio titolo, tavolo e contenuti sono disegnati in prima pagina e la funzione afterPage() non sembra avere alcun effetto reale sui miei contenuti del documento .

Come posso modificare il mio codice in modo che il contenuto (data nel mio codice) inizi dalla seconda pagina?

risposta

13

Per questo è possibile utilizzare PageBreak(). Basta inserire Story.append(PageBreak()) e importarlo da reportlab.platypus.