Extracting hte font name from a TrueType font file

Steve Holden steve at holdenweb.com
Fri Sep 19 03:25:41 EDT 2008


Aaron "Castironpi" Brady wrote:
> On Sep 18, 7:48 pm, Steve Holden <st... at holdenweb.com> wrote:
>> Fredrik Lundh wrote:
>>> Steve Holden wrote:
>>>> Does anyone have a Python recipe for this?
>>>>>> from PIL import ImageFont
>>>>>> f = ImageFont.truetype("/windows/fonts/verdanai.ttf", 1)
>>>>>> f.font.family
>>> 'Verdana'
>>>>>> f.font.style
>>> 'Italic'
>> Thanks so much, Fredrik. The reason I asked is because I found the
>> specification completely opaque ...
>>
>> regards
>>  Steve
>> --
>> Steve Holden        +1 571 484 6266   +1 800 494 3119
>> Holden Web LLC              http://www.holdenweb.com/
> 
> Here's the code to parse the spec.
> 
> #customize path
> f= open( '\\windows\\fonts\\arial.ttf', 'rb' )
> from struct import *
> 
> #header
> shead= Struct( '>IHHHH' )
> fhead= f.read( shead.size )
> dhead= shead.unpack_from( fhead, 0 )
> 
> #font directory
> stable= Struct( '>4sIII' )
> ftable= f.read( stable.size* dhead[ 1 ] )
> for i in range( dhead[1] ): #directory records
>     dtable= stable.unpack_from(
>             ftable, i* stable.size )
>     if dtable[0]== 'name': break
> assert dtable[0]== 'name'
> 
> #name table
> f.seek( dtable[2] ) #at offset
> fnametable= f.read( dtable[3] ) #length
> snamehead= Struct( '>HHH' ) #name table head
> dnamehead= snamehead.unpack_from( fnametable, 0 )
> 
> sname= Struct( '>HHHHHH' )
> for i in range( dnamehead[1] ): #name table records
>     dname= sname.unpack_from(
>             fnametable, snamehead.size+ i* sname.size )
>     if dname[3]== 4: #key == 4: "full name of font"
>         s= unpack_from(
>                 '%is'% dname[4], fnametable,
>                 dnamehead[2]+ dname[5] )[0]
>         print dname, s
> 
> This outputs:
> 
> (0, 3, 0, 4, 10, 318)  A r i a l
> (1, 0, 0, 4, 5, 4081) Arial
> (3, 1, 1033, 4, 10, 318)  A r i a l
> 
> First 3 fields:
> 
> 0, 3, 0= Unicode, Unicode 2.0, English
> 1, 0, 0= Macintosh, Default, English
> 3, 1, 1033= Windows, Version 1.1, Language "1033"

Well you clearly understood it better than *I* did!

regards
 Steve
-- 
Steve Holden        +1 571 484 6266   +1 800 494 3119
Holden Web LLC              http://www.holdenweb.com/




More information about the Python-list mailing list