PostScript(.ps)文件如何检测输出目标为屏幕(Ghostscript)或硬件打印机?
PostScript识别输出目标的方法
核心思路:检测设备字典属性
PostScript运行环境会维护当前输出设备的属性字典,通过currentdevice操作符可获取该字典,从中读取设备类型、分辨率、设备名称等特征,以此区分屏幕显示和打印机输出场景。
1. 检查设备类型(DeviceType)
部分设备会在字典中提供DeviceType键,直接标识设备类别:
% 检测设备类型并执行对应逻辑 currentdevice /DeviceType known { currentdevice /DeviceType get dup /Display eq { % 屏幕输出逻辑:显示简化内容、适配屏幕颜色 /Helvetica 12 selectfont 100 700 moveto (屏幕模式:显示简化版内容) show } { /Printer eq { % 打印机输出逻辑:打印完整细节、高分辨率元素 /Times-Roman 14 selectfont 100 700 moveto (打印模式:输出完整内容) show 100 650 moveto (附加打印专属细节...) show } if } ifelse } if
注意:不是所有设备都支持DeviceType,需先用known操作符检查键是否存在,避免执行错误。
2. 通过分辨率(HWResolution)判断
屏幕设备分辨率通常远低于打印机(屏幕多为72/96/144DPI,打印机多为300/600/1200DPI),可读取HWResolution做阈值判断:
% 读取设备分辨率并区分输出目标 currentdevice /HWResolution get aload pop /resx exch def % 获取X方向分辨率 resx 150 le { % 低分辨率判定为屏幕输出 100 700 moveto (屏幕输出:适配低分辨率显示) show } { % 高分辨率判定为打印机输出 100 700 moveto (打印机输出:适配高分辨率打印) show } ifelse
补充:针对高DPI屏幕(如Retina),可适当提高阈值,结合其他属性综合判断。
3. 识别Ghostscript专属屏幕设备
如果仅针对Ghostscript的屏幕渲染场景,它的屏幕设备名称通常为display,可通过DeviceName键检测:
% 检测是否为Ghostscript屏幕设备 currentdevice /DeviceName get (display) eq { % Ghostscript屏幕显示专属逻辑 100 700 moveto (Ghostscript屏幕预览模式) show } { % 打印机或其他输出设备逻辑 100 700 moveto (正式打印输出模式) show } ifelse
局限性:仅适用于Ghostscript环境,其他PostScript显示引擎可能使用不同设备名称。
4. 结合页面尺寸(PageSize)辅助判断
屏幕有效显示尺寸通常和标准打印纸张尺寸(如A4)有差异,可结合PageSize进一步验证:
currentdevice /PageSize get aload pop /pagewidth exch def pagewidth 612 le { % 612pt是A4纸的宽度,屏幕可能更小 % 疑似屏幕输出 } { % 疑似打印机输出 } ifelse
注意:Ghostscript可模拟纸张尺寸,单独使用可靠性较低,建议和其他方法配合。
内容的提问来源于stack exchange,提问作者Bill Evans at Mariposa
相关产品推荐
相关产品推荐

