在书中我看到了例子:
BaseFont bf = BaseFont.createFont("KozMinPro-Regular", "Identity-V", BaseFont.NOT_EMBEDDED);
Font font = new Font(bf, 20);
VerticalText vt = new VerticalText(writer.getDirectContent()); vt.setVerticalLayout(390, 570, 540, 12, 30);
font = new Font(bf, 20);
vt.addText(new Phrase(convertCIDs("a"), font));
vt.go();
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);
}
Run Code Online (Sandbox Code Playgroud)
当我更改为:
BaseFont bf = BaseFont.createFont("/../KozMinProRegular.otf",BaseFont.IDENTITY_V, BaseFont.EMBEDDED);
Run Code Online (Sandbox Code Playgroud)
结果:'a' 没有顺时针旋转 90 度。
当未嵌入字体时,PDF 查看器不知道该字体是什么样子。它不使用实际的字体,而是在查看文档的人的操作系统上搜索具有相似名称的字体。
例如:有14种所谓的Standard Type 1字体不需要嵌入:
如果您在 iText 中使用这些字体,iText 将忽略该embedded参数,因为可以安全地假设 Adobe Reader 和其他查看器可以正确呈现这些字体。
现在假设您使用特殊字体(例如 Coca Cola 字体)来绘制在可口可乐广告上看到的文本,或者使用 Walt Disney 字体(例如 Walt Disney 字体)来使用卷曲的 Walt Disney 字形绘制文本。在这种情况下,最好嵌入字体。如果不这样做,当用户打开 PDF 文档时,字体很可能无法正确显示。
嵌入字体意味着您将完整字体或字体子集的字形描述包含到 PDF 中。这会导致文件大小增加,但在某些情况下,必须嵌入字体。例如:如果要遵守PDF/A标准,则需要嵌入所有字体。
当使用 CJK 字体(在 itext-asian.jar 中定义的字体)时,iText 将忽略该embedded参数。它永远不会嵌入 CJK 字体,因为 CJK 字体期望您的查看器中存在亚洲字体包(如果不存在,Adobe Reader 将要求您下载此类字体包)。
使用IDENTITY_H或时IDENTITY_V,iText 也会忽略该embedded参数,因为 PDF 规范要求您在使用这些参数值时嵌入字体的子集encoding。
目前还不清楚为什么在更改参数时您会期望字形顺时针旋转 90 度embedded。在我看来,你正在混淆一些概念。IDENTITY_V与旋转字形无关。它是关于垂直而不是水平渲染文本。对于西方语言,我们从左到右、从上到下水平书写文本。阿拉伯语和希伯来语是从右到左以水平线书写的。一些亚洲语言(例如日语)是垂直书写的,从右到左按列排列。这是当您要使用 时IDENTITY_V,不是将字形旋转 90 度,而是确保不同字形之间的垂直间距正确(而IDENTITY_H定义水平间距)。
请参阅vertical_text_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);
}
Run Code Online (Sandbox Code Playgroud)
结果如下所示:vertical_text_2.pdf(我承认不太好)。此示例的完整代码可以在此处找到。
| 归档时间: |
|
| 查看次数: |
2210 次 |
| 最近记录: |