使用fontforge和fonttools创建轻量级备用字体

2024-06-01 00:08:39 发布

您现在位置:Python中文网/ 问答频道 /正文

对于一个webapp,我需要一种方法来防止浏览器返回到另一种字体,如果我的web字体不包含字符。似乎唯一的方法是向fontstack添加另一种字体,其中包括“所有”可能的字符1。在

已经存在fallbackfonts,但是这些都是更多的调试助手,因为它们将代码点显示为数字,因此它们非常重(>;2MB)。在

我的用例的后备字体应该只显示一个类似于方框的东西来表示缺少的字符。在

我的想法是生成一个只有一个字形的简单字体,并应用一个特性文件,用这个字形替换所有的字形。在

我为fontforge写的剧本:

import fontforge
import fontTools.feaLib.builder as feaLibBuilder
from fontTools.ttLib import TTFont

font_name = 'maeh.ttf'
font = fontforge.font()
glyph = font.createChar(33, "theone")
pen = glyph.glyphPen()
pen.moveTo((100,100))
pen.lineTo((100,500))
pen.lineTo((500,500))
pen.lineTo((500,100))
pen.closePath()

for i in range(34, 99):
    glyph = font.createChar(i)
    glyph.width=10

font.cidConvertTo('Adobe', 'Identity', 0)  # doesn't make a difference

font.generate(font_name)

font = TTFont(font_name)
feaLibBuilder.addOpenTypeFeatures(font, 'fallback.fea')
font.save("fea_"+font_name)

我的功能文件:

^{pr2}$

但在上述a结果中

KeyError: ('cid00037', 'SingleSubst[0]', 'Lookup[0]', 'LookupList')

更改cid00037的数字。在

如果我使用特性文件中带注释的A-Z,那么这种方法似乎并不是完全错误的。在

如果我用CID符号指定范围,为什么fontcools找不到glyphs? 有没有其他方法可以为包含所有glyph的OpenType特性文件打包一个类?在


Tags: 文件方法nameimport字体数字特性字符
1条回答
网友
1楼 · 发布于 2024-06-01 00:08:39

在处理上面的问题时,有人暗示我使用Adobe NotDef字体,这正是我要找的。由于某些原因,我无法用fontforge将Adobe NotDef的.otf转换为woff或woff2。同样,所有创建像fontsquirrel这样的web字体文件的在线工具都失败了。为了创建woff文件,我使用了woff工具包中的sfnt2woff。对于woff2文件,我使用了https://github.com/google/woff2。在

相关问题 更多 >