ITextRenderer 嵌入字体不适用于 base 14 字体

ITextRenderer embedding font not working for base 14 fonts

我需要在 Java 中使用 velocity 和 ITextRenderer 将所有字体嵌入到我的 pdf 中。

大多数字体都可以正常工作,如

renderer.getFontResolver().addFont(
getClass().getResource("fonts/tahoma.ttf").toExternalForm(), true);

我有相同的 Times-Roman 和 Helvetica 代码,但生成的 pdf 没有嵌入这两个代码。我确保字体名称与 PDF 文件 属性 中缺失字体的名称匹配。

来自Acrobat Help

A font can be embedded only if it contains a setting by the font vendor that permits it to be embedded.

其他字体(不起作用)不允许嵌入。

Flying Saucer 是一款基于 iText 构建的产品。虽然iText公司不认可使用Flying Saucer,但我会破例回答这个问题(我是iText Software的CEO)。

您指的是过去称为 Base 14 字体的字体。今天,这些字体被称为标准 Type 1 字体。

与 TrueType 和 OpenType 字体相反,Type 1 字体在一组两个文件中进行了描述。每种字体有:

  1. Adobe 字体规格 (AFM) 文件。此文件包含在不嵌入字体的情况下使用字体所需的所有指标。
  2. 打印机字体二进制 (PFB) 文件。该文件包含绘制字体中每个字形所需的语法。这是嵌入字体时需要的文件。

根据 PDF 规范中的定义,每个查看者都应该能够呈现 14 种标准 Type 1 字体。这就是人们通常不嵌入它们的原因(除非有嵌入字体的特定原因。PDF/A 合规性是其中一个原因)。

至于 iText,iText 附带 14 个 AFM 文件。 iText 可以这样做,因为 AFM 文件的许可证允许这样做。 iText 不附带相应的 PFB 文件。如果这样做,那将是非法的,因为 PFB 文件不是免费提供的。因此,iText 永远不会嵌入 14 种标准 Type 1 字体,即使您将 embedded 参数设置为 true。嵌入字体(如 Helvetica)的唯一方法是提供字体程序。即:不仅是 iText 附带的 AFM 文件,还有知道如何绘制字形的 PFB 文件。

使用飞碟时要非常小心:如果您将它与 iText 2 结合使用,则适用: 如果您将它与 iText 5 结合使用,并且您没有根据 AGPL 分发自己的代码,则可能需要商业许可证。