为什么 ghostscript 将字体名称替换为 "CairoFont"?

Why does ghostscript replace fontnames to "CairoFont"?

我使用 ghostscript 来优化 pdf 文件(主要是关于大小),它在这方面做得很好。我使用的命令是:

gs -dNOPAUSE -dBATCH -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress \
   -dCompatibilityLevel=1.4 -sOutputFile=out.pdf in.pdf

但是,这似乎替换了字体(或子集)并且没有保留它们的名称。它被 CairoFont 取代。我怎样才能让 ghostscript 保留字体名称?

示例: 一个简单的 pdf 文件(使用 Inkscape 创建),其中包含一个文本元素 (Nimbus Roman) 作为输入 (in.pdf):

其中 pdffonts 报告:

name                                 type              emb sub uni object ID
------------------------------------ ----------------- --- --- --- ---------
PMLNBT+NimbusRomanNo9L               Type 1            yes yes yes      5  0

但是,在 运行 对文件 pdffonts 进行 ghostscript 后报告:

name                                 type              emb sub uni object ID
------------------------------------ ----------------- --- --- --- ---------
OEPSCM+CairoFont-0-0                 Type 1C           yes yes no       8  0

那么,有没有办法让 ghostscript(或 libcairo?)保留字体的名称?

输入文件已上传here

Ghostscript 不会更改字体名称,但事实上,PDF 文件中有几种不同的字体'names'。

对于您的文件,PDF FontDescriptor 对象有一个名称

<<
  /Type /FontDescriptor
  /FontName /PMLNBT+NimbusRomanNo9L
  /Flags 4
  /FontBBox [ -168 -281 1031 924 ]
  /ItalicAngle 0
  /Ascent 924
  /Descent -281
  /CapHeight 924
  /StemV 80
  /StemH 80
  /FontFile 7 0 R
>>

指的是 FontFile 流

  /FontFile 7 0 R

该流包含以下内容:

%!PS-AdobeFont-1.0: NimbusRomNo9L-Regu 1.06
%%Title: NimbusRomNo9L-Regu
%Version: 1.06
%%CreationDate: Thu Aug  2 13:14:49 2007
%%Creator: frob
%Copyright: Copyright (URW)++,Copyright 1999 by (URW)++ Design &
%Copyright:  Development; Cyrillic glyphs added by Valek Filippov (C)
%Copyright:  2001-2005
% Generated by FontForge 20070723 (http://fontforge.sf.net/)
%%EndComments

FontDirectory/NimbusRomNo9L-Regu known{/NimbusRomNo9L-Regu findfont dup/UniqueID known pop false {dup
/UniqueID get 5020931 eq exch/FontType get 1 eq and}{pop false}ifelse
{save true}{false}ifelse}{false}ifelse
11 dict begin
/FontType 1 def
/FontMatrix [0.001 0 0 0.001 0 0 ]readonly def
/FontName /CairoFont-0-0 def

您在 实际 字体中看到 FontName 了吗?它叫做 CairoFont-0-0

这让我回到了我在这里和其他地方经常重申的观点;当您使用 Ghostscript 处理 PDF 文件并使用 pdfwrite 设备发出新的 PDF 文件时,您不是 'optimising'、'converting'、'subsetting' 或一般意义上的操纵原始 PDF 的内容文件。

Ghostscript 所做的是解释 PDF 文件,生成一组 opf 标记操作(例如 'stroke'、'fill'、'image' 等),并将其发送到选定的 Ghostscript设备。然后,大多数 Ghostscript 设备将使用图形库将操作呈现为位图,并在页面完成时将位图写入文件。 'high level' 或 'vector' 设备将操作重新打包为另一种页面描述语言。对于 pdfwrite,这是一个 PDF 文件。

这实际上意味着生成的 PDF 文件与原始 PDF 文件没有任何共同点(除了外观)。特别是对象的描述可能不同。

所以在你的情况下,pdfwrite 设备不知道在原始 PDF 对象中调用的字体是什么。它确实知道所定义的字体名为 Cairo-0-0,因此它在发出字体时就是这样称呼该字体的。

坦率地说,这是来自开罗的另一个糟糕的例子,除了将每个页面定义为包含透明度(无论是否包含透明度)之外,Font 对象中的 FontName 是 supposed与字体流中的名称相同。

很明显 FontName 已被更改,因为那里有其余的样板文件。