【发布时间】:2017-07-19 01:08:51
【问题描述】:
出于 PDF 字体嵌入的目的,我的任务是从 CFF OpenType 文件中删除未使用字形的字形轮廓数据以减小其大小。
问题在于,与 TTF 不同,CFF 将其字形轮廓数据“压缩”到子例程中,并在字形之间创建依赖关系,我不能只从 cmap 和轮廓数据中删除字形及其匹配的字符。
由于有几个开源 CFF 库(如 otfcc)可以子程序化 CFF 文件,我想知道是否有库可以执行相反的操作并撤消子程序化。
更新: 我正在使用的库是 otfcc 和 sfntly。 Sfntly 没有 CFF 解析器,所以我正在扩展一个,otfcc 确实有一个,但似乎没有子集选项,但源看起来更有希望。我还查看了 freetype,虽然它确实有 CFF 加载器,但似乎没有子集。
我目前已将 pdfbox 的 fontbox 从 Apache 移植到 sfntly 完成了一半。解析器工作,但子集仍然不完整。
【问题讨论】:
-
请删除
c++标签。 -
这是一件奇怪的事情:你的工具链应该已经能够做到这一点,所以为了不遇到XY Problem:你能提供更多关于你如何使用哪些工具的细节吗? '已经用于从“源”到“最终pdf”?因为根据该链中使用的工具,几乎可以肯定已经有一个实用程序甚至只是运行时标志可以为您实现这一目标。
-
@Mike'Pomax'Kamermans 我们的应用程序还没有 CFF 支持,它只有一个 TTF 子集,似乎是在 fontbox Apache 作为参考的内部开发的。 ie) 根本不支持 CFF,它对 CFF OTF 唯一能做的就是将它嵌入到 pdf 中,而不是对其进行子集化。
-
听起来你在重新发明轮子,因为字体锻造、字体工具和 adobe FDK 等东西已经免费......只需将它们用于您的子集。哎呀,通过带有字符字符串展开的 TTX 运行字体,修剪不需要的字形,通过 TTX 运行它以将其打包,然后如果需要进一步优化,则使用 adobe 自己的子程序优化器。完成,不费吹灰之力。有些真的是 TTF,TTX -> 删除字形 -> TTX 就完成了,开发你的工具的人实际上是在浪费时间 =/
-
@Mike'Pomax'Kamermans 是的,但要求是我需要在我们的应用程序中包含该功能而不添加到分布式文件中,所以我需要将它移植到 C++ 并集成到项目。 FontTools 实际上支持 CFF 子集选项,因此您可以获得子集的 OTF 而无需将其转换为 TTX 格式,但无论如何我需要移植它。
标签: fonts opentype compact-font-format