将一系列.svg文件导入FontForge作为字形并输出字体文件
我想创建一个包含大量字形的字体。想象一下日本的汉字,数量可能达到几千个。所以肯定需要一些脚本或批处理的工作。幸运的是,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 个回答
试着重新安装你的 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。