You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows下使用Python指定打印机名称静默打印文件的方法

已知打印机名称实现TXT文件静默打印

针对需要静默打印TXT文件且指定打印机的需求,这里提供两种Windows平台下的可靠解决方案:

方法一:使用pywin32库(推荐,代码更简洁)

pywin32封装了Windows打印API,无需手动处理复杂的ctypes内存管理,开发效率更高。

  1. 先安装依赖:
    pip install pywin32

  2. 实现代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 20:20:55