python使用自定义配置并调用电脑打印机
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)