python調用windows打印機,需要用到包pywin32
pip install pywin32 -i https://pypi.tuna.tsinghua.edu.cn/simple
import win32con
import win32gui
import win32print
以上幾個包會在打印時使用。
調用打印機的順序為
獲取打印機名稱 -> 連接打印機 -> 定義打印機配置 -> 創建新DC(設備上下文)
-> 創建文檔 -> 創建頁面 -> 打印內容 -> 結束頁面 -> 結束文檔
1) 獲取打印機名稱
在安裝完對應驅動程序后並添加打印機后
import win32print
def get_item_printer(printer_name=None):
if not printer_name:
printer_name = win32print.GetDefaultPrinter()
for it in win32print.EnumPrinters(2):
if it[2].upper() == printer_name.upper():
return it
return None
2) 連接打印機
hprinter = win32print.OpenPrinter(MyPrinter.printer_name) # 打印機pyhandle對象
3) 自定義打印機配置
devmode = win32print.GetPrinter(hprinter, 2)["pDevMode"] # 獲取配置
devmode.FormName = "Gprinter 58(48) x 3276 mm" # 定義配置
pDC = win32gui.CreateDC("WINSPOOL", "printer_name", devmode) # 使用配置
# 所有dev選項通過dir(devmode)查看
#注:devmode中有一個DriverData的選項,是一堆字節碼,
# 如果不知道打印機如何配置,可以先將打印機手動配置好,
#然后記錄下DriverData數據,在以后的使用中直接將其賦值即可。
#update:某些參數是無法通過記錄driverdata實現,比如卷的設置
driver_data = b"\xa4\x00\x01\x00MDTN\x02\x00\x00\x00\x05\x00\x00\x00\xcb\x00\x00\x00\x00\x19\x00\x00\xe4\x0c\x00\x00\x00\x00\x00\x00\xb8\x0b\x00\x00p\x17\x00\x00\x00\x00\x00\x00\xdc\x05\x00\x00X\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfe\xff\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x007\x0c\x00\x00\xda\x0c\x00\x00\x10'\x00\x00\x10'\x00\x00\x10'\x00\x00\x10'\x00\x00\xa0\n\x00\x00\xc2\x06\x00\x00\xb8\x06\x00\x00,\x04\x00\x00@\x01\x00\x00\xd2\x00\x00\x00\x18\x00\x00\x00\x00\x00\x10'\x10'\x10'\x00\x00\x10'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00d\x04\x01\x04\x00\x00\x00\x00\xce\x18\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x02\x00\x00\x00\x12\x000\x00\x00\x00\x00\x00\x00\x00\x07\x00\x00\x00\xff\xff\xff\xff\x02\x00\x00\x00\x01\x00\x00\x00P\x00\x00\x00\x00\x00\x00\x00\xb8\x0b\x00\x00\x00\x00\x00\x00\xb8\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\xa8)\x01\x00\x03\x00\x00\x00ssstscl\x04"
devmode.DriverData = driver_data
4) 創建Dc
pDC = win32gui.CreateDC("WINSPOOL", "printer_name", devmode)
5) 創建文檔
win32print.StartDoc(pDC, ("some_name", None, None, 0))
6) 創建頁面
win32print.StartPage(pDC)
7) 打印內容
# 打印文本
# 添加了DT_CALCRECT計算出文本面積大小,但是是單行的
drawrect = win32gui.DrawText(MyPrinter.pDC,
msg,
-1,
(0, 0, 0, 0),
win32con.DT_NOPREFIX | win32con.DT_LEFT | win32con.DT_TOP | win32con.DT_CALCRECT)
# 根據紙張長度進行換行,得到合適的打印區域大小
rect = (drawrect[1][0],
drawrect[1][1] + y,
MyPrinter.paper_width,
((drawrect[1][2] + MyPrinter.paper_width) // MyPrinter.paper_width + 1) * drawrect[1][3] + y)
# 使用得到的打印區域進行打印
win32gui.DrawText(
MyPrinter.pDC,
msg,
-1,
rect,
win32con.DT_NOPREFIX | win32con.DT_LEFT | win32con.DT_TOP | win32con.DT_EDITCONTROL | win32con.DT_WORDBREAK,
)
y = rect[3] # 連續打印的一個自定義參數
# 打印圖片
image = Image.open(io.BytesIO(pic))
dib = ImageWin.Dib(image)
dib.draw(MyPrinter.pDC, (0, y, MyPrinter.paper_width, y + MyPrinter.paper_width))
y += MyPrinter.paper_width
此時不會實際打印,需要結束文檔后才會打印
8) 結束頁面
win32print.EndPage(pDC)
9) 結束文檔
win32print.EndDoc(pDC)
