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 >