通过Fontforge脚本获取字形宽度

4

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

由于技术上来说,fontforge是从二进制TTF文件中捕获字形宽度,然后基于AFM标准模板创建AFM字体文件。我想知道是否可能通过fontforge命令直接将TTF文件转换为字形宽度列表?!?


如果您在问题中标记使用的编程语言,您可能会获得更多帮助。 - Carl Anderson
@CarlAnderson 我不想使用编程语言,我想使用 fontforgettf 文件转换为字形宽度。 - Googlebot
说实话,我认为这个问题应该放在tex.stackexchange或superusers上,因为它并不是一个真正的编程问题。 - Carl Anderson
@CarlAnderson 我同意你的观点,但是我不认为tex或者superusers没有使用fontforge作为捕捉字形属性的编程工具。fontforge的高级用户就是程序员。 - Googlebot
1个回答

8
FontForge包括两个解释器,因此您可以编写脚本来修改字体。其中一个解释器是Python(首选),另一个是传统语言。 Fontforge嵌入了Python,但也可以将Fontforge构建为Python扩展。
那么您会使用哪个:Python还是Legacy language? 哪种界面:命令行、GUI还是Python扩展?
命令行和传统语言
脚本可以在文件中,也可以作为参数呈现为字符串。您可能需要使用-lang参数指定要使用的解释器。请参见Command Line Arguments
$ fontforge -script scriptfile.pe {arguments}
$ fontforge -c "script-string" {arguments}
$ fontforge -lang={ff|py} -c "script-string"

在阅读了文档之后,我编写了我的脚本文件.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()也会选择非字形。访问不存在的字形将引发错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接