当未嵌入字体时,PDF 查看器不知道该字体是什么样子。它不使用实际的字体,而是在查看文档的人的操作系统上搜索具有相似名称的字体。
例如:有14个所谓的标准 Type 1 字体不需要嵌入的:
- 扎普夫丁巴特斯
- 罗马时代
- 时代斜体
- 黑体-博多布利克
- 博尔多布里克信使公司
- Helvetica 粗体
- 黑体
- 斜信使
- 斜体 Helvetica
- 快递粗体
- 时代粗斜体
- courier
- 倍粗体
- symbol
如果您在 iText 中使用这些字体,iText 将忽略embedded
参数,因为可以安全地假设 Adobe Reader 和其他查看器可以正确呈现这些字体。
现在假设您使用特殊字体(例如 Coca Cola 字体)来绘制在可口可乐广告上看到的文本,或者使用 Walt Disney 字体(例如 Walt Disney 字体)来使用卷曲的 Walt Disney 字形绘制文本。在这种情况下,最好嵌入字体。如果不这样做,当用户打开 PDF 文档时,字体很可能无法正确显示。
嵌入字体意味着您将完整字体或字体子集的字形描述包含到 PDF 中。这会导致文件大小增加,但在某些情况下,必须嵌入字体。例如:如果要遵守PDF/A标准,则需要嵌入所有字体。
当使用 CJK 字体(在 itext-asian.jar 中定义的字体)时,iText 将忽略embedded
范围。它会never嵌入 CJK 字体,因为 CJK 字体期望您的查看器中存在亚洲字体包(如果不存在,Adobe Reader 将要求您下载此类字体包)。
使用时IDENTITY_H
or IDENTITY_V
, iText 也会忽略embedded
参数,因为 PDF 规范要求您在使用这些值时嵌入字体的子集encoding
范围。
目前尚不清楚为什么您会期望在更改字形时顺时针旋转 90 度embedded
范围。在我看来,你正在混淆一些概念。IDENTITY_V
与旋转字形无关。它是关于垂直而不是水平渲染文本。对于西方语言,我们从左到右、从上到下水平书写文本。阿拉伯语和希伯来语是从右到左以水平线书写的。一些亚洲语言(例如日语)是垂直书写的,从右到左按列排列。这是你要使用的时候IDENTITY_V
,不是将字形旋转 90 度,而是确保不同字形之间的垂直间距正确(而IDENTITY_H
定义水平间距)。
See 垂直文本_1.pdf举个例子,其中V
说得通。还有一个我们旋转文本的示例:
/**
* Converts the CIDs of the horizontal characters of a String
* into a String with vertical characters.
* @param text The String with the horizontal characters
* @return A String with vertical characters
*/
public String convertCIDs(String text) {
char cid[] = text.toCharArray();
for (int k = 0; k < cid.length; ++k) {
char c = cid[k];
if (c == '\n')
cid[k] = '\uff00';
else
cid[k] = (char) (c - ' ' + 8720);
}
return new String(cid);
}
结果如下:垂直文本_2.pdf(我承认,不太好)。此示例的完整代码可以找到here.