Re: Setting TrueType fonts in table cell

Robin Becker <[email protected]>
Newsgroups gmane.comp.python.reportlab.user
Message-ID <[email protected]>
Hi Nils,

On 13/10/2013 07:42, Nils Smeds wrote:>> I think the error is that you are 
re-using the canvas at the end of the
.............
 > When starting this project all I had as input was the users guide which in
 > all examples I read refers to the SimpleDocTemplate. I'd be happy to use a
 > more suitable setup if I could find references as to how to use a
 > "ComplexDocTemplate".  Would it be possible to get some references to more
 > complex layouts and what is provided by the existing Templates (and how to
 > create your own if that is what it takes) on the FAQ page or in the use's
 > guide?

Form the above I think you just need the ability to add drawn material of your 
own in a flowing document.

A simple way to accomplish that would be to define a Flowable subclass that 
allows you to do whatever you want to a page with canvas commands, but uses the 
Flowable api. In the code below that's what the DrawingStuff class does.

##############################################################################
import sys

from reportlab.lib.pagesizes import letter, A4
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfbase.pdfmetrics import registerFontFamily

from reportlab.lib.colors import black, red, blue, green
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import Table,TableStyle
from reportlab.platypus import Paragraph, SimpleDocTemplate, PageBreak, 
Flowable, FrameBreak, PageBegin

# My Liberation fonts are installed in:  /usr/share/fonts/liberation
pdfmetrics.registerFont(TTFont('SansR', '/windows/fonts/arial.ttf'))
pdfmetrics.registerFont(TTFont('SansB', '/windows/fonts/arialbd.ttf'))
pdfmetrics.registerFont(TTFont('SansI', '/windows/fonts/ariali.ttf'))
pdfmetrics.registerFont(TTFont('SansBI', '/windows/fonts/arialbi.ttf'))
registerFontFamily('Sans',normal='SansR',bold='SansB',italic='SansI',boldItalic='SansBI')

def d0(canv):
     canv.setStrokeColor(red)
     canv.setFillColor(red)
     canv.setFont("Courier", 20)
     canv.drawString(72, 144, 'C TALLY HOOO!!! c')
     canv.setFont("SansB", 20)
     canv.drawString(72, 360, 'C TALLY HOOO!!!  c')

def d1(canv):
     canv.setStrokeColor(green)
     canv.setFillColor(green)
     canv.setFont("Courier", 20)
     canv.drawString(144, 144, 'C TALLY HOOO!!! c')
     canv.setFont("SansB", 20)
     canv.drawString(144, 360, 'C TALLY HOOO!!!  c')

def d2(canv):
     canv.setStrokeColor(blue)
     canv.setFillColor(blue)
     canv.setFont("Courier", 20)
     canv.drawString(72, 360, 'C TALLY HOOO!!! c')
     canv.setFont("SansB", 20)
     canv.drawString(360, 144, 'C TALLY HOOO!!!  c')

class DrawingStuff(Flowable):
     '''
     Flowable that allows arbitrary canvas operations
     DrawingStuff(myFunc)
         argument myFunc is a callable that will be passed the canvas at draw time.
     '''
     _ZEROSIZE=1
     _SPACETRANSFER = True
     def __init__(self,myDrawingFunc):
         self._myDrawingFunc = myDrawingFunc

     def __repr__(self):
         return "%s(%r)" % (self.__class__.__name__,self._myDrawingFunc)

     def wrap(self,aW,aH):
         return 0,0

     def drawOn(self,canvas,x,y,_sW=0):
         canvas.saveState()
         self._myDrawingFunc(canvas)
         canvas.restoreState()

filename='mytest.pdf'

page_width, page_height = A4
doc = SimpleDocTemplate(filename,pagesize=A4)
story=[]
story_add=story.append

styles = getSampleStyleSheet()
styleH = styles['Heading1']
styleN = styles['Normal']

base_style=[('GRID', (0,0), (-1,-1), 1, (0,0,0)),
                 ('FONT', (1,0), (1,-1), 'SansR'),
                 ('BOX', (0,0), (-1,-1), 3, (0,0,0)),
                 ('ALIGN',(1,0),(1,-1),'RIGHT'),
                 ('ALIGN',(3,0),(3,-1),'RIGHT'),
                 ('VALIGN',(0,0),(-1,-1),'TOP')]

data=[('COL1','COL2','COL3','COL4','COL5')]
data.append(['COL1','COL2','COL3','COL4','COL5'])
data.append(['COL1','COL2','COL3','COL4','COL5'])
data.append(['COL1','COL2','COL3','COL4','COL5'])
t=Table(data,style=base_style)
story_add(t)

#generate some psecial pages
story_add(PageBreak())
story_add(DrawingStuff(d0))
story_add(PageBreak())
story_add(DrawingStuff(d1))
story_add(PageBreak())
story_add(DrawingStuff(d2))

doc.build(story)
##############################################################################
-- 
Robin Becker
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.