“稍后打印”软件


12

有时,当我在笔记本电脑上工作时,由于当时未连接到打印机,所以我希望排队一些文档以便以后打印。

但是,并非为此设计实际的打印机队列。他们立即尝试打印文档,当我连接到网络时,所有人突然突然开始打印,这通常不是我想要做的。此外,有时我想更改队列中文档的顺序,这并不是一件容易的事,尤其是在其中一些文档开始打印后。

另外,有时打印失败,因为例如打印机用尽了纸张或碳粉,我想将文档重新打印到另一台打印机上。用eg CUPSsystem-config-printer; 这不是很简单。通常,我必须回去,重新打开PDF阅读器,然后重新开始。我认识的所有PDF阅读器都不会让您保留以后要打印的文档的列表,但这可能是PDF阅读器的隐藏功能,我不知道。

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

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

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

奖励积分:

  • 不需要在PDF阅读器中打开文档。我要打印它们,而不是浏览它们,因此没有理由它们必须是同一应用程序。
  • 多个清单。
  • 也适用于Postscript,DjVu和其他页面描述格式。
  • 从文件管理器中拖放。

有什么建议么?


如果您有足够的声誉,就开始赏金;)
AB

据我所知,这仅需要对当前由实施的打印机队列进行简单修改cups。您只需将其打印到所需的打印机队列,然后将打印机作业“保留”,直到决定“释放”它们。仅需要“保持”按钮。还是我想念什么?
2015年

@Jos我的版本system-config-printer-applet确实允许我保留和释放打印作业以及将其移动到其他打印机,但是提交作业后我无法更改打印作业的顺序或更改打印选项。而且,到那时,原始文档的路径已经消失了。
Nathaniel M. Beaver 2015年

@AB不幸的是,赏金需要75互联网积分,而我的得分却只有53。
纳撒尼尔·比弗

Answers:


10

我要做的是以下---它没有您要求的通用,但是可以正常使用。您需要定义所有打印机,然后需要以下两个脚本:

  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 +xCAVEAT:我没有任何打印机,其名称中带有空格。在那种情况下不会对脚本进行测试(但是我敢肯定,我们的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

(AFAIK,打印队列在重新启动后是持久的)。当您要打印时:

[romano:~] % start_printers         
Printer PDF:  restarted.
Printer ColorDEA:  restarted.
Printer Deskjet_6980:  restarted.
Printer fotocop5:  restarted.

使用lprm可以根据需要删除工作;lpr通过命令行将文档排入队列,如果要使用不同的“列表”,没有人会禁止多次使用不同的名称定义同一台打印机。

您也可以手动恢复每台打印机,这只是cupsenable <printername>从提示符处运行的问题。

我认为您无法使用此解决方案来更改事实后的打印选项---您将不得不为此出队并重新入队。


2
+1好,但是,尽管您可能有自己的理由,但可以通过在cut部分中使用适当的定界符来简化数组的填充cat /etc/printcap | cut -d "|" -f 1 | grep -v "#"。通过消除翻译,您可以节省一些周期时间tr。如果您只需要第一个字段,则此方法有效。
Cbhihe

1

我的程序包(无耻插件),duplexpr可以满足您的要求,并包含bash函数,这些函数可能在滚动您自己的版本时很有用。(它以bash编码,因此应该相对容易进行修改,如果可以的话,我会帮忙。)

它旨在在非双面打印机上模拟双面打印,并实现自己的简单打印队列管理。它同时具有gui和cli接口。

当前版本仅以双面打印,并且仅适用于非双工打印机,但是正在开发一个新版本,该版本将处理具有双工硬件的打印机,本质上仅是打印机和队列管理而没有双工仿真软件。(我有一个脚本的Alpha版本,如果有人想通过该项目直接与我联系,该脚本已经可以使用。)

系统将打印到当前的默认打印机,但是dplx和双工脚本接受传递给lp的其他参数,并可用于设置lp可以理解的任何选项,例如打印机和其他属性。

该系统当前处理PDF,PostScript和纯文本文件。

有一件事会不会做的是使用打印到文件选项创建从打印文件 Acroread。这些文件不适用于lp,而且我一直无法引起任何上游人员的关注,以找出问题所在。

就个人而言,即使打印机可用,我也几乎可以“脱机”打印所有内容(使用大多数应用程序支持的“打印到文件”选项)。它可以帮助我专注于自己在做什么。稍后,当我到达合适的断点时,我将打印一批作业。

当您要打印另一副本而不需要重新生成它时,拥有打印队列也非常好,这对于处理打印机错误(如卡纸或碳粉用尽)至关重要。


那是一个有趣的程序包,但是看起来它现在有一些粗糙的边缘,而且我不确定如果出现问题,是否能够修复它。顺便说一句,您是否考虑过将其上传到Github?
Nathaniel M. Beaver

@bariumbitmap-自10年来,我每天都在使用它(自从我第一次写它以来)。很稳定 我还在开发一个新版本。如果您破坏它或需要其他功能并愿意与我合作,我会修复它。我还没学过git,所以我很少使用github。Sourceforge是众所周知的。
2015年

0

似乎没有针对此问题的完整解决方案,但是这是我添加到我的函数中的一个函数,与上面的Rmano的答案.bashrc类似,并具有自动完成的其他便利。

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.