daniel-s
5/18/2017 - 9:17 AM

reportlab simple boilerplate

reportlab simple boilerplate

import reportlab.lib.colors as colors
from reportlab.lib.pagesizes import A4, landscape
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.lib.units import cm, inch
from reportlab.platypus import (Paragraph, SimpleDocTemplate, Spacer, Table,
                                TableStyle)
from reportlab.platypus.flowables import PageBreak
from reportlab.rl_config import defaultPageSize


class SAMPLE_STYLES(object):
    _styles = getSampleStyleSheet()
    Normal = _styles['Normal']
    BodyText = _styles['BodyText']
    Italic = _styles['Italic']
    Heading1 = _styles['Heading1']
    Title = _styles['Title']
    Heading2 = _styles['Heading2']
    Heading3 = _styles['Heading3']
    Heading4 = _styles['Heading4']
    Heading5 = _styles['Heading5']
    Heading6 = _styles['Heading6']
    Bullet = _styles['Bullet']
    Definition = _styles['Definition']
    Code = _styles['Code']
    
    
class PDF(object):

    def __init__(self, filename, orientation='landscape'):
        super(PDF, self).__init__()
        self.filename = filename + '.pdf'
        self.title = filename
        self.pageinfo = filename
        self.story = [Spacer(1, 2 * 2.54 * cm)]
        self.pagesize = landscape(A4) if orientation == 'landscape' else defaultPageSize
        self.PAGE_HEIGHT = self.pagesize[1]
        self.PAGE_WIDTH = self.pagesize[0]
        self.PAGE_MARGIN = 0.5 * inch

    def build(self):
        doc = SimpleDocTemplate(self.filename)
        doc.pagesize = self.pagesize  # Set PDF orientation to landscape
        doc.leftMargin = self.PAGE_MARGIN
        doc.righMargin = self.PAGE_MARGIN
        doc.topMargin = self.PAGE_MARGIN
        doc.bottomMargin = self.PAGE_MARGIN
        doc.build(self.story, onFirstPage=self._first_page, onLaterPages=self._later_pages)

    def add_element(self, element):
        self.story.append(element)

    def add_paragraph(self, text):
        style = SAMPLE_STYLES.Normal
        p = Paragraph(text, style)
        self.story.append(p)
        self.story.append(Spacer(1, 0.2 * 2.54 * cm))

    def add_page_break(self):
        self.story.append(PageBreak())

    def _first_page(self, canvas, doc):
        canvas.saveState()
        canvas.setFont('Times-Bold', 16)
        canvas.drawCentredString(self.PAGE_WIDTH / 2.0, self.PAGE_HEIGHT - 108, self.title)
        canvas.setFont('Times-Roman', 9)
        canvas.drawString(cm, 0.75 * 2.54 * cm, "First Page / %s" % self.pageinfo)
        canvas.restoreState()

    def _later_pages(self, canvas, doc):
        canvas.saveState()
        canvas.setFont('Times-Roman', 9)
        canvas.drawString(self.PAGE_MARGIN * 0.5, self.PAGE_MARGIN * 0.5, "Page %d / %s" % (doc.page, self.pageinfo))
        canvas.restoreState()