PostScript 常见问题解答/使用 Ghostscript
Ghostscript 是一个常用的开源软件套件,它基于 Adobe Systems 的页面描述语言 PostScript 和其 Portable Document Format (PDF) 的 解释器。该套件由 Artifex Software 和全球社区开发,主要用于文档页面的光栅化和渲染以显示或打印它们,以及 PostScript 和 PDF 之间的转换。它包含一组免费的 PostScript 字体,并在许多第三方应用程序和 GUI 中使用。
有关详细信息和软件下载,请参见 Ghostscript。
Ghostscript 有五个用于颜色管理的 TIFF 设备。以及五个 TIFF 压缩设备,它们只生成黑白图像。
gs -sDEVICE=tif32nc -sOutputFile=tiger.tiff -dEPSCrop examples/tiger.eps
未受保护的 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。
Ghostscript 具有过度激进的启发式方法来识别用于 JPEG 压缩的图像。使用setdistillerparams
运算符,可以手动选择压缩算法。除了setdistillerparams
运算符外,Ghostscript 还接受大多数 distiller 参数(PDF 0.6M)作为命令行参数。
ps2pdf -dAutoFilterColorImages#false -dColorImageFilter#/FlateEncode \ -dAutoFilterGrayImages#false -dGrayImageFilter#/FlateEncode foo.ps foo.pdf
Ghostscript 开发人员已认识到这个问题。修复预计很快就会到来。
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 中有部分文档说明。有关详细信息,请阅读源代码。
写入 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
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
您尝试学习 postscript,但无法做到
$ gs GS>(test.ps)run
来自 gs 的堆栈转储在这里 ....
Current allocation mode is local Last OS error: Permission denied ... GS>
从 9.50 版本开始,其他安全功能处于活动状态。现在您需要
$ gs -dNOSAFER