reportlab/demos/odyssey/odyssey.py
author rgbecker
Wed, 25 Oct 2000 08:57:46 +0000
changeset 494 54257447cfe9
parent 251 6f6cd14069f6
child 1677 1450177dd19e
permissions -rw-r--r--
Changed to indirect copyright
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
494
54257447cfe9 Changed to indirect copyright
rgbecker
parents: 251
diff changeset
     1
#copyright ReportLab Inc. 2000
54257447cfe9 Changed to indirect copyright
rgbecker
parents: 251
diff changeset
     2
#see license.txt for license details
54257447cfe9 Changed to indirect copyright
rgbecker
parents: 251
diff changeset
     3
#history http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/reportlab/demos/odyssey/odyssey.py?cvsroot=reportlab
54257447cfe9 Changed to indirect copyright
rgbecker
parents: 251
diff changeset
     4
#$Header: /tmp/reportlab/reportlab/demos/odyssey/odyssey.py,v 1.9 2000/10/25 08:57:44 rgbecker Exp $
54257447cfe9 Changed to indirect copyright
rgbecker
parents: 251
diff changeset
     5
__version__=''' $Id: odyssey.py,v 1.9 2000/10/25 08:57:44 rgbecker Exp $ '''
16
f9c7525619fb Docstring & other fixes
rgbecker
parents: 10
diff changeset
     6
___doc__=''
4
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
     7
#odyssey.py
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
     8
#
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
     9
#Demo/benchmark of PDFgen rendering Homer's Odyssey.
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    10
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    11
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    12
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    13
#results on my humble P266 with 64MB:
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    14
# Without page compression:
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    15
# 239 pages in 3.76 seconds = 77 pages per second
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    16
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    17
# With textOut rather than textLine, i.e. computing width
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    18
# of every word as we would for wrapping:
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    19
# 239 pages in 10.83 seconds = 22 pages per second
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    20
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    21
# With page compression and textLine():
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    22
# 239 pages in 39.39 seconds = 6 pages per second
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    23
10
0cb88428a663 Conversion to reportlab package
rgbecker
parents: 7
diff changeset
    24
from reportlab.pdfgen import canvas
72
2b88c2668c26 Fix to timing page count, try to read full text
rgbecker
parents: 42
diff changeset
    25
import time, os
4
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    26
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    27
42
ba8c232f544e Moved inch and cm definitions to reportlab.lib.units and amended all demos
andy_robinson
parents: 19
diff changeset
    28
from reportlab.lib.units import inch, cm
ba8c232f544e Moved inch and cm definitions to reportlab.lib.units and amended all demos
andy_robinson
parents: 19
diff changeset
    29
from reportlab.lib.pagesizes import A4
4
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    30
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    31
#precalculate some basics
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    32
top_margin = A4[1] - inch
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    33
bottom_margin = inch
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    34
left_margin = inch
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    35
right_margin = A4[0] - inch
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    36
frame_width = right_margin - left_margin
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    37
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    38
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    39
def drawPageFrame(canv):
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    40
    canv.line(left_margin, top_margin, right_margin, top_margin)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    41
    canv.setFont('Times-Italic',12)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    42
    canv.drawString(left_margin, top_margin + 2, "Homer's Odyssey")
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    43
    canv.line(left_margin, top_margin, right_margin, top_margin)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    44
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    45
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    46
    canv.line(left_margin, bottom_margin, right_margin, bottom_margin)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    47
    canv.drawCentredString(0.5*A4[0], 0.5 * inch,
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    48
               "Page %d" % canv.getPageNumber())
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    49
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    50
    
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    51
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    52
def run():
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    53
    started = time.time()
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    54
    canv = canvas.Canvas('odyssey.pdf')
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    55
    canv.setPageCompression(0)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    56
    drawPageFrame(canv)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    57
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    58
    #do some title page stuff
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    59
    canv.setFont("Times-Bold", 36)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    60
    canv.drawCentredString(0.5 * A4[0], 7 * inch, "Homer's Odyssey")
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    61
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    62
    canv.setFont("Times-Bold", 18)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    63
    canv.drawCentredString(0.5 * A4[0], 5 * inch, "Translated by Samuel Burton")
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    64
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    65
    canv.setFont("Times-Bold", 12)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    66
    tx = canv.beginText(left_margin, 3 * inch)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    67
    tx.textLine("This is a demo-cum-benchmark for PDFgen.  It renders the complete text of Homer's Odyssey")
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    68
    tx.textLine("from a text file.  On my humble P266, it does 77 pages per secondwhile creating a 238 page")
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    69
    tx.textLine("document.  If it is asked to computer text metrics, measuring the width of each word as ")
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    70
    tx.textLine("one would for paragraph wrapping, it still manages 22 pages per second.")
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    71
    tx.textLine("")
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    72
    tx.textLine("Andy Robinson, Robinson Analytics Ltd.")
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    73
    canv.drawText(tx)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    74
    
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    75
    canv.showPage()
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    76
    #on with the text...
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    77
    drawPageFrame(canv)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    78
    
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    79
    canv.setFont('Times-Roman', 12)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    80
    tx = canv.beginText(left_margin, top_margin - 0.5*inch)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    81
    
251
6f6cd14069f6 test filename case fix
rgbecker
parents: 72
diff changeset
    82
    for fn in ('odyssey.full.txt','odyssey.txt'):
72
2b88c2668c26 Fix to timing page count, try to read full text
rgbecker
parents: 42
diff changeset
    83
        if os.path.isfile(fn):
2b88c2668c26 Fix to timing page count, try to read full text
rgbecker
parents: 42
diff changeset
    84
            break
2b88c2668c26 Fix to timing page count, try to read full text
rgbecker
parents: 42
diff changeset
    85
2b88c2668c26 Fix to timing page count, try to read full text
rgbecker
parents: 42
diff changeset
    86
    data = open(fn,'r').readlines()
4
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    87
    for line in data:
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    88
        #this just does it the fast way...
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    89
        tx.textLine(line)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    90
        #this forces it to do text metrics, which would be the slow
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    91
        #part if we were wrappng paragraphs.
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    92
        #canv.textOut(line)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    93
        #canv.textLine('')
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    94
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    95
        #page breaking        
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    96
        y = tx.getY()   #get y coordinate
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    97
        if y < bottom_margin + 0.5*inch:
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    98
            canv.drawText(tx)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    99
            canv.showPage()
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   100
            drawPageFrame(canv)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   101
            canv.setFont('Times-Roman', 12)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   102
            tx = canv.beginText(left_margin, top_margin - 0.5*inch)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   103
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   104
            #page
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   105
            pg = canv.getPageNumber()
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   106
            if pg % 10 == 0:
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   107
                print 'formatted page %d' % canv.getPageNumber()
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   108
19
5b4da60fa383 trailing text/Odyssey fix
rgbecker
parents: 16
diff changeset
   109
    if tx:
5b4da60fa383 trailing text/Odyssey fix
rgbecker
parents: 16
diff changeset
   110
        canv.drawText(tx)
5b4da60fa383 trailing text/Odyssey fix
rgbecker
parents: 16
diff changeset
   111
        canv.showPage()
5b4da60fa383 trailing text/Odyssey fix
rgbecker
parents: 16
diff changeset
   112
        drawPageFrame(canv)
5b4da60fa383 trailing text/Odyssey fix
rgbecker
parents: 16
diff changeset
   113
		
4
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   114
    print 'about to write to disk...'
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   115
    
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   116
    canv.save()
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   117
    
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   118
    finished = time.time()
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   119
    elapsed = finished - started
72
2b88c2668c26 Fix to timing page count, try to read full text
rgbecker
parents: 42
diff changeset
   120
    pages = canv.getPageNumber()-1
4
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   121
    speed =  pages / elapsed
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   122
    print '%d pages in %0.2f seconds = %0.2f pages per second' % (
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   123
                pages, elapsed, speed)
251
6f6cd14069f6 test filename case fix
rgbecker
parents: 72
diff changeset
   124
 
4
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   125
if __name__=='__main__':
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   126
    run()