Pywin32 设备
win32print
- 参数
level:返回信息类型1:列表,无值含义说明2-5:内容逐渐省略的字典,键值对表示值含义、值
hPrinter:win32print.OpenPrinter返回的打印机句柄hdc:win32gui.CreateDC返回打印机设备上下文句柄pPrinter:win32print.GetPrinter返回的PRINTER_INFO_*字典
 
打印机
win32print.OpenPrinter(printer, Defaults):获取指定打印机的句柄win32print.GetPrinter(hPrinter, Level):获取打印机相关信息Level:信息展示格式,一般设置为2以字典形式返回
win32print.GetDevicesCaps(hdc, Index):获取设备上下文相关的参数、设置Index参数代号,可以通过win32con.获取- 将打印机句柄作为 
hdc传递时,正常执行但返回结果始终为0 
win32print.SetPrinter(hPrinter, Level, pPrinter, Command):改变打印机配置、状态Command:发送给打印机的命令,可以通过win32print.PRINTER_CONTROL_*查看
win32print.EnumPrinters(flags, name, level):枚举打印机flags:指定打印机类型,可以通过win32print.PRINTER_ENUM_<type>获取相关类型枚举值- 可设置为 
6以枚举 local、connections 类型设备 
- 可设置为 
 
win32print.GetDefaultPrinter/win32print.GetDefaultPrinterWwin32print.SetDefaultPrinter/win32print.SetDefaultPrinterW
打印机属性设置
打印机属性设置方式
1
2
3
4
5
6// 获取打印相关属性
properties = win32print.GetPrinter(hPrinter, 2)
devmode = properties["pDevMode"]
// 修改属性设置
properties["pDevMode"] = devmode
win32print.SetPrinter(hPrinter, 2, properties, 0)打印机属性常用设置
devmode.Color:彩印- 可通过 
win32con.DMCOLOR_<XXX>查看枚举值 
- 可通过 
 devmode.PaperSize:纸张尺寸- 可以通过 
win32con.DMPAPER_<XXXX>查看枚举值 - 指定此属性时,
devmode.PaperLength、devmode.PaperWidth不生效 
- 可以通过 
 devmode.PaperLength:纸张长,单位毫米devmode.PaperWidth:纸张宽,单位毫米devmode.Duplex:单双面(双面分为 flip over 、flip up)- 可通过 
win32con.DMDUP_<XXXX>查看枚举值 
- 可通过 
 devmode.Orientation:打印方向,即横向、纵向- 可通过 
win32con.DMORIENT_<XXXX>查看枚举值 - 真实打印时影响不大,打印至 pdf 文件时、双面打印时有影响
 
- 可通过 
 devmode.MediaType:纸张类型devmode.DefaultSource:纸张来源
打印
无 GDI 打印
win32print.StartDocPrinter(hPrinter, level, tuple):通知打印 spool 将有文件加入hPrinter:wi32print.OpenPrinter返回的打印机句柄level:文档信息结构,此处仅支持1(元组)tuple:按level指定格式设置的文档信息docName:文档名outputFile:输出文件名dataType:文档数据类型
win32print.EndDocPrinter(hPrinter):结束打印机的打印任务- 在 
win32print.WriterPrinter调用后使用 
- 在 
 win32printer.AbortPrinter(hPrinter):删除打印机的 spool 文件win32print.StartPagePrinter(hPrinter):通知打印 spool 一页将被打印win32print.EndPagePrinter(hPrinter):结束打印 job 中的一页win32print.WritePrinter(hPrinter, buf):将buf复制到打印机- 适合复制 
raw Postscripts、HPGL文件 
- 适合复制 
 
GDI 打印
win32print.StartDoc(hdc, docinfo):在打印机设备上下文上开始 spooling 打印任务hdc:win32gui.CreateDC返回的设备上下文句柄docinfo:指定打印任务参数,四元组DocName:文档名Output:输出文件名,仅在输出至文件时需要,正常打印时可设置为NoneDataType:数据类型,如:RAW、EMF、TEXT,None` 使用默认Type:操作模式,可选值DI_APPBANDING、DI_ROPS_READ_DESTINATION、0
win32print.EndDoc(hdc, docinfo):在打印机设备上下文上结束 spooling 打印任务win32print.AbortDoc(hdc):取消打印 jobwin32print.StartPage(hdc):在打印机设备上下文上开始一页win32print.EndPage(hdc):在打印机设备上下文上结束一页
打印任务
win32print.EnumJobs(hPrinter, FirstJob, NoJobs, Level):枚举打印机上的打印 jobwin32print.GetJob(hPrinter, JobID, Level):获取打印 job 的信息win32print.SetJob(hPrinter, JobID, Level, JobInfo, Command):暂停、取消、恢复、设置优先级Command:指定设置的内容,可以通过查询win32print.JOB_CONTROL_<XXXX>查看枚举值
打印示例
图片打印
直接使用
win32gui.CreateDC1
2
3
4
5
6
7
8
9
10
11
12
13# 创建打印机上下文
hdc = win32gui.CreateDC("WINSPOOL", printer_name, None)
# 打开图像文件,并创建位图
bmp = Image.Open(filename)
dib = ImageWin.Dib(bmp)
# 在上下文上打开文件、文件页
win32print.StartDoc(hdc, 1, ("", None, None, 0))
win32print.StartPage(hdc)
# 绘制位图
dib.draw(hdc, (x1, y1, x2, y2))
win32print.EndPage(hdc)
win32print.EndDoc(hdc)
win32gui.DeleteDC(hdc)使用
win32ui.CreateDC1
2
3
4
5
6
7
8
9
10
11
12
13# 创建未初始化设备上下文
hdc = win32ui.CreateDC()
# 初始化上下文
hdc.CreatePrinterDC(printer_name)
hdc.StartDoc(filename)
hdc.StartPage()
bmp = Image.Open(filename)
dib = ImageWin.Dib(bmp)
# 获取句柄,并绘制
dib.draw(hdc.GetHandleOutput(), (x1, y1, x2, y2))
hdc.EndPage()
hdc.EndDoc()
hdc.DeleteDC()结合
win32gui.CreateDC、win32ui.CreateDC1
2
3
4# 可以设置 `PDEVMODE`
g_hdc = win32gui.CreateDC("WINSPOOL", printer_name, dev_mode)
hdc = win32gui.CreateDCFromHandle(g_hdc)
# 之后同上
- 可通过
 GetDeviceCaps方法、函数获取设备上下文属性,用于确定、设置打印位置、方向等- https://stackoverflow.com/questions/54522120/python3-print-landscape-image-file-with-specified-printer
 - https://www.cnblogs.com/onsunsl/p/python_call_win32print_print_unicode.html