Re: Built-in versus embedded fonts

Glenn Linderman <[email protected]>
Newsgroups gmane.comp.python.reportlab.user
Message-ID <[email protected]>
On 21 June 2015 at 02:16, Glenn Linderman <[email protected]> wrote:

> As an outgrowth of the "Helvetica" reference (and I've got working code to
> avoid it now, but would like the Canvas parameter for initial_fontname in
> time, thanks), I found some code that is using "Times-Roman" (also built in)
> to determine which string is longer... The strings are _actually_ placed in
> the document using "Times New Roman" (TTF)... but...
>
> 1) pdfmetrics.stringWidth doesn't seem to work for TTF fonts.
> 2) I couldn't find an obvious way to obtain the information for TTF fonts.
> 3) If kerning gets implemented, the stringWidth should reflect that.
>
> I vaguely recall implementing this "proxy for reality" late one night in a
> coding frenzy... is there an easy way to obtain stringWidth for a TTF font?

On 6/21/2015 12:32 PM, Andy Robinson wrote:
> As far as I remember, if you register a TrueType Font,
> pdfmetrics.stringwidth(..) gives the right answer.
>
> It gets aliased to various functions in C accelerators so it may not
> be obvious from reading the code....

Well, I couldn't get it to work using any of the nick name I assigned, 
the full font name, or the font file name. It would give an error (same 
error in all cases, full reportlab traceback shown for last one.
==========
   File "C:\Python34\lib\site-packages\reportlab\pdfbase\pdfmetrics.py", 
line 612, in getTypeFace
     return _typefaces[faceName]
KeyError: 'Times'
==========
   File "C:\Python34\lib\site-packages\reportlab\pdfbase\pdfmetrics.py", 
line 612, in getTypeFace
     return _typefaces[faceName]
KeyError: 'Times New Roman'
==========
Traceback (most recent call last):
   File "C:\Python34\lib\site-packages\reportlab\pdfbase\pdfmetrics.py", 
line 671
, in getFont
     return _fonts[fontName]
KeyError: 'times'

During handling of the above exception, another exception occurred:

   File "C:\Python34\lib\site-packages\reportlab\pdfbase\pdfmetrics.py", 
line 707
, in stringWidth
     return getFont(fontName).stringWidth(text, fontSize, encoding=encoding)
   File "C:\Python34\lib\site-packages\reportlab\pdfbase\pdfmetrics.py", 
line 673
, in getFont
     return findFontAndRegister(fontName)
   File "C:\Python34\lib\site-packages\reportlab\pdfbase\pdfmetrics.py", 
line 655
, in findFontAndRegister
     face = getTypeFace(fontName)
   File "C:\Python34\lib\site-packages\reportlab\pdfbase\pdfmetrics.py", 
line 612
, in getTypeFace
     return _typefaces[faceName]
KeyError: 'times'
==========


On 6/21/2015 1:40 AM, Laura Creighton wrote:
> does instanceStringWidthTTF(self,text,size,encoding) get the
> correct size?
>
> Laura

In trying to find the method in your suggestion I found the code in 
ttfonts.py that says:

try:
     from _rl_accel import _instanceStringWidthTTF
     import new
     TTFont.stringWidth = new.instancemethod(_instanceStringWidthTTF,None,TTFont)
except ImportError:
     pass

So I decided to try using stringWidth from the TTFont class returned 
from registering the font, which I had kept around for other reasons 
anyway.... First try it told me it needed the size as a second parameter 
(no real surprise there), and second try worked.

Fiddling a bit, Times Roman (PDF built-in) font is an excellent proxy 
for Times New Roman (they had the exact same length in every case that I 
tried).  Nonetheless, I am pleased to find TTFont.stringWidth works, 
because I will be using some fonts for which there is not a built-in 
proxy, excellent or otherwise, so now I have a solution for that case.

Whether pdfmetrics.stringWidth is _supposed to_ or _could be improved 
to_ detect the existence of the TTFont and call the TTFont.stringWidth, 
I couldn't say.  It would be a user-friendly feature, but then it might 
cause a small performance degradation.

Thanks!
Glenn
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.