win32print 是 pywin32 库的一部分,它提供了与 Windows 打印系统交互的接口。通过使用 win32print,你可以获取打印机信息、设置默认打印机、管理打印任务等。这使得在 Python 中处理打印操作变得更方便。
常用函数介绍
获取打印机
EnumPrinters(flags)
:
- 获取系统中所有打印机的列表。
flags
参数指定打印机类型,可以使用常量PRINTER_ENUM_LOCAL
列出本地打印机,PRINTER_ENUM_SHARED
列出共享打印机等。
import win32print
printers = win32print.EnumPrinters(win32print.PRINTER_ENUM_LOCAL)
for printer in printers:
print(printer)
设置默认打印机
SetDefaultPrinter(printer_name)
:
- 将指定的打印机设置为默认打印机。
- 例如,打印之前可以先调用这个函数来确保发送任务到正确的打印机。
win32print.SetDefaultPrinter('HP LaserJet MFP M227fdw')
获取当前打印机名称
GetDefaultPrinter()
:
- 获取当前默认打印机的名称。
default_printer = win32print.GetDefaultPrinter()
print(f"当前默认打印机是: {default_printer}")
打印机句柄
OpenPrinter(printer_name)
和 ClosePrinter(printer_handle)
:
OpenPrinter()
用来打开指定打印机并返回一个打印机句柄,ClosePrinter()
用于关闭打印机句柄。- 打开打印机后,可以使用它来查询和控制打印任务。
printer_handle = win32print.OpenPrinter('HP LaserJet MFP M227fdw')
# 处理打印机操作
win32print.ClosePrinter(printer_handle)
开始打印
StartDocPrinter(printer_handle, level, document_info)
:
- 开始一个打印任务,
document_info
是一个字典,包含打印任务的名称、数据类型等。
document_info = ("Test Document", None, "RAW")
win32print.StartDocPrinter(printer_handle, 1, document_info)
标记开始结束
StartPagePrinter(printer_handle)
和 EndPagePrinter(printer_handle)
:
- 这些函数分别标记打印页的开始和结束,用于在多个页面的打印任务中处理分页。
关闭 Windows 自动管理默认打印机
- 打开设置:
- 点击 “开始” 按钮,然后选择 “设置”(齿轮图标),或者按下
Win + I
键组合打开设置窗口。
- 点击 “开始” 按钮,然后选择 “设置”(齿轮图标),或者按下
- 进入设备设置:
- 在设置窗口中,点击 “设备” 选项。
- 选择打印机和扫描仪:
- 在左侧菜单中,选择 “打印机和扫描仪”。
- 关闭自动管理默认打印机:
- 在 “打印机和扫描仪” 页面上,找到 “让 Windows 管理默认打印机” 选项。
- 关闭该选项(将开关切换到 “关闭” 位置)
批量文档打印源码剖析
导入必要的库
import os
import win32print
import win32api
os
: 提供与操作系统交互的功能,尤其是在文件系统中遍历目录、获取文件路径等。win32print
:pywin32
库的一部分,用于与 Windows 打印系统进行交互,例如设置默认打印机。win32api
:pywin32
库中的 API,用于执行各种 Windows 操作,这里使用它来启动打印任务。
获取指定扩展名的文件列表
def get_files(input_dir, file_extension=None):
"""
遍历指定目录及其子目录,返回所有符合条件的文件路径列表。
参数:
input_dir (str): 要遍历的根目录的路径。
file_extension (str): 可选,指定要筛选的文件扩展名(例如'.pdf')。如果为None,则返回所有文件。
返回:
list: 返回包含所有符合条件的文件路径的列表。
"""
file_list = []
for root, dirs, files in os.walk(input_dir):
for filename in files:
if file_extension is None or filename.endswith(file_extension):
file_path = os.path.join(root, filename)
file_list.append(file_path)
return file_list
-
os.walk(input_dir)
:遍历目录及其所有子目录,返回三部分内容:根目录root
、子目录列表dirs
和文件列表files
。 -
循环
files
,如果file_extension
为None
或者文件后缀匹配指定的扩展名,则将文件路径添加到file_list
。 -
返回:符合条件的文件路径列表。
打印单个文件
def print_file(file_path, printer_name):
"""
打印指定文件到指定的打印机。
参数:
file_path (str): 要打印的文件的完整路径。
printer_name (str): 打印机名称。
"""
try:
win32print.SetDefaultPrinter(printer_name)
win32api.ShellExecute(0, "print", file_path, None, ".", 0)
print(f"已发送打印任务:{file_path} 到打印机 {printer_name}")
except Exception as e:
print(f"打印文件 {file_path} 时出错:{e}")
- 使用
win32print.SetDefaultPrinter(printer_name)
设置指定的打印机为当前默认打印机。 - 使用
win32api.ShellExecute()
执行 Windows 的打印操作:0
:窗口句柄,通常设置为0
表示在当前环境中执行操作。"print"
:操作类型,这里指定为打印。file_path
:要打印的文件路径。None
:其他参数,可忽略。"."
:当前目录。0
:窗口显示模式,0
表示隐藏窗口。
批量打印文件
def print_files(input_dir, printer_name, file_extension=None):
"""
获取指定目录中的所有符合条件的文件,并发送打印任务。
参数:
input_dir (str): 输入目录的路径。该目录及其子目录下的所有文件会被遍历。
printer_name (str): 打印机名称,指定将要用于打印的打印机。
file_extension (str): 可选参数,指定要筛选的文件扩展名(例如'.pdf')。默认为None,表示打印所有类型的文件。
"""
files_to_print = get_files(input_dir, file_extension)
for file_path in files_to_print:
print_file(file_path, printer_name)
- 调用
get_files()
函数获取符合条件的文件列表。 - 遍历文件列表,调用
print_file()
函数逐个打印文件。
程序主入口
if __name__ == "__main__":
input_dir = 'a'
printer_name = 'Microsoft Print to PDF'
file_extension = '.txt'
print_files(input_dir, printer_name, file_extension)
input_dir = 'a'
:指定输入文件夹路径。printer_name = 'Microsoft Print to PDF'
:指定打印机名称。file_extension = '.txt'
:只打印.txt
文件。