es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Capturar eventos de la impresora en Windows

La impresora tiene una cola de impresión donde se preparan documentos para imprimir que fueron enviados a la impresora desde diferentes computadoras.

Me gustaría escribir un código en Python que se ejecute en el servidor y compruebe los eventos de la impresora. Especialmente cuando el documento ha terminado de imprimir correctamente, me gustaría capturar este evento y obtener información sobre el documento:

  • nombre del documento
  • número de páginas
  • formato (A4, A3, etc.)
  • si era en color o en blanco y negro
  • hora de finalización de la impresión

¿Podrías ayudarme a empezar?

Ya estudié esta pregunta pero no puedo entender lo que necesito de ella.

Intenté este código pero termina con un mensaje de error:

Traceback (most recent call last):
  File "...recipe-305690-1.py", line 195, in <module>
    prt.EnumJobs(pJob, prt.pcbNeeded)
  File "...recipe-305690-1.py", line 164, in EnumJobs
    ret = ws.EnumJobsA(self.OpenPrinter(),
ctypes.ArgumentError: argument 5: <class 'OverflowError'>: int too long to convert
Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como experto en informática especializado en Python, Python-3.x, eventos, impresión y pywin32, puedo ayudarle con sus requisitos. Para lograr la funcionalidad deseada, podemos utilizar el módulo “win32print” disponible en el paquete “pywin32”.

    En primer lugar, necesitaremos obtener el identificador de la impresora que debe monitorearse. Esto se puede hacer utilizando el método “win32print.OpenPrinter(printer_name)”. Una vez que tengamos el identificador, podemos monitorear los eventos de la impresora utilizando el método “win32print.FindFirstPrinterChangeNotification(hPrinter, fdwFilter, fdwOptions)”.

    El parámetro “fdwFilter” especificará qué eventos deseamos monitorear. En este caso, monitorearemos el evento “PRINTER_CHANGE_JOB”, que se activará cada vez que se termine de imprimir un trabajo de impresión. Una vez que se active el evento, podemos obtener la información requerida sobre el trabajo de impresión completo utilizando el método “win32print.GetJob(hPrinter, job_id, level)”.

    Aquí hay un fragmento de código de ejemplo que demuestra cómo lograr la funcionalidad deseada:

    import win32print
    import win32con
    
    # Especifica el nombre de la impresora que debe monitorearse
    printer_name = "Nombre de la impresora"
    
    # Obtener el identificador de la impresora
    hPrinter = win32print.OpenPrinter(printer_name)
    
    # Establecer el filtro para monitorear solo el evento "PRINTER_CHANGE_JOB"
    fdwFilter = win32con.PRINTER_CHANGE_JOB
    
    # Monitorear los eventos de la impresora
    hNotify = win32print.FindFirstPrinterChangeNotification(hPrinter, fdwFilter)
    
    try:
        while True:
            # Esperar a que se active el evento
            result = win32print.WaitForPrinterChange(hPrinter, hNotify)
    
            # Si el evento es un evento de finalización de trabajo
            if result == win32con.PRINTER_CHANGE_JOB:
                # Obtener los detalles del trabajo
                job, job_info = win32print.GetJob(hPrinter, win32print.GetPrinterData(hPrinter, win32print.PRINTER_ATTRIBUTE_DEFAULT), 2)
    
                # Extraer la información requerida de los detalles del trabajo
                document_name = job_info["pDocument"]
                num_pages = job_info["TotalPages"]
                formato = job_info["pDevMode"].PaperSize
                color = "Color" if job_info["pDevMode"].Color == 1 else "Blanco y Negro"
                tiempo_finalizado = job_info["Submitted"]
    
                # Realizar las acciones requeridas con la información extraída
                print(f"Trabajo de impresión completado - Nombre del documento: {document_name}, Número de páginas: {num_pages}, Formato: {formato}, Color: {color}, Tiempo finalizado: {tiempo_finalizado}")
    
    finally:
        # Cierra el identificador de notificación
        win32print.FindClosePrinterChangeNotification(hNotify)
    
        # Cierra el identificador de la impresora
        win32print.ClosePrinter(hPrinter)
    

    Este código continuamente monitoreará la impresora especificada para obtener eventos de finalización de trabajo, e imprimirá la información requerida sobre los trabajos de impresión completados. Espero que esto ayude! Háganos saber si tiene más consultas.

Comments are closed.