即使嵌入了字体并且存在 /ToUnicode,PDF 也不显示字符

PDF doesn't show characters even though font is embedded and /ToUnicode is present

我在生成 PDF 文件时遇到问题。我使用 /ToUnicode 字符映射嵌入了字体。然后我将字形 ID 写为文本流。

奇怪的是:我可以 select 将文本从 PDF 复制到其他应用程序并粘贴文本。这适用于每个字符,甚至俄语、希腊语等。但是,文本不会显示在屏幕上。

下面是我的 PDF 的结构:

PDF 本身位于:https://drive.google.com/file/d/0B9J8lfyB3w2PX3R3N0dfT0VhRTA/view?usp=sharing

如果我在浏览器(Firefox 或 Chrome)中查看此 PDF,则会显示文本 "Hello"。如果我在 Adob​​e Reader 或其他文档查看器(如 xpdf 或 Linux 文档查看器中打开此 PDF,则不会显示字形。

我已将编码设置为 Identity-H 并创建了一个有效的 /ToUnicode table。我已将字体设置为 CIDFontType0 /(FontDescriptor 中的 CIDFontType0C)。 FontFile3 包含字体 "Asimov" 的 .otf 文件的完整副本,因为我想嵌入完整的字体。

Linux PDF 查看器告诉我字体已嵌入:

我不明白为什么文本没有显示。我通过查找字体的字形 ID 来编写文本。我需要做什么才能显示字体?

你的(第一个)问题是颜色space的定义和使用,名为DefaultGray、DefaultRGB和DefaultCMYK,这些名称有特定的含义。

这些 space 用于将 DeviceGray、DeviceRGB 和 DeviceCMYK 中定义的颜色映射到 CIE 颜色 space,以便对定义进行颜色管理。您不直接使用 Default* 颜色 spaces。文本变得不可见,因为您(实际上)两次使用相同的颜色 space,一次直接作为 DefaultCMYK,然后再次将生成的 CMYK 值映射到 CIE,然后再映射回 RGB(用于显示)。

你应该;

  1. 将颜色 space 设置为 DeviceCMYK 等而不是 DefaultCMYK
  2. 将命名颜色 space 称为 DefaultCMYK 等以外的颜色

我也认为,正如 Jan Slabon 所说,您使用的 ICC 配置文件有问题。

最后,看起来字体也坏了,所以即使你修复了颜色 space(我通过将内容流更改为使用 /DevcieCMYK 来完成)文本仍然没有使用 Acrobat 渲染。

FontDescriptor 中的 FontBBox 看起来不正确: [0 1327 472912 1327]

472912 似乎太大了,但是如果第二个和第四个条目的值相同,则表明该字体没有高度。

您可能还想考虑将 Ascent、Descent 和 CapHeight 条目设置为非零值。

问题是我在保存文档时压缩了字体。无论出于何种原因,您可能无法压缩字体流或 PDF 查看器无法再提取数据。一旦我禁用了 PDF 的压缩,字体又出现了。