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

Yun*_*ang 14 linux pdf fonts

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

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

参见等式(1).

在Windows上,Acrobat Reader正确显示公式: 在此输入图像描述 但在Linux上,\sum它显示为一个实心点: 在此输入图像描述

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

Kur*_*fle 30

您的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,HelveticaSymbol实例,因此它可以呈现此类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 
Run Code Online (Sandbox Code Playgroud)

-dPDFSETTINGS=/prepressCLI参数的一部分告诉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标准 - 没有' 基本 14'PDF字体(这是4'标准','斜体','粗体'和'粗体 - 斜体'变体对于Helvetica,Times和Courier以及Symbol和Dingbats)需要嵌入,并且所有PDF查看器都应提供自己的方法来渲染这些字体中的所有字形,即使它们没有嵌入到文件中.

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

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

  • @pipitas:谢谢你的大力帮助!实际上这个问题出现在JMLR的每篇文章中.我必须在(虚拟)Windows上打印这些文件,这很不方便.我尝试了`gs`表达,修复后的PDF可以正确呈现.您的解决方案真的对我有所帮助 (3认同)
  • @Martin Schröder:您所指的是 ** 非常古老的** Adob​​e 建议(考虑到在昂贵的硬盘驱动器和 RAM 时代的小文件大小)。我所谈论的是使 PDF 在现实世界中可靠工作所需的条件。这就是为什么 fe 各种 PDF/A ISO 标准确实**需要**嵌入*所有*字体,(甚至是符号!)。 (2认同)
  • *叹气......*看,马丁.黄芸出了问题.我分析了它,甚至提供了一个解决方案,即使有一个错误的Evince,如何避免这个问题.我***谈论的是*'使PDF在现实世界中可靠地工作'*.您所谈论的***是PDF-1.7规范,已证明**并非**使(所有)PDF在现实世界中可靠地工作.这就是为什么PDF-1.7规范已被其他规范(甚至是标准!)补充的原因,例如PDF/A和PDF/X (2认同)
  • 这不是你相信什么的问题.这是一个对像Yun Huang和我这样的人有用的问题. (2认同)
  • @MartinSchröder:可能应该改进JMLR提交系统,以确保所有字体都嵌入在提交的文件中.谢谢大家:) (2认同)
  • @becko:现在 Adob​​e Reader 不共同安装任何字体*作为字体*。它具有用于显示 PDF“Base 14”字体的字体***编译***到其二进制文件中。Ghostscript 提供了这些 Base 14 PDF 字体的相似克隆,Evince 也可以使用它们。 (2认同)
  • @becko:`sudo apt-get install gsfonts`。 (2认同)
  • @becko:如果有问题的字体不是“Base 14”之一,那么看看 Adob​​e Reader 关于这些字体的说法。如果您执行“[ctrl]+[d] -> 字体”*,它应该识别字体名称。查看***未***标记为“嵌入”*的字体。然后记下显示的*“实际字体”*名称。这就是 Reader 用作替代字体的内容。但如果它读作*“xyz MM”*,则意味着它是一种“变形”Multiple Master 字体,Evince 不支持...所以您只能接受现在所拥有的。 (2认同)
  • @becko:...如果*“实际字体”* ***不是*** MM类型,那么谷歌它的名称并下载+安装在您的系统上... (2认同)