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字体不需要嵌入:

  • 扎普丁蝙蝠
  • 罗马时代
  • 斜体时代
  • 黑花蛇舌草
  • 信使
  • 黑尔维蒂卡黑体
  • 赫尔维蒂卡
  • 信使斜线
  • 斜角海胆
  • 粗体信使
  • 泰晤士报黑体斜体
  • 信使
  • 泰晤士报
  • 象征
如果在iText中使用这些字体,iText将忽略
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);
}