将一系列.svg文件导入FontForge作为字形并输出字体文件

13 投票
1 回答
11278 浏览
提问于 2025-04-17 20:28

我想创建一个包含大量字形的字体。想象一下日本的汉字,数量可能达到几千个。所以肯定需要一些脚本或批处理的工作。幸运的是,FontForge支持Python脚本!不幸的是,我一直没能让它正常工作。[伤心]

首先,感谢用户 Hoff这里 发布的代码,解决了我问题中的一大部分。但在运行他的脚本时,我遇到了一些问题,这又引发了更多的问题:

Failed to find NameList: AGL For New Fonts
Warning: Font contained no glyphs

更新:

  • 出现“字体没有字形”的错误,显然是FontForge的一个bug,当字体中包含一个或更少的字形时会发生。添加第二个字形'B'解决了这个问题。
  • 我发现无论是保存 .ttf、.sfd 还是 .otf 等格式,使用的语法都是一样的。
  • NameList失败实际上并不会阻止字体文件的写入。我很高兴发现这一点,但仍然不明白如何提供它所需的NameList。

这是Hoff的代码:

import fontforge
font = fontforge.open('blank.sfd')
glyph = font.createMappedChar('A')
glyph.importOutlines('sourceimg.svg')
font.generate('testfont.ttf')

昨天我花了五个小时在Mac上折腾FontForge(这个过程挺复杂的)。现在看起来我已经成功运行它了。起初我从.dmg安装了一个预构建的版本,结果发现没有Python支持。但因为Hoff似乎没有遇到我遇到的错误,所以我也不排除是构建的问题。

无论如何,我不明白与AGL有关的错误。AGL是什么? 我查了一下: “Adobe Glyph List - 一种标准的字形命名规范”。听起来像是FontForge试图将Unicode值映射到字形名称,但没能成功。

那么,AGL NameList的问题是什么呢?提前感谢任何帮助。

1 个回答

12

试着重新安装你的 Fontforge。因为代码应该是可以工作的。我测试过,运行得很好。

我成功通过 Homebrew 安装了带 Python 扩展的 Fontforge。以下是相关信息:

allcaps$ brew info fontforge
fontforge: stable 20120731, HEAD
http://fontforge.org/
/usr/local/Cellar/fontforge/20120731 (377 files, 16M) *
  Built from source with: --with-x
From: https://github.com/Homebrew/homebrew/commits/master/Library/Formula/fontforge.rb
==> Dependencies
Required: gettext ✘, fontconfig ✔
Recommended: jpeg ✔, libtiff ✔
Optional: cairo ✔, pango ✘, libspiro ✘, czmq ✘
==> Options
--with-cairo
  Build with cairo support
--with-czmq
  Build with czmq support
--with-gif
  Build with GIF support
--with-libspiro
  Build with libspiro support
--with-pango
  Build with pango support
--with-x
  Build with X11 support, including FontForge.app
--without-jpeg
  Build without jpeg support
--without-libpng
  Build without libpng support
--without-libtiff
  Build without libtiff support
--without-python
  Build without python support
--HEAD
  install HEAD version
==> Caveats
Set PYTHONPATH if you need Python to find the installed site-packages:
  export PYTHONPATH=/usr/local/lib/python2.7/site-packages:$PYTHONPATH

.app bundles were installed.
Run `brew linkapps` to symlink these to /Applications.

设置 PYTHONPATH
当然要运行 brew install fontforge,并加上你需要的所有选项。
然后运行 brew linkapps

更新

从一个空的字体开始,这样字体就不是问题了:

import fontforge
font = fontforge.font() # create a new font

如果需要包含一个字形列表(通常不需要),可以下载这个文件: http://partners.adobe.com/public/developer/en/opentype/glyphlist.txt,然后:

import fontforge
fontforge.loadNamelist('glyphlist.txt') # load a name list
...

通过代码点创建字形。 createChar(uni[,name]),'A' 的代码是 65,所以

char = font.createChar(65)

字形及其代码点:

>>> for c in u'ABC 賢治':  print ord(c). 
>>> 65, 66, 67, 32, 36066, 27835. 

Unicode 联盟定义了 Unicode 标准。'CJK 统一汉字' 位于 '基本多语言平面(BMP)'。

没有 Unicode 点的字形可以通过名称在字体中引用。这些字形对于开放类型特性或构建新字形的基础块很有用。你可以这样创建它们:

font.createChar(-1, 'some_name')

更新 2

你应该用 AGL 字形名称命名所有出现在 Adobe 字形列表 中的字形。其他字形应该命名为 uniXXXX,其中 XXXX 是 Unicode 索引。在开发过程中,你可以使用任何人类可读的名称。所以可以先用自己的命名,等生成字体时再替换。查看 Typophile

撰写回答