使用PostScript自动选择纸张

时间:2011-11-09 21:36:39

标签: postscript

PostScript 3打印机有多个托盘装有A4和A3纸,我遇到了问题。在使用CUPS系统的Linux下,我现在通过指定media = a4选项或定义两个单独的打印机手动设置正确的纸张尺寸:一个用于A4,一个用于A3。

然而,这种情况远非最佳,因为您总是要记得选择合适的打印机。

由于PostScript是一种图灵完备语言,在Red BookBlue 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

详细问题

  • 如何获取页面边界框的信息?是否有我可以研究的标准或更多文档?
  • 如果在我的示例代码中设置PageSize就足以让打印机选择合适的托盘吗?
  • 有没有办法从打印机的PPD文件中找出切换纸盘需要哪些PS命令?此外,这台打印机每个尺寸都有两个托盘,因此如果打印机在纸张缺纸的情况下选择整个托盘,那将会很棒。

修改

来自KenS&#39;回答似乎没有简单的方法直接从PostScript中获取边界框。有没有办法在将PS文件发送回CUPS队列之前或发送到打印机之前,通过自定义脚本路由PS文件?

1 个答案:

答案 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知之甚少。