
有時,當我在筆記型電腦上工作時,我想排隊一些文件以便稍後列印,因為當時我沒有連接到印表機。
然而,實際的印表機隊列並不是為此而設計的。他們立即嘗試列印文檔,一旦我連接到網絡,所有的人都突然開始列印,這通常不是我想要做的。此外,有時我想更改佇列中文檔的順序,這不是很容易,特別是當其中一些文檔開始列印時。
另外,有時列印會失敗,因為例如印表機用完紙張或碳粉,而我想將文件重新列印到另一台印表機。對於 例如CUPS
或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 和純文字檔案。
它將要做的一件事不是do 是列印使用「列印到文件」選項建立的文件之內阿克羅讀。這些文件無法與 lp 一起使用,而且我始終無法引起任何上游人員的注意以找出問題所在。
就個人而言,即使我的印表機可用,我也可以「離線」列印幾乎所有內容(使用大多數應用程式支援的「列印到檔案」選項)。它幫助我專注於我正在做的事情。後來,當我到達合適的斷點時,我會大量列印作業。
當您想要列印另一份內容而無需重新生成時,擁有列印佇列也非常有用,並且它對於處理卡紙或碳粉耗盡等印表機錯誤至關重要。
答案3
這個問題似乎沒有完整的解決方案,但這是我添加到我的函數中,.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