2017-05-22 2 views
0

Je souhaite effacer ou supprimer des travaux d'impression à l'aide de Python. Mais comment puis-je obtenir JobID?Comment utiliser SetJob dans win32print?

win32print.SetJob(hPrinter, JobID , Level , JobInfo , Command)

Comment pourrais-je exécuter ce code?

jobs = [] 
for p in win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL,None, 1): 
    flags, desc, name, comment = p 

    pHandle = win32print.OpenPrinter(name) 
    print = list(win32print.EnumJobs(pHandle, 0, -1, 1)) 
    jobs.extend(print) 
    SetJob(pHandle, id, 1,JOB_CONTROL_DELETE) 
    #where should i get id from? 
    win32print.ClosePrinter(pHandle) 
+0

Connaissez-vous certains détails sur l'imprimante (par ex. nom de l'imprimante)? Parce qu'il ne sert à rien d'itérer à travers toutes les imprimantes installées et d'essayer de faire cette opération. Vous attribuez également une valeur à 'print', qui est une fonction intégrée. – CristiFati

Répondre

0

A partir de votre code, j'ai réussi à créer un petit script qui supprime toute tâche d'impression sur une imprimante (local) (je l'ai testé et il fonctionne ).

Ici, il est (je l'ai exécuté avec Py35):

import win32print 

if __name__ == "__main__": 

    printer_info_level = 1 

    for printer_info in win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL, None, printer_info_level): 
     name = printer_info[2] 
     #print(printer_info) 
     printer_handle = win32print.OpenPrinter(name) 
     job_info_level = 1 
     job_info_tuple = win32print.EnumJobs(printer_handle, 0, -1, job_info_level) 
     #print(type(job_info_tuple), len(job_info_tuple)) 
     for job_info in job_info_tuple: 
      #print("\t", type(job_info), job_info, dir(job_info)) 
      win32print.SetJob(printer_handle, job_info["JobId"], job_info_level, job_info, win32print.JOB_CONTROL_DELETE) 
     win32print.ClosePrinter(printer_handle) 

Remarques:

  • Ce que je dis dans mon commentaire (environ itérer sur les imprimantes) tient toujours , mais je suppose que cela dépasse la portée de cette question
  • J'ai amélioré le script un peu:
    • Donner (plus) des noms significatifs aux variables
    • Utiliser des variables plutôt que des nombres simples pour augmenter la lisibilité du code
    • Autres petites corrections
    • Probablement, il pourrait utiliser une gestion des exceptions
  • Le secret du script se composent de:
    • EnumJobs retourner un tuple de dictionnaires (où chaque dictionnaire encapsule un [MSDN]: JOB_INFO_1 structure - pour job_info_level = 1), ou (évidemment) un tuple vide s'il n'y a pas mis en attente d'emplois pour l'imprimante
    • Comment les informations de EnumJobs est passé à SetJob:
      • Le l'argument JobID (que vous avez demandé à propos) est job_info["JobId"] (check point précédent)
      • notez également les 2 arguments suivants: Level et JobInfo