英文:
Print a word document from Python 3 after setting some printer properties
问题
I have a word document that I would like to print from inside Python. I also need to set some printer properties, like the tray, duplex printing etc.
So far I have only partly succeeded to print, by using win32api.ShellExecute
but this will open Word to print and it will get the printer properties set in Word, which is not desirable.
If I use win32print
module I am able to set the properties as I want but I haven't been able to send the document to the printer.
In sort, the part of the code that seems to work for setting my printer properties is as follows:
import win32con
import win32gui
import win32print
# pDevMode Constants
# DefaultSource
TRAY_1 = 260
TRAY_2 = 259
# Duplex
SINGLE_SIDE = 1
DUPLEX_OVER = 2
DUPLEX_UP = 3
# Color
COLOR = 2
MONOCHROME = 1
device_name = win32print.GetDefaultPrinter()
handle = win32print.OpenPrinter(device_name)
properties = win32print.GetPrinter(handle, 2)
devmode = properties['pDevMode']
devmode.DefaultSource = TRAY_1
devmode.Fields |= win32con.DM_DEFAULT_SOURCE
win32print.DocumentProperties(None, handle, device_name, devmode, devmode, win32con.DM_IN_BUFFER | win32con.DM_OUT_BUFFER)
hdc = win32gui.CreateDC("", device_name, devmode)
win32print.StartDoc(hdc, ("Print Document", None, None, 0))
win32print.StartPage(hdc)
...
win32print.EndPage(hdc)
win32print.EndDoc(hdc)
The above will print an empty page (as expected) from the correct tray.
I am not sure how to send the document though.
I have been reading my file and trying to send to the printer with:
with open(document_path, "rb") as file:
data = file.read()
win32print.WritePrinter(printer_handle, data)
but doesn't work.
I am also a bit confused with StartDoc/StartDocPrinter, StartPage/StartPagePrinter functions in win32print... Whatever I tried so far didn't seem to work.
Any help would be much appreciated.
英文:
I have a word document that I would like to print from inside Python. I also need to set some printer properties, like the tray, duplex printing etc.
So far I have only partly succeeded to print, by using win32api.ShellExecute
but this will open Word to print and it will get the printer properties set in Word, which is not desirable.
If I use win32print
module I am able to set the properties as I want but I haven't been able to send the document to the printer.
In sort, the part of the code that seems to work for setting my printer properties is as follows:
import win32con
import win32gui
import win32print
# pDevMode Constants
# DefaultSource
TRAY_1 = 260
TRAY_2 = 259
# Duplex
SINGLE_SIDE = 1
DUPLEX_OVER = 2
DUPLEX_UP = 3
# Color
COLOR = 2
MONOCHROME = 1
device_name = win32print.GetDefaultPrinter()
handle = win32print.OpenPrinter(device_name)
properties = win32print.GetPrinter(handle, 2)
devmode = properties['pDevMode']
devmode.DefaultSource = TRAY_1
devmode.Fields |= win32con.DM_DEFAULT_SOURCE
win32print.DocumentProperties(None, handle, device_name, devmode, devmode, win32con.DM_IN_BUFFER | win32con.DM_OUT_BUFFER)
hdc = win32gui.CreateDC("", device_name, devmode)
win32print.StartDoc(hdc, ("Print Document", None, None, 0))
win32print.StartPage(hdc)
...
win32print.EndPage(hdc)
win32print.EndDoc(hdc)
The above will print an empty page (as expected) from the correct tray.
I am not sure how to send the document though.
I have been reading my file and trying to send to the printer with:
with open(document_path, "rb") as file:
data = file.read()
win32print.WritePrinter(printer_handle, data)
but doesn't work.
I am also a bit confused with StartDoc/StartDocPrinter, StartPage/StartPagePrinter functions in win32print... Whatever I tried so far didn't seem to work.
Any help would be much appriciated
答案1
得分: 1
所以最后我成功了...
显然,没有必要使用 win32gui.CreateDC
。
我实际上需要进行的操作是注册 pDevMode 更改到打印机的是:
win32print.SetPrinter(printer_handle, 2, properties, 0)
就在 DocumentProperties 行之后。
为了使这个工作,我必须添加 PRINTER_DEFAULTS 参数到打印机句柄命令中,如下所示:
PRINTER_DEFAULTS = {
"DesiredAccess": win32print.PRINTER_ALL_ACCESS
}
printer_handle = win32print.OpenPrinter(printer_name, PRINTER_DEFAULTS)
然后,使用 ShellExecute 命令,我能够使用设置的设置进行打印。
英文:
So I got it working in the end...
Apparently there is no need for win32gui.CreateDC
What I was missing to actually register the pDevMode changes to the printer was:
win32print.SetPrinter(printer_handle, 2, properties, 0)
right after the DocumentProperties line.
For this to work though I had to add the PRINTER_DEFAULTS argument to the printer handle command as follows:
PRINTER_DEFAULTS = {
"DesiredAccess": win32print.PRINTER_ALL_ACCESS
}
printer_handle = win32print.OpenPrinter(printer_name, PRINTER_DEFAULTS)
Then with a ShellExecute command I was able to print with the set settings
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论