【问题标题】:Get glyph widths by fontforge script通过 fontforge 脚本获取字形宽度
【发布时间】:2014-01-24 05:02:53
【问题描述】:

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

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

【问题讨论】:

  • 如果你用你正在使用的编程语言标记它,你可能会在这个问题上获得更多帮助。
  • @CarlAnderson 我不想使用编程语言,我想使用fontforgettf 文件转换为字形宽度。
  • 老实说,我认为这个问题属于 tex.stackexchange 或超级用户,因为它不是真正的编程问题。
  • @CarlAnderson 我同意你的观点,但不是texsuperusers 都没有使用fontforge 作为捕获字形属性的编程工具。 fontforge 的高级用户只是程序员。

标签: fonts truetype fontforge


【解决方案1】:

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

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

命令行和传统语言

脚本可以在文件中,也可以只是作为参数呈现的字符串。您可能需要指定与 -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')))

点击“确定”。

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() 也选择了非字形。访问不存在的字形会引发错误。

【讨论】:

    猜你喜欢
    • 2017-12-24
    • 2013-08-22
    • 2012-09-24
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    相关资源
    最近更新 更多