PDF / iText:替换字体defs

时间:2016-05-13 11:32:20

标签: java pdf itext

我正在使用iText(Java lib)处理已创建的PDF文件。

我想要实现的是用PDF基本字体替换与PDF基本字体度量兼容的字体。这将使PDF更“合规”,也可能更小。

这是怎么回事:

  • 循环播放PDF中使用的字体。
  • 如果字体与指标兼容 使用PDF基本字体然后用该字体替换字体名称(但保留PDF资源名称,例如/F13,这样我们就不需要触摸任何文本 对象)。由于iText在其jar中嵌入了PDF的AFM文件 基本字体我假设iText实际上有足够的知识 做这个评估。我可能要看一下 serif / sans-serif和monotype flags以及我是否应该交换 在Helvetica,Times或Courier。
  • 此外,如果度量兼容:删除 任何字体嵌入该字体。 (因为我们已经用PDF基础代替了 字体没有必要嵌入任何东西..尺寸很重要!)

一个例子:

现有的PDF文件使用“Calibri”,“Arial”和“Times”。以下是每种方法的处理方式。

  • 宋体。此字体在PDF基本字体中没有与度量兼容的表兄弟,因此将跳过对此字体资源的处理。

  • Arial字体。此字体在PDF基本字体中具有与度量兼容的表兄弟,即“Helvetica”。字体资源的名称(我认为属性BaseFont)将更改为“Helvetica”,并且将删除任何可能的嵌入。

  • 时报。此字体已是PDF基本字体。跳过处理。 (我们可以考虑在这里解开,如果有什么东西要解开,但我已经知道如何做到这一点而不是问题的一部分)

我基本上陷入了确定度量兼容性的步骤。非常感谢任何帮助。

(注意:基于iText 5.x的答案是完全可以的,因为我觉得最近的iText 7仍然有些无证)

更新

正如所指出的那样,为了安全替换,还需要进行一些检查:

  1. 字体编码兼容性。对我来说不是一个问题,因为我将要处理的文档中的字体将使用WinAnsiEncoding。
  2. 字体中可用的字符。对我来说不是一个问题,因为我只会处理仅使用ISO 8859-1字符的文档。此外:如果PDF包含嵌入的字体子集,那么我将能够轻松获取有关该字体文档中使用哪些字符的知识。
  3. 我确信我可以找出检查这两种情况。 (我很天真)

    我不想做一般工具。我知道我将处理PDF的来源。在任何情况下,我想如果无法确定替换是“安全的”,可以从PDF中获取足够的信息来跳过字体替换。

0 个答案:

没有答案