svv/pdf.py
author Tero Marttila <terom@fixme.fi>
Thu, 23 Dec 2010 19:56:44 +0200
changeset 15 e098ee83b363
parent 4 b3a1ab44f517
child 17 820c46308e45
permissions -rw-r--r--
Implement OrderContractDocument
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
# coding: utf-8
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
"""
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
    PDF output
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
"""
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
from reportlab import platypus as rlpp
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
from reportlab.lib.units import inch
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
from reportlab.lib import pagesizes, styles
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
from cStringIO import StringIO
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
import itertools
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
import logging
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
import datetime
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
log = logging.getLogger('svv.pdf')
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
class Styles (object) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
    """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
        Simple stylesheet
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
    """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
    samplestyles = styles.getSampleStyleSheet()
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
    # normal text
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
    h1 = styles.ParagraphStyle('Heading1', samplestyles['h1'],
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
            fontName        = 'Times-Bold',
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
            fontSize        = 22,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
            spaceBefore     = 0,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
            spaceAfter      = 0,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
    )
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
    h2 = styles.ParagraphStyle('Heading2', samplestyles['h2'],
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
            fontName        = 'Times-Bold',
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
            fontSize        = 14,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
            spaceBefore     = 6,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
            spaceAfter      = 0,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
    )
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
    
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
    h3 = styles.ParagraphStyle('Heading3', samplestyles['h3'],
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
            fontName        = 'Times-Italic',
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
            fontSize        = 12,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
            spaceBefore     = 0,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
            spaceAfter      = 0,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
    )
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
    text = styles.ParagraphStyle('Text', samplestyles['Normal'],
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
    )
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
    # list indent level
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
    list_indent = inch / 4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
    # root title
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
    list_h1 = styles.ParagraphStyle('ListHeading1', samplestyles['h1'],
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
            bulletIndent    = 0,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
            leftIndent      = 0,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
    )
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
    # section
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
    list_h2 = styles.ParagraphStyle('ListHeading2', samplestyles['h2'],
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
            bulletIndent    = 0,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
            leftIndent      = list_indent,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
            fontName        = 'Times-Bold',
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
            fontSize        = 10,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
            leading         = 12,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
            spaceBefore     = 6,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
            spaceAfter      = 0,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
    )
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
    
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
    # segment
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
    list_h3 = styles.ParagraphStyle('ListHeading3', samplestyles['h3'],
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
            bulletIndent    = 0,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
            leftIndent      = list_indent,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
            fontName        = 'Times-Italic',
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
            fontSize        = 10,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
            leading         = 12,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
            spaceBefore     = 0,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
            spaceAfter      = 0,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
    )
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
    
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
    # infot
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
    list_text = styles.ParagraphStyle('ListText', samplestyles['Normal'],
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
            bulletIndent    = 0,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
            leftIndent      = list_indent,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
    )
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
class ListItem (object) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
    """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
        Indented/nested list
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
    """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
    @classmethod
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
    def seq (cls) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
            List numbering.
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
            Fixed as numeric only for now
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
        
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
        for idx in itertools.count(1) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
            yield "%d." % (idx, )
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
    def __init__ (self, title, title_style, text, subseq=None, sublist=None, 
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
            text_style=Styles.list_text, indent=Styles.list_indent) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
                title       - title to display as first line
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
                title_style - paragraph style for title line
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
                text        - multi-line texto to display on first or previous lines
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
                subseq      - sequence of bullet-texts to use for items in sublist
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
                sublist     - sequence of sub-nodes
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
                text_style  - paragraph style for text lines
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
                indent      - indentation for text and sub-lists
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
        self.title = title
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
        self.title_style = title_style
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
        self.text = text
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
        self.subseq = subseq
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
        self.sublist = sublist
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
        self.text_style = text_style
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
        self.indent = indent
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130
    def render_pdf (self, bullet=None) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
            Yield a series of PDF flowables for this list node and sub-nodes, useable for pdf.DocTemplateBase.build()
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
                bullet      - bullet text to use for this item's paragraph
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
        # first line, with possible bullet
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
        if self.title :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
            yield rlpp.Paragraph(self.title, self.title_style, bullet)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
        elif self.text :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
            yield rlpp.Paragraph(self.text, self.text_style, bullet)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
        # indented text after title
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
        if self.title and self.text :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
            yield rlpp.Paragraph(self.text, self.text_style)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
        if self.sublist :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
            # following lines, indented
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
            yield rlpp.Indenter(self.indent)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
            # sub-items
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
            for item in self.sublist :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
                # get (optional) bullet for item
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
                bullet = next(self.subseq, None) if self.subseq else None
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
                # render item as series of elements
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
                for element in item.render_pdf(bullet) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
                    yield element
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
            # de-dent
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
            yield rlpp.Indenter(-self.indent)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
    
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
class SignatureBlock (rlpp.Flowable) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
    """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
        A signature block, with multiple sets of multiple pre-fillied fields.
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   169
    """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
    # vertical space per field
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
    FIELD_HEIGHT = 2 * inch / 4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   173
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   174
    # horizontal offset from top of field to field line
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
    FIELD_OFFSET = FIELD_HEIGHT / 2
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
    
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   177
    # maximum width to scale columns to
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
    COL_WIDTH_MAX = 4 * inch
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
    
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   180
    # empty space to leave below the fields
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   181
    PADDING_BOTTOM = inch / 2
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   182
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   183
    def __init__ (self, cols, fields, values) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   184
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   185
            cols    - Column titles
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   186
            fields  - Fields titles, describing the horizontal fields
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   187
            values  - Pre-filled values as a {(col, field): value} dict
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   189
            desc/value strings can contain formatting codes:
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   191
                column      - title of the current column
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   192
                today       - today's date in %d/%m/%Y format
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   193
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   194
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   195
        self.cols = cols
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   196
        self.fields = fields
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   197
        self.values = values
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   198
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   199
    def wrap (self, width, height) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   200
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   201
            Calculate how much space we use up, returning (width, height)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   202
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   203
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   204
        self.width = width
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   205
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   206
        # consume all available height, to place us at the bottom
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   207
        self.height = max(len(self.fields) * self.FIELD_HEIGHT, height)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   208
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   209
        return self.width, self.height
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   210
    
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   211
    def formatString (self, text, col_title) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   212
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   213
            Format display string using context parameters
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   214
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   215
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   216
        return text % dict(
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   217
                column      = col_title,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   218
                today       = datetime.date.today().strftime("%d/%m/%Y"),
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   219
        )
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   220
    
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   221
    # text above field line
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   222
    VALUE_FONT = "Courier-Bold"
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   223
    VALUE_FONT_SIZE = 14
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   224
    VALUE_OFFSET = inch / 12
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   225
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   226
    # text below field line
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   227
    TITLE_FONT = "Times-Italic"
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   228
    TITLE_FONT_SIZE = 10
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   229
    TITLE_OFFSET = inch / 8
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   230
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   231
    def draw (self) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   232
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   233
            Render full block onto our canvas
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   234
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   235
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   236
        # target canvas
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   237
        canvas = self.canv
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   238
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   239
        col_width = min(self.width / len(self.cols), self.COL_WIDTH_MAX)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   240
        col_margin = col_width * 0.1
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   241
        col_height = len(self.fields) * self.FIELD_HEIGHT + self.PADDING_BOTTOM
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   242
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   243
        for field_idx, (field_title) in enumerate(self.fields) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   244
            h = self.FIELD_HEIGHT
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   245
            y = col_height - h * (field_idx + 1)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   246
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   247
            for col_idx, (col_title) in enumerate(self.cols) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   248
                w = col_width
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   249
                x = w * col_idx
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   250
                value = self.values.get((col_title, field_title))
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   251
                title = field_title
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   252
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   253
                value = self.formatString(value, col_title) if value else None
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   254
                title = self.formatString(title, col_title) if title else None
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   255
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   256
                if value :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   257
                    canvas.setFont(self.VALUE_FONT, self.VALUE_FONT_SIZE)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   258
                    canvas.drawString(x + col_margin + self.VALUE_OFFSET, y - self.FIELD_OFFSET + 2, value)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   259
                
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   260
                # field line
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   261
                canvas.line(x + col_margin, y - self.FIELD_OFFSET, x + w - col_margin, y - h / 2)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   262
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   263
                # desc text
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   264
                canvas.setFont(self.TITLE_FONT, self.TITLE_FONT_SIZE)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   265
                canvas.drawString(x + col_margin + self.TITLE_OFFSET, y - self.FIELD_OFFSET - self.TITLE_FONT_SIZE, title)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   266
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   267
class PageTemplate (rlpp.PageTemplate) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   268
    """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   269
        A single-frame page with header and footer.
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   270
    """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   271
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   272
    # vertical space available for footer/header, fixed because we can't really flow text vertically
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   273
    HEADER_HEIGHT = 1 * inch
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   274
    FOOTER_HEIGHT = 1 * inch
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   275
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   276
    COL_FONT_SIZE = 8
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   277
    COL_TITLE_FONT_NAME, COL_TITLE_FONT_SIZE = COL_TITLE_FONT = ("Times-Bold", COL_FONT_SIZE)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   278
    COL_TEXT_FONT_NAME, COL_TEXT_FONT_SIZE = COL_TEXT_FONT = ("Times-Roman", COL_FONT_SIZE)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   279
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   280
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   281
    def __init__ (self, id='page', page_size=pagesizes.A4, margin=inch, header_columns=None, footer_columns=None) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   282
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   283
                id          - identifier for this page template
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   284
                page_size   - the (width, height) of this page
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   285
                margin      - the base margin to use between elements
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   286
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   287
                header_columns  - (title, text) list of header columns
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   288
                footer_columnss - (title, text) list of footer columns
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   289
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   290
        
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   291
        self.page_width, self.page_height = self.page_size = page_size
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   292
        self.margin = margin
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   293
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   294
        self.header_height = self.HEADER_HEIGHT
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   295
        self.footer_height = self.FOOTER_HEIGHT
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   296
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   297
        # calculate frame
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   298
        self.frame_left = self.margin
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   299
        self.frame_bottom = self.footer_height + self.margin / 2
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   300
        self.frame_top = self.page_height - self.header_height - self.margin / 2
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   301
        self.frame_right = self.page_width - self.margin
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   302
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   303
        self.frame = rlpp.Frame(self.frame_left, self.frame_bottom, self.frame_right - self.frame_left, self.frame_top - self.frame_bottom)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   304
        
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   305
        # init base template
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   306
        rlpp.PageTemplate.__init__(self, id, frames=[self.frame])
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   307
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   308
        self.header_columns = header_columns
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   309
        self.footer_columns = footer_columns
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   310
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   311
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   312
    def fmt_string (self, text) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   313
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   314
            Prepare a string for display by handling format codes
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   315
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   316
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   317
        # XXX: unicode?
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   318
        return str(text % dict(
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   319
            today = datetime.date.today().strftime("%d / %m / %Y"),
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   320
        ))
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   321
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   322
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   323
    def draw_column (self, canvas, x, y, width, title, lines, gray=None) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   324
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   325
            Draw a column in the specified position, with the specified lines of text
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   326
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   327
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   328
        text = canvas.beginText(x, y)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   329
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   330
        # grayscale text?
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   331
        if gray :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   332
            text.setFillGray(gray)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   333
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   334
        # title
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   335
        text.setFont(*self.COL_TITLE_FONT)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   336
        text.textLine(self.fmt_string(title))
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   337
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   338
        # lines
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   339
        text.setFont(*self.COL_TEXT_FONT)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   340
        text.textLines(self.fmt_string(lines))
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   341
        
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   342
        # draw out
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   343
        canvas.drawText(text)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   344
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   345
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   346
    def draw_columns (self, canvas, x, y, width, columns, **opts) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   347
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   348
            Draw a series of columns in the specified position
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   349
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   350
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   351
        col_count = len(columns)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   352
        col_width = width / col_count
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   353
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   354
        x_base = x
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   355
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   356
        for col_idx, (col_data) in enumerate(columns) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   357
            x = x_base + (col_idx * col_width)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   358
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   359
            # draw column data at correct offset inside our space
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   360
            self.draw_column(canvas, x, y - self.COL_FONT_SIZE, col_width, *col_data, **opts)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   361
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   362
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   363
    def draw_header (self, canvas) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   364
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   365
            Draw page header
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   366
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   367
        
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   368
        # offsets
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   369
        x = self.margin
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   370
        h = self.footer_height - self.margin / 4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   371
        w = self.page_width - self.margin * 2
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   372
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   373
        # spacer
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   374
        y = self.page_height - self.footer_height
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   375
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   376
        canvas.setLineWidth(0.5)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   377
        canvas.line(x - self.margin / 2, y, self.page_width - self.margin / 2, y)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   378
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   379
        # columns
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   380
        y = self.page_height - self.margin / 4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   381
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   382
        self.draw_columns(canvas, x, y, w, self.header_columns)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   383
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   384
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   385
    def draw_footer (self, canvas) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   386
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   387
            Draw page footer
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   388
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   389
        
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   390
        # offsets
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   391
        x = self.margin
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   392
        y = self.footer_height
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   393
        w = self.page_width - self.margin * 2
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   394
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   395
        # spacer
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   396
        canvas.setLineWidth(0.5)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   397
        canvas.line(x - self.margin / 2, y, self.page_width - self.margin / 2, y)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   398
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   399
        # columns
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   400
        self.draw_columns(canvas, x, y - inch / 8, w, self.footer_columns, gray=0.4)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   401
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   402
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   403
    def beforeDrawPage (self, canvas, document) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   404
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   405
            Draw page headers/footers
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   406
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   407
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   408
        self.draw_header(canvas)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   409
        self.draw_footer(canvas)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   410
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   411
class DocumentTemplate (rlpp.BaseDocTemplate) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   412
    def __init__ (self, page_templates, title, author, page_size=pagesizes.A4) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   413
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   414
            Initialize with fixed list of needed PageTemplates.
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   415
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   416
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   417
        # we supply the file later
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   418
        rlpp.BaseDocTemplate.__init__(self, filename=None, 
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   419
                pageTemplates=page_templates, title=title, author=author,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   420
                pageSize=page_size
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   421
        )
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   422
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   423
    def render_buf (self, elements) :
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   424
        """
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   425
            Build the document using the given list of Flowables, returning a StringIO containing the PDF.
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   426
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   427
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   428
        buf = StringIO()
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   429
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   430
        # build
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   431
        self.build(elements, buf)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   432
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   433
        # prepare for read
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   434
        buf.seek(0)
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   435
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   436
        return buf
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   437
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   438
    def render_string (self, elements) :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   439
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   440
            Build the document using the given list of Flowables, returning the PDF as a single str.
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   441
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   442
        
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   443
        # render
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   444
        buf = self.render_buf(elements)
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   445
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   446
        # binary data out
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   447
        return buf.getvalue()
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   448