【问题标题】:Automatic paper selection using PostScript使用 PostScript 自动选择纸张
【发布时间】:2011-11-09 21:36:38
【问题描述】:

我的 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

详细问题

  • 如何获取页面边框信息?是否有我可以查看的标准文档或更多文档?
  • 在我的示例代码中设置 PageSize 是否足以让打印机选择正确的纸盘?
  • 有没有办法从打印机的 PPD 文件中找出切换纸盘需要哪些 PS 命令?此外,这台打印机为每种尺寸提供两个纸盘,因此如果一个纸用完,打印机可以选择装满的纸盘。

编辑

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

【问题讨论】:

    标签: postscript


    【解决方案1】:

    如果可能的话,制造商通常会采用这种方式。它要求打印机知道哪个托盘包含哪种介质。有些打印机确实有这些信息,有些则没有。当然,对于某些打印机,它是固定的。

    对于您的详细问题: 1) 页面设备字典中的 /PageSize 键具有当前请求的媒体大小。 setpagedevice 运算符用于请求媒体(以及任何其他内容)。如果您的 PostScript 文件不包含媒体选择操作符(setpagedevice 等),那么它可能包含提供 BoundingBox 的 cmets。大多数解释器会忽略这些(它们是 cmets),但有些解释器可能允许您处理它们。这通常高度依赖于设备。

    如果作业没有定义页面的边界框,则无法(在 PostScript 中)获取页面的边界框,这是因为合法的(并且对于打印机需要出血)使 PostScript 输出覆盖的区域大于请求的/预期的媒介。

    2) 选择特定托盘通常取决于设备,您需要知道您的设备是如何做到这一点的。我想制造商会尊重页面设备字典中的 MediaPosition 键,但经验表明这不太可能。 YMMV

    3) PPD 可能(或可能不)包含托盘切换代码,您必须查看 PPD 并弄清楚。至于如果现有托盘是空的,则选择满托盘,这确实超出了 PostScript 程序的范围,取决于制造商的实施。 在语言级别 3 设备中,页面设备字典中的 TraySwitch 键控制自动托盘切换,请参阅 PostScript 语言参考手册(第 3 版)p403,因此,既然您拥有 3 级设备,那么您可能会很幸运。

    由于您已经在使用 CUPS,您可以使用 bbox 设备通过 Ghostscript 运行原始 PostScript/PDF,这将为您提供页面上标记的边界框。只要您有理由确定您(或您的用户)没有设置超出媒体边界的标记。然后,您可以使用该信息来选择我认为正确的“打印机”。

    警告:我对 CUPS 知之甚少。

    【讨论】:

    • 感谢您的见解。如果 PPD 中有托盘切换代码,我想我需要进行逆向工程。我认为应该有一些,因为可以在打印机的 CUPS 设置中选择纸张尺寸。此外,还指定了每个纸盘中的介质。在我看来,这比我想象的要复杂一些。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多