2014-05-02 5 views
7

Ich versuche, einen Report mit Reportlab in Python zu generieren.Python Reportlab Seitenumbruch

Mein Ziel ist es, die erste Seite meiner PDF-Datei mit nur einem einfachen Titel und einer Tabelle ohne den eigentlichen Inhalt zu haben. Der eigentliche Inhalt beginnt auf der zweiten Seite.

Nach dem Durchsehen einiger So Posts, fand ich heraus, dass afterPage() Befehl verwendet werden kann, um Seiten zu brechen. So kam ich mit so etwas wie dies oben:

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) 

Aber anstatt alle meine Titel, Tisch und Inhalte werden auf der ersten Seite gezogen und die afterPage() Funktion scheint keine wirklichen Auswirkungen auf meinen Inhalt des Dokuments haben .

Wie kann ich meinen Code ändern, so dass der Inhalt (data in meinem Code) von der zweiten Seite beginnt?

Antwort

13

Sie können hierfür PageBreak() verwenden. Einfach Story.append(PageBreak()) einfügen und von reportlab.platypus importieren.