简体   繁体   中英

Change printer tray with pywin32

I'm trying to change the printer tray using the Python win32print module without any success. The printer supports two 'bins': 7=Auto and 4=Manual. I want to start a print job from the 'manual' bin. Here's some code:

import win32print
import win32gui

# Constants from wingdi.h
DM_OUT_BUFFER = 0x02
DM_IN_BUFFER = 0x08
DM_IN_PROMPT = 0x04
DM_DEFAULT_SOURCE = 0x200

# Get a handle for the default printer
device_name = win32print.GetDefaultPrinter()
handle = win32print.OpenPrinter(device_name)

# Get the default properties for the printer
properties = win32print.GetPrinter(handle, 2)
devmode = properties['pDevMode']

# Print the default paper source (prints '7' for 'Automatically select')
print(devmode.DefaultSource)

# Change the default paper source to '4' for 'Manual feed'
devmode.DefaultSource = 4
devmode.Fields = devmode.Fields | DM_DEFAULT_SOURCE

# Write these changes back to the printer
win32print.DocumentProperties(None, handle, device_name, devmode, devmode, DM_IN_BUFFER | DM_OUT_BUFFER)

# Confirm the changes were updated
print(devmode.DefaultSource)  # Aaargh! Prints '7' again!

# Start printing with the device
hdc = win32gui.CreateDC('', device_name, devmode)
win32print.StartDoc(hdc, ('Test', None, None, 0))
win32print.StartPage(hdc)

# ... GDI drawing commands ...

win32print.EndPage(hdc)
win32print.EndDoc(hdc)

Obviously either the PyDEVMODE structure was not updated, or somehow the driver rejected my changes.

If the following line:

win32print.DocumentProperties(None, handle, device_name, devmode, devmode, DM_IN_BUFFER | DM_OUT_BUFFER)

Is changed to:

win32print.DocumentProperties(None, handle, device_name, devmode, devmode, DM_IN_PROMPT | DM_IN_BUFFER | DM_OUT_BUFFER)

Then a 'Print' dialog is shown and I can change the paper source from there. These changes are then correctly copied out to the devmode structure and printing works as expected from the manual feed tray.

So I think my problem is that changes to the PyDEVMODE structure are not re-marshalled and so are lost when the structure is re-submitted to DocumentProperties. Any ideas? Many thanks.

There was a bug in some older versions of Pywin32 that could cause that behaviour. Try installing the most recent build (217).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM