Windows下使用Python指定打印机名称静默打印文件的方法
已知打印机名称实现TXT文件静默打印
针对需要静默打印TXT文件且指定打印机的需求,这里提供两种Windows平台下的可靠解决方案:
方法一:使用pywin32库(推荐,代码更简洁)
pywin32封装了Windows打印API,无需手动处理复杂的ctypes内存管理,开发效率更高。
先安装依赖:
pip install pywin32实现代码:
import win32print import win32api def print_text_silently(printer_name, txt_path): # 打开目标打印机 h_printer = win32print.OpenPrinter(printer_name) try: # 获取打印机默认数据类型 default_datatype = win32print.GetPrinter(h_printer, 2)["pDefaultDatatype"] # 初始化打印作业信息 job_info = { "pDocName": txt_path, "pDatatype": default_datatype } # 启动打印文档 h_job = win32print.StartDocPrinter(h_printer, 1, job_info) try: win32print.StartPagePrinter(h_printer) # 读取TXT内容并发送到打印机(编码需匹配打印机支持格式) with open(txt_path, "r", encoding="utf-8") as f: content = f.read() # 多数Windows打印机支持GBK编码,乱码时可切换为utf-8 win32api.WritePrinter(h_printer, content.encode("gbk")) win32print.EndPagePrinter(h_printer) finally: # 结束打印文档 win32print.EndDocPrinter(h_printer) finally: # 关闭打印机句柄 win32print.ClosePrinter(h_printer) # 使用示例 target_printer = "你的打印机名称" # 替换为你获取的默认打印机名称 target_file = "example.txt" print_text_silently(target_printer, target_file)
核心优势:代码简洁,API封装完善,无需手动处理Win32 API的细节错误。
方法二:纯ctypes实现(无额外依赖)
如果不想引入第三方库,可以基于现有ctypes代码扩展,直接调用Win32打印API:
import ctypes from ctypes import wintypes # 加载Windows系统库 winspool = ctypes.WinDLL("winspool.drv", use_last_error=True) kernel32 = ctypes.WinDLL("kernel32", use_last_error=True) # 定义Win32 API用到的类型 HANDLE = wintypes.HANDLE LPCWSTR = wintypes.LPCWSTR DWORD = wintypes.DWORD BOOL = wintypes.BOOL # 声明API函数原型 winspool.OpenPrinterW.argtypes = [LPCWSTR, ctypes.POINTER(HANDLE), wintypes.LPCVOID] winspool.OpenPrinterW.restype = BOOL winspool.StartDocPrinterW.argtypes = [HANDLE, DWORD, wintypes.LPCVOID] winspool.StartDocPrinterW.restype = BOOL winspool.StartPagePrinter.argtypes = [HANDLE] winspool.StartPagePrinter.restype = BOOL winspool.WritePrinter.argtypes = [HANDLE, wintypes.LPCVOID, DWORD, ctypes.POINTER(DWORD)] winspool.WritePrinter.restype = BOOL winspool.EndPagePrinter.argtypes = [HANDLE] winspool.EndPagePrinter.restype = BOOL winspool.EndDocPrinter.argtypes = [HANDLE] winspool.EndDocPrinter.restype = BOOL winspool.ClosePrinter.argtypes = [HANDLE] winspool.ClosePrinter.restype = BOOL # 定义打印文档信息结构 class DOC_INFO_1(ctypes.Structure): _fields_ = [ ("pDocName", LPCWSTR), ("pOutputFile", LPCWSTR), ("pDatatype", LPCWSTR) ] def print_text_silently(printer_name, txt_path): h_printer = HANDLE(0) # 打开打印机 if not winspool.OpenPrinterW(printer_name, ctypes.byref(h_printer), None): raise ctypes.WinError(ctypes.get_last_error()) try: # 设置打印作业参数 doc_info = DOC_INFO_1( pDocName=txt_path, pOutputFile=None, pDatatype="RAW" # RAW模式直接发送文本内容,避免格式转换 ) # 启动打印文档 if not winspool.StartDocPrinterW(h_printer, 1, ctypes.byref(doc_info)): raise ctypes.WinError(ctypes.get_last_error()) try: winspool.StartPagePrinter(h_printer) # 读取文件内容并发送 with open(txt_path, "r", encoding="gbk") as f: content_bytes = f.read().encode("gbk") bytes_written = DWORD(0) if not winspool.WritePrinter(h_printer, content_bytes, len(content_bytes), ctypes.byref(bytes_written)): raise ctypes.WinError(ctypes.get_last_error()) winspool.EndPagePrinter(h_printer) finally: winspool.EndDocPrinter(h_printer) finally: winspool.ClosePrinter(h_printer) # 使用示例 target_printer = "你的打印机名称" target_file = "example.txt" print_text_silently(target_printer, target_file)
核心优势:无需安装第三方库,与现有代码风格一致,适合对依赖有严格要求的场景。
注意事项
- 编码匹配:打印乱码时,优先调整文本编码(如切换为utf-8或打印机支持的其他编码)。
- 权限:确保程序拥有访问目标打印机的权限(普通用户权限通常即可)。
- 静默性:两种方法均不会弹出任何窗口,完全在后台执行打印操作。
内容的提问来源于stack exchange,提问作者DeKrypt
相关产品推荐
相关产品推荐

