Автор оригинала: Mike Driscoll.
На днях я пытался выяснить способ отслеживать очередь печати на окнах. Задача под рукой было отслеживать, какие документы пошли на принтер и полностью успешно. Идея заключалась в том, что при завершении печати документ будет затем архивировать. Чтобы сделать такую вещь, вам нужно Pywin32 (АКА: Python для расширений Windows). В этой статье мы посмотрим на простой скрипт, который проверяет очередь печати.
Вот код:
import time import win32print #---------------------------------------------------------------------- def print_job_checker(): """ Prints out all jobs in the print queue every 5 seconds """ jobs = [1] while jobs: jobs = [] for p in win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL, None, 1): flags, desc, name, comment = p phandle = win32print.OpenPrinter(name) print_jobs = win32print.EnumJobs(phandle, 0, -1, 1) if print_jobs: jobs.extend(list(print_jobs)) for job in print_jobs: print "printer name => " + name document = job["pDocument"] print "Document name => " + document win32print.ClosePrinter(phandle) time.sleep(5) print "No more jobs!" #---------------------------------------------------------------------- if __name__ == "__main__": print_job_checker()
Сначала мы импортируем Win32Print и модуль времени. Нам нужен Win32Print для доступа к принтеру. Мы создаем потенциально бесконечный цикл, чтобы продолжать проверку рабочих мест в очереди печати. Если список заданий всегда пуст, это означает, что в очереди печати ничего не осталось, и функция выйдет. В коде выше мы используем Win32Print.enumprinters () Чтобы закрутить на принтерах, которые установлены на машине. Первый аргумент – это флаг (Win32Print.Printer_enum_Local), второй – это имя (или нет в этом случае), а третью – уровень информации. Есть несколько флагов, которые мы можем использовать, например, printer_enum_shared, printer_enum_local или printer_enum_connections. Я пошел с Printer_enum_Local, потому что он возвращал имя принтера в формате, который я мог бы использовать с Win32Print’s OpenPrinter метод. Мы делаем это, чтобы запросить принтер для информации через ручку. Чтобы получить список заданий на печать, мы называем Win32Print.enumjobs () с ручкой для печати. Затем мы связываемся над ними и распечатаем имя принтера и имя документа. Вам не нужно делать все эти отпечатки, но я нашел это полезным, когда я пишу код. Для целей тестирования я рекомендую открыть очередь печати и установить его на «приостановленную», чтобы вы могли предотвратить печатать бумагу, пока вы не будете готовы. Это позволяет все равно добавлять элементы в очередь печати, которые вы можете запросить.
Я положил задержку 5 секунд между проверками, чтобы убедиться, что нет новых обновлений в очереди. Если есть задания печати, она снова проверяет очередь. В противном случае он вырывается из цикла.
Надеюсь, вы найдете этот кусок кода, полезный для чего-то, что вы делаете. Наслаждаться!
Дополнительная информация
Документация Tim Golden для || Win32Print. Старая нить о Win32Print на || Pywin32 списка рассылки