Re: Setting TrueType fonts in table cell

Nils Smeds <[email protected]>
Newsgroups gmane.comp.python.reportlab.user
Message-ID <CADo-R2CQjuS3=yQUQ2-RxqDbyFaVokRSfzPjGxFhZ_OEOOTdow@mail.gmail.com>
I am pretty sure you are right - deriving my own Drawing class from
Flowable looks like the way to go.
Your example shows me what I need to implement in this class(and how).

Thanks for your help! Now I also know what sections in the manual to study
further and not to be deterred
by the comments in the manual  ;-)


Class Flowable:

Abstract base class for things to be drawn. Key concepts:

1. It knows its size

2. It draws in its own coordinate system (this requires the base API to
provide a translate() function.

def drawOn(self, canvas, x, y, _sW=0):

Tell it to draw itself on the canvas. Do not override


/Nils



On Mon, Oct 14, 2013 at 12:30 PM, Robin Becker <[email protected]> wrote:

> 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.