[reportlab-users] UTF8 Encoded Strings
    Tim Roberts 
    timr at probo.com
       
    Wed Oct 31 16:48:28 EDT 2007
    
    
  
Rich Shepard wrote:
>
>   Are these available for reuse by others ... particularly me? :-)
Here's one example, completely devoid of comments.  If it was hard to
write, it should be hard to read.  ;)
textOut writes something at the current caret, and updates the caret. 
textOutNo writes something at the current caret, but does not update the
caret.  textLine writes at the caret and does a carriage return and
linefeed.  drawUnderline draws an underline starting at the caret. 
drawUnderlineTo draws an underline from the caret to a fixed position. 
drawBox draws a checkbox at the caret and advances beyond it.  gap
inserts a fixed-size gap.
class TextBox:
    def __init__(self, canvas, x=0, y=0 ):
        self.canvas = canvas
        self.setXY( x, y )
        self.x0 = x
    def setXY( self, x, y ):
        self.x = x
        self.y = y
    def getXY( self ):
        return (self.x,self.y)
    def linefeed( self ):
        self.y -= self.canvas._leading
    def textOut( self, txt ):
        c = self.canvas
        c.drawString( self.x, self.y, txt )
        self.x += c.stringWidth(txt, c._fontname, c._fontsize)
    def textOutNo( self, txt, adjustx=0 ):
        c = self.canvas
        c.drawString( self.x+adjustx, self.y, txt )
    def textLine( self, txt=None ):
        if txt:
            self.canvas.drawString( self.x, self.y, txt )
        self.x = self.x0
        self.linefeed()
    def drawUnderline( self, length, adjustx=1 ):
        self.canvas.line( self.x, self.y-2, self.x+length, self.y-2 )
        if adjustx:
            self.x += length
    def drawUnderlineTo( self, x ):
        self.drawUnderline( x - self.x )
    def drawBox( self, w, h, gap=0 ):
        self.canvas.rect( self.x, self.y-2, w, h )
        self.x += w + gap
    def gap( self, w ):
        self.x += w
    def fillWith( self, ch, tabstop ):
        c = self.canvas
        s = ''
        target = tabstop - self.x
        while c.stringWidth( s, c._fontname, c._fontsize ) < target:
            s += ch
        c.drawRightString( tabstop, self.y, s[:-1] )
        self.x = tabstop
So, a usage:
    c = self.canvas.
    ...
    tb = TextBox( c, left, y )
    self.fontNormal()
    tb.textOut( 'Tax ID#' )          # draw and advance
    tb.gap( 6 )                      # leave 6 point gap
    self.fontField()
    # Fill in a data field but do not advance caret.  Leave
    # a 9 pt left margin.
    tb.textOutNo( self.data['ein'], 9 )
    tb.drawUnderline( 2*inch )       # draw a 2 inch underline
    tb.textLine()                    # start new line
    if not self.isCouncil:
        self.fontNormal()
        tb.textOut( 'Club Name:' )
        tb.gap( 6 )
        self.fontField()
        tb.textOutNo( self.data['name'], 9 )
        tb.drawUnderline( 6*inch )
        tb.textLine()
    self.fontNormal()
    tb.textOut( 'Council:' )
    tb.gap( 6 )
    self.fontField()
    tb.textOutNo( self.data['council'], 9 )
    tb.drawUnderline( 3*inch )
    tb.textLine()
    return tb.getXY()[1]             # return the new bottom Y
These all draw immediately.  They don't use the deferred textbox feature.
-- 
Tim Roberts, timr at probo.com
Providenza & Boekelheide, Inc.
    
    
More information about the reportlab-users
mailing list