使用 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
是布尔值:true
或 false
.
iText会不会嵌入字体?
由embedded
参数决定:
- 如果是
false
,则未嵌入字体。
- 如果是
true
,则嵌入字体,除了 Standard Type 1 字体 或缺少 .pfb 文件的类型 1 字体 或 CJK 字体。
关于例外情况:
- 标准 Type 1 字体 是 4 种 Helvetica 字体(常规、粗体、斜体、粗斜体)、4 种 Times Roman (...)、4 种字体Courier (...)、Symbol 和 Zapfdingbats。 iText 附带 14 个 Adobe 字体规格 (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 个字符)的字体。
我被要求将部分字体包含到 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
是布尔值:true
或false
.
iText会不会嵌入字体?
由embedded
参数决定:
- 如果是
false
,则未嵌入字体。 - 如果是
true
,则嵌入字体,除了 Standard Type 1 字体 或缺少 .pfb 文件的类型 1 字体 或 CJK 字体。
关于例外情况:
- 标准 Type 1 字体 是 4 种 Helvetica 字体(常规、粗体、斜体、粗斜体)、4 种 Times Roman (...)、4 种字体Courier (...)、Symbol 和 Zapfdingbats。 iText 附带 14 个 Adobe 字体规格 (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 个字符)的字体。