[reportlab-users] Underline String in Graphics

Robin Becker robin at reportlab.com
Thu Mar 26 07:04:07 EDT 2015


On 25/03/2015 20:43, Nathalie Steinmetz wrote:
> Hi,
>
> I realize that I can underline text within Paragraphs using <u></u>. For text within Graphics, in String objects, the recommendation seems to have been to draw a Line underneath the String.
>
> Is this still the way to go, or is there an easier way to have underlined text in graphics?
>

Hi Nathalie,

nothing prevents you from using Paragraph / XPreformatted to do your own drawing 
of complex strings. It's a bit more difficult, but see the end of this program 
for an example

###############################################################################
from reportlab.pdfbase.ttfonts import TTFont
from reportlab.pdfbase.pdfmetrics import registerFont
from reportlab.pdfgen.canvas import Canvas
from reportlab.lib.colors import green, pink, lightblue, red
from reportlab.platypus import XPreformatted
from reportlab.lib.styles import getSampleStyleSheet
registerFont(TTFont("Vera", "Vera.ttf"))
registerFont(TTFont("VeraBI", "VeraBI.ttf"))

c = Canvas('helloworld.pdf', pagesize=(300,500))
c.setFont('Vera', 10)
c.drawString(100, 200, u'Hello World')

c.showPage()
c.setPageSize((400,600))
c.setFont('Vera', 20)
c.setFillColor(green)
c.drawString(100, 300, u'Hello World')

c.showPage()
c.setPageSize((400,600))

sss = getSampleStyleSheet()
normal = sss['Normal']
xpre = XPreformatted('<font color="red">Red</font> <u>underliney</u>',normal)

w,h = xpre.wrap(0,0)

c.saveState()
#draw lines to show what's going on
c.setDash(2,2)
c.setStrokeColor(green)
c.setLineWidth(0.01)
c.line(72,100,72+w,100)
c.setStrokeColor(red)
c.line(72,100+h,72+w,100+h)
c.restoreState()
xpre.drawOn(c,72,100)

c.save()
###############################################################################

the main code is
xpre = XPreformatted('<font color="red">Red</font> <u>underliney</u>',normal)
w,h = xpre.wrap(0x7fffffff,0x7fffffff)
xpre.drawOn(c,72,100)

ie set up the styled text object, wrap and obtain the size. Note that the 
wrap(0,0) trick will likely not work with Paragraphs as they need a width to do 
their actual wrapping. The XPreformatted returns the max of the available width 
and the required width.


> Thanks!
> Nathalie
>
>
> --
> Nathalie Steinmetz
> Senior Software Engineer
>
> Jolt Labs


-- 
Robin Becker


More information about the reportlab-users mailing list