def StartPrint (printer='MyPSPrinter', path=r'D:\test.txt', copies = 1, orientation = win32con.DMORIENT_PORTRAIT, duplex = win32con.DMDUP_HORIZONTAL, printQuality = win32con.DMRES_HIGH, color = win32con.DMCOLOR_MONOCHROME, paperSize = win32con.DMPAPER_LETTER, # or DMPAPER_A4 text=None): PRINTER_DEFAULTS = {"DesiredAccess": win32print.PRINTER_ALL_ACCESS} h_printer = win32print.OpenPrinter(printer, PRINTER_DEFAULTS) properties = win32print.GetPrinter(h_printer, 2) devmode = properties["pDevMode"] devmode.FormName = 'A4' # or 'Letter' devmode.PaperSize = paperSize devmode.Orientation = orientation devmode.PrintQuality = printQuality devmode.Color = color devmode.TTOption = win32con.DMTT_SUBDEV devmode.Scale = 100 devmode.Copies = copies devmode.Duplex =duplex devmode.Fields |= (win32con.DM_FORMNAME | win32con.DM_PAPERSIZE | win32con.DM_ORIENTATION | win32con.DM_PRINTQUALITY | win32con.DM_COLOR | win32con.DM_TTOPTION | win32con.DM_SCALE) properties['pDevMode'] =devmode win32print.SetPrinter(h_printer, 2, properties, 0) win32print.SetDefaultPrinter(printer) try: listOfFiles = os.listdir(path) if (len(listOfFiles)!=0): for file in listOfFiles: filename = path+'\\'+file print(filename) print(win32api.ShellExecute( 0, "printto", filename, '"%s"' % win32print.GetDefaultPrinter(), ".", 0 )) print_jobs = win32print.EnumJobs(h_printer, 0, -1, 2) delete = True while (delete): old_print_jobs = print_jobs print_jobs = win32print.EnumJobs(h_printer, 0, -1, 2) if((len(print_jobs) == 0) & (len(old_print_jobs)!=0)): print('ok') delete = False filename = path+'\\'+file os.remove(filename) except FileNotFoundError: print('Directory not created.')
def clearJobsQueue(): printer = win32print.OpenPrinter('PDFCreator') jobs = win32print.EnumJobs(printer, 0, 100, 2) while len(jobs) > 0: for currentJob in jobs: print '\nDeleting print job with id [' + str(currentJob['JobId']) + ']' win32print.SetJob(printer, currentJob['JobId'], 0, None, win32print.JOB_CONTROL_DELETE) win32print.ClosePrinter(printer) time.sleep(.5) printer = win32print.OpenPrinter('PDFCreator') jobs = win32print.EnumJobs(printer, 0, 100, 2) win32print.ClosePrinter(printer)
def print_job_checker(): server = socket.gethostname() while True: 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: document = job["pDocument"] username = job['pUserName'] identity = job['JobId'] jobstate = job['Status'] machinename = job['pMachineName'].replace("\\\\", "") pTime = datetime.datetime.now().isoformat() today = datetime.date.today().isoformat() Pages = job['TotalPages'] printstr = "[Server:" + server + "],[Who:" + username + "],[Computer:" + machinename + "],[Print Time:" + pTime + "],[JobID:" + str( identity) + "]" print(printstr) win32print.ClosePrinter(phandle) time.sleep(0.5)
def GetJobList(self, printer): phandle = win32print.OpenPrinter(printer) #now get all the print jobs (start at job 0 and -1 for all jobs) jlist = win32print.EnumJobs(phandle, 0, -1, 1) win32print.ClosePrinter(phandle) return jlist # this lists all jobs on all printers
def GetJobList(printer): printer_handle = win32print.OpenPrinter(printer) job_list = win32print.EnumJobs(printer_handle, 0, -1, 2) win32print.ClosePrinter(printer_handle) return job_list
def task(): # 获取默认打印机的工作状态 printer_name = win32print.GetDefaultPrinter() print(WHERE, "默认打印机", printer_name) handle_printer = win32print.OpenPrinter(printer_name) # 获取打印机句柄 printer_info = win32print.GetPrinter(handle_printer, 2) # 调用相关函数进行信息查询 task_list = win32print.EnumJobs(handle_printer, 0, 10) # 参数(句柄,编文档号,枚举条数) return printer_info["cJobs"] # 获取当前打印机任务数目
def printer_watchdog(): print win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL) # get local printers print win32print.EnumPrinters(win32print.PRINTER_ENUM_CONNECTIONS) # get printers which other computer shared default_printer_name = win32print.GetDefaultPrinter() printer = win32print.OpenPrinter(default_printer_name) print win32print.GetPrinter(printer) jobs_list = list() total_seconds = 60 * 5 # reset after 60*5 seconds, see 'known issue 2' in this file. sleep_seconds = 10 times = total_seconds / sleep_seconds current_times = 0 while True: jobs = win32print.EnumJobs(printer, 0, 3, 1) # except: pywintypes.error: (1722, 'EnumJobs', 'RPC 服务器不可用。'), ignored this except # 0 is location of first job, # 3 is number of jobs to enumerate, # 1 is job info level, can be 1(win32print.JOB_INFO_1), 2, 3. 3 is reserved, 1 and 2 can NOT get job status, :( if len(jobs) >= 1: for job in jobs: filename = job.get('pDocument') job_id = job.get('JobId', md5(filename).hexdigest()) job_status = job.get('Status', 0) if job_status in [0x00000002, 0x00000004, 0x00000800]: # JOB_STATUS_ERROR """ Refers: https://docs.microsoft.com/en-us/windows/desktop/printdocs/job-info-2 ~\AppData\Local\Programs\Common\Microsoft\Visual C++ for Python\9.0\WinSDK\Include\WinSpool.h """ print "printer need to be reset, ... " reset_printer() jobs_list = [] # make sure there are not same job id in list current_times = 0 print "Current job: ", job_id, job.get('pUserName'), job.get('Submitted'), job.get( 'pMachineName'), filename, "[ %d/%d ]" % (times, current_times + 1) jobs_list.append(job_id) # if any([jid in jobs_list for jid in (jobs[0].get('JobId'), jobs[-1].get('JobId'))]): # current_times += 1 if Counter(jobs_list).most_common(1)[0][1] > 1: current_times += 1 if current_times > times: """ KNOWN ISSUE 2: It will reset when a document sends lots of pages to printer. This script may reset printer before job finished which is not expected. """ print "printer need to be reset, ... " reset_printer() jobs_list = [] # make sure there are not same job id in list current_times = 0 else: jobs_list = [] current_times = 0 print 'looks good, keep watching ...' time.sleep(sleep_seconds)
def printer_watchdog(): DEFAULT_LOCALE_ENCODING = get_system_encoding() print win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL) # get local printers print win32print.EnumPrinters(win32print.PRINTER_ENUM_CONNECTIONS) # get printers which other computer shared default_printer_name = win32print.GetDefaultPrinter() printer = win32print.OpenPrinter(default_printer_name) print win32print.GetPrinter(printer) jobs_list = list() total_seconds = 60 * 5 # reset after 60*5 seconds sleep_seconds = 10 times = total_seconds / sleep_seconds current_times = 0 while True: jobs = win32print.EnumJobs(printer, 0, 3, 1) # 0 is location of first job, # 3 is number of jobs to enumerate, # 1 is job info level, can be 1(win32print.JOB_INFO_1), 2, 3. 3 is reserved, 1 and 2 can NOT get job status, :( if len(jobs) >= 1: for job in jobs: print job.get('pUserName'), job.get('Submitted'), job.get('pMachineName'), \ job.get('pDocument').decode(DEFAULT_LOCALE_ENCODING) jobs_list.append(job.get('JobId', -1)) if any([jid in jobs_list for jid in (jobs[0].get('JobId'), jobs[-1].get('JobId'))]): current_times += 1 if current_times > times: print "printer need to be reset, ... " reset_printer() jobs_list = [] # make sure there are not same job id in list current_times = 0 print 'looks good' time.sleep(sleep_seconds)
def cancelPrint(printerName, docName): phandle = win32print.OpenPrinter(printerName) print_jobs = win32print.EnumJobs(phandle, 0, -1, 1) for job in print_jobs: if docName in job["pDocument"]: document = job["pDocument"] print("Canceling Print: " + document) win32print.SetJob(phandle, job["JobId"], 0, None, win32print.JOB_CONTROL_DELETE) win32print.ClosePrinter(phandle) time.sleep(1)
def printer_watchdog(): # DEFAULT_LOCALE_ENCODING = get_system_encoding() print win32print.EnumPrinters( win32print.PRINTER_ENUM_LOCAL) # get local printers print win32print.EnumPrinters(win32print.PRINTER_ENUM_CONNECTIONS ) # get printers which other computer shared default_printer_name = win32print.GetDefaultPrinter() printer = win32print.OpenPrinter(default_printer_name) print win32print.GetPrinter(printer) jobs_list = list() total_seconds = 60 * 5 # reset after 60*5 seconds, see 'known issue 2' in this file. sleep_seconds = 10 times = total_seconds / sleep_seconds current_times = 0 while True: jobs = win32print.EnumJobs(printer, 0, 3, 1) # 0 is location of first job, # 3 is number of jobs to enumerate, # 1 is job info level, can be 1(win32print.JOB_INFO_1), 2, 3. 3 is reserved, 1 and 2 can NOT get job status, :( if len(jobs) >= 1: for job in jobs: filename = job.get('pDocument') job_id = job.get('JobId', md5(filename).hexdigest()) print "Current job: ", job_id, job.get('pUserName'), job.get( 'Submitted'), job.get( 'pMachineName'), filename, "[ %d/%d ]" % ( times, current_times + 1) jobs_list.append(job_id) # if any([jid in jobs_list for jid in (jobs[0].get('JobId'), jobs[-1].get('JobId'))]): # current_times += 1 if Counter(jobs_list).most_common(1)[0][1] > 1: current_times += 1 if current_times > times: """ KNOWN ISSUE 2: It will reset when a document sends lots of pages to printer. This script may reset printer before job finished which is not expected. """ print "printer need to be reset, ... " reset_printer() jobs_list = [] # make sure there are not same job id in list current_times = 0 else: jobs_list = [] current_times = 0 print 'looks good, keep watching ...' time.sleep(sleep_seconds)
def get_job(printer_name): hprinter = win32print.OpenPrinter(printer_name) response = win32print.EnumJobs(hprinter, 0, 100) # print(response) json_arr = [] for x in response: x['Submitted'] = 'Null' r = json.dumps(x) load_r = json.loads(r) json_arr.append(load_r) json_r = json.dumps(json_arr) print(json_r) return Response(json_r, status=200, mimetype='text/plain')
def printChecker(printerName, docName): """ Checking job status from pdf invoice given to the printer, whether still in queue or have completely printed Parameters ---------- printerName : obj The object of printer name obtained from printer enumeration docName : The document name to check (in this case is invoice number) """ print('Printing Now : {}'.format(docName)) jobs = 1 timeCount = 0 while jobs: phandle = win32print.OpenPrinter(printerName) enumStat = 1 while enumStat: try: print_jobs = win32print.EnumJobs(phandle, 0, -1, 1) enumStat = 0 except Exception: time.sleep(3) pass listPrintJobs = [] if print_jobs: for job in print_jobs: listPrintJobs.append(job["pDocument"]) if docName in job["pDocument"]: pass else: jobs = 0 else: jobs = 0 if timeCount == 120: print( 'Printing taking too long time...\nPlease check the printer state, maybe out of paper or something.' ) win32print.ClosePrinter(phandle) timeCount += 5 time.sleep(5) print("Printing Complete")
def get_status_of_printer(self, name_of_printer): """Метод для получения статуса принтера""" try: printer_handler = win32print.OpenPrinter(name_of_printer) except: return query_printer = win32print.EnumJobs(printer_handler, 0, -1, 1) if query_printer: first_document = query_printer[0] document_status = self.HANDLER_STATUS.get( int(first_document['Status'])) else: document_status = self.HANDLER_STATUS.get(self.STATUS_IS_READY) return document_status
def printChecker(printerName, docName): jobs = [1] while jobs: jobs = [] phandle = win32print.OpenPrinter(printerName) print_jobs = win32print.EnumJobs(phandle, 0, -1, 1) if print_jobs: jobs.extend(list(print_jobs)) for job in print_jobs: if docName in job["pDocument"]: document = job["pDocument"] print("Printing Now: " + document + " - status %s" % (job["Status"])) win32print.ClosePrinter(phandle) time.sleep(5)
def main(): printer_name = win32print.GetDefaultPrinter() while 1: time.sleep(1) prn = win32print.OpenPrinter(printer_name) error = printer_errorneous_state(prn) if error: print("ERROR occurred: ", error) else: print("Printer OK... Name of Printer :" + prn) ilist = win32print.GetJob(prn, jobID, 1) print_jobs = win32print.EnumJobs(prn, 0, 1, 2) currentJob = {} for job in print_jobs: while (win32print.GetJob(job["JobId"]) > 0): currentJob = job printCatching(currentJob)
def printChecker(printerName, docName): jobs = [1] while jobs: jobs = [] phandle = win32print.OpenPrinter(printerName) print_jobs = win32print.EnumJobs(phandle, 0, -1, 1) if print_jobs: jobs.extend(list(print_jobs)) for job in print_jobs: document = job["pDocument"] print("Printing Now: " + document) win32print.ClosePrinter(phandle) time.sleep(5) # check if the other thread sent a signal to stop execution. if stop_event.is_set(): break print("Printing Complete")
def cancelPrint(): jobs = [1] while jobs: jobs = [] for p in win32print.EnumPrinters(win32print.PRINTER_ENUM_CONNECTIONS, 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: win32print.SetJob(phandle, win32print.AddJob(phandle)[1], 0, None, win32print.JOB_CONTROL_DELETE) document = job["pDocument"] print("Canceling Print: " + document) win32print.ClosePrinter(phandle) time.sleep(5)
def printChecker(): jobs = [1] while jobs: jobs = [] for p in win32print.EnumPrinters(win32print.PRINTER_ENUM_CONNECTIONS, 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: document = job["pDocument"] print("Printing Now: " + document) win32print.ClosePrinter(phandle) time.sleep(5) # check if the other thread sent a signal to stop execution. if stop_event.is_set(): break print("Printing Complete")
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!")
def main(): printer_name = "HP LaserJet 2420 PCL6 Class Driver" # or get_printer_names()[0] prn = win32print.OpenPrinter(printer_name) error = printer_errorneous_state(prn) if error: print("ERROR occurred: ", error) else: print("Printer OK...") # Do the real workS previusStatus = 0 counter = 0 previusJob = {} while True: jobs = [] print_jobs = win32print.EnumJobs(prn, 0, 1, 2) if print_jobs: jobs.extend(list(print_jobs)) if (len(jobs) > 0): if (previusStatus == 0): print("Starting printing") counter = counter + 1 previusStatus = 1 previusJob = printCatching(jobs) else: if (previusStatus == 1): print("User " + previusJob["pUserName"] + " have printed " + str(previusJob["PagesPrinted"]) + " Pages") print("Finish printing") print(counter) counter = 0 previusStatus = 0 win32print.ClosePrinter(prn)
def list_jobs(): p_handle = win32print.OpenPrinter(PRINTER_NAME) # printer handler print_jobs = win32print.EnumJobs(p_handle, 0, -1, 1) return print_jobs
import win32api import win32print printer_name = win32print.GetDefaultPrinter() print("默认打印机", printer_name) handle_printer = win32print.OpenPrinter(printer_name) # 获取打印机句柄 printer_info = win32print.GetPrinter(handle_printer, 2) # 调用相关函数进行信息查询 for k in printer_info: print(k, printer_info[k]) task_list = win32print.EnumJobs(handle_printer, 0, 10) # 参数(句柄,编文档号,枚举条数) print(task_list) import bin.my_lib.data_sqlite as db res = db.execute('SELECT * FROM KEY_VALUE') print('res:', res)
def checkStatus(printerName, docName): jobStatus = '' jobcheck = [] phandle = win32print.OpenPrinter(printerName) data = ('req.txt', None, None) p = win32print.StartDocPrinter(phandle, 1, data) print(p) addJob = win32print.AddJob(phandle) print(addJob) pJobsEnum = win32print.EnumJobs(phandle, 0, -1, 1) for job in pJobsEnum: # a = job if docName in job['pDocument']: jobCheck = job jobStatus = job['Status'] print(jobCheck) # type(jobCheck) # type(a) #JOB STATUS LIST blockedDriver = win32print.JOB_STATUS_BLOCKED_DEVQ #The driver cannot print the job jobDeleted = win32print.JOB_STATUS_DELETED #Job has been deleted jobDeleting = win32print.JOB_STATUS_DELETING #Job is being deleted jobError = win32print.JOB_STATUS_ERROR #An error is associated with the job jobOffline = win32print.JOB_STATUS_OFFLINE #Printer is offline jobPaperOut = win32print.JOB_STATUS_PAPEROUT #Printer is out of paper jobPaused = win32print.JOB_STATUS_PAUSED #Job is paused jobPrinted = win32print.JOB_STATUS_PRINTED #Job has printed jobPrinting = win32print.JOB_STATUS_PRINTING #Job is printing jobRestart = win32print.JOB_STATUS_RESTART #Job has been restarted jobSpooling = win32print.JOB_STATUS_SPOOLING #Job is spooling userIntervent = win32print.JOB_STATUS_USER_INTERVENTION #Printer has an error that requires the user to do something jobComplete = win32print.JOB_STATUS_COMPLETE #The job is sent to the printer, but may not be printed yet. See Remarks for more information status = 0 print(jobStatus) while status == 0: if jobStatus == blockedDriver: print('\nThe driver can\'t print the job') print('\nPlease check printer driver...') input('\nPress enter to continue...\n') elif jobStatus == jobDeleted: print('Job has been deleted') status = 1 elif jobStatus == jobDeleting: print('\nDeleting Job') elif jobStatus == jobError: print('\nPrinting Error') print('\nPlease check printer condition...') input('\nPress enter to continue...\n') elif jobStatus == jobOffline: print('\nPrinter Offline') print('\nPlease turn on printer and continue...') input('\nPress enter to continue...\n') elif jobStatus == jobPaperOut: print('\nPrinter out of paper') print('\nPlease refill the paper and continue...') input('\nPress enter to continue...\n') elif jobStatus == jobPaused: print('\nJob paused') print('\nPlease resume the printing job and continue...') input('\nPress enter to continue...\n') elif jobStatus == jobPrinting: print('\nPrinting file...') elif jobStatus == jobPrinted: print('\nFile printed') status = 1 elif jobStatus == jobRestart: print('\nRestarting job') elif jobStatus == jobSpooling: print('\nSpooling job') input('\nPress enter to continue...\n') elif jobStatus == userIntervent: print('\nJob has been intervented by user') input('\nPress enter to continue...\n') status = 1 elif jobStatus == jobComplete: print('\nThe job is sent to the printer') else: print('\nPrinting Error') print('\nPlease check printer condition...') input('\nPress enter to continue...\n') return status
# make sure the default printer is set appropriately PDF_CREATOR_PRINTER = 'PDFCreator' if getDefaultPrinter() != PDF_CREATOR_PRINTER: print 'setting default printer to %s' % PDF_CREATOR_PRINTER win32print.SetDefaultPrinter(PDF_CREATOR_PRINTER) # build the command line commandParams.append('/NoStart') inputFileExt = os.path.splitext(inputFile)[1].lower() if readOnly and inputFileExt == '.pdf': commandParams.append('/IF"%s"' % inputFile) commandParams.append('/OF"%s"' % outputFile) else: commandParams.append('/PF"%s"' % inputFile) command = ' '.join(commandParams) # execute the command print '\ncommand: %s' % command os.system(command) # wait until the printer queue becomes empty printer = win32print.OpenPrinter('PDFCreator') while True: if len(win32print.EnumJobs(printer, 0, 1, 2)) == 0: break time.sleep(.5)