[reportlab-users] Setting TrueType fonts in table cell

Robin Becker robin at reportlab.com
Mon Oct 14 06:30:11 EDT 2013


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


More information about the reportlab-users mailing list