- assigned_to: nobody --> andy_robinson
- status: open --> closed
I just downloaded the latest version of reportlab.
(reportlab/__init__.py claims 'Version = "1.06"')
I've been trying to figure out how to emulate fixed
size
fonts. I decided to take that as an opportunity to
learn about the font metrics. I can't seem to get it
to work. Here's what I'm doing (this is all in
PythonWin
1.5.2):
>>> import reportlab.pdfbase.pdfmetrics
>>> f = reportlab.pdfbase.pdfmetrics.fontsByName
['Helvetica']
>>> f.getWidths()
Traceback (innermost last):
File "<interactive input>", line 1, in ?
File "D:\ReportLab\reportlab\pdfbase\pdfmetrics.py",
line 188, in getWidths
return _rl_accel.getFontInfo(self.fontName)[0]
NameError: _rl_accel
Looking at the code, the _rl_accel is a C extension
but it
should back up to Python code if not available. If not
available, the _stringWidth variable is set to None.
Yet the code is doing the following
if not _stringWidth:
...
def getWidths(self):
"Returns width array"
return _rl_accel.getFontInfo(self.fontName)[0]
else:
def getWidths(self):
"Returns width array"
return widthVectorsByFont[self.fontName]
Shouldn't those be reversed? (I suspect the problem is
because that's the only bit of code using "if not
_stringWidth",
instead of "if _stringWidth".)
Then when I swapped those two function definitions I
get
>>> f.getWidths()
Traceback (innermost last):
File "<interactive input>", line 1, in ?
File "D:\ReportLab\reportlab\pdfbase\pdfmetrics.py",
line 188, in getWidths
return widthVectorsByFont[self.fontName]
AttributeError: fontName
>>>
That appears to be because "self.name" contains the
font name
and not "self.fontName". If I do a hack fix in the
Font.__init__
of
self.name = self.fontName = name
then I get a workable result, as in
>>> f.getWidths(ord("a"))
556
>>>
It seems the better fix would be to change everything
to
use either self.name or self.fontName, but I don't know
enough about your practices to suggest which, if either
of these, is correct.
Andrew
dalke@acm.org