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

13
我希望创建一个包含大量字形的字体,类似于成千上万的日语汉字。因此需要进行一些脚本/批处理。幸运的是,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字形列表-标准字形命名约定”。听起来像是FontForge试图将Unicode值映射到字形名称,但失败了。
那么,为什么会出现AGL NameList问题呢? 提前感谢任何帮助。

你能发一下错误信息吗?你的 blank.sfd 是一个汉字字体吗?也许可以尝试使用新字体:fontforge.font()。或者加载一个名称列表:fontforge.loadNamelist('some_name_list.txt') - allcaps
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
...

通过 Unicode 码位创建字形。 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

所有出现在Adobe字形列表中的字形都应该使用它们的AGL字形名称进行命名。其余的字形应该以uniXXXX进行命名,其中XXXX是Unicode索引。在开发过程中,您可以使用任何可读性良好的名称。因此,请使用自己的命名,并在生成用于发布的字体时进行替换。见Typophile


这不是一个汉字字体。我制作的blank.sfd是默认编码,我还没有弄清楚如何通过脚本指定编码。我想尝试加载namelist,但不知道在哪里找到UTF-8 namelist文件。我刚学习了关于namelist的知识,所以有很多我还不理解的地方。我发现了我认为是完整的Unicode集合(http://ash.jp/code/unitbl21.htm),但后来发现它列出了像①这样没有Unicode编号的字形。新问题比答案更快地涌现出来。首先,我会尝试按照您建议的创建一个新字体,而不是从模板文件开始工作。谢谢。 - Mentalist
我的更新中的glyphlist.txt就是你要找的。但是你真的不应该加载它,因为你的代码在我的机器上运行得很好。所以我认为你的构建有问题。或者你可以尝试通过代码点获取或创建字形:createChar(uni[,name]) A 是 65,所以 char = font.createChar(65) - allcaps
我喜欢那种方法的想法。但是你从哪里得到'A'的数字65呢?是否有一个标准资源,类似于glyphlist文件,但也包括代码点数?我预计需要准备一个.txt文件,其中包含所有这些值,以便我可以跟踪并告诉FontForge如何正确分配字形。 - Mentalist
1
感谢@allcaps - 您已经回答了本帖子主题的主要问题。进一步的问题涉及Unicode字符映射,超出了原始问题的范围。您真是太有帮助了。不幸的是,stackoverflow禁止我为您的答案点赞:“点赞需要15个声望”。我觉得他们很自大。我希望我能以某种方式给你应有的荣誉,感谢你所做的一切。也许那些声望被stackoverflow神所垂青的成员中的一个可以代表我给予点赞的祝福。无论如何,非常感谢! - Mentalist
1
回答那个悬而未决的问题“你从哪里得到了表示'A'的数字65呢?”,它是A的ASCII码。字形列表中的0041是十六进制中的65,因此您已经有了一个可以使用的映射。 - scruss
显示剩余7条评论

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