[reportlab-users] Bounded text (truncated)
Robin Becker
robin at reportlab.com
Thu Jan 4 13:43:24 EST 2007
Tim Roberts 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?
>>
>
> This question started me to thinking -- always a dangerous thing.
>
> Postscript fully supports path clipping. Does the PDF subset support
> that as well? One way to implement what he describes would be to
> establish a clipping rectangle, then draw the text, then free the
> clipping rectangle.
>
That's another way to do it. And there's an example of just that in the output
of test_pdfgen_general.py where a clipping path derived from the word Python is
used to mask some underlying stuff. The code looks like this c is the canvas
#first the outline
c.saveState()
t = c.beginText(inch, 3.0 * inch)
t.setFont('Helvetica-BoldOblique',108)
t.setTextRenderMode(5) #stroke and add to path
t.textLine('Python!')
t.setTextRenderMode(0)
c.drawText(t) #this will make a clipping mask
#now some small stuff which wil be drawn into the current clip mask
t = c.beginText(inch, 4 * inch)
t.setFont('Times-Roman',6)
t.textLines((('spam ' * 40) + '\n') * 15)
c.drawText(t)
#now reset canvas to get rid of the clipping mask
c.restoreState()
Clearly we could have used a more normal clipping path setup eg
p = c.beginPath()
#make a chessboard effect, 1 cm squares
for i in range(14):
x0 = (3 + i) * cm
for j in range(7):
y0 = (16 + j) * cm
p.rect(x0, y0, 0.85*cm, 0.85*cm)
c.addLiteral('%Begin clip path')
c.clipPath(p)
c.addLiteral('%End clip path')
--
Robin Becker
More information about the reportlab-users
mailing list