16

我使用Evince在 Ubuntu Linux 10.04 上查看 PDF 文件。但有时程序无法正确显示数学符号。

一个例子。PDF 文件可从以下网址下载:

见等式(1)。

在 Windows 上,Acrobat Reader 可以正确显示等式: 在此处输入图像描述 但在 Linux 上,\sum显示为实心点: 在此处输入图像描述

我已经安装了软件包:ttf-symbol-replacement, libpoppler5, poppler-data.

4

2 回答 2

37

您的 PDF 文件不适用于所有 PDF 查看器的原因是:的“zhang11a.pdf”没有嵌入所有字体。尤其缺少的是symbol字体,您可以从以下列表中看到:

kupfe@abc:~$ pdffonts zhang11a.pdf
名称 类型 emb 子 uni 对象 ID
------------------ --------- --- --- --- ---------
NXDEKT+CMSY10 类型 1C 是 是 是 11 0
Times-Italic Type 1 no no no 10 0
Times-Bold Type 1 no no no 9 0
Times-Roman Type 1 no no no 8 0
UYBJCW+MSBM10 Type 1C 是 是 否 29 0
QEAPRL+CMR10 类型 1C 是 是 否 23 0
OBCIBS+CMMI10 类型 1C 是 是 是 25 0
符号类型 1 no no no 33 0
OUPZTL+ZapfChancery-MediumItalic Type 1C 是 是 否 27 0
CFICWF+CMEX10 类型 1C 是 是 否 31 0
XRVDJC+CMMI7 类型 1C 是 是 否 56 0
JQSOYL+CMMI10 Type 1C 是 是 否 54 0
UWKDHL+CMBX10 类型 1C 是 是 否 58 0
AIYCES+CMMI5 类型 1C 是 是 否 60 0
SDIKLH+CMEX9 类型 1C 是 是 否 72 0
EKRXFC+CMSS10 类型 1C 是 是 否 84 0
快递类型 1 不 不 不 91 0
Helvetica 类型 1 否 否 否 97 0
UELPFP+CMMI10 类型 1C 是 是 否 135 0
VZIXBZ+CMR10 Type 1C 是 是 否 133 0

现在,如果 PDF 阅读器遇到未嵌入的字体,它会使用类似于以下的策略。它...

  • (1) ....搜索本地操作系统并尝试找到具有匹配类型和名称的字体,以便使用它来呈现文本;如果这不成功,它....
  • (2) ....搜索本地操作系统以找到具有匹配名称的字体(可能是其他字体类型);如果不成功,它....
  • (3) ....搜索适当的替代字体(其字体度量接近原始字体的度量——原始字体的度量信息应该嵌入到 PDF 中,即使字体文件本身不是); 如果不成功,那么...
  • (4) ....用于Courier渲染文本。

我对问题根本原因的假设是:

您的字体中缺少 ∑ 字符的ttf-symbol-replacement字形,或者在该替换字体的字形表中的不同位置找到了该字形。

因此,无法正确渲染该文件并不是 Evince 的错。

另一方面,Acrobat Reader 确实附带了TimesCourierHelveticaSymbol的应用程序嵌入实例,因此它可以呈现此类 PDF。所以 AcroRead 对这个文件没有问题。(由于这些字体的许可证,Evince 不能使用这些技巧......)

记住我的话:
如果您想要万无一失的 PDF 文件,可以由所有类型的操作系统系统上的每个 PDF 阅读器正确呈现(和打印),请确保您的 PDF 嵌入了它使用的所有字体!

修复你的 zhang11a.pdf

但是,可以在 Ghostscript 的帮助下修复有问题的 PDF。我在 Ubuntu Oneiric 系统(使用 Ghostscript v9.02)上使用了这个命令来做到这一点:

/usr/bin/gs \
  -o gs-repaired---zhang11a.pdf \
  -dPDFSETTINGS=/prepress \
  -sDEVICE=pdfwrite \
   zhang11a.pdf 

CLI 参数的-dPDFSETTINGS=/prepress一部分告诉 Ghostscript 嵌入所有非嵌入字体。

这就是修复后的 PDF 的嵌入属性现在的样子:

kupfe@abc:~$ pdffonts gs-repaired---zhang11a.pdf
名称 类型 emb 子 uni 对象 ID
------------------ --------- --- --- --- ---------
AFNVKD+Times-Italic Type 1C 是 是 否 12 0   
PEQXED+CMSY10 类型 1C 是 是 是 14 0   
FYXQNZ+Times-Roman Type 1C 是 是 否 8 0    
XILTND+Times-Bold Type 1C 是 是 否 10 0   
HZJMVE+符号类型 1C 是 是 否 36 0   
EGYAWT+CMR10 类型 1C 是 是 否 26 0   
AQGZYJ+CMMI10 Type 1C 是 是 是 28 0   
YJATHO+ZapfChancery-MediumItalic Type 1C 是 是 否 30 0   
CZXDRN+MSBM10 Type 1C 是 是 否 32 0   
KTZJPT+CMEX10 类型 1C 是 是 否 34 0   
NYTDMD+CMMI10 类型 1C 是 是 否 58 0   
DFQTPB+CMMI7 类型 1C 是 是 否 60 0   
GXJYGS+CMBX10 Type 1C 是 是 否 62 0   
QAMUEV+CMMI5 类型 1C 是 是 否 64 0   
QEWIFQ+CMEX9 类型 1C 是 是 否 76 0   
KNOSJH+CMSS10 类型 1C 是 是 否 88 0   
UCHHLK+Courier Type 1C 是 是 否 95 0   
TWNVND+Helvetica Type 1C 是 是 否 102 0  
ZDIWNO+CMR10 类型 1C 是 是 否 139 0  
IGJFUT+CMMI10 类型 1C 是 是 否 141 0  

我检查了 Evince 如何渲染修复的 PDF:现在可以了。


更新:

Martin Schröder 的说法是正确的——根据 ISO PDF 标准——“ Base 14 ”PDF 字体(即 4 种“标准”、“斜体”、“粗体”和“粗斜体”变体)都不是对于 Helvetica、Times 和 Courier 以及 Symbol 和 Dingbats)需要嵌入,并且所有 PDF 查看器都应该提供自己的方法来呈现这些字体中的所有字形,即使它们没有嵌入文件中。

In reality, following this recommendation did lead to many problems in real life (such as one case is on display in this very question): because not all viewers, renderers and automatic PDF processors do reliably render the glyphs for un-embedded fonts. And that's the reason why all current ISO standards for PDF/A (archiving) and PDF/X (blind eXchange) require to embed all fonts (even the 'Base 14' ones) in PDF files. Otherwise that file is not deemed compliant with the respective standard.

And as my Ghostscript command's result shows: embedding the Symbol font does reliably avoid the ∑ glyph rendering problem for Evince. Even if you consider it an Evince bug (which you rightly can) that it doesn't correctly render the original PDF...

于 2012-04-23T14:12:41.557 回答
-2

看起来像是 Ubuntu 10.4 中(现在已经两年了)evince 中的一个错误。更新您的 Ubuntu 或向 Ubuntu 提交错误。

于 2012-04-23T14:06:07.157 回答