Itext 什么';字体之间的区别是嵌入字体和非嵌入字体?
在书中我看到了这样的例子:Itext 什么';字体之间的区别是嵌入字体和非嵌入字体?,itext,Itext,在书中我看到了这样的例子: 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
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);
}
结果:“a”不会顺时针旋转90度。如果未嵌入字体,PDF查看器将不知道该字体的外观。它不使用实际字体,而是在查看文档的人的操作系统上搜索具有类似名称的字体 例如:有14种所谓的标准类型1字体不需要嵌入:
- 扎普丁蝙蝠
- 罗马时代
- 斜体时代
- 黑花蛇舌草
- 信使
- 黑尔维蒂卡黑体
- 赫尔维蒂卡
- 信使斜线
- 斜角海胆
- 粗体信使
- 泰晤士报黑体斜体
- 信使
- 泰晤士报
- 象征
embedded
参数,因为可以安全地假设Adobe Reader和其他查看器可以正确呈现这些字体
现在假设您使用一种特殊字体,例如可口可乐字体来绘制您在可口可乐广告上看到的文本,或者使用沃尔特·迪斯尼字体来绘制使用沃尔特·迪斯尼卷曲标志符号的文本。在这种情况下,最好嵌入字体。如果不这样做,当用户打开PDF文档时,字体很可能无法正确显示
嵌入字体意味着您在PDF中包含完整字体或字体子集的字形描述。这会增加文件大小,但在某些情况下,必须嵌入字体。例如:如果你想符合PDF/A标准,所有字体都需要嵌入
使用CJK字体(在itext asian.jar中定义的字体)时,itext将忽略嵌入的
参数。它永远不会嵌入CJK字体,因为CJK字体期望在您的查看器中出现亚洲字体包(如果没有,Adobe Reader会要求您下载这样的字体包)
当使用IDENTITY\u H
或IDENTITY\u V
时,iText还将忽略嵌入的参数,因为PDF规范要求在将这些值用于编码
参数时嵌入字体的子集
不清楚在更改嵌入的
参数时,为什么希望图示符顺时针旋转90度。在我看来,你似乎在混合一些概念<代码>标识\u V
与旋转图示符无关。它是关于垂直而不是水平地呈现文本。对于西方语言,我们以从左到右、从上到下的行水平书写文本。阿拉伯语和希伯来语从右到左用水平线书写。一些亚洲语言,如日语,是垂直书写的,从右向左列。这是当您要使用IDENTITY\u V
时,不要将图示符旋转90度,而是要确保不同图示符之间的垂直间距正确(而IDENTITY\u H
定义了水平间距)
有关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);
}
/**
*转换字符串水平字符的CID
*转换为具有垂直字符的字符串。
*@param text包含水平字符的字符串
*@返回带有垂直字符的字符串
*/
公共字符串转换器CIDS(字符串文本){
char cid[]=text.toCharArray();
对于(int k=0;k
结果是这样的:(我承认不是很好)。可以找到这个示例的完整代码。我的问题是:“如何在旋转模式下嵌入字体(.otf)显示文本”作为链接。我发现了很多主题,但没有任何解决方案。我更新了示例。解决方案的关键是需要使用正确的UNICODE值。convertCIDs
方法将水平西方字母的Unicode值转换为旋转90度的同一字母的Unicode值。我不知道这是否适用于其他语言。你为什么让自己这么难?为什么不使用普通字母并旋转整个字符串?你想达到什么目标?也许你正在使用一种非常困难的方法来做一些非常简单的事情。在日语中,字母以旋转模式(字体)显示,与普通字母(顺时针旋转90度)不同。示例:unicode U+3300中的字符作为链接。因为我想通过cmap将水平模式下的角色映射到垂直模式。我对日语不够熟悉,无法回答这个问题。我几年前写过这个例子:它在右边第一列有一些日语字符。没有人抱怨这是错误的。因此我认为这是正确的。
/**
* 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);
}