使用 iText 嵌入 Pdf 部分字体

Pdf partial font embedding with iText

我被要求将部分字体包含到 pdf 中。 我想我会使用 iText,我找到了如何嵌入字体,但我没有找到关于部分嵌入的线索。

有人知道部分嵌入是否是自动的吗?或者 iText 可能没有此功能?

谢谢。

iText 何时嵌入完整字体、子集或无字体?

在此答案中,假设您使用 BaseFont class 和 Font class 如下:

BaseFont bf = BaseFont.createFont(pathToFont, encoding, embedded);
Font font = new Font(bf, 12);

在此代码段中:

  • pathToFont 是字体文件(.ttf、.ttc、otf、.afm)的路径,
  • encoding是一种编码,例如"winansi"、BaseFont.IDENTITY_H、...
  • embedded 是布尔值:truefalse.

iText会不会嵌入字体?

embedded参数决定:

  • 如果是 false,则未嵌入字体。
  • 如果是true,则嵌入字体,除了 Standard Type 1 字体缺少 .pfb 文件的类型 1 字体 或 CJK 字体。

关于例外情况:

  • 标准 Type 1 字体 是 4 种 Helvetica 字体(常规、粗体、斜体、粗斜体)、4 种 Times Roman (...)、4 种字体Courier (...)、Symbol 和 Zapfdingbats。 iText 附带 14 个 Adob​​e 字体规格 (AFM) 文件。这些文件包含计算字形和单词宽度所需的指标。 iText 没有嵌入字体所需的打印机字体二进制 (PFB) 文件。
  • Type 1 字体存储在两个文件中:AFM 文件和 PFB 文件。如果您提供 AFM 文件,iText 将在同一目录中查找 PFB 文件。如果 iText 找不到任何 PFB 文件,则无法嵌入字体。
  • CJK 代表可下载字体包中的一系列中文、日文和韩文字体。这是一种特殊的亚洲字体;可以嵌入 .ttf.otf.ttc 文件中的亚洲字体。

iText 是否会子集字体?

iText 将始终尝试嵌入字体的子集,而不是整个字体,除了,以防您提供 Type 1 字体(AFM 和 PFB 文件)。如果提供了 Type 1 字体,则会嵌入 full 字体。

iText 可以嵌入完整字体吗?

是的,您可以通过添加以下行强制 iText 嵌入完整字体:

bf.setSubset(false);

但是,如果您使用 Identity-H 编码,这个值将被忽略,因为 ISO-32000-1 中是这样描述的。 iText 只会嵌入作为简单字体(256 个字符)存储在 PDF 中的完整字体; iText 永远不会嵌入存储为复合字体(最多 65,535 个字符)的字体。