字体之间的区别是11月字体中的嵌入字体?

时间:2014-12-07 16:38:18

标签: 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 = 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);
}

当我改为:

BaseFont bf = BaseFont.createFont("/../KozMinProRegular.otf",BaseFont.IDENTITY_V, BaseFont.EMBEDDED);

结果:&#39; a&#39;没有顺时针旋转90度。

1 个答案:

答案 0 :(得分:3)

如果未嵌入字体,则PDF查看器不知道字体的外观。它不是使用实际字体,而是在查看文档的人的操作系统上搜索具有相似名称的字体。

例如:有14个所谓的标准类型1字体,不需要嵌入:

  • ZAPFDINGBATS
  • 倍罗马
  • 倍斜体
  • 黑体-boldoblique
  • 快递-boldoblique
  • 黑体粗体
  • 黑体
  • 快递斜
  • 黑体斜
  • 快递粗体
  • 倍-BOLDITALIC
  • 快递
  • 倍粗体
  • 符号

如果您在iText中使用这些字体,iText将忽略embedded参数,因为可以安全地假设Adobe Reader和其他查看者可以正确呈现这些字体。

现在假设您使用特殊字体(例如可口可乐字体)来绘制您在可口可乐广告上看到的文字,或者使用沃尔特迪斯尼字体来使用卷曲的沃尔特迪斯尼字形来绘制文字。在这种情况下,最好嵌入字体。如果你不这样做,那么当用户打开他的PDF文档时,字体很有可能无法正确显示。

嵌入字体意味着您将完整字体的字形描述或字体的子集包含在PDF中。这会导致文件大小增加,但在某些情况下,必须嵌入字体。例如:如果您想要遵守PDF / A标准,则需要嵌入所有字体。

当使用CJK字体(在itext-asian.jar中定义的字体)时,iText将忽略embedded参数。它永远不会嵌入CJK字体,因为CJK字体期望在您的查看器中存在亚洲字体包(如果它不存在,Adobe Reader将要求您下载这样的字体包)。

使用IDENTITY_HIDENTITY_V时,iText也会忽略embedded参数,因为PDF规范要求您在为{{1}使用这些值时嵌入字体的子集参数。

目前还不清楚为什么在更改encoding参数时,您希望字形顺时针旋转90度。在我看来,你正在混合一些概念。 embedded并非关于旋转字形。它是关于垂直渲染文本而不是水平渲染文本。对于西方语言,我们将文本水平地写成从左到右,从上到下的行。阿拉伯语和希伯来语从右到左用水平线写成。某些亚洲语言(如日语)垂直写入,从右到左依次列出。这是当你打算使用IDENTITY_V,而不是将字形旋转90度,而是确保不同字形之间的垂直间距是正确的(而IDENTITY_V定义水平间距)。

有关IDENTITY_H有意义的示例,请参阅vertical_text_1.pdf。还有一个我们旋转文本的例子:

V

结果如下:vertical_text_2.pdf(不是那么好,我承认)。可以找到此示例的完整代码here