从命令行打印图像并在 Windows 等待打印作业完成

print an image from command line and await print job completion on Windows

我需要编写一个解决方案来写入数据,然后批量打印 RFID 标签,每个标签都从模板 python 脚本和从数据库或 [=24= 中获取的数据生成为 .png 图像] 文件。

要打印程序,只需调用相关系统实用程序(unix 系统上的 CUPS),使用 subprocess.check_call(print_cmd) 传递图像文件(保存在 ram-mounted 文件系统上以减少磁盘使用)

现在,它还需要 运行 在 Windows 系统上,但实际上并没有一个像样的系统实用程序,类似问题下的解决方案 command line tool for print picture? 也没有考虑到打印作业的完成情况,或者如果作业导致错误,则页边距都被拧紧并且图像出于某种原因总是旋转 90 度。

如何使用 Windows 中的命令或脚本理智地打印图像并等待它成功完成或 return 如果作业出现错误则出现错误? 可能没有依赖关系

如果可以安装依赖,有很多程序可以提供解决方案out-of-the-box。


我能找到解决此问题且没有依赖关系的唯一明智的方法是创建一个 powershell 脚本来解决这个问题

[CmdletBinding()]
param (
    [string]    $file = $(throw "parameter is mandatory"),
    [string]    $printer = "EXACT PRINTER NAME HERE"
)

$ERR = "UserIntervention|Error|Jammed"

$status = (Get-Printer -Name $printer).PrinterStatus.ToString()
if ($status -match $ERR){ exit 1 }

# 
# only sends the print job to the printer
rundll32 C:\Windows\System32\shimgvw.dll,ImageView_PrintTo $file $printer

# wait until printer is in printing status
do {
    $status = (Get-Printer -Name $printer).PrinterStatus.ToString()
    if ($status -match $ERR){ exit 1 }
    Start-Sleep -Milliseconds 100
} until ( $status -eq "Printing" )

# wait until printing is done
do {
    $status = (Get-Printer -Name $printer).PrinterStatus.ToString()
    if ($status -match $ERR){ exit 1 }
    Start-Sleep -Milliseconds 100
} until ( $status -eq "Normal" )

然后我需要将打印子进程调用稍微修改为

powershell -File "path\to\print.ps1" "C:\absolute\path\to\file.png"

然后是几个必要的设置步骤:

(免责声明,我不使用英语的 windows 所以我不知道英语的 thigs 应该怎么称呼。我将使用 cursive对于那些)

  1. 创建示例图像,右击然后select 打印

    • 从打开的打印对话框中,然后为您要使用的特定打印机设置所有您想要的默认选项,例如方向、页边距、纸张类型等。
  2. 进入打印机设置,在工具下编辑打印机状态监控

    • 监控频率编辑为“仅在打印作业期间”。默认情况下应该 禁用
    • 在下一个选项卡中,将轮询频率修改为可用的最小值,在打印作业期间为 100 毫秒(您可以为 不打印时使用较低的频率选项

假设如下:

  • 只有你的程序是运行这个脚本
  • 对于给定的打印机,一次总是只有 1 个打印作业
  • 打印机驱动程序不是猴子写的,它们实际上报告了当前正确的打印机状态

这个小 hack 将允许从命令打印图像并等待作业完成,并进行错误管理;并且仅使用 windows 个预装软件

可以通过保持 powershell 子进程处于活动状态并仅以 & "path\to\print.ps1" "C:\absolute\path\to\file.png" 格式向其传递脚本,等待标准输出报告 OK 或 KO 来进一步优化;但前提是需要大量印刷。