«Распечатай позже»

12

Иногда, когда я работаю на своем ноутбуке, я хочу поставить в очередь несколько документов для печати позже, так как в данный момент я не подключен к принтеру.

Однако реальные очереди принтеров не предназначены для этого; они сразу пытаются распечатать документ, и все внезапно начинают печатать, как только я попадаю в сеть, что обычно не то, что я хочу делать. Более того, иногда я хочу изменить порядок документов в очереди, что не очень легко, особенно после того, как некоторые из них начали печатать.

Кроме того, иногда происходит сбой печати, поскольку, например, в принтере заканчивается бумага или тонер, и я хочу повторно напечатать документ на другом принтере. Это не просто с например, CUPSили system-config-printer; Обычно мне приходится возвращаться назад, открывать программу чтения PDF и начинать заново. Ни один из известных мне ридеров PDF не позволяет хранить список документов для последующей печати, но это может быть скрытая особенность ридера PDF, о которой я не знаю.

В любом случае, вот что я хочу сделать:

  • Укажите список PDF-файлов, которые я хочу распечатать.
  • Сохраните этот список на диске, чтобы я мог закрыть приложение или перезагрузиться, не теряя весь список.
  • Укажите принтер (-ы), на который я хочу отправить их заранее, без фактического подключения к этим принтерам в данный момент.
  • Укажите параметры печати, такие как цвет, дуплекс и количество копий.
  • Измените эти назначения принтера и параметры печати позже.
  • Подождите, пока я не нажму кнопку или не выполню команду для фактической печати документа (ов).
  • Сохраните отдельный список документов, которые уже были напечатаны, на случай, если печать не работает или я хочу перепечатать их позже.

Я знаю, что мог бы взломать что-нибудь вместе со сценарием оболочки lprи списком путей в текстовом файле, но я не могу не чувствовать, что эта проблема уже решена более надежным и элегантным способом.

Бонусные очки:

  • Не требуйте, чтобы документы были открыты в программе чтения PDF. Я хочу напечатать их, а не просматривать их, и нет никаких причин, чтобы они были одним и тем же приложением.
  • Более одного списка.
  • Также работает для Postscript, DjVu и других форматов описания страниц.
  • Перетащите из файловых менеджеров.

Какие-либо предложения?

Натаниэль М. Бивер
источник
Начните награду, если у вас достаточно репутации;)
AB
Насколько я вижу, это потребует лишь простой модификации очередей принтера, как это реализовано в настоящее время cups. Вы просто печатаете в нужную очередь принтера, но переводите задания принтера в режим ожидания, пока не решите их «освободить». Кнопка «на удержании» - это все, что нужно. Или я что-то пропустил?
Джос
@Jos Моя версия system-config-printer-appletпозволяет мне удерживать и отпускать задания на печать, а также перемещать их на другие принтеры, но я не могу изменить порядок заданий на печать или изменить параметры печати после отправки задания. Кроме того, к этому моменту путь к исходному документу давно ушел.
Натаниэль М. Бивер
@AB К сожалению, щедротам нужно 75 интернет-очков, а я скромный 53-указатель.
Натаниэль М. Бивер

Ответы:

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 +x. ПРЕДУПРЕЖДЕНИЕ : у меня нет принтера с пробелами в их именах. Сценарии в этом случае не тестируются (но я уверен, что один из гуру наших сценариев-оболочек исправит сценарии в одно мгновение; -) ...)

Теперь вы можете выдать:

[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>из командной строки.

То, что я не думаю, что вы можете сделать с этим решением, это изменить параметры печати после факта - вам придется снять и повторно поставить документ в очередь для этого.

Rmano
источник
2
+1 Хорошо, однако, в то время как вы можете иметь свои причины, заселение вашего массива может быть проще с помощью соответствующего разделителя в cutчасти: cat /etc/printcap | cut -d "|" -f 1 | grep -v "#". Вы экономите время на цикле, избавляясь от перевода tr. Это работает, если вам нужно только ваше первое поле.
Cbhihe
1

Мой пакет (бесстыдный плагин) duplexpr делает то, что вам нужно, и включает в себя функции bash, которые могут быть полезны при развертывании вашей собственной версии. (Он написан на bash, поэтому его относительно легко изменить, и я помогу, если смогу.)

Он разработан для эмуляции двусторонней печати на недуплексных принтерах и имеет собственное простое управление очередью печати. У этого есть и интерфейсы GUI и Cli.

Текущая версия печатается только в дуплексном режиме и работает только с недуплексными принтерами, но в настоящее время разрабатывается новая версия, которая будет обрабатывать принтеры с дуплексным оборудованием, что по сути является просто управлением принтерами и очередями без программного обеспечения эмуляции дуплексного режима. (У меня есть альфа-версия скрипта, который уже работает, если кто-то хочет связаться со мной напрямую через проект и т. Д.)

Система печатает на текущий принтер по умолчанию, но сценарии dplx и duplex принимают дополнительные аргументы, которые передаются в lp и могут использоваться для установки любых опций, которые понимает lp, таких как принтер и другие свойства.

В настоящее время система обрабатывает PDF, PostScript и текстовые файлы.

Одна вещь , которую она не сделать , это печать файлов , которые были созданы с помощью печати в опции File из в Acroread. Эти файлы просто не работают с lp, и мне никогда не удавалось привлечь внимание любого из вышестоящих людей, чтобы выяснить, в чем проблемы.

Лично я печатаю почти все в автономном режиме (используя параметры «Печать в файл», которые поддерживаются большинством приложений), даже когда мои принтеры доступны. Это помогает мне сосредоточиться на том, что я делаю. Позже, когда я достигаю подходящей точки разрыва, я печатаю партии заданий.

Наличие очереди печати также очень удобно, когда вы хотите напечатать еще одну копию чего-либо без необходимости ее регенерации, и это важно для устранения ошибок принтера, таких как замятие или нехватка тонера.

Джо
источник
Это интересный пакет, но, похоже, сейчас у него несколько грубых краев, и я не уверен, что смогу это исправить, если что-то пойдет не так. Кстати, вы рассматривали возможность загрузки на Github?
Натаниэль М. Бивер
@bariumbitmap - я использую его ежедневно более 10 лет (с тех пор как написал). Это стабильно. У меня также есть новая версия в разработке. Если вы сломаете его или вам понадобятся дополнительные функции и вы захотите поработать со мной, я это исправлю. Я еще не выучил git, поэтому я минимально использую github. Sourceforge очень хорошо известен.
Джо
0

Кажется, нет полного решения этой проблемы, но вот функция, которую я добавил к моей, .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
Натаниэль М. Бивер
источник