Beispiel #1
0
    def __init__(self, name, width=None):

        self.name = name
        self.value_list = []

        if width:
            self.width = width
        else:
            self.width = 72

        self.height = 11

        ## Header
        self.header = Field(name)
        self.header.format = format_title
        self.header.style.bold = True
        self.header.style.color = (1,1,1)
        self.header.style.horizontal_alignment = alignment.CENTER
        #self.header.box.bottom_border = 1
        self.header.box.background_color = (0,0,0)

        ## Row
        self.row = Field()

        ## Footer
        self.footer = Field()
        #self.footer.style.bold = True
        self.footer.box.top_border = 1         
        self.footer.style.horizontal_alignment = alignment.CENTER
        self.footer.value = None
Beispiel #2
0
class Heading(object):

    def __init__(self, value):
    
        self.field = Field(value)
        self.field.style.vertical_padding = 2
        self.field.style.bold = True
        self.field.style.size = 9
        self.field.style.horizontal_alignment = alignment.CENTER
        self.skip = 10
        self._drew_skip = False
        self._drew_title = False

    #-----------------------------------------------------------------Draw Some

    def draw_some(self, canvas, left, right, yoff, vspace):

        if not self._drew_skip:
            height = self.skip
            if height < vspace:
                used = height
            else:
                used = vspace
            self._drew_skip = True


        elif not self._drew_title:
            height = self.field.get_height()
            ## Is there enought room for the title?
            if height < vspace:
                self.field.width = right - left
                self.field.draw(canvas, left, yoff)
                self._drew_title = True
                used = height

            ## If not, force a new page
            else:
                used = vspace
                
        ## We're done            
        else:
            used = 0

        return used
Beispiel #3
0
 def __init__(self, value):
 
     self.field = Field(value)
     self.field.style.vertical_padding = 2
     self.field.style.bold = True
     self.field.style.size = 9
     self.field.style.horizontal_alignment = alignment.CENTER
     self.skip = 10
     self._drew_skip = False
     self._drew_title = False
Beispiel #4
0
#------------------------------------------------------------------------------
#   file:       podunk/prefab/fields.py
#   author:     Jim Storch
#------------------------------------------------------------------------------

from podunk.widget.field import Field
from podunk.prefab.styles import HEADER_STYLE
from podunk.prefab.boxes import HEADER_BOX

## You need to do a copy.copy(FIELD_NAME) in order to use a prefab field in
## multiple spots

HEADER_FIELD = Field()
HEADER_FIELD.style = HEADER_STYLE
HEADER.box = HEADER_BOX
Beispiel #5
0
class Column(object):

    def __init__(self, name, width=None):

        self.name = name
        self.value_list = []

        if width:
            self.width = width
        else:
            self.width = 72

        self.height = 11

        ## Header
        self.header = Field(name)
        self.header.format = format_title
        self.header.style.bold = True
        self.header.style.color = (1,1,1)
        self.header.style.horizontal_alignment = alignment.CENTER
        #self.header.box.bottom_border = 1
        self.header.box.background_color = (0,0,0)

        ## Row
        self.row = Field()

        ## Footer
        self.footer = Field()
        #self.footer.style.bold = True
        self.footer.box.top_border = 1         
        self.footer.style.horizontal_alignment = alignment.CENTER
        self.footer.value = None

    #--------------------------------------------------------------------Append

    def append(self, value):
        self.value_list.append(value)

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

    def draw_header(self, canvas, x, y):
        self.header.width = self.width
        self.header.height = self.height
        self.header.draw(canvas, x, y)

    #------------------------------------------------------------------Draw Row

    def draw_row(self, canvas, x, y, row_number):

        if row_number % 2:
            self.row.box.background_color = (.90,1,.85)
        else:
             self.row.box.background_color = (1,1,1)

        self.row.value = self.value_list[row_number] 
        self.row.width = self.width
        self.row.height = self.height
        self.row.draw(canvas, x, y)

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

    def draw_footer(self, canvas, x, y):
        if self.footer.value != None:
            self.footer.width = self.width
            self.footer.height = self.height
            self.footer.draw(canvas, x, y)

    #----------------------------------------------------------------Find Width
    
    def find_width(self, canvas):
        """
        Return the width of the widest element in this column.
        """
        widths = []
        widths.append(self.header.get_width(canvas))
        widths.append(self.footer.get_width(canvas))
        for value in self.value_list:
            self.row.value = value
            widths.append(self.row.get_width(canvas))
        return max(widths)
    
    #----------------------------------------------------------------Auto Width
    
    def auto_width(self, canvas):
        """
        Set the column width to the widest element found.
        """
        self.width = self.find_width(canvas)
Beispiel #6
0
    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
Beispiel #7
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')