[reportlab-users] Vertical text in table cell
Arkadi Colson
arkadi at smartbit.be
Tue Feb 1 08:00:22 EST 2011
Is there a way to detect the height of the paragraph? For example when
drawing the text over 2 lines it is needed for alignment...
On 01/31/2011 05:14 PM, Robin Becker wrote:
> #!/usr/bin/env python
>
> """Test for creating vertical table cells in ReportLab tables.
> """
>
> import sys, os.path
>
> from reportlab.lib.units import cm
> from reportlab.lib import colors
> from reportlab.lib.styles import getSampleStyleSheet
> from reportlab.platypus.flowables import Flowable
> from reportlab.platypus import SimpleDocTemplate, Paragraph, Table
>
>
> class RotededText(Flowable):
> '''Rotates a text in a table cell.'''
>
> def __init__(self, text ):
> Flowable.__init__(self)
> self.text=text
>
> def draw(self):
> canvas = self.canv
> canvas.rotate(90)
> fs = canvas._fontsize
> canvas.translate(1, -fs/1.2) # canvas._leading?
> canvas.drawString(0, 0, self.text)
>
> def wrap(self, aW, aH):
> canv = self.canv
> fn, fs = canv._fontname, canv._fontsize
> return canv._leading, 1 + canv.stringWidth(self.text, fn, fs)
>
> class RotatedParagraph(Flowable):
> '''Rotates a text in a table cell.'''
>
> def __init__(self, text ):
> Flowable.__init__(self)
> self.text=text
>
> def draw(self):
> canvas = self.canv
> canvas.rotate(90)
> fs = canvas._fontsize
> canvas.translate(1, -self.height) # canvas._leading?
> self.text.canv = canvas
> try:
> self.text.draw()
> finally:
> del self.text.canv
>
>
> def wrap(self, aW, aH):
> w, h = self.text.wrap(aH,aW)
> self.width,self.height = h, w
> return h, w
>
>
> def main():
> stylesheet = getSampleStyleSheet()
> normal = stylesheet['Normal']
> doc = SimpleDocTemplate("test_rotated_cells.pdf")
> cli = RotatedParagraph(Paragraph('Clientes de cobranca muito duvidosa', style=normal))
>
> data = [
> ('codigo', RotededText('NIVEL'), RotededText('FOOBAR'), 'descricao'),
> ('11', '0', '1', 'Caixa'),
> ('21', '1', '2', cli)
> ]
>
> style = [
> ('ALIGN', (1,0), (1, -1), 'CENTER'),
> ('INNERGRID', (0,0), (-1,-1), 0.25, colors.red),
> ('BOX', (0,0), (-1,-1), 0.25, colors.blue),
> ('VALIGN', (0,0), (-1,-1), 'BOTTOM')
> ]
>
> tab = Table(data, rowHeights=[None,None,100],colWidths=[40, 20, 20, None], style=style)
> story = [tab]
> doc.build(story)
>
>
> if __name__ == "__main__":
> main()
--
Smartbit bvba
Hoogstraat 13
B-3670 Meeuwen
T: +32 11 64 08 80
F: +32 89 46 81 10
W: http://www.smartbit.be
E: arkadi at smartbit.be
More information about the reportlab-users
mailing list