我正在编写一个程序,需要使用 打印 PDF 文件lp
。我可以使用 PDF 查看器和 GUI 打印该文件,但使用时lp
出现问题。我想确切地了解 PDF 查看器向 CUPS 发送了哪些选项,以便我可以在命令中使用它们lp
,但我没有在 CUPS 界面中看到任何方法来执行此操作。这可能吗?
答案1
如果您知道如何从命令行运行 pdf 查看器(例如 )xpdf my.pdf
,请改用以下命令:
strace -f -e execve xpdf my.pdf
这将输出像这样的行
execve("/usr/bin/lp", ["lp", "-abc", "my.pdf"], ...
它显示正在运行的命令,以及数组中显示的参数[,,,]
。
如果您无法从命令行运行查看器,请找到它的进程 ID(使用ps fax
或类似的),如果是 2519,请使用以下命令将 strace 附加到它:
strace -f -e execve -p 2519
您应该得到类似的输出。键入control-c以终止 strace。
这可能不会显示 的执行情况lp
,但如果需要,您可以要求 strace 显示更多正在执行的操作。
答案2
CUPS 将作业中的所有选项(和元数据)记录在c
- 文件(控制文件)与实际的线轴数据一起传输d
- 文件输入/var/线轴/杯子/。
控制文件命名为cNNNNNN
,其中 NNNNNN 表示 CUPS 作业 ID。
这一点我一直都知道。昨天,我需要仔细查看这些文件,但由于它们是二进制编码的,因此strings
对它们进行简单的运行并不能产生足够好的结果。
首先我在StackOverflow上问了一个相关的问题,但后来我发现了一个可以剖析c文件的工具。它位于 CUPS 源代码中,但默认情况下不会构建,因此即使是最极客的 CUPS 用户也几乎看不到它(并且也不是由 Linux 发行版打包程序构建的)。
它的名字是testipp
。
我在 StackOverflow 上描述了如何构建它以及如何使用它:
答案3
如果您有权访问 CUPSerror_log
文件(通常位于/var/log/cups/
),并且如果 CUPSLogLevel debug
在其设置中(在/etc/cups/cupsd.conf
文件),然后您可以通过 grep 包含字符串 的行来查看每个作业将哪些命令行参数传递给 CUPS argv[5]
。
argv[5]
包含 CUPS 在每个过滤器命令行的第五个参数中看到的所有这些参数。在这些之前,在同一行上,您还会看到打印为 的相应作业 ID [Job NNNNNN]
。