Linux上的PDF查看器“Evince”无法正确显示某些数学符号

时间:2012-04-23 08:49:33

标签: linux pdf fonts

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

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

见等式(1)。

在Windows上,Acrobat Reader正确显示公式: enter image description here 但是在Linux上,\sum显示为一个实心点: enter image description here

我已经安装了软件包:ttf-symbol-replacementlibpoppler5poppler-data

2 个答案:

答案 0 :(得分:29)

您的PDF文件无法在所有PDF查看器上运行的原因是:您的'zhang11a.pdf'没有嵌入所有字体。特别缺少的是symbol字体,您可以从以下列表中看到:

kupfe@abc:~$ pdffonts zhang11a.pdf 
name                             type      emb sub uni object ID
-------------------------------- --------- --- --- --- ---------
NXDEKT+CMSY10                    Type 1C   yes yes yes     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   yes yes no      29  0
QEAPRL+CMR10                     Type 1C   yes yes no      23  0
OBCIBS+CMMI10                    Type 1C   yes yes yes     25  0
Symbol                           Type 1    no  no  no      33  0
OUPZTL+ZapfChancery-MediumItalic Type 1C   yes yes no      27  0
CFICWF+CMEX10                    Type 1C   yes yes no      31  0
XRVDJC+CMMI7                     Type 1C   yes yes no      56  0
JQSOYL+CMMI10                    Type 1C   yes yes no      54  0
UWKDHL+CMBX10                    Type 1C   yes yes no      58  0
AIYCES+CMMI5                     Type 1C   yes yes no      60  0
SDIKLH+CMEX9                     Type 1C   yes yes no      72  0
EKRXFC+CMSS10                    Type 1C   yes yes no      84  0
Courier                          Type 1    no  no  no      91  0
Helvetica                        Type 1    no  no  no      97  0
UELPFP+CMMI10                    Type 1C   yes yes no     135  0
VZIXBZ+CMR10                     Type 1C   yes yes no     133  0

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

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

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

  

ttf-symbol-replacement字体中缺少Σ字符的字形,或者该字形位于该替换字体的字形表中的不同位置。

因此,无法正确呈现该文件不是Evince的错误。

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

标记我的话:
如果您想要所有类型的OS系统上的每个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
name                             type      emb sub uni object ID
-------------------------------- --------- --- --- --- ---------
AFNVKD+Times-Italic              Type 1C   yes yes no      12  0   
PEQXED+CMSY10                    Type 1C   yes yes yes     14  0   
FYXQNZ+Times-Roman               Type 1C   yes yes no       8  0    
XILTND+Times-Bold                Type 1C   yes yes no      10  0   
HZJMVE+Symbol                    Type 1C   yes yes no      36  0   
EGYAWT+CMR10                     Type 1C   yes yes no      26  0   
AQGZYJ+CMMI10                    Type 1C   yes yes yes     28  0   
YJATHO+ZapfChancery-MediumItalic Type 1C   yes yes no      30  0   
CZXDRN+MSBM10                    Type 1C   yes yes no      32  0   
KTZJPT+CMEX10                    Type 1C   yes yes no      34  0   
NYTDMD+CMMI10                    Type 1C   yes yes no      58  0   
DFQTPB+CMMI7                     Type 1C   yes yes no      60  0   
GXJYGS+CMBX10                    Type 1C   yes yes no      62  0   
QAMUEV+CMMI5                     Type 1C   yes yes no      64  0   
QEWIFQ+CMEX9                     Type 1C   yes yes no      76  0   
KNOSJH+CMSS10                    Type 1C   yes yes no      88  0   
UCHHLK+Courier                   Type 1C   yes yes no      95  0   
TWNVND+Helvetica                 Type 1C   yes yes no     102  0  
ZDIWNO+CMR10                     Type 1C   yes yes no     139  0  
IGJFUT+CMMI10                    Type 1C   yes yes no     141  0  

我查看了Evince如何呈现修复过的PDF:现在可以了。


更新:

MartinSchröder说得对 - 根据ISO PDF标准 - 没有' Base 14 'PDF字体(这是4'标准','斜体','需要嵌入Helvetica,Times和Courier以及Symbol和Dingbats的大胆'和'粗体 - 斜体'变体,并且所有PDF查看器都应提供自己的方法来渲染这些字体中的所有字形,即使它们不是嵌入在文件中。

实际上,遵循这一建议确实导致了现实生活中的许多问题(例如在这个问题中展示了一个案例):因为并非所有观众,渲染器和自动PDF处理器都能可靠地渲染未嵌入的字形字体。这就是为什么所有现行的PDF / A(归档)和PDF / X(盲目交换)的ISO标准都需要来嵌入所有字体(甚至是'基础14 '个)PDF文件。否则该文件不符合相应标准。

正如我的Ghostscript命令的结果所示:嵌入Symbol字体确实可以避免Evince的Σ字形渲染问题。即使您认为它是一个Evince错误(您可以正确地),它也无法正确呈现原始PDF ...

答案 1 :(得分:-2)

在Ubuntu 10.4中看起来像是(现在两岁)的一个错误。要么更新你的Ubuntu,要么用Ubuntu提交bug。