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

Windows下Python无弹窗打印JPG文件的问题求助

无弹窗打印Windows标签的Python方案问题

背景

我就职于一家汽车制造企业,正在开发一套零件信息追踪系统,工位电脑上的软件负责录入操作人员输入的零件信息,生成JPG格式的内部追踪标签(这部分用QRCode和PIL模块实现,功能正常)。现在卡在打印环节——需要无弹窗自动打印,避免操作人员手动操作带来的失误和标签格式问题。

核心诉求

求一种Python在Windows下无弹窗发送打印指令的可靠方法,同时解决当前win32print方案的错误问题。

系统环境

  • Windows系统
  • Python 3.12.6

尝试过的方案

方案一:os.startfile()

用startfile(file_path, "print")触发打印,但会弹出系统打印对话框,不符合无交互需求:

from os import path, getcwd, startfile
...
# 尝试以打印模式打开label.jpg
try:
    startfile(file_path, "print")
except FileNotFoundError:
    ...

方案二:win32print库(当前卡住的方案)

尝试用win32print实现无弹窗打印,但触发"句柄无效"错误:

from PIL import Image, ImageDraw, ImageFont, ImageWin
from os import path, getcwd, startfile
import win32print
...
def print_label(filepath: str | bytes) -> None:
    """打开指定路径的文件并打印"""
    try:
        label = Image.open(filepath)
        printer_name = win32print.GetDefaultPrinter()
        printer = win32print.OpenPrinter(printer_name)
        # 初始化文档打印任务
        doc_printer = win32print.StartDocPrinter(printer, 1, (filepath, None, "RAW"))
        win32print.StartPagePrinter(doc_printer)  # 错误触发点
        
        # 调整图片方向
        label = label.rotate(90, expand=True)
        width, height = label.size
        bitmap = ImageWin.Dib(label)
        bitmap.draw(doc_printer, (0, 0, width, height))
        
        # 结束打印任务
        win32print.EndPagePrinter(doc_printer)
        win32print.EndDocPrinter(doc_printer)
        win32print.ClosePrinter(printer)
    except OSError as ex:
        if ex.winerror == 1155:
            # 无打印应用关联的提示逻辑
            ...
        else:
            # 其他错误提示逻辑
            ...

错误输出

Default Printer: \\[servername]\[printername]
Printer Object: <PyPrinterHANDLE:2151737373152>
Initialized Printer: 199
Traceback (most recent call last):
  File "\...\wip_label_generator.py", line 290, in generate_labels
    print_label(label)
  File "\...\wip_label_generator.py", line 36, in print_label
    win32print.StartPagePrinter(doc_printer)
pywintypes.error: (6, 'StartPagePrinter', 'The handle is invalid.')

问题总结

  1. 上述StartPagePrinter报"句柄无效"的原因是什么?怀疑是StartDocPrinter的初始化方式有误。
  2. 有没有更优的无弹窗打印方案?比如用subprocess.run()实现的可能?

内容的提问来源于stack exchange,提问作者Mason Ritchason

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 10:08:11