reportlab/pdfgen/test/testpdfgen.py
author rgbecker
Wed, 25 Oct 2000 08:57:46 +0000
changeset 494 54257447cfe9
parent 237 132245a36067
child 760 0e51a12a0e39
permissions -rwxr-xr-x
Changed to indirect copyright
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6
eb791971b252 Added license, __version__ and Logi comment
rgbecker
parents: 0
diff changeset
     1
#!/bin/env python
494
54257447cfe9 Changed to indirect copyright
rgbecker
parents: 237
diff changeset
     2
#copyright ReportLab Inc. 2000
54257447cfe9 Changed to indirect copyright
rgbecker
parents: 237
diff changeset
     3
#see license.txt for license details
54257447cfe9 Changed to indirect copyright
rgbecker
parents: 237
diff changeset
     4
#history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/pdfgen/test/testpdfgen.py?cvsroot=reportlab
54257447cfe9 Changed to indirect copyright
rgbecker
parents: 237
diff changeset
     5
#$Header: /tmp/reportlab/reportlab/pdfgen/test/Attic/testpdfgen.py,v 1.16 2000/10/25 08:57:45 rgbecker Exp $
54257447cfe9 Changed to indirect copyright
rgbecker
parents: 237
diff changeset
     6
__version__=''' $Id: testpdfgen.py,v 1.16 2000/10/25 08:57:45 rgbecker Exp $ '''
16
f9c7525619fb Docstring & other fixes
rgbecker
parents: 10
diff changeset
     7
__doc__='testscript for reportlab.pdfgen'
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
     8
#tests and documents new low-level canvas
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
     9
import string
10
0cb88428a663 Conversion to reportlab package
rgbecker
parents: 7
diff changeset
    10
from reportlab.pdfgen import canvas   # gmcm 2000/10/13, pdfgen now a package
42
ba8c232f544e Moved inch and cm definitions to reportlab.lib.units and amended all demos
andy_robinson
parents: 16
diff changeset
    11
from reportlab.lib.units import inch, cm
43
71baccf1c57f Canvas has two methods setFillColor(aColor) and setStrokeColor(aColor)
andy_robinson
parents: 42
diff changeset
    12
from reportlab.lib import colors
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    13
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    14
#################################################################
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    15
#
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    16
#  first some drawing utilities
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    17
#
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    18
#
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    19
################################################################
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    20
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    21
BASEFONT = ('Times-Roman', 10)
55
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    22
def framePageForm(c):
231
eb5d3b398a4f removed 0's on outline and link operations
aaron_watters
parents: 167
diff changeset
    23
    c.beginForm("frame")
55
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    24
    c.saveState()
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    25
    # forms can't do non-constant operations
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    26
    #canvas.setFont('Times-BoldItalic',20)
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    27
    #canvas.drawString(inch, 10.5 * inch, title)
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    28
                            
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    29
    #c.setFont('Times-Roman',10)
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    30
    #c.drawCentredString(4.135 * inch, 0.75 * inch,
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    31
    #                        'Page %d' % c.getPageNumber())
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    32
    
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    33
    #draw a border
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    34
    c.setFillColorRGB(0,0,0.95)
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    35
    c.rect(0.3*inch, inch, 0.5*inch, 10*inch, fill=1)
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    36
    from reportlab.lib import corp
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    37
    c.translate(0.8*inch, 9.6*inch)
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    38
    c.rotate(90)
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    39
    logo = corp.ReportLabLogo(width=1.3*inch, height=0.5*inch, powered_by=1)
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    40
    c.setFillColorRGB(1,1,1)
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    41
    c.setStrokeColorRGB(1,1,1)
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    42
    logo.draw(c)
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    43
    #c.setStrokeColorRGB(1,0,0)
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    44
    #c.setLineWidth(5)
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    45
    #c.line(0.8 * inch, inch, 0.8 * inch, 10.75 * inch)
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    46
    #reset carefully afterwards
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    47
    #canvas.setLineWidth(1)
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    48
    #canvas.setStrokeColorRGB(0,0,0)\
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    49
    c.restoreState()
231
eb5d3b398a4f removed 0's on outline and link operations
aaron_watters
parents: 167
diff changeset
    50
    c.endForm()
55
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    51
    
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    52
titlelist = []
167
99dd06eb9591 added demonstration of usage of closed outline entries
aaron_watters
parents: 140
diff changeset
    53
closeit = 0
55
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    54
    
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    55
def framePage(canvas, title):
167
99dd06eb9591 added demonstration of usage of closed outline entries
aaron_watters
parents: 140
diff changeset
    56
    global closeit
55
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    57
    titlelist.append(title)
140
582ff725867b eliminated canvas._inPage0() (now disallowed)
aaron_watters
parents: 135
diff changeset
    58
    #canvas._inPage0()  # do we need this at all?  would be good to eliminate it
55
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    59
    canvas.saveState()
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    60
    canvas.setFont('Times-BoldItalic',20)
55
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    61
    
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    62
    canvas.drawString(inch, 10.5 * inch, title)
231
eb5d3b398a4f removed 0's on outline and link operations
aaron_watters
parents: 167
diff changeset
    63
    canvas.bookmarkHorizontalAbsolute(title, 10.8*inch)
135
6f634b913387 added demonstration of new AddOutlineEntry0 api
aaron_watters
parents: 63
diff changeset
    64
    #newsection(title)
231
eb5d3b398a4f removed 0's on outline and link operations
aaron_watters
parents: 167
diff changeset
    65
    canvas.addOutlineEntry(title+" section", title, level=0, closed=closeit)
167
99dd06eb9591 added demonstration of usage of closed outline entries
aaron_watters
parents: 140
diff changeset
    66
    closeit = not closeit # close every other one
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    67
    canvas.setFont('Times-Roman',10)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    68
    canvas.drawCentredString(4.135 * inch, 0.75 * inch,
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    69
                            'Page %d' % canvas.getPageNumber())
55
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
    70
    canvas.restoreState()
231
eb5d3b398a4f removed 0's on outline and link operations
aaron_watters
parents: 167
diff changeset
    71
    canvas.doForm("frame")
61
cf3fcb2d65e9 added demonstration of outline trees
aaron_watters
parents: 55
diff changeset
    72
    
135
6f634b913387 added demonstration of new AddOutlineEntry0 api
aaron_watters
parents: 63
diff changeset
    73
def makesubsection(canvas, title, horizontal):
231
eb5d3b398a4f removed 0's on outline and link operations
aaron_watters
parents: 167
diff changeset
    74
    canvas.bookmarkHorizontalAbsolute(title, horizontal)
135
6f634b913387 added demonstration of new AddOutlineEntry0 api
aaron_watters
parents: 63
diff changeset
    75
    #newsubsection(title)
231
eb5d3b398a4f removed 0's on outline and link operations
aaron_watters
parents: 167
diff changeset
    76
    canvas.addOutlineEntry(title+" subsection", title, level=1)
61
cf3fcb2d65e9 added demonstration of outline trees
aaron_watters
parents: 55
diff changeset
    77
    
cf3fcb2d65e9 added demonstration of outline trees
aaron_watters
parents: 55
diff changeset
    78
# outline helpers
135
6f634b913387 added demonstration of new AddOutlineEntry0 api
aaron_watters
parents: 63
diff changeset
    79
#outlinenametree = []
6f634b913387 added demonstration of new AddOutlineEntry0 api
aaron_watters
parents: 63
diff changeset
    80
#def newsection(name):
6f634b913387 added demonstration of new AddOutlineEntry0 api
aaron_watters
parents: 63
diff changeset
    81
#    outlinenametree.append(name)
61
cf3fcb2d65e9 added demonstration of outline trees
aaron_watters
parents: 55
diff changeset
    82
    
135
6f634b913387 added demonstration of new AddOutlineEntry0 api
aaron_watters
parents: 63
diff changeset
    83
#def newsubsection(name):
6f634b913387 added demonstration of new AddOutlineEntry0 api
aaron_watters
parents: 63
diff changeset
    84
#    from types import TupleType
6f634b913387 added demonstration of new AddOutlineEntry0 api
aaron_watters
parents: 63
diff changeset
    85
#    thissection = outlinenametree[-1]
6f634b913387 added demonstration of new AddOutlineEntry0 api
aaron_watters
parents: 63
diff changeset
    86
#    if type(thissection) is not TupleType:
6f634b913387 added demonstration of new AddOutlineEntry0 api
aaron_watters
parents: 63
diff changeset
    87
#        subsectionlist = []
6f634b913387 added demonstration of new AddOutlineEntry0 api
aaron_watters
parents: 63
diff changeset
    88
#        thissection = outlinenametree[-1] = (thissection, subsectionlist)
6f634b913387 added demonstration of new AddOutlineEntry0 api
aaron_watters
parents: 63
diff changeset
    89
#    else:
6f634b913387 added demonstration of new AddOutlineEntry0 api
aaron_watters
parents: 63
diff changeset
    90
#        (sectionname, subsectionlist) = thissection
6f634b913387 added demonstration of new AddOutlineEntry0 api
aaron_watters
parents: 63
diff changeset
    91
#    subsectionlist.append(name)
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    92
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    93
class DocBlock:
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    94
    """A DocBlock has a chunk of commentary and a chunk of code.
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    95
    It prints the code and commentary, then executes the code,
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    96
    which is presumed to draw in a region reserved for it.
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    97
    """
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    98
    def __init__(self):
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
    99
        self.comment1 = "A doc block"
42
ba8c232f544e Moved inch and cm definitions to reportlab.lib.units and amended all demos
andy_robinson
parents: 16
diff changeset
   100
        self.code = "canvas.setTextOrigin(cm, cm)\ncanvas.textOut('Hello World')"
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   101
        self.comment2 = "That was a doc block"
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   102
        self.drawHeight = 0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   103
        
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   104
    def _getHeight(self):
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   105
        "splits into lines"
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   106
        self.comment1lines = string.split(self.comment1, '\n')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   107
        self.codelines = string.split(self.code, '\n')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   108
        self.comment2lines = string.split(self.comment2, '\n')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   109
        textheight = (len(self.comment1lines) +
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   110
                len(self.code) +
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   111
                len(self.comment2lines) +
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   112
                18)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   113
        return max(textheight, self.drawHeight)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   114
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   115
    def draw(self, canvas, x, y):
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   116
        #specifies top left corner
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   117
        canvas.saveState()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   118
        height = self._getHeight()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   119
        canvas.rect(x, y-height, 6*inch, height)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   120
        #first draw the text
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   121
        canvas.setTextOrigin(x + 3 * inch, y - 12)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   122
        canvas.setFont('Times-Roman',10)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   123
        canvas.textLines(self.comment1)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   124
        drawCode(canvas, self.code)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   125
        canvas.textLines(self.comment2)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   126
55
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   127
        #now a box for the drawing, slightly within rect        
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   128
        canvas.rect(x + 9, y - height + 9, 198, height - 18)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   129
        #boundary:
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   130
        self.namespace = {'canvas':canvas,'cm': cm,'inch':inch}
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   131
        canvas.translate(x+9, y - height + 9)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   132
        codeObj = compile(self.code, '<sample>','exec')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   133
        exec codeObj in self.namespace
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   134
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   135
        canvas.restoreState()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   136
        
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   137
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   138
        
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   139
def drawAxes(canvas, label):
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   140
    """draws a couple of little rulers showing the coords -
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   141
    uses points as units so you get an imperial ruler
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   142
    one inch on each side"""
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   143
    #y axis
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   144
    canvas.line(0,0,0,72)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   145
    for y in range(9):
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   146
        tenths = (y+1) * 7.2
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   147
        canvas.line(-6,tenths,0,tenths)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   148
    canvas.line(-6, 66, 0, 72)  #arrow...
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   149
    canvas.line(6, 66, 0, 72)  #arrow...
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   150
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   151
    canvas.line(0,0,72,0)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   152
    for x in range(9):
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   153
        tenths = (x+1) * 7.2
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   154
        canvas.line(tenths,-6,tenths, 0)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   155
    canvas.line(66, -6, 72, 0)  #arrow...
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   156
    canvas.line(66, +6, 72, 0)  #arrow...
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   157
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   158
    canvas.drawString(18, 30, label)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   159
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   160
def drawCrossHairs(canvas, x, y):
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   161
    """just a marker for checking text metrics - blue for fun"""
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   162
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   163
    canvas.saveState()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   164
    canvas.setStrokeColorRGB(0,1,0)    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   165
    canvas.line(x-6,y,x+6,y)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   166
    canvas.line(x,y-6,x,y+6)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   167
    canvas.restoreState()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   168
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   169
def drawCode(canvas, code):
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   170
    """Draws a block of text at current point, indented and in Courier"""
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   171
    canvas.addLiteral('36 0 Td')
43
71baccf1c57f Canvas has two methods setFillColor(aColor) and setStrokeColor(aColor)
andy_robinson
parents: 42
diff changeset
   172
    canvas.setFillColor(colors.blue)
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   173
    canvas.setFont('Courier',10)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   174
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   175
    t = canvas.beginText()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   176
    t.textLines(code)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   177
    c.drawText(t)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   178
    
43
71baccf1c57f Canvas has two methods setFillColor(aColor) and setStrokeColor(aColor)
andy_robinson
parents: 42
diff changeset
   179
    canvas.setFillColor(colors.black)
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   180
    canvas.addLiteral('-36 0 Td')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   181
    canvas.setFont('Times-Roman',10)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   182
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   183
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   184
def run():
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   185
    c = canvas.Canvas('testpdfgen.pdf')
55
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   186
    framePageForm(c) # define the frame form
231
eb5d3b398a4f removed 0's on outline and link operations
aaron_watters
parents: 167
diff changeset
   187
    c.showOutline()
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   188
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   189
    framePage(c, 'PDFgen graphics API test script')
135
6f634b913387 added demonstration of new AddOutlineEntry0 api
aaron_watters
parents: 63
diff changeset
   190
    makesubsection(c, "PDFgen and PIDDLE", 10*inch)
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   191
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   192
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   193
    t = c.beginText(inch, 10*inch)
237
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   194
    t.setFont('Times-Roman', 10)
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   195
    drawCrossHairs(c, t.getX(),t.getY())
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   196
    t.textLines("""
237
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   197
The ReportLab library permits you to create PDF documents directly from
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   198
your Python code. The "pdfgen" subpackage is the lowest level exposed
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   199
to the user and lets you directly position test and graphics on the
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   200
page, with access to almost the full range of PDF features. 
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   201
  The API is intended to closely mirror the PDF / Postscript imaging
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   202
model.  There is an almost one to one correspondence between commands
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   203
and PDF operators.  However, where PDF provides several ways to do a job,
237
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   204
we have generally only picked one. 
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   205
  The test script attempts to use all of the methods exposed by the Canvas
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   206
class, defined in reportlab/pdfgen/canvas.py
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   207
  First, let's look at text output.  There are some basic commands
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   208
to draw strings:
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   209
-    canvas.setFont(fontname, fontsize [, leading])
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   210
-    canvas.drawString(x, y, text)
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   211
-    canvas.drawRightString(x, y, text)
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   212
-    canvas.drawCentredString(x, y, text)
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   213
237
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   214
The coordinates are in points starting at the bottom left corner of the
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   215
page.  When setting a font, the leading (i.e. inter-line spacing)
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   216
defaults to 1.2 * fontsize if the fontsize is not provided.
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   217
237
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   218
For more sophisticated operations, you can create a Text Object, defined
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   219
in reportlab/pdfgen/testobject.py.  Text objects produce tighter PDF, run
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   220
faster and have many methods for precise control of spacing and position.
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   221
Basic usage goes as follows:
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   222
-   tx = canvas.beginText(x, y)
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   223
-   tx.textOut('Hello')    # this moves the cursor to the right
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   224
-   tx.textLine('Hello again') # prints a line and moves down
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   225
-   y = tx.getY()       # getX, getY and getCursor track position
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   226
-   canvas.drawText(tx)  # all gets drawn at the end
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   227
237
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   228
The green crosshairs below test whether the text cursor is working
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   229
properly.  They should appear at the bottom left of each relevant
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   230
substring.
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   231
""")
237
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   232
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   233
    t.setFillColorRGB(1,0,0)
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   234
    t.setTextOrigin(inch, 4*inch)
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   235
    drawCrossHairs(c, t.getX(),t.getY())
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   236
    t.textOut('textOut moves across:')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   237
    drawCrossHairs(c, t.getX(),t.getY())
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   238
    t.textOut('textOut moves across:')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   239
    drawCrossHairs(c, t.getX(),t.getY())
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   240
    t.textOut('textOut moves across:')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   241
    drawCrossHairs(c, t.getX(),t.getY())
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   242
    t.textLine('')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   243
    drawCrossHairs(c, t.getX(),t.getY())
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   244
    t.textLine('textLine moves down')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   245
    drawCrossHairs(c, t.getX(),t.getY())
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   246
    t.textLine('textLine moves down')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   247
    drawCrossHairs(c, t.getX(),t.getY())
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   248
    t.textLine('textLine moves down')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   249
    drawCrossHairs(c, t.getX(),t.getY())
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   250
237
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   251
    t.setTextOrigin(4*inch,3.25*inch)
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   252
    drawCrossHairs(c, t.getX(),t.getY())
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   253
    t.textLines('This is a multi-line\nstring with embedded newlines\ndrawn with textLines().\n')
237
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   254
    drawCrossHairs(c, t.getX(),t.getY())
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   255
    t.textLines(['This is a list of strings',
237
132245a36067 Test script text now bears some resemblance to our code base
andy_robinson
parents: 231
diff changeset
   256
                'drawn with textLines().'])
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   257
    c.drawText(t)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   258
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   259
    t = c.beginText(2*inch,2*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   260
    t.setFont('Times-Roman',10)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   261
    drawCrossHairs(c, t.getX(),t.getY())
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   262
    t.textOut('Small text.')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   263
    drawCrossHairs(c, t.getX(),t.getY())
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   264
    t.setFont('Courier',14)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   265
    t.textOut('Bigger fixed width text.')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   266
    drawCrossHairs(c, t.getX(),t.getY())
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   267
    t.setFont('Times-Roman',10)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   268
    t.textOut('Small text again.')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   269
    drawCrossHairs(c, t.getX(),t.getY())
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   270
    c.drawText(t)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   271
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   272
    #mark the cursor where it stopped
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   273
    c.showPage()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   274
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   275
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   276
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   277
    ##############################################################
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   278
    #
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   279
    # page 2 - line styles
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   280
    #
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   281
    ###############################################################
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   282
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   283
    #page 2 - lines and styles
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   284
    framePage(c, 'Line Drawing Styles')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   285
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   286
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   287
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   288
    # three line ends, lines drawn the hard way
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   289
    #firt make some vertical end markers
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   290
    c.setDash(4,4)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   291
    c.setLineWidth(0)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   292
    c.line(inch,9.2*inch,inch, 7.8*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   293
    c.line(3*inch,9.2*inch,3*inch, 7.8*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   294
    c.setDash() #clears it
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   295
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   296
    c.setLineWidth(5)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   297
    c.setLineCap(0)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   298
    p = c.beginPath()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   299
    p.moveTo(inch, 9*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   300
    p.lineTo(3*inch, 9*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   301
    c.drawPath(p)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   302
    c.drawString(4*inch, 9*inch, 'the default - butt caps project half a width')
135
6f634b913387 added demonstration of new AddOutlineEntry0 api
aaron_watters
parents: 63
diff changeset
   303
    makesubsection(c, "caps and joins", 8.5*inch)
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   304
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   305
    c.setLineCap(1)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   306
    p = c.beginPath()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   307
    p.moveTo(inch, 8.5*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   308
    p.lineTo(3*inch, 8.5*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   309
    c.drawPath(p)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   310
    c.drawString(4*inch, 8.5*inch, 'round caps')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   311
        
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   312
    c.setLineCap(2)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   313
    p = c.beginPath()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   314
    p.moveTo(inch, 8*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   315
    p.lineTo(3*inch, 8*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   316
    c.drawPath(p)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   317
    c.drawString(4*inch, 8*inch, 'square caps')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   318
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   319
    c.setLineCap(0)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   320
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   321
    # three line joins
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   322
    c.setLineJoin(0)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   323
    p = c.beginPath()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   324
    p.moveTo(inch, 7*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   325
    p.lineTo(2*inch, 7*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   326
    p.lineTo(inch, 6.7*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   327
    c.drawPath(p)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   328
    c.drawString(4*inch, 6.8*inch, 'Default - mitered join')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   329
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   330
    c.setLineJoin(1)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   331
    p = c.beginPath()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   332
    p.moveTo(inch, 6.5*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   333
    p.lineTo(2*inch, 6.5*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   334
    p.lineTo(inch, 6.2*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   335
    c.drawPath(p)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   336
    c.drawString(4*inch, 6.3*inch, 'round join')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   337
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   338
    c.setLineJoin(2)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   339
    p = c.beginPath()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   340
    p.moveTo(inch, 6*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   341
    p.lineTo(2*inch, 6*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   342
    p.lineTo(inch, 5.7*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   343
    c.drawPath(p)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   344
    c.drawString(4*inch, 5.8*inch, 'bevel join')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   345
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   346
    c.setDash(6,6)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   347
    p = c.beginPath()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   348
    p.moveTo(inch, 5*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   349
    p.lineTo(3*inch, 5*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   350
    c.drawPath(p)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   351
    c.drawString(4*inch, 5*inch, 'dash pattern 6 points on, 3 off- setDash(6,3)')
135
6f634b913387 added demonstration of new AddOutlineEntry0 api
aaron_watters
parents: 63
diff changeset
   352
    makesubsection(c, "dash patterns", 5*inch)
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   353
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   354
    c.setDash([1,2,3,4,5,6],0)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   355
    p = c.beginPath()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   356
    p.moveTo(inch, 4.5*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   357
    p.lineTo(3*inch, 4.5*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   358
    c.drawPath(p)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   359
    c.drawString(4*inch, 4.5*inch, 'dash pattern lengths growing - setDash([1,2,3,4,5,6],0)')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   360
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   361
    c.setDash()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   362
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   363
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   364
    c.showPage()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   365
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   366
##############################################################
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   367
#
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   368
# higher level shapes
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   369
#
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   370
###############################################################
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   371
    framePage(c, 'Shape Drawing Routines')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   372
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   373
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   374
    t = c.beginText(inch, 10*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   375
    t.textLines("""
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   376
Rather than making your own paths, you have access to a range of shape routines.
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   377
These are built in pdfgen out of lines and bezier curves, but use the most compact
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   378
set of operators possible.  We can add any new ones that are of general use at no
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   379
cost to performance.""")
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   380
    t.textLine()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   381
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   382
    #line demo    
135
6f634b913387 added demonstration of new AddOutlineEntry0 api
aaron_watters
parents: 63
diff changeset
   383
    makesubsection(c, "lines", 10*inch)
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   384
    c.line(inch, 8*inch, 3*inch, 8*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   385
    t.setTextOrigin(4*inch, 8*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   386
    t.textLine('canvas.line(x1, y1, x2, y2)')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   387
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   388
    #bezier demo - show control points
135
6f634b913387 added demonstration of new AddOutlineEntry0 api
aaron_watters
parents: 63
diff changeset
   389
    makesubsection(c, "bezier curves", 7.5*inch)
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   390
    (x1, y1, x2, y2, x3, y3, x4, y4) = (
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   391
                        inch, 6.5*inch,
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   392
                        1.2*inch, 7.5 * inch,
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   393
                        3*inch, 7.5 * inch,
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   394
                        3.5*inch, 6.75 * inch
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   395
                        )
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   396
    c.bezier(x1, y1, x2, y2, x3, y3, x4, y4)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   397
    c.setDash(3,3)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   398
    c.line(x1,y1,x2,y2)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   399
    c.line(x3,y3,x4,y4)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   400
    c.setDash()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   401
    t.setTextOrigin(4*inch, 7 * inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   402
    t.textLine('canvas.bezier(x1, y1, x2, y2, x3, y3, x4, y4)')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   403
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   404
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   405
    #rectangle
135
6f634b913387 added demonstration of new AddOutlineEntry0 api
aaron_watters
parents: 63
diff changeset
   406
    makesubsection(c, "rectangles", 7*inch)
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   407
    c.rect(inch, 5.25 * inch, 2 * inch, 0.75 * inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   408
    t.setTextOrigin(4*inch, 5.5 * inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   409
    t.textLine('canvas.rect(x, y, width, height) - x,y is lower left')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   410
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   411
    #wedge
135
6f634b913387 added demonstration of new AddOutlineEntry0 api
aaron_watters
parents: 63
diff changeset
   412
    makesubsection(c, "wedges", 5*inch)
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   413
    c.wedge(inch, 5*inch, 3*inch, 4*inch, 0, 315)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   414
    t.setTextOrigin(4*inch, 4.5 * inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   415
    t.textLine('canvas.wedge(x1, y1, x2, y2, startDeg, extentDeg)')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   416
    t.textLine('Note that this is an elliptical arc, not just circular!')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   417
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   418
    #wedge the other way
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   419
    c.wedge(inch, 4*inch, 3*inch, 3*inch, 0, -45)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   420
    t.setTextOrigin(4*inch, 3.5 * inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   421
    t.textLine('Use a negative extent to go clockwise')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   422
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   423
    #circle
135
6f634b913387 added demonstration of new AddOutlineEntry0 api
aaron_watters
parents: 63
diff changeset
   424
    makesubsection(c, "circles", 3.5*inch)
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   425
    c.circle(1.5*inch, 2*inch, 0.5 * inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   426
    c.circle(3*inch, 2*inch, 0.5 * inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   427
    t.setTextOrigin(4*inch, 2 * inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   428
    t.textLine('canvas.circle(x, y, radius)')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   429
    c.drawText(t)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   430
##############################################################
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   431
#
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   432
# Page 4 - fonts
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   433
#
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   434
###############################################################
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   435
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   436
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   437
    c.showPage()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   438
    framePage(c, "Font Control")
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   439
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   440
    c.drawString(inch, 10*inch, 'Listing available fonts...')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   441
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   442
    y = 9.5*inch
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   443
    for fontname in c.getAvailableFonts():
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   444
        c.setFont(fontname,24)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   445
        c.drawString(inch, y, 'This should be %s' % fontname)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   446
        y = y - 28
135
6f634b913387 added demonstration of new AddOutlineEntry0 api
aaron_watters
parents: 63
diff changeset
   447
    makesubsection(c, "fonts and colors", 4*inch)
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   448
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   449
    c.setFont('Times-Roman', 12)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   450
    t = c.beginText(inch, 4*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   451
    t.textLines("""Now we'll look at the color functions and how they interact
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   452
    with the text.  In theory, a word is just a shape; so setFillColorRGB()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   453
    determines most of what you see.  If you specify other text rendering
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   454
    modes, an outline color could be defined by setStrokeColorRGB() too""")
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   455
    c.drawText(t)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   456
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   457
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   458
    t = c.beginText(inch, 2.75 * inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   459
    t.setFont('Times-Bold',36)
43
71baccf1c57f Canvas has two methods setFillColor(aColor) and setStrokeColor(aColor)
andy_robinson
parents: 42
diff changeset
   460
    t.setFillColor(colors.green)  #green
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   461
    t.textLine('Green fill, no stroke')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   462
    
43
71baccf1c57f Canvas has two methods setFillColor(aColor) and setStrokeColor(aColor)
andy_robinson
parents: 42
diff changeset
   463
    #t.setStrokeColorRGB(1,0,0)  #ou can do this in a text object, or the canvas.
71baccf1c57f Canvas has two methods setFillColor(aColor) and setStrokeColor(aColor)
andy_robinson
parents: 42
diff changeset
   464
    t.setStrokeColor(colors.red)  #ou can do this in a text object, or the canvas.
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   465
    t.setTextRenderMode(2)   # fill and stroke
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   466
    t.textLine('Green fill, red stroke - yuk!')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   467
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   468
    t.setTextRenderMode(0)   # back to default - fill only
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   469
    t.setFillColorRGB(0,0,0)   #back to default
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   470
    t.setStrokeColorRGB(0,0,0) #ditto
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   471
    c.drawText(t)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   472
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   473
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   474
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   475
#########################################################################
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   476
#
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   477
#  Page 5 - coord transforms
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   478
#
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   479
#########################################################################
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   480
    c.showPage()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   481
    framePage(c, "Coordinate Transforms")
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   482
    c.setFont('Times-Roman', 12)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   483
    t = c.beginText(inch, 10 * inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   484
    t.textLines("""This shows coordinate transformations.  We draw a set of axes,
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   485
    moving down the page and transforming space before each one.
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   486
    You can use saveState() and restoreState() to unroll transformations.
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   487
    Note that functions which track the text cursor give the cursor position
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   488
    in the current coordinate system; so if you set up a 6 inch high frame
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   489
    2 inches down the page to draw text in, and move the origin to its top
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   490
    left, you should stop writing text after six inches and not eight.""")
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   491
    c.drawText(t)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   492
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   493
    drawAxes(c, "0.  at origin")
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   494
    c.addLiteral('%about to translate space')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   495
    c.translate(2*inch, 7 * inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   496
    drawAxes(c, '1. translate near top of page')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   497
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   498
    c.saveState()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   499
    c.translate(1*inch, -2 * inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   500
    drawAxes(c, '2. down 2 inches, across 1')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   501
    c.restoreState()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   502
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   503
    c.saveState()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   504
    c.translate(0, -3 * inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   505
    c.scale(2, -1)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   506
    drawAxes(c, '3. down 3 from top, scale (2, -1)')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   507
    c.restoreState()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   508
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   509
    c.saveState()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   510
    c.translate(0, -5 * inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   511
    c.rotate(-30)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   512
    drawAxes(c, "4. down 5, rotate 30' anticlockwise")
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   513
    c.restoreState()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   514
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   515
    c.saveState()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   516
    c.translate(3 * inch, -5 * inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   517
    c.skew(0,30)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   518
    drawAxes(c, "5. down 5, 3 across, skew beta 30")
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   519
    c.restoreState()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   520
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   521
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   522
#########################################################################
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   523
#
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   524
#  Page 6 - clipping
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   525
#
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   526
#########################################################################
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   527
    c.showPage()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   528
    framePage(c, "Clipping")
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   529
    c.setFont('Times-Roman', 12)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   530
    t = c.beginText(inch, 10 * inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   531
    t.textLines("""This shows clipping at work. We draw a chequerboard of rectangles
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   532
    into a path object, and clip it.  This then forms a mask which limits the region of
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   533
    the page on which one can draw.  This paragraph was drawn after setting the clipping
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   534
    path, and so you should only see part of the text.""")
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   535
    c.drawText(t)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   536
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   537
    c.saveState()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   538
    #c.setFillColorRGB(0,0,1)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   539
    p = c.beginPath()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   540
    #make a chesboard effect, 1 cm squares
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   541
    for i in range(14):
42
ba8c232f544e Moved inch and cm definitions to reportlab.lib.units and amended all demos
andy_robinson
parents: 16
diff changeset
   542
        x0 = (3 + i) * cm
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   543
        for j in range(7):
42
ba8c232f544e Moved inch and cm definitions to reportlab.lib.units and amended all demos
andy_robinson
parents: 16
diff changeset
   544
            y0 = (16 + j) * cm
ba8c232f544e Moved inch and cm definitions to reportlab.lib.units and amended all demos
andy_robinson
parents: 16
diff changeset
   545
            p.rect(x0, y0, 0.85*cm, 0.85*cm)
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   546
    c.addLiteral('%Begin clip path')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   547
    c.clipPath(p)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   548
    c.addLiteral('%End clip path')
42
ba8c232f544e Moved inch and cm definitions to reportlab.lib.units and amended all demos
andy_robinson
parents: 16
diff changeset
   549
    t = c.beginText(3 * cm, 22.5 * cm)
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   550
    t.textLines("""This shows clipping at work.  We draw a chequerboard of rectangles
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   551
    into a path object, and clip it.  This then forms a mask which limits the region of
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   552
    the page on which one can draw.  This paragraph was drawn after setting the clipping
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   553
    path, and so you should only see part of the text.
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   554
        This shows clipping at work.  We draw a chequerboard of rectangles
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   555
    into a path object, and clip it.  This then forms a mask which limits the region of
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   556
    the page on which one can draw.  This paragraph was drawn after setting the clipping
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   557
    path, and so you should only see part of the text.
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   558
        This shows clipping at work.  We draw a chequerboard of rectangles
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   559
    into a path object, and clip it.  This then forms a mask which limits the region of
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   560
    the page on which one can draw.  This paragraph was drawn after setting the clipping
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   561
    path, and so you should only see part of the text.""")
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   562
    c.drawText(t)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   563
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   564
    c.restoreState()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   565
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   566
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   567
    t = c.beginText(inch, 5 * inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   568
    t.textLines("""You can also use text as an outline for clipping with the text render mode.
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   569
        The API is not particularly clean on this and one has to follow the right sequence;
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   570
        this can be optimized shortly.""")
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   571
    c.drawText(t)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   572
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   573
    #first the outline
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   574
    c.saveState()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   575
    t = c.beginText(inch, 3.0 * inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   576
    t.setFont('Helvetica-BoldOblique',108)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   577
    t.setTextRenderMode(5)  #stroke and add to path
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   578
    t.textLine('Python!')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   579
    t.setTextRenderMode(0)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   580
    c.drawText(t)    #this will make a clipping mask
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   581
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   582
    #now some small stuff which wil be drawn into the current clip mask
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   583
    t = c.beginText(inch, 4 * inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   584
    t.setFont('Times-Roman',6)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   585
    t.textLines((('spam ' * 40) + '\n') * 15)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   586
    c.drawText(t)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   587
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   588
    #now reset canvas to get rid of the clipping mask    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   589
    c.restoreState()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   590
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   591
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   592
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   593
#########################################################################
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   594
#
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   595
#  Page 7 - images
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   596
#
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   597
#########################################################################
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   598
    c.showPage()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   599
    framePage(c, "Images")
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   600
    c.setFont('Times-Roman', 12)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   601
    t = c.beginText(inch, 10 * inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   602
    try:
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   603
        import Image
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   604
    except:
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   605
        t.textOut("Python Imaging Library not found!  You need it to see images.")
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   606
        c.save()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   607
        return
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   608
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   609
        
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   610
    t.textLines("""This shows image capabilities.  If I've done things
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   611
        right, the bitmap should have its bottom left corner aligned
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   612
        with the crosshairs.""")
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   613
    t.textLines("""PDFgen uses the Python Imaging Library to process
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   614
        a very wide variety of image formats.  Although some processing
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   615
        is required, cached versions of the image are prepared and
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   616
        stored in the project directory, so that subsequent builds of
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   617
        an image-rich document are very fast indeed.""")
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   618
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   619
    c.drawText(t)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   620
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   621
    c.drawInlineImage('PythonPowered.gif',2*inch, 7*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   622
    c.line(1.5*inch, 7*inch, 4*inch, 7*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   623
    c.line(2*inch, 6.5*inch, 2*inch, 8*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   624
    c.drawString(4.5 * inch, 7.25*inch, 'image drawn at natural size')
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   625
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   626
    c.drawInlineImage('PythonPowered.gif',2*inch, 4*inch, inch, inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   627
    c.line(1.5*inch, 4*inch, 4*inch, 4*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   628
    c.line(2*inch, 3.5*inch, 2*inch, 5*inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   629
    c.drawString(4.5 * inch, 4.25*inch, 'image distorted to fit box')
55
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   630
    
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   631
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   632
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   633
#########################################################################
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   634
#
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   635
#  Page 8 - Forms and simple links
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   636
#
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   637
#########################################################################
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   638
    c.showPage()
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   639
    framePage(c, "Forms and Links")
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   640
    c.setFont('Times-Roman', 12)
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   641
    t = c.beginText(inch, 10 * inch)
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   642
    t.textLines("""Forms are sequences of text or graphics operations
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   643
      which are stored only once in a PDF file and used as many times
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   644
      as desired.  The blue logo bar to the left is an example of a form
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   645
      in this document.  See the function framePageForm in this demo script
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   646
      for an example of how to use canvas.beginForm(name, ...) ... canvas.endForm().
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   647
      
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   648
      Documents can also contain cross references where (for example) a rectangle
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   649
      on a page may be bound to a position on another page.  If the user clicks
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   650
      on the rectangle the PDF viewer moves to the bound position on the other
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   651
      page.  There are many other types of annotations and links supported by PDF.
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   652
      
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   653
      For example there is a bookmark to each page in this document and below
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   654
      is a browsable index that jumps to those pages.
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   655
      """)
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   656
    c.drawText(t)
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   657
    
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   658
    nentries = len(titlelist)
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   659
    xmargin = 3*inch
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   660
    xmax = 7*inch
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   661
    ystart = 6.54*inch
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   662
    ydelta = 0.4*inch
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   663
    for i in range(nentries):
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   664
        yposition = ystart - i*ydelta
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   665
        title = titlelist[i]
6eeb7f9994c7 added demos for forms and links
aaron_watters
parents: 43
diff changeset
   666
        c.drawString(xmargin, yposition, title)
231
eb5d3b398a4f removed 0's on outline and link operations
aaron_watters
parents: 167
diff changeset
   667
        c.linkAbsolute(title, title, (xmargin-ydelta/4, yposition-ydelta/4, xmax, yposition+ydelta/2))
61
cf3fcb2d65e9 added demonstration of outline trees
aaron_watters
parents: 55
diff changeset
   668
    ### now do stuff for the outline
cf3fcb2d65e9 added demonstration of outline trees
aaron_watters
parents: 55
diff changeset
   669
    #for x in outlinenametree: print x
cf3fcb2d65e9 added demonstration of outline trees
aaron_watters
parents: 55
diff changeset
   670
    #stop
135
6f634b913387 added demonstration of new AddOutlineEntry0 api
aaron_watters
parents: 63
diff changeset
   671
    #apply(c.setOutlineNames0, tuple(outlinenametree))
0
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   672
    c.save()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   673
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   674
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   675
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   676
def pageShapes(c):
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   677
    """Demonstrates the basic lines and shapes"""
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   678
    c.showPage()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   679
    framePage(c, "Basic line and shape routines""")
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   680
    c.setTextOrigin(inch, 10 * inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   681
    c.setFont('Times-Roman', 12)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   682
    c.textLines("""pdfgen provides some basic routines for drawing straight and curved lines,
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   683
    and also for solid shapes.""")
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   684
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   685
    y = 9 * inch
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   686
    d = DocBlock()
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   687
    d.comment1 = 'Lesson one'
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   688
    d.code = "canvas.textOut('hello, world')" 
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   689
    print d.code
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   690
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   691
    d.comment2 = 'Lesson two'
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   692
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   693
    d.draw(c, inch, 9 * inch)
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   694
    
f19e0a2433ab Initial revision
gmcm
parents:
diff changeset
   695
if __name__ == "__main__":
6
eb791971b252 Added license, __version__ and Logi comment
rgbecker
parents: 0
diff changeset
   696
    run()