有时,当我使用笔记本电脑工作时,我想要排队一些文档以便稍后打印,因为我当时没有连接到打印机。
然而,实际的打印机队列并非为此而设计的;它们会立即尝试打印文档,并且只要我连接到网络,它们就会突然开始打印,这通常不是我想要的。此外,有时我想更改队列中文档的顺序,这并不容易,特别是当其中一些文档已经开始打印时。
此外,有时打印会失败,例如因为打印机缺纸或缺墨,我想用另一台打印机重新打印文档。使用 egCUPS
或 时,这并不简单system-config-printer
;我通常必须返回,重新打开 PDF 阅读器,然后重新开始。据我所知,没有一款 PDF 阅读器允许您保留文档列表以便稍后打印,但这可能是 PDF 阅读器中某个我不知道的隐藏功能。
无论如何,这就是我想要做的事情:
- 指定我想要打印的 PDF 列表。
- 将该列表保存在磁盘上,以便我可以关闭应用程序或重新启动而不会丢失整个列表。
- 提前指定我想要发送它们的打印机,而无需当时实际连接到这些打印机。
- 指定打印选项,如颜色、双面和份数。
- 稍后更改这些打印机分配和打印选项。
- 等到我按下按钮或运行命令来实际打印文档。
- 保留已打印文件的单独列表,以防打印不起作用或者我想稍后重新打印它们。
我知道我可以使用 shell 脚本lpr
和文本文件中的路径列表来破解某些东西,但我不禁感到这个问题已经以一种更强大、更优雅的方式得到了解决。
奖励积分:
- 不要求文档在 PDF 阅读器中打开。我想打印它们,而不是浏览它们,而且它们没必要使用同一个应用程序。
- 多个列表。
- 也适用于 Postscript、DjVu 和其他页面描述格式。
- 从文件管理器中拖放。
有什么建议么?
答案1
我所做的如下 --- 它不像您要求的那样通用,但它几乎可以正常工作。您需要定义所有打印机,然后需要这两个脚本:
stop_printers
:#!/bin/bash -f # allp=(`cat /etc/printcap | tr "|" "\t" | cut -f 1 | grep -v "#"`) for i in ${allp[@]}; do echo -n Printer $i: cupsdisable "$i" echo " " paused. done
start_printers
:#!/bin/bash -f # allp=(`cat /etc/printcap | tr "|" "\t" | cut -f 1 | grep -v "#"`) for i in ${allp[@]}; do echo -n Printer $i: cupsenable "$i" echo " " restarted. done
您必须将它们放在您的路径中(例如~/bin
)并使它们可执行chmod +x
。警告:我没有任何名称中带有空格的打印机。在这种情况下,脚本没有经过测试(但我相信我们的 shell 脚本专家之一会立即修复脚本 ;-)... )
现在,您可以发出:
[romano:~] % stop_printers
Printer PDF: paused.
Printer ColorDEA: paused.
Printer Deskjet_6980: paused.
Printer fotocop5: paused.
并且您可以从任何您想要的地方进行打印,打印机将暂停:
您可以查看您的队列:
[romano:~] % lpq -PDeskjet_6980
Deskjet_6980 is not ready
Rank Owner Job File(s) Total Size
1st romano 439 Bones_3+RG.pdf — Flesh depth 125952 bytes
(据我所知,打印队列在重启后仍然有效)。当你想打印时:
[romano:~] % start_printers
Printer PDF: restarted.
Printer ColorDEA: restarted.
Printer Deskjet_6980: restarted.
Printer fotocop5: restarted.
lprm
如果需要,您可以使用它来删除一份工作;lpr
通过命令行将文档排入队列,如果您想要不同的“列表”,没有人禁止用不同的名称多次定义同一台打印机。
您也可以手动恢复每台打印机,只需cupsenable <printername>
从提示符运行即可。
我认为您无法使用此解决方案来在事后更改打印选项 --- 您必须为此取消排队并重新排队文档。
答案2
我的包裹(厚颜无耻的推销),双工器可以完成一些您想要的操作,并包含可能对推出您自己的版本有用的 bash 函数。(它是用 bash 编码的,因此修改起来应该相对容易,如果可以的话我会提供帮助。)
它旨在在非双面打印机上模拟双面打印,并实现自己的简单打印队列管理。它具有 GUI 和 CLI 界面。
当前版本仅支持双面打印,并且仅适用于非双面打印机,但正在开发的新版本将处理具有双面硬件的打印机,本质上只是打印机和队列管理,没有双面仿真软件。(如果有人想通过项目直接联系我,我有一个已经可以运行的脚本的 alpha 版本。)
系统打印到当前默认打印机,但 dplx 和 duplex 脚本接受传递给 lp 的附加参数,可用于设置 lp 理解的任何选项,例如打印机和其他属性。
该系统目前可处理 PDF、PostScript 和纯文本文件。
唯一会的是不是要做的是打印使用“打印到文件”选项创建的文件之内Acroread。这些文件无法与 lp 配合使用,而且我一直无法引起上游人员的注意以找出问题所在。
就我个人而言,即使我的打印机可用,我也会“离线”打印几乎所有内容(使用大多数应用程序支持的“打印到文件”选项)。这有助于我集中精力做我正在做的事情。稍后,当我达到合适的休息点时,我会批量打印作业。
当您想要打印另一份副本而不必重新生成时,拥有打印队列也非常有用,并且它对于处理卡纸或碳粉用完等打印机错误至关重要。
答案3
这个问题似乎没有完整的解决方案,但是我添加了一个.bashrc
类似于Rmano 的回答以上,还有自动完成的额外便利。
all-printers() {
if [ "$*" = "" ]
then
# Print usage."
printf "Usage:\n"
printf "all-printers start\n"
printf "all-printers stop\n"
return 1
elif ! [ "$1" = "stop" -o "$1" = "start" ]
then
printf "Unrecognized command: $1\n"
return 1
fi
cut -f 1 -d '|' /etc/printcap |
grep -v '^#' |
while read printer_name
do
if [ "$1" = "stop" ]
then
cupsdisable "$printer_name"
printf "$printer_name stopped.\n"
elif [ "$1" = "start" ]
then
cupsenable "$printer_name"
printf "$printer_name started.\n"
fi
done
}
complete -W 'stop start' all-printers