第一个问题是您如何定义 Bravura 和 Calibri。这些字体不是标准 Ghostscript 安装的一部分,因此必须以某种方式添加它们,可能通过 fontconfig(在 Linux 上),但我看到您使用的是 Windows(从路径名)。你是如何添加字体的?
现在您(再次从反向通道消息)加载 TrueType 字体并使用它们作为缺少的 PostScript 字体的替代品。这是一个非标准功能,因此 Ghostscript 必须进行大量猜测才能尝试从 TrueType 字体创建 Type 42 字体(具有 TrueType 轮廓的 PostScript 字体)。尽管现在已经相当不错了,但不能保证它会成功。
顺便说一句,这与 Unicode 无关:-)
在 PostScript 中,您对要显示的每个字符使用字符代码。在您的情况下,您连续使用了 0x40 (@) 到 0x4C (L)。渲染字形时,解释器获取字符代码,并查找该位置的编码。请注意,您的编码数组仅包含从 0x41 到 0x47 的条目,因此代码 0x48 到 0x4C 将是未定义的。
让我们考虑一下您的“TextFont”,即 Calibri。在编码中的位置 0x41 处,您有一个字形名称“Scaron”。因此解释器随后会查阅该字体的 CharStrings 字典。 CharStrings 字典包含键/值对,键(在本例中)是名称,值是定义如何呈现字形的可执行程序。
因此解释器在 CharStrings 字典中查找名为 /Scaron 的键,然后执行与其关联的程序。如果它找不到键 /Scaron,那么它会查找键 /.notdef(所有字体都是required有一个 .notdef) 并执行它。
你实际上还没有说出你要说什么。我假设存在问题,因为您已经发布了一个问题(似乎不包含任何实际问题......),但您还没有说出它是什么。如果您得到的是空心矩形而不是预期的字形,那么这是因为解释器正在执行 /.notdef,对于 TrueType 字体来说,它通常是一个矩形(PostScript 字体通常有一个完全空白的 .notdef,但是两种字体类型都可以有它们想要的任何内容)。想)
在这种情况下,问题是您使用的字形名称(例如 /muscialnote)在 CharStrings 字典中不存在。除非 TrueType 字体有 POST 表(大多数没有),否则这并不奇怪,因为 /musicalnote 是一个非常不标准的字形名称。
如果我将 Calibri 添加到 fontmap.GS 然后执行以下操作:
%!
/Calibri findfont /CharStrings get {== ==} forall
然后我看到many表格的条目:
0
/_6756
0
/_6689
这些将名称(例如 /_6576)映射到 TrueType GID。当使用 TrueType 字体时,Ghostscript 需要 GID,以便它可以从 GLYF 表中找到该字体中的字形程序。当定义用作 type 42 的 TrueType 字体时,这是 Ghostscript 必须尝试为自己创建的东西(真正的 Type 42 字体是使用此字典作为字体的一部分来定义的)。它如何实现这一点是启发式的,即它猜测很多。
在本例中,GID 为 0,这是 TrueType 为 .notdef 字形保留的 GID,因此这些名称将全部映射到 .notdef。
我还看到许多条目,例如:
4
/A
这些(显然)是您可以使用的字形,在本例中名称 /A 映射到 GID 4。检查输出,没有名称“quarternote”、“musicalnote”等。有一个 Scaron,所以我希望您的“@”字符将呈现为带抑扬音符号的大写 S。剩余的字形将呈现为空方块,或者根本不呈现。这里的测试显示(有趣的是)一个带有问号的矩形。
现在,Calibri 字体可能包含您想要的字形,如果确实如此,那么恐怕访问它们的唯一方法(从 PostScript)就是识别 Ghostscript 与字形关联的名称。 Bravura 字体也是如此。
一些 PostScript 编程(看起来您完全有能力编写这个)将允许您从字体中检索 CharStrings 字典,迭代它,并构建一个包含所有具有非零值的名称的数组。然后,您可以打印一页(可能是很多页),在其中打印字体的命名字形,并在其下方打印与该字形关联的名称。这就是您的映射,现在您可以构建一个编码,将字形名称映射到您想要在 PostScript 程序中用于绘制该字形的字符代码。
FWIW,当我尝试使用 Bravura(这是一种 OpenType 字体,而不是 TrueType 字体)时,我在加载字体时遇到语法错误。 BravuraText 也是如此。