我使用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
):
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 回答
Ghostscript不会更改字体名称,但实际上,PDF文件中有几种不同的字体“名称” .
对于您的文件,PDF FontDescriptor对象具有名称
它指的是FontFile流
该流包含以下内容:
你看到 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已被更改,因为那里有其余的样板文件 .