svv/pdf.py
author Tero Marttila <terom@fixme.fi>
Fri, 31 Dec 2010 02:32:52 +0200
changeset 28 1bfe14d74dcf
parent 23 26ae1b1db3c7
child 31 e1b63e4d10f4
permissions -rw-r--r--
orders: fix OrderForm.load to take an Order object
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
23
26ae1b1db3c7 pdf: add SignatureBlock(fullheight=) param
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   183
    def __init__ (self, cols, fields, values={}, fullheight=None) :
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   184
        """
23
26ae1b1db3c7 pdf: add SignatureBlock(fullheight=) param
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   185
            cols        - Column titles
26ae1b1db3c7 pdf: add SignatureBlock(fullheight=) param
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   186
            fields      - Fields titles, describing the horizontal fields
26ae1b1db3c7 pdf: add SignatureBlock(fullheight=) param
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   187
            values      - Pre-filled values as a {(col, field): value} dict
26ae1b1db3c7 pdf: add SignatureBlock(fullheight=) param
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   188
            fullheight  - Consume full vertical height to place at bottom of page
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   189
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
            desc/value strings can contain formatting codes:
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   191
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   192
                column      - title of the current column
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   193
                today       - today's date in %d/%m/%Y format
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
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   196
        self.cols = cols
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   197
        self.fields = fields
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   198
        self.values = values
23
26ae1b1db3c7 pdf: add SignatureBlock(fullheight=) param
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   199
        self.fullheight = fullheight
4
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
    def wrap (self, 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
            Calculate how much space we use up, returning (width, height)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   204
        """
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
        self.width = width
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   207
23
26ae1b1db3c7 pdf: add SignatureBlock(fullheight=) param
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   208
        self.height = len(self.fields) * self.FIELD_HEIGHT
26ae1b1db3c7 pdf: add SignatureBlock(fullheight=) param
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   209
26ae1b1db3c7 pdf: add SignatureBlock(fullheight=) param
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   210
        if self.fullheight :
26ae1b1db3c7 pdf: add SignatureBlock(fullheight=) param
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   211
            # consume all available height, to place us at the bottom
26ae1b1db3c7 pdf: add SignatureBlock(fullheight=) param
Tero Marttila <terom@fixme.fi>
parents: 17
diff changeset
   212
            self.height = max(self.height, height)
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   213
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   214
        return self.width, self.height
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
    def formatString (self, text, col_title) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   217
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   218
            Format display string using context parameters
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   219
        """
17
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   220
        
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   221
        # XXX: the canvas.drawString we use here does support unicode?
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   222
        return text % dict(
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   223
                column      = col_title,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   224
                today       = datetime.date.today().strftime("%d/%m/%Y"),
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
    
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   227
    # text above field line
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   228
    VALUE_FONT = "Courier-Bold"
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   229
    VALUE_FONT_SIZE = 14
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   230
    VALUE_OFFSET = inch / 12
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   231
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   232
    # text below field line
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   233
    TITLE_FONT = "Times-Italic"
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   234
    TITLE_FONT_SIZE = 10
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   235
    TITLE_OFFSET = inch / 8
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   236
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   237
    def draw (self) :
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
            Render full block onto our canvas
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   240
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   241
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   242
        # target canvas
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   243
        canvas = self.canv
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   244
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   245
        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
   246
        col_margin = col_width * 0.1
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   247
        col_height = len(self.fields) * self.FIELD_HEIGHT + self.PADDING_BOTTOM
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   248
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   249
        for field_idx, (field_title) in enumerate(self.fields) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   250
            h = self.FIELD_HEIGHT
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   251
            y = col_height - h * (field_idx + 1)
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
            for col_idx, (col_title) in enumerate(self.cols) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   254
                w = col_width
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   255
                x = w * col_idx
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   256
                value = self.values.get((col_title, field_title))
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   257
                title = field_title
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   258
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   259
                value = self.formatString(value, col_title) if value else None
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   260
                title = self.formatString(title, col_title) if title else None
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   261
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   262
                if value :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   263
                    canvas.setFont(self.VALUE_FONT, self.VALUE_FONT_SIZE)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   264
                    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
   265
                
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   266
                # field line
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   267
                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
   268
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   269
                # desc text
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   270
                canvas.setFont(self.TITLE_FONT, self.TITLE_FONT_SIZE)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   271
                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
   272
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   273
class PageTemplate (rlpp.PageTemplate) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   274
    """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   275
        A single-frame page with header and footer.
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   276
    """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   277
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   278
    # 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
   279
    HEADER_HEIGHT = 1 * inch
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   280
    FOOTER_HEIGHT = 1 * inch
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   281
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   282
    COL_FONT_SIZE = 8
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   283
    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
   284
    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
   285
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
    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
   288
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   289
                id          - identifier for this page template
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   290
                page_size   - the (width, height) of this page
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   291
                margin      - the base margin to use between elements
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   292
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   293
                header_columns  - (title, text) list of header columns
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   294
                footer_columnss - (title, text) list of footer columns
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   295
        """
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
        self.page_width, self.page_height = self.page_size = page_size
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   298
        self.margin = margin
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   299
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   300
        self.header_height = self.HEADER_HEIGHT
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   301
        self.footer_height = self.FOOTER_HEIGHT
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
        # calculate frame
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   304
        self.frame_left = self.margin
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   305
        self.frame_bottom = self.footer_height + self.margin / 2
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   306
        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
   307
        self.frame_right = self.page_width - self.margin
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   308
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   309
        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
   310
        
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   311
        # init base template
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   312
        rlpp.PageTemplate.__init__(self, id, frames=[self.frame])
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
        self.header_columns = header_columns
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   315
        self.footer_columns = footer_columns
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
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   318
    def fmt_string (self, text) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   319
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   320
            Prepare a string for display by handling format codes
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   321
        """
17
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   322
        
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   323
        return unicode(text % dict(
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   324
            today = datetime.date.today().strftime("%d / %m / %Y"),
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   325
        ))
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
    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
   328
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   329
            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
   330
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   331
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   332
        text = canvas.beginText(x, y)
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
        # grayscale text?
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   335
        if gray :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   336
            text.setFillGray(gray)
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
        # title
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   339
        text.setFont(*self.COL_TITLE_FONT)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   340
        text.textLine(self.fmt_string(title))
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
        # lines
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   343
        text.setFont(*self.COL_TEXT_FONT)
17
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   344
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   345
        # XXX: textobject's textLine fails at unicode, but textLine should work...
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   346
        for line in lines :
820c46308e45 fix pdf unicode issues, and move OrderContractForm submit inside fieldset
Tero Marttila <terom@fixme.fi>
parents: 15
diff changeset
   347
            text.textLine(self.fmt_string(line))
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   348
        
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   349
        # draw out
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   350
        canvas.drawText(text)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   351
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   352
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   353
    def draw_columns (self, canvas, x, y, width, columns, **opts) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   354
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   355
            Draw a series of columns in the specified position
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   356
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   357
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   358
        col_count = len(columns)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   359
        col_width = width / col_count
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   360
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   361
        x_base = x
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
        for col_idx, (col_data) in enumerate(columns) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   364
            x = x_base + (col_idx * col_width)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   365
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   366
            # draw column data at correct offset inside our space
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   367
            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
   368
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   369
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   370
    def draw_header (self, canvas) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   371
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   372
            Draw page header
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   373
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   374
        
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   375
        # offsets
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   376
        x = self.margin
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   377
        h = self.footer_height - self.margin / 4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   378
        w = self.page_width - self.margin * 2
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   379
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   380
        # spacer
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   381
        y = self.page_height - self.footer_height
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   382
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   383
        canvas.setLineWidth(0.5)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   384
        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
   385
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   386
        # columns
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   387
        y = self.page_height - self.margin / 4
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
        self.draw_columns(canvas, x, y, w, self.header_columns)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   390
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   391
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   392
    def draw_footer (self, canvas) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   393
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   394
            Draw page footer
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   395
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   396
        
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   397
        # offsets
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   398
        x = self.margin
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   399
        y = self.footer_height
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   400
        w = self.page_width - self.margin * 2
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
        # spacer
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   403
        canvas.setLineWidth(0.5)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   404
        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
   405
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   406
        # columns
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   407
        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
   408
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   409
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   410
    def beforeDrawPage (self, canvas, document) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   411
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   412
            Draw page headers/footers
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
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   415
        self.draw_header(canvas)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   416
        self.draw_footer(canvas)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   417
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   418
class DocumentTemplate (rlpp.BaseDocTemplate) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   419
    def __init__ (self, page_templates, title, author, page_size=pagesizes.A4) :
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   420
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   421
            Initialize with fixed list of needed PageTemplates.
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   422
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   423
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   424
        # we supply the file later
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   425
        rlpp.BaseDocTemplate.__init__(self, filename=None, 
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   426
                pageTemplates=page_templates, title=title, author=author,
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   427
                pageSize=page_size
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   428
        )
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   429
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   430
    def render_buf (self, elements) :
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   431
        """
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   432
            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
   433
        """
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   434
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   435
        buf = StringIO()
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   436
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   437
        # build
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   438
        self.build(elements, buf)
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   439
15
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   440
        # prepare for read
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   441
        buf.seek(0)
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
        return buf
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   444
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   445
    def render_string (self, elements) :
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   446
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   447
            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
   448
        """
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   449
        
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   450
        # render
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   451
        buf = self.render_buf(elements)
e098ee83b363 Implement OrderContractDocument
Tero Marttila <terom@fixme.fi>
parents: 4
diff changeset
   452
4
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   453
        # binary data out
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   454
        return buf.getvalue()
b3a1ab44f517 Separate svv.pdf module
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   455