Рубрики
Без рубрики

Pywin32 – Как отслеживать очередь печати

Учебник о том, как использовать Python, чтобы запросить очередь печати в Windows через Pywin32 / Win32Print

Автор оригинала: 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 списка рассылки