我正在使用iText(Java lib)来处理已经创建的PDF文件 .
我想要实现的是用该PDF基本字体替换与PDF基本字体公制兼容的字体 . 这将使PDF更“合规”,也可能更小 .
这是怎么回事:
循环播放PDF中使用的字体 .
如果字体与PDF基本字体的度量标准兼容,则用该字体替换字体名称(但保留PDF资源名称,例如 /F13 ,这样我们就不需要触摸任何文本对象) . 由于iText在其jar中嵌入了PDF基本字体的AFM文件,我假设iText实际上有足够的知识来进行此评估 . 我可能不得不看看serif / sans-serif和monotype标志以及我是否应该交换Helvetica,Times或Courier .
此外,如果度量兼容:删除该字体的任何字体嵌入 . (因为我们've replaced with a PDF base font there'不需要嵌入任何东西..大小很重要!)
一个例子:
现有的PDF文件使用“Calibri”,“Arial”和“Times” . 以下是每种方法的处理方法 .
Calibri . 此字体在PDF基本字体中没有与度量兼容的表兄弟,因此将跳过对此字体资源的处理 .
Arial . 此字体在PDF基本字体中具有与度量兼容的表兄,即"Helvetica" . 字体资源的名称(我认为属性 BaseFont )将更改为"Helvetica",并且将删除任何可能的嵌入 .
次 . 此字体已是PDF基本字体 . 跳过处理 . (我们可以考虑在这里解开,如果有什么东西要解开,但我已经知道如何做到这一点,所以不是问题的一部分)
我基本上陷入了确定度量兼容性的步骤 . 任何帮助是极大的赞赏 .
(注意:基于iText 5.x的答案是完全可以的,因为我觉得最近的iText 7仍然有些无证)
更新
正如所指出的那样,为了安全更换,还需要进行一些检查:
字体编码兼容性 . 对我来说不是一个问题,因为我将要处理的文档中的字体将使用WinAnsiEncoding .
字体中可用的字符 . 这对我来说不是一个问题,因为我可以轻松获取有关该字体文档中使用哪些字符的知识 .
我相信我可以找出来检查这两个条件 . (我很天真)
我不是想做一个通用的工具 . 我知道我将处理PDF的来源 . 在任何情况下,我想如果无法确定替换是“安全的”,可以从PDF中获取足够的信息来跳过字体替换 .