Ejemplo n.º 1
0
class Report(object):
    def __init__(self,
                 pdf_file=None,
                 paper_type=None,
                 time_zone=None,
                 left_margin=None,
                 top_margin=None,
                 right_margin=None,
                 bottom_margin=None,
                 date_flag=None,
                 flag_footer=None,
                 logo=None,
                 logo_filename=None,
                 logo_width=None,
                 logo_height=None,
                 logo_top_margin=None):

        self.pdf_file = pdf_file
        self.title = ''
        self.author = 'Manexware S.A.'
        self.department = 'OpenEduNav'
        self.date_flag = date_flag
        self.logo = logo
        self.logo_filename = logo_filename
        self.logo_width = logo_width
        self.logo_height = logo_height
        self.flag_footer = flag_footer

        if time_zone:
            local_tz = pytz.timezone(time_zone)
        else:
            local_tz = pytz.timezone('America/Guayaquil')
        utc_dt = datetime.datetime.utcnow()
        local_dt = utc_dt.replace(tzinfo=pytz.utc).astimezone(local_tz)
        date_time = local_tz.normalize(local_dt)

        if paper_type:
            self.page_width, self.page_height = paper_type
        else:
            self.page_width, self.page_height = paper.A4_LANDSCAPE

        if left_margin is not None:
            self.left_margin = left_margin
        else:
            self.left_margin = 50

        if top_margin is not None:
            self.top_margin = top_margin
        else:
            self.top_margin = 40

        if right_margin is not None:
            self.right_margin = right_margin
        else:
            self.right_margin = 50

        if bottom_margin is not None:
            self.bottom_margin = bottom_margin
        else:
            self.bottom_margin = 40
        if logo_top_margin is not None:
            self.logo_top_margin = logo_top_margin
        else:
            self.logo_top_margin = 70

        # Metrics
        self._top_edge = self.page_height - 1
        self._right_edge = self.page_width - 1
        self._bottom_edge = 0
        self._left_edge = 0
        self._working_width = self.page_width - (self.right_margin +
                                                 self.left_margin)
        self._working_height = self.page_height - (self.top_margin +
                                                   self.bottom_margin)

        # Create the ReportLab Canvas
        self.canvas = Canvas(self.pdf_file,
                             pagesize=(self.page_width, self.page_height))

        # Create the page header
        self.header = Field()
        # self.header.box.bottom_border = 2
        # self.header.box.line_cap = 1
        # self.header.box.border_color = (.6,.6,.6)
        self.header.style.vertical_padding = 6
        self.header.style.bold = True
        self.header.style.size = 10
        # self.header.style.color = (.6,.6,.6)
        self.header.style.horizontal_alignment = alignment.RIGHT
        self.header.width = self._working_width

        # Create the page footer
        self.footer = Field()
        self.footer.box.top_border = 1
        self.footer.box.line_cap = 1
        # self.footer.box.border_color = (.6,.6,.6)
        self.footer.style.horizontal_alignment = alignment.CENTER
        self.footer.style.vertical_alignment = alignment.TOP
        # self.footer.style.color = (.6,.6,.6)
        self.footer.width = self._working_width
        self.footer.style.size = 8

        # Create the date label
        self.date = Field(date_time)
        self.date.format = format_report_date
        self.date.style.vertical_alignment = alignment.TOP
        # self.date.style.color = (.6,.6,.6)
        # self.date.style.horizontal_padding = 0
        self.date.style.size = 9

        # Create the department label
        self.departmentField = Field()
        self.departmentField.style.vertical_alignment = alignment.TOP
        # self.date.style.color = (.6,.6,.6)
        # self.date.style.horizontal_padding = 0
        self.departmentField.style.size = 8

        # Create the page number label; 'Page X of'
        self.page_num = Field()
        self.page_num.style.horizontal_alignment = alignment.RIGHT
        self.page_num.style.vertical_alignment = alignment.TOP
        self.page_num.width = self._working_width - 13
        # self.page_num.style.color = (.6,.6,.6)
        self.page_num.horizontal_padding = 0
        self.page_num.style.size = 8

        # Create the last page number label
        self.last_page = Field()
        # self.last_page.style.horizontal_alignment = alignment.LEFT
        self.last_page.style.vertical_alignment = alignment.TOP
        # self.last_page.width = self._working_width
        # self.last_page.style.color = (.6,.6,.6)
        self.last_page.horizontal_padding = 0
        self.last_page.style.size = 8

        # Objects to be drawn
        self.draw_list = []

        self._page_count = 1

    # -----------------------------------------------------------------------Add

    def add(self, item):
        # Add any object that, duck-typingly, has a 'draw_some' method
        self.draw_list.append(item)

    # --------------------------------------------------------------------Create

    def create(self):
        self.canvas.setAuthor(self.author)
        self.canvas.setTitle(self.title)
        self.canvas.setSubject('Python Generated Report')
        self._draw_header()
        if self.flag_footer:
            self._draw_footer()
        vspace = self._working_height
        left = self.left_margin
        right = self.page_width - self.right_margin

        if self.logo:
            self._draw_logo()
            vspace = self._working_height - self.logo_height

        for item in self.draw_list:

            while True:

                if vspace < 1:
                    self._start_new_page()
                    if self.logo:
                        vspace = self._working_height - self.logo_height
                    else:
                        vspace = self._working_height

                yoff = self.bottom_margin + vspace
                used = item.draw_some(self.canvas, left, right, yoff, vspace)

                if used == 0:
                    break

                else:
                    vspace -= used

        # Add the numbering for last page
        # We have to do this as a PDF 'Form' object since we don't know in
        # advance how many pages there will be.
        self.canvas.beginForm('last_page')
        self.canvas.saveState()
        self.last_page.value = '%d' % self._page_count
        self.last_page.draw(self.canvas,
                            self._right_edge - (self.right_margin + 14),
                            self.bottom_margin * .65)
        self.canvas.restoreState()
        self.canvas.endForm()

        # Close the PDF
        self.canvas.save()

    # ----------------------------------------------------------------Start Page

    def _start_new_page(self):
        self._page_count += 1
        self.canvas.showPage()
        # self.canvas.doForm('page %s' % self._page_count)
        self._draw_header()
        if self.flag_footer:
            self._draw_footer()
        if self.logo:
            self._draw_logo()

    # ---------------------------------------------------------------Draw Header

    def _draw_header(self):
        self.header.value = self.title
        self.header.draw(self.canvas, self.left_margin,
                         self._top_edge - (self.top_margin * .65))
        if self.date_flag:
            self.date.draw(self.canvas, self._right_edge - 200,
                           self._top_edge - (self.top_margin * .65))

    # ---------------------------------------------------------------Draw Logo

    def _draw_logo(self):
        if self.logo:
            x = ((self.page_width - self.logo_width) / 2)
            y = self._top_edge - self.logo_top_margin
            self.canvas.drawImage(self.logo_filename, x, y, self.logo_width,
                                  self.logo_height)

    # ---------------------------------------------------------------Draw Footer

    def _draw_footer(self):
        self.footer.value = self.author
        self.footer.draw(self.canvas, self.left_margin,
                         self.bottom_margin * .65)
        self.departmentField.value = self.department
        self.departmentField.draw(self.canvas, self.left_margin,
                                  self.bottom_margin * .65)
        self.page_num.value = 'Página No. %d de ' % self._page_count
        self.page_num.draw(self.canvas, self.left_margin,
                           self.bottom_margin * .65)
        self.canvas.doForm('last_page')
Ejemplo n.º 2
0
class Report(object):

    def __init__(self, pdf_file=None):

        self.pdf_file = pdf_file
        self.title = 'Untitled Report'
        self.author = 'Podunk'
        self.page_width, self.page_height = paper.LETTER_PORTRAIT

        self.left_margin = 54
        self.top_margin = 72
        self.right_margin = 54
        self.bottom_margin = 72
 
        ## Metrics        
        self._top_edge = self.page_height - 1
        self._right_edge = self.page_width - 1
        self._bottom_edge = 0
        self._left_edge = 0
        self._working_width = self.page_width - (
            self.right_margin + self.left_margin )
        self._working_height = self.page_height - (
            self.top_margin + self.bottom_margin )
         
        ## Create the ReportLab Canvas
        self.canvas = Canvas(self.pdf_file, pagesize = (self.page_width,
            self.page_height))

        ## Create the page header
        self.header = Field()
        self.header.box.bottom_border = 2
        self.header.box.line_cap = 1
        #self.header.box.border_color = (.6,.6,.6)        
        self.header.style.vertical_padding = 6
        self.header.style.bold = True
        self.header.style.size = 10
        #self.header.style.color = (.6,.6,.6)
        self.header.style.horizontal_alignment = alignment.RIGHT
        self.header.width = self._working_width

        ## Create the page footer
        self.footer = Field()
        self.footer.box.top_border = 1
        self.footer.box.line_cap = 1
        #self.footer.box.border_color = (.6,.6,.6)
        self.footer.style.horizontal_alignment = alignment.CENTER
        self.footer.style.vertical_alignment = alignment.TOP
        #self.footer.style.color = (.6,.6,.6)   
        self.footer.width = self._working_width
        self.footer.style.size = 8

        ## Create the date label
        self.date = Field(datetime.datetime.today())
        self.date.format = format_report_date
        self.date.style.vertical_alignment = alignment.TOP
        #self.date.style.color = (.6,.6,.6)
        #self.date.style.horizontal_padding = 0
        self.date.style.size = 8

        ## Create the page number label; 'Page X of'
        self.page_num = Field()
        self.page_num.style.horizontal_alignment = alignment.RIGHT
        self.page_num.style.vertical_alignment = alignment.TOP
        self.page_num.width = self._working_width - 13
        #self.page_num.style.color = (.6,.6,.6)
        self.page_num.horizontal_padding = 0
        self.page_num.style.size = 8

        ## Create the last page number label
        self.last_page = Field()
        #self.last_page.style.horizontal_alignment = alignment.LEFT
        self.last_page.style.vertical_alignment = alignment.TOP
        #self.last_page.width = self._working_width
        #self.last_page.style.color = (.6,.6,.6)
        self.last_page.horizontal_padding = 0
        self.last_page.style.size = 8

        ## Objects to be drawn
        self.draw_list = []

        self._page_count = 1

    #-----------------------------------------------------------------------Add

    def add(self, item):
        ## Add any object that, duck-typingly, has a 'draw_some' method
        self.draw_list.append(item)

    #--------------------------------------------------------------------Create

    def create(self):
        self.canvas.setAuthor(self.author)
        self.canvas.setTitle(self.title)
        self.canvas.setSubject('Python Generated Report')
        self._draw_header()
        self._draw_footer()
        vspace = self._working_height
        left = self.left_margin   
        right = self.page_width - self.right_margin

        for item in self.draw_list:
           
            while True:

                if vspace < 1:
                    self._start_new_page()
                    vspace = self._working_height  

                yoff = self.bottom_margin + vspace
                used = item.draw_some(self.canvas, left, right, yoff, vspace)
                
                if used == 0:
                    break

                else:
                    vspace -= used

        ## Add the numbering for last page
        ## We have to do this as a PDF 'Form' object since we don't know in
        ## advance how many pages there will be.
        self.canvas.beginForm('last_page')
        self.canvas.saveState()
        self.last_page.value = '%d' % self._page_count
        self.last_page.draw(self.canvas, 
            self._right_edge - ( self.right_margin + 14),
            self.bottom_margin * .65)
        self.canvas.restoreState()
        self.canvas.endForm()

        ## Close the PDF
        self.canvas.save()

    #----------------------------------------------------------------Start Page

    def _start_new_page(self):
        self._page_count += 1
        self.canvas.showPage()
        self._draw_header()
        self._draw_footer()

    #---------------------------------------------------------------Draw Header

    def _draw_header(self):
        self.header.value = self.title
        self.header.draw(self.canvas, self.left_margin, self._top_edge - 
            (self.top_margin * .65) )

    #---------------------------------------------------------------Draw Footer

    def _draw_footer(self):
        self.footer.value = self.author
        self.footer.draw(self.canvas, self.left_margin, 
            self.bottom_margin * .65)
        self.date.draw(self.canvas, self.left_margin,
            self.bottom_margin * .65)
        self.page_num.value = 'Page %d of ' % self._page_count
        self.page_num.draw(self.canvas, self.left_margin,
            self.bottom_margin * .65)
        self.canvas.doForm('last_page')