4

我有一台服务器,在该服务器上,我将几台串行打印机设置为杯子中的原始队列。在每一个上,我都安装了接口脚本来执行一些简单的输出操作,并使用在服务器上运行的应用程序来处理 IPC,并且喜欢直接连接到打印机并写入它们,这与 cups 认为的不太合适他完全控制打印机设备。那里的一切似乎都在工作。

在服务器上输入另一个应用程序,虽然它确实通过了 cups(在通过自己的打印假脱机程序进行假脱机之后),但似乎正在将特定于打印机的转义码注入到它打印出来的文件中。换句话说,此应用程序产生的打印不仅仅是纯文本字符流,而是包含打印机要解释的二进制控制代码。

我遇到的问题是,当 cups 从第二个应用程序接收此类文件时,它似乎绕过了我的接口。我通过设置两个几乎相同的打印文件对此进行了测试。第一个包含纯文本“你好,世界!” 后跟换行符;第二个包含其中一台打印机的一些转义码,然后是“Hello,world!” 和换行符。然后我在我的打印机界面上添加了一条“sleep 5”行,这样打印时会有明显的延迟。

当我使用 lp 打印第一个文件时,五秒钟内什么也没发生,之后打印机恢复活力并写下“Hello, world!”。但是,当我使用完全相同的lp命令打印第二个文件时,它立即打印出“Hello, world!” 不睡觉。我还注意到,我可以使用 " -o raw" 选项lp来强制对第一个文件执行相同的行为(立即将其打印出来,没有 5 秒的延迟)。

我的猜测是,cups 正在查看正在打印的实际数据并试图确定其类型,当它在数据中看到打印机转义码时,它决定这是“原始”打印并绕过接口。这不是我所期望的行为,因为我首先将打印机设置为“原始”队列并假设这意味着杯子只会传递通过接口发送给它的任何东西;尽管如此,这是我看到的行为。

我的问题是:有没有办法向 cups 发送一个选项(除了-o raw,它似乎也绕过了界面)告诉他不要检测接收到的打印数据的类型并继续并将其发送到界面脚本? 或者,有没有办法指定传入数据的格式(例如,告诉 cups 它正在接收的是“纯文本”,即使它包含转义码),这样 cups 就不会查看它并简单地将其传递给界面?

4

1 回答 1

5

您拥有的打印队列不是“原始”队列!

首先,您似乎不知道 CUPS 用语中的原始打印队列是什么:原始队列是与...无关的队列。

  • ...既不是接口脚本(与位于 中的队列本身同名的脚本/etc/cups/interfaces/),

  • ...也不是PostScript 打印机描述(PPD) 文件(与队列本身同名的 PPD 文件,带有附加后缀*.ppd,位于 中/etc/cups/ppd/)。

既然你说你已经为你的打印机队列安装了一个接口脚本,根据定义,这些不是原始队列!

-o raw要将作业作为原始(即:未过滤)发送到非原始 CUPS 队列,除了在命令行上使用之外别无他法lp。您也可以使用(或者)该选项-o document-format=application/vnd.cups-raw...但这具有完全相同的含义:它使 CUPS 使用相同的作业处理,并且只需多出 7 倍的键盘键即可打孔。

这两种方式都会导致 CUPS 跳过自动键入传入作业文件的步骤,并将其未经过滤地传递到队列的后端。

启用后,可以/var/log/cups/error_log通过查找关键字在日志文件中观察自动输入步骤及其结果:提及的行告诉您 CUPS 将您的传入作业分类为哪种 MIME 类型。)Auto-typingcupsd.confLogLevel debugRequest file type is ...

如何强制 CUPS 将传入的打印数据作为文本处理

-o document-format=text/plainlp命令行中使用。

如何设置 CUPS 的“原始”队列

如果要将(任何)现有打印队列转换为原始队列,只需删除关联的 PPD 文件 ( /etc/cups/ppd/myprinter.ppd) 或关联的接口脚本 ( /etc/cups/interfaces/myprinter)。

如果您想从一开始就安装一个打印队列作为原始队列,只需使用打印机名称和后端 URI,但不要指定任何 PPD 或任何与之关联的接口脚本:

安装“原始”打印队列的示例命令:

 sudo lpadmin -p my_raw_printer -E -v socket://192.168.177.188:9100

-p是指定打印队列名称,-E是从一开始就启用打印队列。)

推测:为什么第二个应用程序可能会绕过您的界面脚本

如果没有看到您的完整系统设置并查看第二个应用程序(其打印行为似乎与您的第一个不同),或者无法访问调试级别error_log的 CUPS 文件,则只能推测:

  • 我的猜测是你的第二个应用程序使用了一些硬连线的打印命令,它隐式地使用了-o raw打印命令选项。
于 2012-09-04T23:01:17.433 回答