PostScript 3打印机有多个托盘装有A4和A3纸,我遇到了问题。在使用CUPS系统的Linux下,我现在通过指定media = a4选项或定义两个单独的打印机手动设置正确的纸张尺寸:一个用于A4,一个用于A3。
然而,这种情况远非最佳,因为您总是要记得选择合适的打印机。
由于PostScript是一种图灵完备语言,在Red Book和Blue Book中读了一下后,我有一个问题:
是否可以修改打印机的PPD文件以自动生成挑选纸张尺寸'选项,如果激活,则自动设置正确的介质尺寸?也许取决于打印输出的边界框大小?
也许是这样的:
PostScript代码
% set pagesize A4
/setA4Paper {<</PageSize [595 842] >> setpagedevice} def
% set pagesize A3
/setA3Paper {<</PageSize [842 1190] >> setpagedevice} def
% decide which paper size to take based on the bounding box
% (array of two elements, width and height)
% if the bounding box is wider that A4 paper, pick A3 paper instead
boundingBox 0 get 595 gt {setA3Paper} {setA4Paper} ifelse
详细问题
修改
来自KenS&#39;回答似乎没有简单的方法直接从PostScript中获取边界框。有没有办法在将PS文件发送回CUPS队列之前或发送到打印机之前,通过自定义脚本路由PS文件?
答案 0 :(得分:1)
如果可能的话,这是制造商通常采用的东西。它要求打印机知道哪个托盘包含哪种介质。有些打印机确实有此信息,有些则没有。对于某些打印机,它当然是固定的。
您的详细问题: 1)页面设备字典中的/ PageSize键具有当前请求的媒体大小。 setpagedevice运算符用于请求媒体(在任何其他事物中)。如果你的PostScript文件不包含媒体选择操作符(setpagedevice等),那么它可能包含给BoundingBox的注释。大多数口译员会忽略这些(他们是评论)但有些人可能会允许你处理它们。这通常高度依赖于设备。
如果作业没有定义,则无法(在PostScript中)获取页面的边界框,这是因为其合法(以及需要的打印机出血)使PostScript输出覆盖面积大于请求/预期的媒体。
2)选择特定托盘通常取决于设备,您需要知道设备如何执行此操作。我想制造商尊重页面设备字典中的MediaPosition键,但经验表明这不太可能。 YMMV
3)PPD 可能(或可能不包括)托盘切换代码,您必须查看PPD并弄清楚。至于选择一个完整的托盘,如果现有的托盘是空的,这确实超出了PostScript程序的范围,直到制造商的实现。 在语言级别3设备中,页面设备字典中的TraySwitch键控制自动托盘切换,请参阅PostScript语言参考手册(第3版)p403,因为您有3级设备,您可能很幸运。
由于您已经在使用CUPS,因此可以使用bbox设备通过Ghostscript运行原始PostScript / PDF,这将为您提供页面上标记的边界框。只要您有理由相信您(或您的用户)没有设置超出媒体边界的标记。然后你可以使用这些信息来选择我认为合适的“打印机”。
警告:我对CUPS知之甚少。