9

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

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

在 fontforge 中有某些选择选项(主菜单 > 编辑 > 选择),在将韩语字符转换为其 unicode 序列后,我尝试了“通过 Wildcarcds 选择”。但还没有运气。

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

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

4

2 回答 2

16

我找到了一种在FontForge中半自动创建现有字体子集的方法。关键是使用 Fontforge 的脚本功能。我使用互联网服务(见下面的链接)来获取我在书中使用的所有字符的 unicode。这看起来像这样“\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 中执行脚本,请从主菜单中选择“文件 -> 执行脚本...” ,粘贴脚本并点击运行。

现在所有使用的字形都被选中,所有未使用的字形都被取消选择。在主菜单中点击“编辑 -> 选择 -> 反转选择”以选择所有未使用的字形。现在我们可以在主菜单“Encoding -> Detach and Remove glyphs”中运行以删除所有选定(未使用)的字形。现在将字体另存为新字体会产生所需的子集。

于 2016-03-02T17:43:43.083 回答
3

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

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

它返回:

选择更多(“u0030”)

选择更多(“u0031”)

...

有一篇关于手动 FontForge 活动的自动替代方案的好文章

于 2018-02-23T21:17:24.383 回答