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)

 

posted @ 2022-04-18 14:59  不要不说  阅读(3253)  评论(1编辑  收藏  举报