“稍后打印”软件

“稍后打印”软件

有时,当我使用笔记本电脑工作时,我想要排队一些文档以便稍后打印,因为我当时没有连接到打印机。

然而,实际的打印机队列并非为此而设计的;它们会立即尝试打印文档,并且只要我连接到网络,它们就会突然开始打印,这通常不是我想要的。此外,有时我想更改队列中文档的顺序,这并不容易,特别是当其中一些文档已经开始打印时。

此外,有时打印会失败,例如因为打印机缺纸或缺墨,我想用另一台打印机重新打印文档。使用 egCUPS或 时,这并不简单system-config-printer;我通常必须返回,重新打开 PDF 阅读器,然后重新开始。据我所知,没有一款 PDF 阅读器允许您保留文档列表以便稍后打印,但这可能是 PDF 阅读器中某个我不知道的隐藏功能。

无论如何,这就是我想要做的事情:

  • 指定我想要打印的 PDF 列表。
  • 将该列表保存在磁盘上,以便我可以关闭应用程序或重新启动而不会丢失整个列表。
  • 提前指定我想要发送它们的打印机,而无需当时实际连接到这些打印机。
  • 指定打印选项,如颜色、双面和份数。
  • 稍后更改这些打印机分配和打印选项。
  • 等到我按下按钮或运行命令来实际打印文档。
  • 保留已打印文件的单独列表,以防打印不起作用或者我想稍后重新打印它们。

我知道我可以使用 shell 脚本lpr和文本文件中的路径列表来破解某些东西,但我不禁感到这个问题已经以一种更强大、更优雅的方式得到了解决。

奖励积分:

  • 不要求文档在 PDF 阅读器中打开。我想打印它们,而不是浏览它们,而且它们没必要使用同一个应用程序。
  • 多个列表。
  • 也适用于 Postscript、DjVu 和其他页面描述格式。
  • 从文件管理器中拖放。

有什么建议么?

答案1

我所做的如下 --- 它不像您要求的那样通用,但它几乎可以正常工作。您需要定义所有打印机,然后需要这两个脚本:

  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
    
  2. 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.

并且您可以从任何您想要的地方进行打印,打印机将暂停:

来自 evince 的打印机

您可以查看您的队列:

[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

相关内容