reportlab/demos/odyssey/odyssey.py
author rgbecker
Thu, 01 Jun 2000 09:41:12 +0000
changeset 251 6f6cd14069f6
parent 72 2b88c2668c26
child 494 54257447cfe9
permissions -rw-r--r--
test filename case fix
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
4
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
     1
###############################################################################
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
     2
#
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
     3
#	ReportLab Public License Version 1.0
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
     4
#
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
     5
#   Except for the change of names the spirit and intention of this
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
     6
#   license is the same as that of Python
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
     7
#
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
     8
#	(C) Copyright ReportLab Inc. 1998-2000.
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
     9
#
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    10
#
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    11
# All Rights Reserved
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    12
#
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    13
# Permission to use, copy, modify, and distribute this software and its
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    14
# documentation for any purpose and without fee is hereby granted, provided
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    15
# that the above copyright notice appear in all copies and that both that
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    16
# copyright notice and this permission notice appear in supporting
7
ca9eb4f68eab License text fixes
rgbecker
parents: 4
diff changeset
    17
# documentation, and that the name of ReportLab not be used
4
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    18
# in advertising or publicity pertaining to distribution of the software
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    19
# without specific, written prior permission. 
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    20
# 
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    21
#
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    22
# Disclaimer
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    23
#
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    24
# ReportLab Inc. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    25
# SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    26
# IN NO EVENT SHALL ReportLab BE LIABLE FOR ANY SPECIAL, INDIRECT
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    27
# OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    28
# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    29
# OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    30
# PERFORMANCE OF THIS SOFTWARE. 
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    31
#
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    32
###############################################################################
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    33
#	$Log: odyssey.py,v $
251
6f6cd14069f6 test filename case fix
rgbecker
parents: 72
diff changeset
    34
#	Revision 1.8  2000/06/01 09:41:12  rgbecker
6f6cd14069f6 test filename case fix
rgbecker
parents: 72
diff changeset
    35
#	test filename case fix
6f6cd14069f6 test filename case fix
rgbecker
parents: 72
diff changeset
    36
#
72
2b88c2668c26 Fix to timing page count, try to read full text
rgbecker
parents: 42
diff changeset
    37
#	Revision 1.7  2000/04/06 08:51:06  rgbecker
2b88c2668c26 Fix to timing page count, try to read full text
rgbecker
parents: 42
diff changeset
    38
#	Fix to timing page count, try to read full text
251
6f6cd14069f6 test filename case fix
rgbecker
parents: 72
diff changeset
    39
#	
42
ba8c232f544e Moved inch and cm definitions to reportlab.lib.units and amended all demos
andy_robinson
parents: 19
diff changeset
    40
#	Revision 1.6  2000/03/08 13:06:39  andy_robinson
ba8c232f544e Moved inch and cm definitions to reportlab.lib.units and amended all demos
andy_robinson
parents: 19
diff changeset
    41
#	Moved inch and cm definitions to reportlab.lib.units and amended all demos
72
2b88c2668c26 Fix to timing page count, try to read full text
rgbecker
parents: 42
diff changeset
    42
#	
19
5b4da60fa383 trailing text/Odyssey fix
rgbecker
parents: 16
diff changeset
    43
#	Revision 1.5  2000/02/18 11:00:57  rgbecker
5b4da60fa383 trailing text/Odyssey fix
rgbecker
parents: 16
diff changeset
    44
#	trailing text/Odyssey fix
42
ba8c232f544e Moved inch and cm definitions to reportlab.lib.units and amended all demos
andy_robinson
parents: 19
diff changeset
    45
#	
16
f9c7525619fb Docstring & other fixes
rgbecker
parents: 10
diff changeset
    46
#	Revision 1.4  2000/02/17 02:05:25  rgbecker
f9c7525619fb Docstring & other fixes
rgbecker
parents: 10
diff changeset
    47
#	Docstring & other fixes
19
5b4da60fa383 trailing text/Odyssey fix
rgbecker
parents: 16
diff changeset
    48
#	
10
0cb88428a663 Conversion to reportlab package
rgbecker
parents: 7
diff changeset
    49
#	Revision 1.3  2000/02/16 09:42:50  rgbecker
0cb88428a663 Conversion to reportlab package
rgbecker
parents: 7
diff changeset
    50
#	Conversion to reportlab package
16
f9c7525619fb Docstring & other fixes
rgbecker
parents: 10
diff changeset
    51
#	
7
ca9eb4f68eab License text fixes
rgbecker
parents: 4
diff changeset
    52
#	Revision 1.2  2000/02/15 17:55:59  rgbecker
ca9eb4f68eab License text fixes
rgbecker
parents: 4
diff changeset
    53
#	License text fixes
10
0cb88428a663 Conversion to reportlab package
rgbecker
parents: 7
diff changeset
    54
#	
7
ca9eb4f68eab License text fixes
rgbecker
parents: 4
diff changeset
    55
#	Revision 1.1.1.1  2000/02/15 15:09:29  rgbecker
ca9eb4f68eab License text fixes
rgbecker
parents: 4
diff changeset
    56
#	Initial setup of demos directory and contents.
ca9eb4f68eab License text fixes
rgbecker
parents: 4
diff changeset
    57
#	
251
6f6cd14069f6 test filename case fix
rgbecker
parents: 72
diff changeset
    58
__version__=''' $Id: odyssey.py,v 1.8 2000/06/01 09:41:12 rgbecker Exp $ '''
16
f9c7525619fb Docstring & other fixes
rgbecker
parents: 10
diff changeset
    59
___doc__=''
4
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    60
#odyssey.py
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    61
#
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    62
#Demo/benchmark of PDFgen rendering Homer's Odyssey.
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    63
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    64
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    65
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    66
#results on my humble P266 with 64MB:
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    67
# Without page compression:
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    68
# 239 pages in 3.76 seconds = 77 pages per second
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    69
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    70
# With textOut rather than textLine, i.e. computing width
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    71
# of every word as we would for wrapping:
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    72
# 239 pages in 10.83 seconds = 22 pages per second
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    73
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    74
# With page compression and textLine():
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    75
# 239 pages in 39.39 seconds = 6 pages per second
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    76
10
0cb88428a663 Conversion to reportlab package
rgbecker
parents: 7
diff changeset
    77
from reportlab.pdfgen import canvas
72
2b88c2668c26 Fix to timing page count, try to read full text
rgbecker
parents: 42
diff changeset
    78
import time, os
4
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    79
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    80
42
ba8c232f544e Moved inch and cm definitions to reportlab.lib.units and amended all demos
andy_robinson
parents: 19
diff changeset
    81
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
    82
from reportlab.lib.pagesizes import A4
4
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    83
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    84
#precalculate some basics
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    85
top_margin = A4[1] - inch
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    86
bottom_margin = inch
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    87
left_margin = inch
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    88
right_margin = A4[0] - inch
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    89
frame_width = right_margin - left_margin
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    90
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    91
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    92
def drawPageFrame(canv):
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    93
    canv.line(left_margin, top_margin, right_margin, top_margin)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    94
    canv.setFont('Times-Italic',12)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    95
    canv.drawString(left_margin, top_margin + 2, "Homer's Odyssey")
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    96
    canv.line(left_margin, top_margin, right_margin, top_margin)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    97
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    98
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
    99
    canv.line(left_margin, bottom_margin, right_margin, bottom_margin)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   100
    canv.drawCentredString(0.5*A4[0], 0.5 * inch,
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   101
               "Page %d" % canv.getPageNumber())
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   102
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   103
    
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   104
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   105
def run():
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   106
    started = time.time()
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   107
    canv = canvas.Canvas('odyssey.pdf')
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   108
    canv.setPageCompression(0)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   109
    drawPageFrame(canv)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   110
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   111
    #do some title page stuff
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   112
    canv.setFont("Times-Bold", 36)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   113
    canv.drawCentredString(0.5 * A4[0], 7 * inch, "Homer's Odyssey")
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   114
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   115
    canv.setFont("Times-Bold", 18)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   116
    canv.drawCentredString(0.5 * A4[0], 5 * inch, "Translated by Samuel Burton")
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   117
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   118
    canv.setFont("Times-Bold", 12)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   119
    tx = canv.beginText(left_margin, 3 * inch)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   120
    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
   121
    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
   122
    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
   123
    tx.textLine("one would for paragraph wrapping, it still manages 22 pages per second.")
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   124
    tx.textLine("")
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   125
    tx.textLine("Andy Robinson, Robinson Analytics Ltd.")
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   126
    canv.drawText(tx)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   127
    
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   128
    canv.showPage()
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   129
    #on with the text...
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   130
    drawPageFrame(canv)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   131
    
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   132
    canv.setFont('Times-Roman', 12)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   133
    tx = canv.beginText(left_margin, top_margin - 0.5*inch)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   134
    
251
6f6cd14069f6 test filename case fix
rgbecker
parents: 72
diff changeset
   135
    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
   136
        if os.path.isfile(fn):
2b88c2668c26 Fix to timing page count, try to read full text
rgbecker
parents: 42
diff changeset
   137
            break
2b88c2668c26 Fix to timing page count, try to read full text
rgbecker
parents: 42
diff changeset
   138
2b88c2668c26 Fix to timing page count, try to read full text
rgbecker
parents: 42
diff changeset
   139
    data = open(fn,'r').readlines()
4
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   140
    for line in data:
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   141
        #this just does it the fast way...
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   142
        tx.textLine(line)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   143
        #this forces it to do text metrics, which would be the slow
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   144
        #part if we were wrappng paragraphs.
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   145
        #canv.textOut(line)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   146
        #canv.textLine('')
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   147
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   148
        #page breaking        
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   149
        y = tx.getY()   #get y coordinate
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   150
        if y < bottom_margin + 0.5*inch:
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   151
            canv.drawText(tx)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   152
            canv.showPage()
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   153
            drawPageFrame(canv)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   154
            canv.setFont('Times-Roman', 12)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   155
            tx = canv.beginText(left_margin, top_margin - 0.5*inch)
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   156
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   157
            #page
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   158
            pg = canv.getPageNumber()
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   159
            if pg % 10 == 0:
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   160
                print 'formatted page %d' % canv.getPageNumber()
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   161
19
5b4da60fa383 trailing text/Odyssey fix
rgbecker
parents: 16
diff changeset
   162
    if tx:
5b4da60fa383 trailing text/Odyssey fix
rgbecker
parents: 16
diff changeset
   163
        canv.drawText(tx)
5b4da60fa383 trailing text/Odyssey fix
rgbecker
parents: 16
diff changeset
   164
        canv.showPage()
5b4da60fa383 trailing text/Odyssey fix
rgbecker
parents: 16
diff changeset
   165
        drawPageFrame(canv)
5b4da60fa383 trailing text/Odyssey fix
rgbecker
parents: 16
diff changeset
   166
		
4
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   167
    print 'about to write to disk...'
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   168
    
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   169
    canv.save()
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   170
    
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   171
    finished = time.time()
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   172
    elapsed = finished - started
72
2b88c2668c26 Fix to timing page count, try to read full text
rgbecker
parents: 42
diff changeset
   173
    pages = canv.getPageNumber()-1
4
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   174
    speed =  pages / elapsed
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   175
    print '%d pages in %0.2f seconds = %0.2f pages per second' % (
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   176
                pages, elapsed, speed)
251
6f6cd14069f6 test filename case fix
rgbecker
parents: 72
diff changeset
   177
 
4
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   178
if __name__=='__main__':
490f6b790498 Initial revision
rgbecker
parents:
diff changeset
   179
    run()