通过fontforge脚本获取字形宽度

时间:2014-01-06 17:44:00

标签: fonts true-type-fonts fontforge

为了获得字形宽度,我将TTF字体转换为AFM,然后解析AFM文件的内容以获取每个字形的宽度。

从技术上讲,fontforge正在从二进制TTF文件中捕获字形宽度,然后根据AFM标准模板创建一个AFM字体文件。我想知道是否可以通过fontforge命令直接将TTF文件转换为字形宽度列表?!?

1 个答案:

答案 0 :(得分:6)

FontForge包含两个解释器,因此您可以编写脚本来修改字体。其中一个解释器是Python(首选),一个是遗留语言。 Fontforge嵌入了Python,但也可以将Fontforge构建为Python扩展。

那么您将使用什么: Python 传统语言? 什么界面:命令行 GUI Python扩展

命令行和旧语言

脚本可以位于文件中,也可以只是作为参数显示的字符串。您可能需要指定与-lang参数一起使用的解释器。请参阅Command Line Arguments

$ fontforge -script scriptfile.pe {arguments}
$ fontforge -c "script-string" {arguments}
$ fontforge -lang={ff|py} -c "script-string"

扫描documentation后我编写了我的scriptfile.pe:

Open($1, 1)
Select($2)
Print( GlyphInfo('Width') )

比:

$ fontforge -script scriptfile.pe YourFont.ttf A
... # Some output truncated.
1298

从GUI执行脚本

打开字体。比选择:'文件'> '执行脚本......'。输入:

Select('A')
Error(ToString(GlyphInfo('Width')))

点击“确定”。

Fontforge Error Window

Python扩展

首先是单个字形(docs)的宽度:

>>> import fontforge
>>> f = fontforge.open("YourFont.ttf")
>>> f['A'].width
1298

这是你问题的答案。对于每个字形,编码索引,名称和宽度:

>>> for i in f.selection.all():
...    try:
...       name, width = f[i].glyphname, f[i].width
...       print i, name, width
...    except:
...       pass
... 
0 uni0009 0
2 uni0002 0
13 nonmarkingreturn 510
# ... Truncated ...
65707 germandbls.smcp 2266
>>>

注意:我使用了try / except,因为不知怎的f.selection.all()也选择了非字形。访问不存在的字形会引发错误。