Програмне забезпечення «Друк пізніше»


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. CAVEAT : У мене немає жодного принтера з пробілами в їх назвах. Сценарії не перевіряються в цьому випадку (але я впевнений, що один із гуру нашого сценарію оболонки виправить сценарії спалахом; -) ...)

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

[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, які можуть бути корисні для прокатки власної версії. (Зашифровано в баші, тому змінити її слід відносно просто, і я допоможу, якщо зможу.)

Він призначений для імітації двостороннього друку на недуплексних принтерах та реалізує власне просте управління чергою друку. Він має інтерфейси gui та cli.

Поточна версія друкується лише в дуплексному режимі і працює лише з недуплексними принтерами, але в роботі працює нова версія, яка буде працювати з принтерами з дуплексним обладнанням, яке по суті є просто управління принтером і чергою без програмного забезпечення для дуплексного емуляції. (У мене є альфа-версія сценарію, яка вже працює, якщо хтось хоче зв’язатися зі мною безпосередньо через проект тощо).

Система друкує на поточний принтер за замовчуванням, але сценарії dplx та дуплекс приймають додаткові аргументи, передані в lp і можуть використовуватися для встановлення будь-яких параметрів, які розуміє lp, таких як принтер та інші властивості.

В даний час система обробляє PDF, PostScript та текстові файли із звичайним текстом.

Одна річ , яку вона НЕ зробити , це друк файлів , які були створені з допомогою друку в опції File з в Acroread. Ці файли просто не працюють з lp, і я ніколи не зміг привернути уваги жодного з людей, що перебувають вгору, щоб зрозуміти, у чому проблеми.

Особисто я друкую майже все "в автономному режимі" (використовуючи параметри "Друк у файл", які підтримує більшість програм), навіть коли мої принтери доступні. Це допомагає мені сконцентруватися на тому, що я роблю. Пізніше, коли я досягаю відповідної точки перерви, друкую партії робіт.

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


Це цікавий пакет, але схоже, що він має кілька грубих країв прямо зараз, і я не впевнений, що зміг би це виправити, якщо щось пішло не так. До речі, ви думали про завантаження в Github?
Натаніель М. Бівер

@bariumbitmap - я використовую його щодня вже більше 10 років (з моменту свого першого написання). Це стабільно. У мене також є нова версія в розробці. Якщо ви зламаєте його або потребуєте додаткових функцій і готові працювати зі мною, я це виправлю. Я ще не вивчив git, тому я мінімально використовую github. Sourceforge дуже відомий.
Джо

0

Здається, не існує повного рішення цієї проблеми, але ось функція, яку я додав до своєї .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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.