嵌入字体和 11 月字体有什么区别?

2023-11-29

在书中我看到了例子:

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);

结果:'a' 没有顺时针旋转 90 度。


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

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

  • 扎普夫丁巴特斯
  • 罗马时代
  • 时代斜体
  • 黑体-博多布利克
  • 博尔多布里克信使公司
  • Helvetica 粗体
  • 黑体
  • 斜信使
  • 斜体 Helvetica
  • 快递粗体
  • 时代粗斜体
  • courier
  • 倍粗体
  • symbol

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

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

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

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

使用时IDENTITY_H or IDENTITY_V, iText 也会忽略embedded参数,因为 PDF 规范要求您在使用这些值时嵌入字体的子集encoding范围。

目前尚不清楚为什么您会期望在更改字形时顺时针旋转 90 度embedded范围。在我看来,你正在混淆一些概念。IDENTITY_V与旋转字形无关。它是关于垂直而不是水平渲染文本。对于西方语言,我们从左到右、从上到下水平书写文本。阿拉伯语和希伯来语是从右到左以水平线书写的。一些亚洲语言(例如日语)是垂直书写的,从右到左按列排列。这是你要使用的时候IDENTITY_V,不是将字形旋转 90 度,而是确保不同字形之间的垂直间距正确(而IDENTITY_H定义水平间距)。

See 垂直文本_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);
}

结果如下:垂直文本_2.pdf(我承认,不太好)。此示例的完整代码可以找到here.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

嵌入字体和 11 月字体有什么区别? 的相关文章

随机推荐