1testannotations="""
2def annotations(canvas):
3    from reportlab.lib.units import inch
4    canvas.drawString(inch, 2.5*inch,
5       "setAuthor, setTitle, setSubject have no visible effect")
6    canvas.drawString(inch, inch, "But if you are viewing this document dynamically")
7    canvas.drawString(inch, 0.5*inch, "please look at File/Document Info")
8    canvas.setAuthor("the ReportLab Team")
9    canvas.setTitle("ReportLab PDF Generation User Guide")
10    canvas.setSubject("How to Generate PDF files using the ReportLab modules")
11"""
12
13# magic function making module
14
15test1 = """
16def f(a,b):
17    print "it worked", a, b
18    return a+b
19"""
20
21test2 = """
22def g(n):
23    if n==0: return 1
24    else: return n*g(n-1)
25    """
26
27testhello = """
28def hello(c):
29    from reportlab.lib.units import inch
30    # move the origin up and to the left
31    c.translate(inch,inch)
32    # define a large font
33    c.setFont("Helvetica", 14)
34    # choose some colors
35    c.setStrokeColorRGB(0.2,0.5,0.3)
36    c.setFillColorRGB(1,0,1)
37    # draw some lines
38    c.line(0,0,0,1.7*inch)
39    c.line(0,0,1*inch,0)
40    # draw a rectangle
41    c.rect(0.2*inch,0.2*inch,1*inch,1.5*inch, fill=1)
42    # make text go straight up
43    c.rotate(90)
44    # change color
45    c.setFillColorRGB(0,0,0.77)
46    # say hello (note after rotate the y coord needs to be negative!)
47    c.drawString(0.3*inch, -inch, "Hello World")
48"""
49
50testcoords = """
51def coords(canvas):
52    from reportlab.lib.units import inch
53    from reportlab.lib.colors import pink, black, red, blue, green
54    c = canvas
55    c.setStrokeColor(pink)
56    c.grid([inch, 2*inch, 3*inch, 4*inch], [0.5*inch, inch, 1.5*inch, 2*inch, 2.5*inch])
57    c.setStrokeColor(black)
58    c.setFont("Times-Roman", 20)
59    c.drawString(0,0, "(0,0) the Origin")
60    c.drawString(2.5*inch, inch, "(2.5,1) in inches")
61    c.drawString(4*inch, 2.5*inch, "(4, 2.5)")
62    c.setFillColor(red)
63    c.rect(0,2*inch,0.2*inch,0.3*inch, fill=1)
64    c.setFillColor(green)
65    c.circle(4.5*inch, 0.4*inch, 0.2*inch, fill=1)
66"""
67
68testtranslate = """
69def translate(canvas):
70    from reportlab.lib.units import cm
71    canvas.translate(2.3*cm, 0.3*cm)
72    coords(canvas)
73    """
74
75testscale = """
76def scale(canvas):
77    canvas.scale(0.75, 0.5)
78    coords(canvas)
79"""
80
81testscaletranslate = """
82def scaletranslate(canvas):
83    from reportlab.lib.units import inch
84    canvas.setFont("Courier-BoldOblique", 12)
85    # save the state
86    canvas.saveState()
87    # scale then translate
88    canvas.scale(0.3, 0.5)
89    canvas.translate(2.4*inch, 1.5*inch)
90    canvas.drawString(0, 2.7*inch, "Scale then translate")
91    coords(canvas)
92    # forget the scale and translate...
93    canvas.restoreState()
94    # translate then scale
95    canvas.translate(2.4*inch, 1.5*inch)
96    canvas.scale(0.3, 0.5)
97    canvas.drawString(0, 2.7*inch, "Translate then scale")
98    coords(canvas)
99"""
100
101testmirror = """
102def mirror(canvas):
103    from reportlab.lib.units import inch
104    canvas.translate(5.5*inch, 0)
105    canvas.scale(-1.0, 1.0)
106    coords(canvas)
107"""
108
109testcolors = """
110def colors(canvas):
111    from reportlab.lib import colors
112    from reportlab.lib.units import inch
113    black = colors.black
114    y = x = 0; dy=inch*3/4.0; dx=inch*5.5/5; w=h=dy/2; rdx=(dx-w)/2
115    rdy=h/5.0; texty=h+2*rdy
116    canvas.setFont("Helvetica",10)
117    for [namedcolor, name] in (
118           [colors.lavenderblush, "lavenderblush"],
119           [colors.lawngreen, "lawngreen"],
120           [colors.lemonchiffon, "lemonchiffon"],
121           [colors.lightblue, "lightblue"],
122           [colors.lightcoral, "lightcoral"]):
123        canvas.setFillColor(namedcolor)
124        canvas.rect(x+rdx, y+rdy, w, h, fill=1)
125        canvas.setFillColor(black)
126        canvas.drawCentredString(x+dx/2, y+texty, name)
127        x = x+dx
128    y = y + dy; x = 0
129    for rgb in [(1,0,0), (0,1,0), (0,0,1), (0.5,0.3,0.1), (0.4,0.5,0.3)]:
130        r,g,b = rgb
131        canvas.setFillColorRGB(r,g,b)
132        canvas.rect(x+rdx, y+rdy, w, h, fill=1)
133        canvas.setFillColor(black)
134        canvas.drawCentredString(x+dx/2, y+texty, "r%s g%s b%s"%rgb)
135        x = x+dx
136    y = y + dy; x = 0
137    for cmyk in [(1,0,0,0), (0,1,0,0), (0,0,1,0), (0,0,0,1), (0,0,0,0)]:
138        c,m,y1,k = cmyk
139        canvas.setFillColorCMYK(c,m,y1,k)
140        canvas.rect(x+rdx, y+rdy, w, h, fill=1)
141        canvas.setFillColor(black)
142        canvas.drawCentredString(x+dx/2, y+texty, "c%s m%s y%s k%s"%cmyk)
143        x = x+dx
144    y = y + dy; x = 0
145    for gray in (0.0, 0.25, 0.50, 0.75, 1.0):
146        canvas.setFillGray(gray)
147        canvas.rect(x+rdx, y+rdy, w, h, fill=1)
148        canvas.setFillColor(black)
149        canvas.drawCentredString(x+dx/2, y+texty, "gray: %s"%gray)
150        x = x+dx
151"""
152
153testspumoni = """
154def spumoni(canvas):
155    from reportlab.lib.units import inch
156    from reportlab.lib.colors import pink, green, brown, white
157    x = 0; dx = 0.4*inch
158    for i in range(4):
159        for color in (pink, green, brown):
160            canvas.setFillColor(color)
161            canvas.rect(x,0,dx,3*inch,stroke=0,fill=1)
162            x = x+dx
163    canvas.setFillColor(white)
164    canvas.setStrokeColor(white)
165    canvas.setFont("Helvetica-Bold", 85)
166    canvas.drawCentredString(2.75*inch, 1.3*inch, "SPUMONI")
167"""
168
169testspumoni2 = """
170def spumoni2(canvas):
171    from reportlab.lib.units import inch
172    from reportlab.lib.colors import pink, green, brown, white, black
173    # draw the previous drawing
174    spumoni(canvas)
175    # now put an ice cream cone on top of it:
176    # first draw a triangle (ice cream cone)
177    p = canvas.beginPath()
178    xcenter = 2.75*inch
179    radius = 0.45*inch
180    p.moveTo(xcenter-radius, 1.5*inch)
181    p.lineTo(xcenter+radius, 1.5*inch)
182    p.lineTo(xcenter, 0)
183    canvas.setFillColor(brown)
184    canvas.setStrokeColor(black)
185    canvas.drawPath(p, fill=1)
186    # draw some circles (scoops)
187    y = 1.5*inch
188    for color in (pink, green, brown):
189        canvas.setFillColor(color)
190        canvas.circle(xcenter, y, radius, fill=1)
191        y = y+radius
192"""
193
194testbezier = """
195def bezier(canvas):
196    from reportlab.lib.colors import yellow, green, red, black
197    from reportlab.lib.units import inch
198    i = inch
199    d = i/4
200    # define the bezier curve control points
201    x1,y1, x2,y2, x3,y3, x4,y4 = d,1.5*i, 1.5*i,d, 3*i,d, 5.5*i-d,3*i-d
202    # draw a figure enclosing the control points
203    canvas.setFillColor(yellow)
204    p = canvas.beginPath()
205    p.moveTo(x1,y1)
206    for (x,y) in [(x2,y2), (x3,y3), (x4,y4)]:
207        p.lineTo(x,y)
208    canvas.drawPath(p, fill=1, stroke=0)
209    # draw the tangent lines
210    canvas.setLineWidth(inch*0.1)
211    canvas.setStrokeColor(green)
212    canvas.line(x1,y1,x2,y2)
213    canvas.setStrokeColor(red)
214    canvas.line(x3,y3,x4,y4)
215    # finally draw the curve
216    canvas.setStrokeColor(black)
217    canvas.bezier(x1,y1, x2,y2, x3,y3, x4,y4)
218"""
219
220testbezier2 = """
221def bezier2(canvas):
222    from reportlab.lib.colors import yellow, green, red, black
223    from reportlab.lib.units import inch
224    # make a sequence of control points
225    xd,yd = 5.5*inch/2, 3*inch/2
226    xc,yc = xd,yd
227    dxdy = [(0,0.33), (0.33,0.33), (0.75,1), (0.875,0.875),
228            (0.875,0.875), (1,0.75), (0.33,0.33), (0.33,0)]
229    pointlist = []
230    for xoffset in (1,-1):
231        yoffset = xoffset
232        for (dx,dy) in dxdy:
233            px = xc + xd*xoffset*dx
234            py = yc + yd*yoffset*dy
235            pointlist.append((px,py))
236        yoffset = -xoffset
237        for (dy,dx) in dxdy:
238            px = xc + xd*xoffset*dx
239            py = yc + yd*yoffset*dy
240            pointlist.append((px,py))
241    # draw tangent lines and curves
242    canvas.setLineWidth(inch*0.1)
243    while pointlist:
244        [(x1,y1),(x2,y2),(x3,y3),(x4,y4)] = pointlist[:4]
245        del pointlist[:4]
246        canvas.setLineWidth(inch*0.1)
247        canvas.setStrokeColor(green)
248        canvas.line(x1,y1,x2,y2)
249        canvas.setStrokeColor(red)
250        canvas.line(x3,y3,x4,y4)
251        # finally draw the curve
252        canvas.setStrokeColor(black)
253        canvas.bezier(x1,y1, x2,y2, x3,y3, x4,y4)
254"""
255
256testpencil = """
257def pencil(canvas, text="No.2"):
258    from reportlab.lib.colors import yellow, red, black,white
259    from reportlab.lib.units import inch
260    u = inch/10.0
261    canvas.setStrokeColor(black)
262    canvas.setLineWidth(4)
263    # draw erasor
264    canvas.setFillColor(red)
265    canvas.circle(30*u, 5*u, 5*u, stroke=1, fill=1)
266    # draw all else but the tip (mainly rectangles with different fills)
267    canvas.setFillColor(yellow)
268    canvas.rect(10*u,0,20*u,10*u, stroke=1, fill=1)
269    canvas.setFillColor(black)
270    canvas.rect(23*u,0,8*u,10*u,fill=1)
271    canvas.roundRect(14*u, 3.5*u, 8*u, 3*u, 1.5*u, stroke=1, fill=1)
272    canvas.setFillColor(white)
273    canvas.rect(25*u,u,1.2*u,8*u, fill=1,stroke=0)
274    canvas.rect(27.5*u,u,1.2*u,8*u, fill=1, stroke=0)
275    canvas.setFont("Times-Roman", 3*u)
276    canvas.drawCentredString(18*u, 4*u, text)
277    # now draw the tip
278    penciltip(canvas,debug=0)
279    # draw broken lines across the body.
280    canvas.setDash([10,5,16,10],0)
281    canvas.line(11*u,2.5*u,22*u,2.5*u)
282    canvas.line(22*u,7.5*u,12*u,7.5*u)
283    """
284
285testpenciltip = """
286def penciltip(canvas, debug=1):
287    from reportlab.lib.colors import tan, black, green
288    from reportlab.lib.units import inch
289    u = inch/10.0
290    canvas.setLineWidth(4)
291    if debug:
292        canvas.scale(2.8,2.8) # make it big
293        canvas.setLineWidth(1) # small lines
294    canvas.setStrokeColor(black)
295    canvas.setFillColor(tan)
296    p = canvas.beginPath()
297    p.moveTo(10*u,0)
298    p.lineTo(0,5*u)
299    p.lineTo(10*u,10*u)
300    p.curveTo(11.5*u,10*u, 11.5*u,7.5*u, 10*u,7.5*u)
301    p.curveTo(12*u,7.5*u, 11*u,2.5*u, 9.7*u,2.5*u)
302    p.curveTo(10.5*u,2.5*u, 11*u,0, 10*u,0)
303    canvas.drawPath(p, stroke=1, fill=1)
304    canvas.setFillColor(black)
305    p = canvas.beginPath()
306    p.moveTo(0,5*u)
307    p.lineTo(4*u,3*u)
308    p.lineTo(5*u,4.5*u)
309    p.lineTo(3*u,6.5*u)
310    canvas.drawPath(p, stroke=1, fill=1)
311    if debug:
312        canvas.setStrokeColor(green) # put in a frame of reference
313        canvas.grid([0,5*u,10*u,15*u], [0,5*u,10*u])
314"""
315
316testnoteannotation = """
317from reportlab.platypus.flowables import Flowable
318class NoteAnnotation(Flowable):
319    '''put a pencil in the margin.'''
320    def wrap(self, *args):
321        return (1,10) # I take up very little space! (?)
322    def draw(self):
323        canvas = self.canv
324        canvas.translate(-10,-10)
325        canvas.rotate(180)
326        canvas.scale(0.2,0.2)
327        pencil(canvas, text="NOTE")
328"""
329
330testhandannotation = """
331from reportlab.platypus.flowables import Flowable
332from reportlab.lib.colors import tan, green
333class HandAnnotation(Flowable):
334    '''A hand flowable.'''
335    def __init__(self, xoffset=0, size=None, fillcolor=tan, strokecolor=green):
336        from reportlab.lib.units import inch
337        if size is None: size=4*inch
338        self.fillcolor, self.strokecolor = fillcolor, strokecolor
339        self.xoffset = xoffset
340        self.size = size
341        # normal size is 4 inches
342        self.scale = size/(4.0*inch)
343    def wrap(self, *args):
344        return (self.xoffset, self.size)
345    def draw(self):
346        canvas = self.canv
347        canvas.setLineWidth(6)
348        canvas.setFillColor(self.fillcolor)
349        canvas.setStrokeColor(self.strokecolor)
350        canvas.translate(self.xoffset+self.size,0)
351        canvas.rotate(90)
352        canvas.scale(self.scale, self.scale)
353        hand(canvas, debug=0, fill=1)
354"""
355
356lyrics = '''\
357well she hit Net Solutions
358and she registered her own .com site now
359and filled it up with yahoo profile pics
360she snarfed in one night now
361and she made 50 million when Hugh Hefner
362bought up the rights now
363and she'll have fun fun fun
364til her Daddy takes the keyboard away'''
365
366lyrics = lyrics.split("\n")
367testtextsize = """
368def textsize(canvas):
369    from reportlab.lib.units import inch
370    from reportlab.lib.colors import magenta, red
371    canvas.setFont("Times-Roman", 20)
372    canvas.setFillColor(red)
373    canvas.drawCentredString(2.75*inch, 2.5*inch, "Font size examples")
374    canvas.setFillColor(magenta)
375    size = 7
376    y = 2.3*inch
377    x = 1.3*inch
378    for line in lyrics:
379        canvas.setFont("Helvetica", size)
380        canvas.drawRightString(x,y,"%s points: " % size)
381        canvas.drawString(x,y, line)
382        y = y-size*1.2
383        size = size+1.5
384"""
385
386teststar = """
387def star(canvas, title="Title Here", aka="Comment here.",
388         xcenter=None, ycenter=None, nvertices=5):
389    from math import pi
390    from reportlab.lib.units import inch
391    radius=inch/3.0
392    if xcenter is None: xcenter=2.75*inch
393    if ycenter is None: ycenter=1.5*inch
394    canvas.drawCentredString(xcenter, ycenter+1.3*radius, title)
395    canvas.drawCentredString(xcenter, ycenter-1.4*radius, aka)
396    p = canvas.beginPath()
397    p.moveTo(xcenter,ycenter+radius)
398    from math import pi, cos, sin
399    angle = (2*pi)*2/5.0
400    startangle = pi/2.0
401    for vertex in range(nvertices-1):
402        nextangle = angle*(vertex+1)+startangle
403        x = xcenter + radius*cos(nextangle)
404        y = ycenter + radius*sin(nextangle)
405        p.lineTo(x,y)
406    if nvertices==5:
407       p.close()
408    canvas.drawPath(p)
409"""
410
411testjoins = """
412def joins(canvas):
413    from reportlab.lib.units import inch
414    # make lines big
415    canvas.setLineWidth(5)
416    star(canvas, "Default: mitered join", "0: pointed", xcenter = 1*inch)
417    canvas.setLineJoin(1)
418    star(canvas, "Round join", "1: rounded")
419    canvas.setLineJoin(2)
420    star(canvas, "Bevelled join", "2: square", xcenter=4.5*inch)
421"""
422
423testcaps = """
424def caps(canvas):
425    from reportlab.lib.units import inch
426    # make lines big
427    canvas.setLineWidth(5)
428    star(canvas, "Default", "no projection",xcenter = 1*inch,
429         nvertices=4)
430    canvas.setLineCap(1)
431    star(canvas, "Round cap", "1: ends in half circle", nvertices=4)
432    canvas.setLineCap(2)
433    star(canvas, "Square cap", "2: projects out half a width", xcenter=4.5*inch,
434       nvertices=4)
435"""
436
437testdashes = """
438def dashes(canvas):
439    from reportlab.lib.units import inch
440    # make lines big
441    canvas.setDash(6,3)
442    star(canvas, "Simple dashes", "6 points on, 3 off", xcenter = 1*inch)
443    canvas.setDash(1,2)
444    star(canvas, "Dots", "One on, two off")
445    canvas.setDash([1,1,3,3,1,4,4,1], 0)
446    star(canvas, "Complex Pattern", "[1,1,3,3,1,4,4,1]", xcenter=4.5*inch)
447"""
448
449testcursormoves1 = """
450def cursormoves1(canvas):
451    from reportlab.lib.units import inch
452    textobject = canvas.beginText()
453    textobject.setTextOrigin(inch, 2.5*inch)
454    textobject.setFont("Helvetica-Oblique", 14)
455    for line in lyrics:
456        textobject.textLine(line)
457    textobject.setFillGray(0.4)
458    textobject.textLines('''
459    With many apologies to the Beach Boys
460    and anyone else who finds this objectionable
461    ''')
462    canvas.drawText(textobject)
463"""
464
465testcursormoves2 = """
466def cursormoves2(canvas):
467    from reportlab.lib.units import inch
468    textobject = canvas.beginText()
469    textobject.setTextOrigin(2, 2.5*inch)
470    textobject.setFont("Helvetica-Oblique", 14)
471    for line in lyrics:
472        textobject.textOut(line)
473        textobject.moveCursor(14,14) # POSITIVE Y moves down!!!
474    textobject.setFillColorRGB(0.4,0,1)
475    textobject.textLines('''
476    With many apologies to the Beach Boys
477    and anyone else who finds this objectionable
478    ''')
479    canvas.drawText(textobject)
480"""
481
482testcharspace = """
483def charspace(canvas):
484    from reportlab.lib.units import inch
485    textobject = canvas.beginText()
486    textobject.setTextOrigin(3, 2.5*inch)
487    textobject.setFont("Helvetica-Oblique", 10)
488    charspace = 0
489    for line in lyrics:
490        textobject.setCharSpace(charspace)
491        textobject.textLine("%s: %s" %(charspace,line))
492        charspace = charspace+0.5
493    textobject.setFillGray(0.4)
494    textobject.textLines('''
495    With many apologies to the Beach Boys
496    and anyone else who finds this objectionable
497    ''')
498    canvas.drawText(textobject)
499"""
500
501testwordspace = """
502def wordspace(canvas):
503    from reportlab.lib.units import inch
504    textobject = canvas.beginText()
505    textobject.setTextOrigin(3, 2.5*inch)
506    textobject.setFont("Helvetica-Oblique", 12)
507    wordspace = 0
508    for line in lyrics:
509        textobject.setWordSpace(wordspace)
510        textobject.textLine("%s: %s" %(wordspace,line))
511        wordspace = wordspace+2.5
512    textobject.setFillColorCMYK(0.4,0,0.4,0.2)
513    textobject.textLines('''
514    With many apologies to the Beach Boys
515    and anyone else who finds this objectionable
516    ''')
517    canvas.drawText(textobject)
518"""
519testhorizontalscale = """
520def horizontalscale(canvas):
521    from reportlab.lib.units import inch
522    textobject = canvas.beginText()
523    textobject.setTextOrigin(3, 2.5*inch)
524    textobject.setFont("Helvetica-Oblique", 12)
525    horizontalscale = 80 # 100 is default
526    for line in lyrics:
527        textobject.setHorizScale(horizontalscale)
528        textobject.textLine("%s: %s" %(horizontalscale,line))
529        horizontalscale = horizontalscale+10
530    textobject.setFillColorCMYK(0.0,0.4,0.4,0.2)
531    textobject.textLines('''
532    With many apologies to the Beach Boys
533    and anyone else who finds this objectionable
534    ''')
535    canvas.drawText(textobject)
536"""
537testleading = """
538def leading(canvas):
539    from reportlab.lib.units import inch
540    textobject = canvas.beginText()
541    textobject.setTextOrigin(3, 2.5*inch)
542    textobject.setFont("Helvetica-Oblique", 14)
543    leading = 8
544    for line in lyrics:
545        textobject.setLeading(leading)
546        textobject.textLine("%s: %s" %(leading,line))
547        leading = leading+2.5
548    textobject.setFillColorCMYK(0.8,0,0,0.3)
549    textobject.textLines('''
550    With many apologies to the Beach Boys
551    and anyone else who finds this objectionable
552    ''')
553    canvas.drawText(textobject)
554"""
555
556testhand = """
557def hand(canvas, debug=1, fill=0):
558    (startx, starty) = (0,0)
559    curves = [
560      ( 0, 2), ( 0, 4), ( 0, 8), # back of hand
561      ( 5, 8), ( 7,10), ( 7,14),
562      (10,14), (10,13), ( 7.5, 8), # thumb
563      (13, 8), (14, 8), (17, 8),
564      (19, 8), (19, 6), (17, 6),
565      (15, 6), (13, 6), (11, 6), # index, pointing
566      (12, 6), (13, 6), (14, 6),
567      (16, 6), (16, 4), (14, 4),
568      (13, 4), (12, 4), (11, 4), # middle
569      (11.5, 4), (12, 4), (13, 4),
570      (15, 4), (15, 2), (13, 2),
571      (12.5, 2), (11.5, 2), (11, 2), # ring
572      (11.5, 2), (12, 2), (12.5, 2),
573      (14, 2), (14, 0), (12.5, 0),
574      (10, 0), (8, 0), (6, 0), # pinky, then close
575      ]
576    from reportlab.lib.units import inch
577    if debug: canvas.setLineWidth(6)
578    u = inch*0.2
579    p = canvas.beginPath()
580    p.moveTo(startx, starty)
581    ccopy = list(curves)
582    while ccopy:
583        [(x1,y1), (x2,y2), (x3,y3)] = ccopy[:3]
584        del ccopy[:3]
585        p.curveTo(x1*u,y1*u,x2*u,y2*u,x3*u,y3*u)
586    p.close()
587    canvas.drawPath(p, fill=fill)
588    if debug:
589        from reportlab.lib.colors import red, green
590        (lastx, lasty) = (startx, starty)
591        ccopy = list(curves)
592        while ccopy:
593            [(x1,y1), (x2,y2), (x3,y3)] = ccopy[:3]
594            del ccopy[:3]
595            canvas.setStrokeColor(red)
596            canvas.line(lastx*u,lasty*u, x1*u,y1*u)
597            canvas.setStrokeColor(green)
598            canvas.line(x2*u,y2*u, x3*u,y3*u)
599            (lastx,lasty) = (x3,y3)
600"""
601
602testhand2 = """
603def hand2(canvas):
604    canvas.translate(20,10)
605    canvas.setLineWidth(3)
606    canvas.setFillColorRGB(0.1, 0.3, 0.9)
607    canvas.setStrokeGray(0.5)
608    hand(canvas, debug=0, fill=1)
609"""
610
611testfonts = """
612def fonts(canvas):
613    from reportlab.lib.units import inch
614    text = "Now is the time for all good men to..."
615    x = 1.8*inch
616    y = 2.7*inch
617    for font in canvas.getAvailableFonts():
618        canvas.setFont(font, 10)
619        canvas.drawString(x,y,text)
620        canvas.setFont("Helvetica", 10)
621        canvas.drawRightString(x-10,y, font+":")
622        y = y-13
623"""
624
625testarcs = """
626def arcs(canvas):
627    from reportlab.lib.units import inch
628    canvas.setLineWidth(4)
629    canvas.setStrokeColorRGB(0.8, 1, 0.6)
630    # draw rectangles enclosing the arcs
631    canvas.rect(inch, inch, 1.5*inch, inch)
632    canvas.rect(3*inch, inch, inch, 1.5*inch)
633    canvas.setStrokeColorRGB(0, 0.2, 0.4)
634    canvas.setFillColorRGB(1, 0.6, 0.8)
635    p = canvas.beginPath()
636    p.moveTo(0.2*inch, 0.2*inch)
637    p.arcTo(inch, inch, 2.5*inch,2*inch, startAng=-30, extent=135)
638    p.arc(3*inch, inch, 4*inch, 2.5*inch, startAng=-45, extent=270)
639    canvas.drawPath(p, fill=1, stroke=1)
640"""
641testvariousshapes = """
642def variousshapes(canvas):
643    from reportlab.lib.units import inch
644    inch = int(inch)
645    canvas.setStrokeGray(0.5)
646    canvas.grid(range(0,11*inch/2,inch/2), range(0,7*inch/2,inch/2))
647    canvas.setLineWidth(4)
648    canvas.setStrokeColorRGB(0, 0.2, 0.7)
649    canvas.setFillColorRGB(1, 0.6, 0.8)
650    p = canvas.beginPath()
651    p.rect(0.5*inch, 0.5*inch, 0.5*inch, 2*inch)
652    p.circle(2.75*inch, 1.5*inch, 0.3*inch)
653    p.ellipse(3.5*inch, 0.5*inch, 1.2*inch, 2*inch)
654    canvas.drawPath(p, fill=1, stroke=1)
655"""
656
657testclosingfigures = """
658def closingfigures(canvas):
659    from reportlab.lib.units import inch
660    h = inch/3.0; k = inch/2.0
661    canvas.setStrokeColorRGB(0.2,0.3,0.5)
662    canvas.setFillColorRGB(0.8,0.6,0.2)
663    canvas.setLineWidth(4)
664    p = canvas.beginPath()
665    for i in (1,2,3,4):
666        for j in (1,2):
667            xc,yc = inch*i, inch*j
668            p.moveTo(xc,yc)
669            p.arcTo(xc-h, yc-k, xc+h, yc+k, startAng=0, extent=60*i)
670            # close only the first one, not the second one
671            if j==1:
672                p.close()
673    canvas.drawPath(p, fill=1, stroke=1)
674"""
675
676testforms = """
677def forms(canvas):
678    #first create a form...
679    canvas.beginForm("SpumoniForm")
680    #re-use some drawing functions from earlier
681    spumoni(canvas)
682    canvas.endForm()
683
684    #then draw it
685    canvas.doForm("SpumoniForm")
686"""
687
688def doctemplateillustration(canvas):
689    from reportlab.lib.units import inch
690    canvas.setFont("Helvetica", 10)
691    canvas.drawString(inch/4.0, 2.75*inch, "DocTemplate")
692    W = 4/3.0*inch
693    H = 2*inch
694    Wd = x = inch/4.0
695    Hd =y = inch/2.0
696    for name in ("two column", "chapter page", "title page"):
697        canvas.setFillColorRGB(0.5,1.0,1.0)
698        canvas.rect(x,y,W,H, fill=1)
699        canvas.setFillColorRGB(0,0,0)
700        canvas.drawString(x+inch/8, y+H-Wd, "PageTemplate")
701        canvas.drawCentredString(x+W/2.0, y-Wd, name)
702        x = x+W+Wd
703    canvas.saveState()
704    d = inch/16
705    dW = (W-3*d)/2.0
706    hD = H -2*d-Wd
707    canvas.translate(Wd+d, Hd+d)
708    for name in ("left Frame", "right Frame"):
709        canvas.setFillColorRGB(1.0,0.5,1.0)
710        canvas.rect(0,0, dW,hD, fill=1)
711        canvas.setFillGray(0.7)
712        dd= d/2.0
713        ddH = (hD-6*dd)/5.0
714        ddW = dW-2*dd
715        yy = dd
716        xx = dd
717        for i in range(5):
718            canvas.rect(xx,yy,ddW,ddH, fill=1, stroke=0)
719            yy = yy+ddH+dd
720        canvas.setFillColorRGB(0,0,0)
721        canvas.saveState()
722        canvas.rotate(90)
723        canvas.drawString(d,-dW/2, name)
724        canvas.restoreState()
725        canvas.translate(dW+d,0)
726    canvas.restoreState()
727    canvas.setFillColorRGB(1.0, 0.5, 1.0)
728    mx = Wd+W+Wd+d
729    my = Hd+d
730    mW = W-2*d
731    mH = H-d-Hd
732    canvas.rect(mx, my, mW, mH, fill=1)
733    canvas.rect(Wd+2*(W+Wd)+d, Hd+3*d, W-2*d, H/2.0, fill=1)
734    canvas.setFillGray(0.7)
735    canvas.rect(Wd+2*(W+Wd)+d+dd, Hd+5*d, W-2*d-2*dd, H/2.0-2*d-dd, fill=1)
736    xx = mx+dd
737    yy = my+mH/5.0
738    ddH = (mH-6*dd-mH/5.0)/3.0
739    ddW = mW - 2*dd
740    for i in range(3):
741        canvas.setFillGray(0.7)
742        canvas.rect(xx,yy,ddW,ddH, fill=1, stroke=1)
743        canvas.setFillGray(0)
744        canvas.drawString(xx+dd/2.0,yy+dd/2.0, "flowable %s" %(157-i))
745        yy = yy+ddH+dd
746    canvas.drawCentredString(3*Wd+2*W+W/2, Hd+H/2.0, "First Flowable")
747    canvas.setFont("Times-BoldItalic", 8)
748    canvas.setFillGray(0)
749    canvas.drawCentredString(mx+mW/2.0, my+mH+3*dd, "Chapter 6: Lubricants")
750    canvas.setFont("Times-BoldItalic", 10)
751    canvas.drawCentredString(3*Wd+2*W+W/2, Hd+H-H/4, "College Life")
752
753class PlatIllust:
754    #wrap the above for PP#
755    def __init__(self, x, y, scale=1):
756        self.x = x
757        self.y = y
758        self.scale = scale
759    def drawOn(self, canvas):
760        canvas.saveState()
761        canvas.translate(self.x, self.y)
762        canvas.scale(self.scale, self.scale)
763        doctemplateillustration(canvas)
764        canvas.restoreState()
765
766class PingoIllust:
767    #wrap the above for PP#
768    def __init__(self, x, y, scale=1):
769##        print 'Pingo illustration %f, %f, %f' % (x,y,scale)
770        self.x = x
771        self.y = y
772        self.scale = scale
773    def drawOn(self, canvas):
774        canvas.rect(self.x, self.y, 100,100, stroke=1, fill=1)
775##        from pingo import testdrawings
776##        from pingo import pingopdf
777##        drawing = testdrawings.getDrawing3()
778##        canvas.saveState()
779##        canvas.scale(self.scale, self.scale)
780##        pingopdf.draw(drawing, canvas, self.x, self.y)
781##        canvas.restoreState()
782
783# D = dir()
784g = globals()
785Dprime = {}
786for a,b in list(g.items()):
787    if a[:4]=="test" and isinstance(b,str):
788        #print 'for', a
789        #print b
790        b = b.strip()
791        exec(b+'\n')
792
793platypussetup = """
794from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer
795from reportlab.lib.styles import getSampleStyleSheet
796from reportlab.lib.pagesizes import DEFAULT_PAGE_SIZE
797from reportlab.lib.units import inch
798PAGE_HEIGHT=DEFAULT_PAGE_SIZE[1]; PAGE_WIDTH=DEFAULT_PAGE_SIZE[0]
799styles = getSampleStyleSheet()
800"""
801platypusfirstpage = """
802Title = "Hello world"
803pageinfo = "platypus example"
804def myFirstPage(canvas, doc):
805    canvas.saveState()
806    canvas.setFont('Times-Bold',16)
807    canvas.drawCentredString(PAGE_WIDTH/2.0, PAGE_HEIGHT-108, Title)
808    canvas.setFont('Times-Roman',9)
809    canvas.drawString(inch, 0.75 * inch, "First Page / %s" % pageinfo)
810    canvas.restoreState()
811"""
812platypusnextpage = """
813def myLaterPages(canvas, doc):
814    canvas.saveState()
815    canvas.setFont('Times-Roman',9)
816    canvas.drawString(inch, 0.75 * inch, "Page %d %s" % (doc.page, pageinfo))
817    canvas.restoreState()
818"""
819platypusgo = """
820def go():
821    doc = SimpleDocTemplate("phello.pdf")
822    Story = [Spacer(1,2*inch)]
823    style = styles["Normal"]
824    for i in range(100):
825        bogustext = ("This is Paragraph number %s.  " % i) *20
826        p = Paragraph(bogustext, style)
827        Story.append(p)
828        Story.append(Spacer(1,0.2*inch))
829    doc.build(Story, onFirstPage=myFirstPage, onLaterPages=myLaterPages)
830"""
831
832if __name__=="__main__":
833    # then do the platypus hello world
834    for b in platypussetup, platypusfirstpage, platypusnextpage, platypusgo:
835        b = b.strip()
836        exec(b+'\n')
837    go()
838