嵌入字体和非嵌入字体有什么区别?

Han*_*Kun 2 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);
}
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 度。

Bru*_*gie 6

当未嵌入字体时,PDF 查看器不知道该字体是什么样子。它不使用实际的字体,而是在查看文档的人的操作系统上搜索具有相似名称的字体。

例如:有14种所谓的Standard Type 1字体不需要嵌入:

  • 扎普夫丁巴特斯
  • 罗马时代
  • 时代斜体
  • 黑体-博多布利克
  • 博尔多布里克信使报
  • Helvetica 粗体
  • 黑体
  • 斜信使
  • 斜体 Helvetica
  • 快递粗体
  • 时代粗斜体
  • 导游
  • 倍粗体
  • 象征

如果您在 iText 中使用这些字体,iText 将忽略该embedded参数,因为可以安全地假设 Adob​​e 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(我承认不太好)。此示例的完整代码可以在此处找到。