[python-win32] why do I get error 1804 from win32print.SetJob?

Glenn Linderman ml at g.nevcal.com
Thu Nov 15 20:39:52 EST 2018


No answers on stackoverflow 
<https://stackoverflow.com/questions/53315433/why-do-i-get-error-1804-from-win32print-setjob> 
so maybe it is a bug I should report here.

I try to change a job name in Win32 spooler using Python 3.6 and 
win32print on Windows 10. [And I tell the spooler to save all my print 
jobs, so there are a bunch in there.]

Here is the code I'm using. Note that the variables js and rename are 
the control variables if you need to tweak this to run in your 
environment. js contains a substring of an existing document name, and 
the idea is that the document name of the first matching spool job 
having a document name containing that fragment will be changed to the 
content of the rename variable by the code.

import sys, os
import time
import win32print
#####################################
def print_job_lister( js='' ):
     """
     Finds a job whose name contains the passed substring.
     """

     res = None
     for p in win32print.EnumPrinters( win32print.PRINTER_ENUM_LOCAL, 
None, 1 ):
         flags, desc, name, comment = p
         showprinter = True

         phandle = win32print.OpenPrinter( name )
         print_jobs = win32print.EnumJobs( phandle, 0, -1, 1 )
         for job in print_jobs:
             document = job["pDocument"]
             if js in document:
                 if showprinter:
                     print( f'printer => {name}')
                     showprinter = False
                 print( f'  Document => {document}')
                 print( f'  JobId => {job["JobId"]}  Status => 
{job["Status"]}'
                        f'  Pages => {job["TotalPages"]}')
                 if not res:
                     res = ( name, job["JobId"])
         win32print.ClosePrinter( phandle )
     return res
#####################################
if __name__ == '__main__':
     js = '20181114'
     rename = 'foobar'
     res = print_job_lister( js )
     print( res )
     if res:
         phandle = win32print.OpenPrinter( res[ 0 ])
         jobinfo = win32print.GetJob( phandle, res[ 1 ], 1 )
         jobinfo['Position'] = win32print.JOB_POSITION_UNSPECIFIED
         if rename:
             jobinfo['pDocument'] = rename
             print( f'abc {win32print.JOB_POSITION_UNSPECIFIED} {jobinfo}')
             win32print.SetJob( phandle, res[ 1 ], 1, jobinfo, 0 )
         win32print.ClosePrinter( phandle )

Here is the error I'm getting:

{'JobId': 27, 'pPrinterName': 'HL6180dw', 'pMachineName': '\\\\STEPHEN', 
'pUserName': 'Glenn', 'pDocument': 'duh', 'pDatatype': 'NT EMF 1.008', 
'pStatus': None, 'Status': 8210, 'Priority': 1, 'Position': 0, 
'TotalPages': 22, 'PagesPrinted': 0, 'Submitted': 
pywintypes.datetime(2018, 11, 14, 21, 1, 27, 882000, 
tzinfo=TimeZoneInfo('GMT Standard Time', True))}
Traceback (most recent call last):
   File "D:\my\py\spool.py", line 109, in <module>
     win32print.SetJob( phandle, res[ 1 ], 1, jobinfo, 0 )
pywintypes.error: (1804, 'SetJob', 'The specified datatype is invalid.')

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-win32/attachments/20181115/75c8072e/attachment.html>


More information about the python-win32 mailing list