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.GetDefaultPrinterW
win32print.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
:输出文件名,仅在输出至文件时需要,正常打印时可设置为None
DataType
:数据类型,如: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.CreateDC
1
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.CreateDC
1
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.CreateDC
1
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