跳转到内容

PostScript 常见问题解答/使用 Ghostscript

来自维基教科书,开放的书籍,开放的世界

使用 Ghostscript

[编辑 | 编辑源代码]

什么是 Ghostscript 以及在哪里可以获取它?

[编辑 | 编辑源代码]

Ghostscript 是一个常用的开源软件套件,它基于 Adobe Systems 的页面描述语言 PostScript 和其 Portable Document Format (PDF) 的 解释器。该套件由 Artifex Software 和全球社区开发,主要用于文档页面的光栅化和渲染以显示或打印它们,以及 PostScript 和 PDF 之间的转换。它包含一组免费的 PostScript 字体,并在许多第三方应用程序和 GUI 中使用。

有关详细信息和软件下载,请参见 Ghostscript

如何创建压缩的 CMYK TIFF?

[编辑 | 编辑源代码]

Ghostscript 有五个用于颜色管理的 TIFF 设备。以及五个 TIFF 压缩设备,它们只生成黑白图像。

 gs -sDEVICE=tif32nc -sOutputFile=tiger.tiff -dEPSCrop examples/tiger.eps

哪些 CJK 字体可以在 Ghostscript 上使用?

[编辑 | 编辑源代码]

未受保护的 CJK 字体可以在 Ghostscript 上正常使用。无法安装 CSL(Adobe 的 CID 支持库),但大多数 PostScript 程序不需要它。CSL 模拟 OCF 结构,用于假设解释器上存在 OCF 字体的作业,并直接操作它们。

Heisei 和 KozMin CIDFonts 是 Adobe Systems 开发的未受保护的专有字体。附带字体的安装程序在 Mac 上运行,并将字体安装到使用 PAP 协议的网络打印机上。要在 Ghostscript 上安装这些字体,您需要将 CIDFont 文件复制到 Resource/CIDFont/ 目录中。

CIDFont 资源隐藏在 Mac 文件系统中不可见文件的资源分叉中。 get-mac-cidfont 从输入文件(通常为/dev/cdrom)中提取所有 CIDFont 资源到目录中。该程序也适用于 Windows NT。

如何在 PDF 中避免 JPEG 压缩?

[编辑 | 编辑源代码]

Ghostscript 具有过度激进的启发式方法来识别用于 JPEG 压缩的图像。使用setdistillerparams 运算符,可以手动选择压缩算法。除了setdistillerparams 运算符外,Ghostscript 还接受大多数 distiller 参数(PDF 0.6M)作为命令行参数。

 ps2pdf -dAutoFilterColorImages#false -dColorImageFilter#/FlateEncode \
   -dAutoFilterGrayImages#false -dGrayImageFilter#/FlateEncode foo.ps foo.pdf

Ghostscript 开发人员已认识到这个问题。修复预计很快就会到来。

Ghostscript 在 findfont 中出现 /invalidfont 错误?

[编辑 | 编辑源代码]

Ghostscript 很可能完全无法访问任何字体。要检查搜索字体的目录,请使用

 gs -h

 gswin32c -h

如何创建半透明对象?

[编辑 | 编辑源代码]

Adobe 在 PDF 1.4 中引入了半透明对象。许多新的 RIP(包括 Ghostscript)直接接受 PDF 1.4。因此,PostScript 中的透明度功能不再需要。

  • Ghostscript 在 v. 8.00 及更高版本中支持 PDF 1.4
  • Adobe CPSI 在 v. 3015 及更高版本中支持 PDF 1.4

标准 PostScript 具有不透明的颜色模型。较新的对象完全遮蔽了底部的对象,但新对象的某些部分可以通过裁剪路径从绘制中排除。在级别 3 PostScript 上,采样图像可用于裁剪另一个采样图像。在级别 2 上,可以通过在图像蒙版上绘制图案颜色来实现类似的效果。

通过叠印专色和纯过程色也可以实现非常有限的透明度效果。

Ghostscript 中的 PDF 1.4 解释器是用扩展的 PostScript 语言实现的。扩展对常规 PostScript 文件可见,并且可以用于实现相同的效果。该接口在 doc/language.htm 中有部分文档说明。有关详细信息,请阅读源代码。

PostScript 输出干扰重定向的设备输出。

[编辑 | 编辑源代码]

写入 stdout 的 PostScript 文件将干扰对 stdout 的设备输出。因此,从 v.7.04 开始,Ghostscript 可以将 PostScript %stdout 输出分配给文件,使实际的 stdout 对于设备输出(如使用-sOutputFile=--sOutputFile=%stdout)保持“干净”。

例如,当 Ghostscript 用作过滤器时,要丢弃 PS %stdout 输出(例如,来自 '=' 运算符),正确的命令行是

 gs -q -sstdout=/dev/null -sOutputFile=- - | ...

借助 bash 的一点帮助,可以将 命名管道 用作常规文件的替代,避免所有 stdout-stderr 问题。

 gs -sDEVICE=pswrite -o >(wc) -c showpage

如何修复由 pswrite 设备生成的的文件

[编辑 | 编辑源代码]

Adobe PostScript 解释器和 Ghostscript v. 8.55 及更高版本在具有由旧版 Ghostscript(使用 Subversion 修订版 1225 到 2334)生成的非标准页面尺寸的文件上出现/typecheck in --where-- 错误。受影响的代码执行null where,这在 PostScript 语言中是不允许的。

以下IdiomSet 资源可以安装在 PostScript 解释器上以解决此问题。要激活IdiomSet,您需要将其复制到打印机或基于主机的解释器上的/Resource/IdiomSet/ 目录中。基于主机的解释器上的 PostScript 根目录可能与系统根目录不同。文件名无关紧要,但建议使用FixOldPSwrite。对于一次性替换,您也可以将该文件预先附加到您的作业文件中。

 %!
 % This IdionSet provides backward compatibility with the old pdfwrite.
 % pswrite device in Ghostscript 7.04 and older generated incorrect
 % PostScript code. It assumed that the null value can be looked up in
 % a dictionary. Adobe interpreters never accepted null as dictionary
 % key and Ghostscript doesn't do this since v. 8.55. (rev. 6956)
 %
 currentuserparams /IdiomRecognition get
 <</IdiomRecognition false>> setuserparams
 currentglobal true setglobal
 /FixOldPSwrite
 << /fix_old_pswrite
     [
       { PageSize aload pop
         3 index eq exch 4 index eq and
           { pop pop pop
           }
           { PageSize dup
             1 5 -1 roll put
             0 4 -1 roll put dup where
               { exch get exec
               }
               { pop /setpagedevice where
                   { pop 1 dict dup /PageSize PageSize put setpagedevice
                   }
                   { /setpage where
                       { pop PageSize aload pop
                         pageparams 3 { exch pop } repeat setpage
                       }
                     if
                   }
                 ifelse
               }
             ifelse
           }
         ifelse
       } bind
       { PageSize aload pop
         3 index eq exch 4 index eq and
           { pop pop pop
           }
           { PageSize dup
             1 5 -1 roll put
             0 4 -1 roll put dup //null eq { false } { dup where } ifelse
               { exch get exec
               }
               { pop /setpagedevice where
                   { pop 1 dict dup /PageSize PageSize put setpagedevice
                   }
                   { /setpage where
                       { pop PageSize aload pop
                         pageparams 3 { exch pop } repeat setpage
                       }
                     if
                   }
                 ifelse
               }
             ifelse
           }
         ifelse
       } bind
     ]
 >> /IdiomSet defineresource pop
 setglobal <</IdiomRecognition 3 -1 roll>> setuserparams

Ghostscript 无法运行我的文件

[编辑 | 编辑源代码]

您尝试学习 postscript,但无法做到

 $ gs
 GS>(test.ps)run

来自 gs 的堆栈转储在这里 ....

Current allocation mode is local
Last OS error: Permission denied
...
GS>

从 9.50 版本开始,其他安全功能处于活动状态。现在您需要

  $ gs -dNOSAFER
华夏公益教科书