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_extensionNone 或者文件后缀匹配指定的扩展名,则将文件路径添加到 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 文件。
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐