使用Fontforge从TTF字体中删除所有未使用的字符

时间:2016-02-22 14:11:47

标签: fonts subset true-type-fonts fontforge

如何使用Fontforge删除TTF字体文件中未在给定文本样本中使用的所有字符?换句话说,我想从现有字体创建一个子集,该字体仅包含实际显示在文本中的字符。 (如果你知道除了fontforge之外的免费工具可以做到这一点,那对我来说也是如此)。

这是一个小例子:有一个文本文件,其中包含单词"사슴 코끼리당나귀"。那么如何从字体文件中删除不属于该小文本样本的所有其他字符?最后,我想得到一个新的TTF文件,其中只包含使用过的字符。实际文本比这长,因此不能选择在fontforge中手动搜索。

在fontforge中有一些选择选项(主菜单>编辑>选择),我尝试了#34; Select by Wildcarcds"将韩语字符转换为unicode序列后。但还没有运气。

非常感谢任何想法! 亲切的问候

编辑: 用例:我正在创建儿童电子书,其性质主要由图像组成。但是,文本不是图片的一部分,而是显示在图片前景中显示的附加图层上。电子书文件(我主要为amazon kindle制作)包括一些元数据,图像文件,布局信息,当然还有字体文件。亚马逊Kindle发布程序具有非常严格的文件大小限制。为了使图书以我想要的特定价格范围出售,文件大小不得超过3兆字节。当我使用西方字体集时,这没关系。但我的电子书是双语的,对于韩语版我需要添加韩语字体(除了西方字体)。由于字母/字形的性质,亚洲字体文件相对较大。存储20.000(在极端情况下高达200.000)字形使每字体重量约为7-12兆字节。同样,我的整体图书文件大小限制是3兆字节,这对于所有图片和字体文件(加上布局和元文件)都有。知道电子书的文本没有被读者改变,丢弃字体中我文本中没有使用的所有字形是安全的。在此不再考虑不填写用户阅读设备的存储空间是另一个考虑因素。我已经大量压缩了图像文件,因为质量开始受到某些压缩率的影响,所以无法进一步压缩。我希望现在很明白为什么我认为对字体进行子集化是一个很好的解决方案。

2 个答案:

答案 0 :(得分:10)

我找到了一种在半自动化的基础上在fontforge中创建现有字体子集的方法。 关键是要使用fontforge的脚本功能。我使用互联网服务(见下面的链接)来获取我在书中使用的所有角色的unicodes。这看起来像这样的“\ uc6d0 \ uc22d \ uc774 \ uac1c \ ubbf8 \ uacf0 \ ubc8c \ ub3cc \ uace0 \ ub798”

我获取了服务的输出并使用了Notepad ++的“搜索和替换”功能来获得脚本的以下结构:

SelectMore("uc6d0")
SelectMore("uc22d")
SelectMore("uc774")
SelectMore("uac1c")
SelectMore("ubbf8")
SelectMore("uacf0")
SelectMore("ubc8c")
SelectMore("ub3cc")
SelectMore("uace0")
SelectMore("ub798")

是的,它只是重复调用相同的函数:SelectMore()。此函数选择作为参数传递的字形,而不清除任何先前的选择。另请注意,此脚本假定fontforge正在运行并且已打开字体文件。 (链接到fontforge脚本帮助,见下文)。 要在Fontforge中执行脚本,请从主菜单中选择“file - > execute script ...”,粘贴脚本并点击运行。

现在选择了所有使用的字形,取消选择所有未使用的字形。在主菜单中点击“编辑 - >选择 - >反向选择”以选择所有未使用的字形。现在我们可以在主菜单“编码 - >分离删除字形”中运行,以删除所有选定的,未使用的字形。现在将字体保存为新字体会产生所需的子集。

Unicode转换器: https://www.branah.com/unicode-converter Fontfore脚本帮助: https://fontforge.github.io/scripting-alpha.html

答案 1 :(得分:1)

很棒的问题/答案 user3725694 。为了使脚本生成更加自动化,可以使用以下 python 代码获取英语可打印字符的 Unicode 数据:

import string 
s = string.printable
for c in s: print('SelectMore("u%04x")' % ord(c))

它返回:

  

SelectMore(" u0030&#34)

     

SelectMore(" u0031&#34)

     

...

在手动FontForge活动的自动替代方案上有一个很棒的article