[reportlab-users] Bounded text (truncated)
Michael Hipp
Michael at Hipp.com
Thu Jan 4 11:03:43 EST 2007
Thanks, Robin. I think the simpler first case will do what I need for how.
Thanks again,
Michael
Robin Becker wrote:
> Michael Hipp wrote:
>> Hello,
>>
>> I'm fairly new to ReportLab. Thanks for a great tool.
>>
>> I'm trying to find a way to print "bounded" text. Meaning I want the "field"
>> it is printed in to be a certain specified size and never exceed that size. If
>> a text value is printed that would go beyond that size, then the text should
>> be truncated.
>>
>> Is there some simple way to accomplish this?
> ......
>
> Maybe not simple. There are ways to do this for two cases. One where you just
> want a single line of text and another where you want something like a paragraph
> with specified width.
>
> In the first case it would be something like this.
>
> from reportlab.pdfbase.pdfmetrics import stringWidth
> t = "this is my very long and disreputable text ... boring etc etc etc"
> fontName='Times-Roman'
> fontSize=12
> desired = 2*72 # two inches
> while t and stringWidth(t,fontName,fontSize)>desired:
> t = t[:-1]
>
> print t
>
> which eventually prints "this is my very long and disre". This could better be
> done using binary search, but that I leave as an exercise.
>
> The paragraph case can be treated similarly, but it's probably worth doing more
> efficiently using the built in mechanisms of paragraphs.
>
> ########################
> text = """this is my very long and disreputable text ... boring etc etc etc I go
> on and on and on for days and weeks and months"""
>
> from reportlab.platypus.paragraph import Paragraph
> from reportlab.lib.styles import ParagraphStyle
> normal = ParagraphStyle('normal')
> normal.firstLineIndent = 18
> normal.spaceBefore = 0
> normal.spaceAfter = 0
> dW = 2*72 #2 inches
> dH = 0.5*72 #0.5 inch
> para = Paragraph(text,normal)
> w,h = para.wrap(dW,dH)
>
> print 'desired=%sx%s wanted=%sx%s' % (dW,dH,w,h)
> if h>dH+1e-8:
> S = para.split(dW,dH)
> print 'split returned %d elements' % len(S)
> if len(S)>=1:
> para = S[0]
> w,h = para.wrap(dW,dH)
> print 'desired=%sx%s new wanted=%sx%s' % (dW,dH,w,h)
> print '\n'.join([' '.join(x[1]) for x in para.blPara.lines])
> else:
> print "can't hack that paragraph into size"
More information about the reportlab-users
mailing list