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