Re: Font Helvetica always used?

Robin Becker <[email protected]>
Newsgroups gmane.comp.python.reportlab.user
Message-ID <CAOBYczr9due-MiOhJH6QEv0BA76eS2Wf228A=Yns9GPt12Bh7g@mail.gmail.com>
On 18 June 2015 at 20:32, Glenn Linderman <[email protected]> wrote:
> On 6/18/2015 5:08 AM, Robin Becker wrote:
.......
> But do I understand correctly that simply providing the fontname='arial'
> parameter when instantiating the Canvas class could bypass all the settings
> weirdness, and/or the initial script hacks?
the token 'arial' is just a string. Support has to be provided by
registering the font (or by it being one of the standard 14).


>
> Except, in looking at Canvas, it doesn't seem to have a fontname parameter,
> nor a catchall keyword parameter.  So I don't understand your comment "It
> can be passed in"... is that just a possibility in a parallel universe?
It can't be passed in directly, but can be via the default in
rl_config. Alternatively before a canvas is used you can call setFont
and that font will be the one used. However, unless it is one of the
standard 14 you still need to register a font before use.

>
> I did some experiments with the technique blessed by GvR here
>
> http://stackoverflow.com/questions/2447353/getattr-on-a-module
>
>
> The technique you referenced is mind-blowing!
>
> def canvas_basefontname():
>     from reportlab.pdfbase.ttfonts import TTFont
>     from reportlab.pdfbase.pdfmetrics import registerFont,
> registerFontFamily
>     registerFont(TTFont('arial','arial.ttf'),)
>     registerFont(TTFont('arial-bold','arialbd.ttf'),)
>     registerFont(TTFont('arial-italic','ariali.ttf'),)
>     registerFont(TTFont('arial-bolditalic','arialbi.ttf'),)
>     registerFontFamily('arial',
>             normal='arial',
>             bold='arial-bold',
>             italic='arial-italic',
>             boldItalic='arial-bolditalic',
>             )
>     return 'arial'
>
the GvR technique effectively makes a module into a class instance so
that the module object can do all the standard getattr tricks etc etc.



> but canvas.basefontname is a property or variable, not a function. Wouldn't

well as we set it up we can check for callable things and hide them
away. That makes the attribute invisible and subject to __getattr__
magic. In the instance __getattr__ we can see all unknown. attributes.


> this result in self._fontname being a reference to a function, instead of
> the string 'arial'? Or is that one of the side-effects of the __getattr__
> stuff, that the function is called when the property is referenced? (maybe
> my mind didn't get blown far enough apart)

yes exactly; we can check in the __getattr__ for squirrelled away
callables and call them just once when first referenced. The returned
value can then be used from then on.
>
> This avoids circular importing which happens otherwise.
>
>
> I don't understand this comment.
>
>

the settings modules/files are used in defining rl_config; most of the
reportlab code will try to import rl_config so if a settings file
contains complex rl code then we have eg

canvas --> rl_config --> settings --> ttfont --> rl_config


-- 
Robin Becker
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.