我使用Evince在 Ubuntu Linux 10.04 上查看 PDF 文件。但有时程序无法正确显示数学符号。
一个例子。PDF 文件可从以下网址下载:
见等式(1)。
在 Windows 上,Acrobat Reader 可以正确显示等式:
但在 Linux 上,\sum
显示为实心点:
我已经安装了软件包:ttf-symbol-replacement
, libpoppler5
, poppler-data
.
我使用Evince在 Ubuntu Linux 10.04 上查看 PDF 文件。但有时程序无法正确显示数学符号。
一个例子。PDF 文件可从以下网址下载:
见等式(1)。
在 Windows 上,Acrobat Reader 可以正确显示等式:
但在 Linux 上,\sum
显示为实心点:
我已经安装了软件包:ttf-symbol-replacement
, libpoppler5
, poppler-data
.
您的 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 阅读器遇到未嵌入的字体,它会使用类似于以下的策略。它...
Courier
渲染文本。我对问题根本原因的假设是:
您的字体中缺少 ∑ 字符的
ttf-symbol-replacement
字形,或者在该替换字体的字形表中的不同位置找到了该字形。
因此,无法正确渲染该文件并不是 Evince 的错。
另一方面,Acrobat Reader 确实附带了Times、Courier、Helvetica和Symbol的应用程序嵌入实例,因此它可以呈现此类 PDF。所以 AcroRead 对这个文件没有问题。(由于这些字体的许可证,Evince 不能使用这些技巧......)
记住我的话:
如果您想要万无一失的 PDF 文件,可以由所有类型的操作系统系统上的每个 PDF 阅读器正确呈现(和打印),请确保您的 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...
看起来像是 Ubuntu 10.4 中(现在已经两年了)evince 中的一个错误。更新您的 Ubuntu 或向 Ubuntu 提交错误。