首页 文章

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

提问于
浏览
0

我使用ghostscript来优化pdf文件(主要是关于大小),为此它做得很好 . 我使用的命令是:

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

但是,它似乎替换了字体(或它们的子集)并且不保留它们的名称 . 它取代了CairoFont . 我怎么能得到ghostscript来保存字体名?

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

enter image description here

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 .

1 回答

  • 2

    Ghostscript不会更改字体名称,但实际上,PDF文件中有几种不同的字体“名称” .

    对于您的文件,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
    

    你看到 actual 字体中的FontName?它被称为 CairoFont-0-0

    这让我回到了我在这里和其他地方经常重申的一点;当您使用Ghostscript处理PDF文件并使用pdfwrite设备发出新的PDF文件时,您不是“优化”,“转换”,“子集化”或一般意义上操纵原始PDF文件的内容 .

    Ghostscript所做的是解释PDF文件,它会产生一组opf标记操作(例如'stroke','fill','image'等),并将其发送到选定的Ghostscript设备 . 然后,大多数Ghostscript设备将使用图形库将操作呈现为位图,当页面完成时,将位图写入文件 . “高级”或“向量”设备将操作重新打包为另一种页面描述语言 . 在pdfwrite的情况下,这是一个PDF文件 .

    这在实践中意味着发出的PDF文件与原始PDF文件没有任何共同点(除了外观) . 特别地,对象的描述可以是不同的 .

    因此,在您的情况下,pdfwrite设备不知道原始PDF对象中调用的字体是什么 . 它确实知道定义的字体叫做Cairo-0-0,这就是它发出字体时所谓的字体 .

    坦率地说,这是来自开罗的另一个贫穷的例子,同时将每个页面定义为包含透明度是否有,Font对象中的FontName是 supposed 与字体流中的名称相同 .

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

相关问题