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

14

如何使用Fontforge从TTF字体文件中删除未在给定文本示例中使用的所有字符?换句话说,我想从现有字体创建一个子集,其中仅包含实际显示在我的文本中的字符。

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

在fontforge中有某些选择选项(主菜单>编辑>选择),我尝试了将韩文字母转换为它们的Unicode序列后的“按通配符选择”。但是还没有成功。

非常感谢任何想法!

编辑: 应用场景:我正在创建儿童电子书,由于其性质主要由图像组成。然而,文本不是图片的一部分,而是显示在额外的层上,该层显示在图片的前景中。电子书文件(我主要为亚马逊Kindle制作)包括一些元数据、图像文件、布局信息和字体文件。亚马逊Kindle出版计划有非常严格的文件大小限制。为了以我想要的特定价格范围销售书籍,文件大小不能超过3兆字节。当我使用西方字体集时,这是可以接受的。但我的电子书是双语的,对于韩文版,我需要添加韩文字体(除了西方字体)。由于它们的字母/字形的性质,亚洲字体文件相对巨大。存储20,000(在极端情况下高达200,000)个字形会产生约7-12兆字节的字体重量。再次强调,我的整体书籍文件大小限制为3兆字节,这必须包括所有图片和字体文件(以及布局和元文件)。知道电子书的文本不会被读者更改,因此安全地丢弃字体中未在我的文本中使用的所有字形。不必要地填满用户阅读设备的存储空间是另一个考虑因素。我已经大幅压缩了图像文件,无法进一步压缩,因为在某些压缩率下,质量开始受到影响。我希望现在清楚为什么我认为子集化字体是一个好的解决方案。


1
问题:为什么?您认为需要子集的问题是什么? - Mike 'Pomax' Kamermans
谢谢指出。我刚刚在问题中添加了一个用例。 - oystersauce
你所描述的使用情况已经被告知Acrobat等工具,使用子集字体而不是完全嵌入来生成文档主文件。这不是你需要自己做的事情。 - Mike 'Pomax' Kamermans
1
谢谢你的回答。我没有使用Acrobat。你是假设电子书是PDF格式,还是为什么假设我使用Acrobat?格式是.mobi(这是.epub格式的Amazon版本),与pdf无关。有一个叫做“Kindle儿童图书创建者”的软件,可以协助组装.mobi文件(否则需要手动完成)。它没有你所描述的功能(即分段嵌入字体)。 - oystersauce
1
我唯一使用的DPT软件是Kindle儿童图书创建器。正如我之前所说,它不支持字体子集化。(在此之前,我实际上是在文本编辑器中制作书籍,因为没有任何现有的DPT可以创建符合要求的绘本!) - oystersauce
显示剩余2条评论
2个回答

22

我已经找到了在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内执行脚本,请从主菜单中选择"file -> execute script...",粘贴脚本并点击运行。

现在所有使用过的字形都被选择,所有未使用的字形都被取消选择。在主菜单中点击"Edit -> Select -> Invert Selection"以选择所有未使用的字形。现在我们可以在主菜单中运行"Encoding -> Detach and Remove glyphs"来删除所有选定的(未使用的)字形。现在将字体另存为新字体即可得到所需的子集。


2
感谢您分享您的解决方案! - gernberg

4
很棒的问题/答案,user3725694。为了使脚本生成更加自动化,可以使用以下python代码获取英文可打印字符的Unicode数据:
import string 
s = string.printable
for c in s: print('SelectMore("u%04x")' % ord(c))

它的翻译是:

它返回:

SelectMore("u0030")

SelectMore("u0031")

...

这里有一篇关于自动替代手动FontForge操作的文章


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