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

Python结合winspool.drv获取打印任务总页数问题求助

解决Python打印机通信中总页数统计的索引定位问题

我之前也折腾过Windows下Python监控打印任务的场景,结合你提到的CristiFati代码框架和Windows打印API的逻辑,给你梳理下怎么找到总页数对应的索引:

  • 先确认JOB_NOTIFY_FIELD_TOTAL_PAGES的数值定义
    在Windows的winspool.h头文件里,JOB_NOTIFY_FIELD_TOTAL_PAGES对应的常量值是18。你可以通过ctypes直接验证:

    import ctypes
    winspool = ctypes.WinDLL("winspool.drv")
    print(winspool.JOB_NOTIFY_FIELD_TOTAL_PAGES)  # 正常应该输出18
    
  • adwData数组的索引对应规则
    Windows打印API的JOB_NOTIFY_INFO_DATA结构体里,adwData数组的索引和JOB_NOTIFY_FIELD_*系列常量的数值是一一对应的。也就是说,JOB_NOTIFY_FIELD_TOTAL_PAGES的值是多少,它在adwData里的索引就是多少。所以你直接取self._NotifyData.adwData[18]就能拿到总页数。

  • 验证你的配置是否正确
    要确保你在DEFAULT_FIELDS里确实添加了JOB_NOTIFY_FIELD_TOTAL_PAGES,比如:

    DEFAULT_FIELDS = [
        # 其他已有的字段...
        winspool.JOB_NOTIFY_FIELD_TOTAL_PAGES,
    ]
    

    只有当这个字段被包含在监听列表里,系统才会把总页数数据填充到adwData对应的位置。

  • 调试排查小技巧
    如果还是拿不到正确值,建议在NotifyData方法里把整个adwData数组打印出来,对比实际打印任务的页数:

    def NotifyData(self, notify_data):
        self._NotifyData = notify_data
        # 打印前32个常用字段的数值
        print("All adwData values:", [self._NotifyData.adwData[i] for i in range(32)])
        # 尝试获取总页数
        total_pages = self._NotifyData.adwData[18]
        print(f"Total Pages: {total_pages}")
    

    提交一个已知页数的测试打印任务(比如3页的文档),看输出里哪个数值是3,那就是你要的索引。

  • 特殊情况处理
    注意:部分老打印机或者不支持双向通信的驱动,可能不会上报总页数,这时候adwData[18]可能返回0或者无效值。这种情况你需要做容错判断,比如当数值为0时提示“无法获取总页数”。

内容的提问来源于stack exchange,提问作者Abnesis Nesis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:54:22