从命令行打印图像并在 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对于那些)
创建示例图像,右击然后select 打印
- 从打开的打印对话框中,然后为您要使用的特定打印机设置所有您想要的默认选项,例如方向、页边距、纸张类型等。
进入打印机设置,在工具下编辑打印机状态监控
- 将监控频率编辑为“仅在打印作业期间”。默认情况下应该 禁用
- 在下一个选项卡中,将轮询频率修改为可用的最小值,在打印作业期间为 100 毫秒(您可以为 不打印时使用较低的频率选项
假设如下:
- 只有你的程序是运行这个脚本
- 对于给定的打印机,一次总是只有 1 个打印作业
- 打印机驱动程序不是猴子写的,它们实际上报告了当前正确的打印机状态
这个小 hack 将允许从命令打印图像并等待作业完成,并进行错误管理;并且仅使用 windows 个预装软件
可以通过保持 powershell 子进程处于活动状态并仅以 & "path\to\print.ps1" "C:\absolute\path\to\file.png"
格式向其传递脚本,等待标准输出报告 OK 或 KO 来进一步优化;但前提是需要大量印刷。
我需要编写一个解决方案来写入数据,然后批量打印 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对于那些)
创建示例图像,右击然后select 打印
- 从打开的打印对话框中,然后为您要使用的特定打印机设置所有您想要的默认选项,例如方向、页边距、纸张类型等。
进入打印机设置,在工具下编辑打印机状态监控
- 将监控频率编辑为“仅在打印作业期间”。默认情况下应该 禁用
- 在下一个选项卡中,将轮询频率修改为可用的最小值,在打印作业期间为 100 毫秒(您可以为 不打印时使用较低的频率选项
假设如下:
- 只有你的程序是运行这个脚本
- 对于给定的打印机,一次总是只有 1 个打印作业
- 打印机驱动程序不是猴子写的,它们实际上报告了当前正确的打印机状态
这个小 hack 将允许从命令打印图像并等待作业完成,并进行错误管理;并且仅使用 windows 个预装软件
可以通过保持 powershell 子进程处于活动状态并仅以 & "path\to\print.ps1" "C:\absolute\path\to\file.png"
格式向其传递脚本,等待标准输出报告 OK 或 KO 来进一步优化;但前提是需要大量印刷。