
Иногда, когда я работаю на ноутбуке, мне хочется поставить в очередь несколько документов, чтобы распечатать их позже, поскольку в этот момент я не подключен к принтеру.
Однако настоящие очереди принтеров не предназначены для этого; они немедленно пытаются распечатать документ, и все внезапно начинают печатать, как только я подключаюсь к сети, что, как правило, не то, что я хочу делать. Более того, иногда я хочу изменить порядок документов в очереди, что не очень просто, особенно когда некоторые из них уже начали печатать.
Также иногда печать не удается, например, потому что в принтере заканчивается бумага или тонер, и я хочу перепечатать документ на другом принтере. Это не так просто, например, CUPS
или system-config-printer
; обычно мне приходится возвращаться, снова открывать PDF-ридер и начинать все заново. Ни один из известных мне PDF-ридеров не позволяет сохранять список документов для последующей печати, но это может быть скрытая функция PDF-ридера, о которой я не знаю.
В любом случае, вот что я хочу уметь делать:
- Укажите список PDF-файлов, которые я хочу распечатать.
- Сохраните этот список на диске, чтобы я мог закрыть приложение или перезагрузить его, не теряя весь список.
- Укажите заранее принтер(ы), на которые я хочу отправить документы, не подключаясь к ним в данный момент.
- Укажите параметры печати, такие как цвет, двусторонняя печать и количество копий.
- Измените назначения принтера и параметры печати позже.
- Подождите, пока я нажму кнопку или выполню команду, чтобы распечатать документ(ы).
- Сохраните отдельный список уже распечатанных документов на случай, если печать не сработает или я захочу перепечатать их позже.
Я знаю, что мог бы что-то сотворить с помощью скрипта оболочки 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
.ПРЕДОСТЕРЕЖЕНИЕ: У меня нет принтеров с пробелами в именах. Скрипты в этом случае не тестируются (но я уверен, что один из наших гуру скриптов оболочки исправит скрипты в мгновение ока ;-)... )
Теперь вы можете оформить:
[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.
Текущая версия печатает только в дуплексном режиме и работает только с принтерами, не поддерживающими дуплексную печать, но разрабатывается новая версия, которая будет работать с принтерами с дуплексным оборудованием, что по сути является просто управлением принтером и очередью без программного обеспечения для эмуляции дуплексной печати. (У меня есть альфа-версия скрипта, которая уже работает, если кто-то хочет связаться со мной напрямую через проект и т. д.)
Система печатает на текущем принтере по умолчанию, но скрипты dplx и duplex принимают дополнительные аргументы, которые передаются в lp и могут использоваться для установки любых параметров, которые понимает lp, таких как принтер и другие свойства.
В настоящее время система обрабатывает файлы PDF, PostScript и простые текстовые файлы.
Единственное, что это будетнетсделать, это распечатать файлы, которые были созданы с помощью опции «Печать в файл» изв пределахAcroread. Эти файлы просто не работают с 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