Ghostscript - 如何在 Windows10 或 Windows Server 2012 上抑制打印对话框
Ghostscript - how to suppress print dialog on Windows10 or Windows Server 2012
我正在从 Windows 10 或 Windows Server 2012 下的 windows 服务调用以下命令(执行命令的 C# 程序),但没有打印任何内容.我可以将发送的命令复制并粘贴到命令提示符中,但它会弹出一个打印对话框,我必须单击“确定”才能打印文件(确实如此)。我需要添加什么开关,这样对话框就不会出现,文件将在没有用户干预的情况下直接打印,因为它的目的是作为 windows 服务在无人值守的情况下工作?这是 ghostscript 9.50,这是今天最新的。在较早版本的 ghostscript 中,如果设备设置为 ljet4,则此方法有效,但这会导致 9.50 出现错误。此外,输出文件在输出文件上没有 %printer% 前缀,之前它的前缀是 \\spool\。我已经尝试了所有这些组合。是导致不需要的对话框的 mswinpr2 吗?我猜这就是阻止打印发生的原因。
gswin64c -dPrinted -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies#1 -sDEVICE#mswinpr2 -sOutputFile#"%%printer%%HP LaserJet Professional P1109w" "\2-DYQJKC2\c$\Webs\myfolder\Public\Reports\HIPAACert9\H01519447A2191016103332.pdf"
mswinpr2 设备需要能够 select Windows 打印机,是的。如果由于任何原因它不能(例如,打错打印机名称是一个典型的原因),那么它将弹出打印机 selection 对话框。它必须这样做,否则它不知道将输出发送到哪里。我猜这是你的问题(与添加额外开关无关)
您应该从命令行使用 %printer%,您只需要在批处理文件中将 % 加倍,因为批处理文件处理会尝试解释 %,因此您必须将其转义。因此,如果您在命令行中将 % 加倍,那么是的,它确实会弹出一个对话框,因为 %printer% 与 %%printer%% 不同,因此 Ghostscript 不会将其识别为打印机。
我建议您继续在命令行中工作,直到得到结果,所以不要加倍 %。
除此之外,很难评论。你在后台通道上得到了什么吗(你也想在调试时删除 -q )?显然我不是坐在你的系统前,所以我看不到打印机叫什么.....
FWIW 我在这里用 "Adobe PDF" 打印机试过,它可以工作,但使用 "Microsoft XPS Document Writer" 不行,事实上,甚至 select 从对话框中输入失败 "Unable to open the initial device".
[编辑]
稍后进行一些调试....
Microsoft XPS Document Writer 函数 DocumentProperties() 失败。我怀疑这是因为 Windows 上的打印系统针对 Vista 及更高版本进行了重大修改,并且 Windows 10 消除了许多遗留代码。我怀疑这个旧的 Win32 API 调用根本不适用于较新的设备。
如果您的打印机在您从打印对话框 select 时工作,但是,这不是同一个问题。对我来说,即使从打印对话框中输入select,这台打印机也会失败。似乎它只是与旧的 Win32 不兼容 API.
注意这也会显示错误 "Printer StartDoc failed (error 00000006)"。
所以我仍然怀疑您的打印机名称有问题。也许一个快速测试是将名称设置为非常简单的名称,例如“Printer1”,然后尝试一下。
我想不出 ljet4 设备中发生的任何变化会导致问题,您没有说明错误是什么,甚至没有说明错误发生在打印机上或由 Ghostscript 报告的位置,所以在这方面我真的无能为力。
我最近 运行 遇到了同样的问题。我添加了一个 -dQueryUser=3 参数。有关使用 -dQueryUser=N 的文档可在以下位置找到:
https://www.ghostscript.com/doc/9.25/Devices.htm#Win
在里面
10.2 支持的选项(设备属性)
部分。
在 Windows 10 的批处理文件中说明这一点的代码是:
SET MY_EXECUTABLE_PATH=C:\Program Files\gs\gs9.53.3\bin
for %%i in (*.pdf) do "%MY_EXECUTABLE_PATH%"\gswin64c.exe -sDEVICE=mswinpr2 -dBATCH -dNOPAUSE -dPDFFitPage -dQueryUser=3 -sOutputFile="%printer%Printer_Name" "%%i"
我正在从 Windows 10 或 Windows Server 2012 下的 windows 服务调用以下命令(执行命令的 C# 程序),但没有打印任何内容.我可以将发送的命令复制并粘贴到命令提示符中,但它会弹出一个打印对话框,我必须单击“确定”才能打印文件(确实如此)。我需要添加什么开关,这样对话框就不会出现,文件将在没有用户干预的情况下直接打印,因为它的目的是作为 windows 服务在无人值守的情况下工作?这是 ghostscript 9.50,这是今天最新的。在较早版本的 ghostscript 中,如果设备设置为 ljet4,则此方法有效,但这会导致 9.50 出现错误。此外,输出文件在输出文件上没有 %printer% 前缀,之前它的前缀是 \\spool\。我已经尝试了所有这些组合。是导致不需要的对话框的 mswinpr2 吗?我猜这就是阻止打印发生的原因。
gswin64c -dPrinted -dBATCH -dNOPAUSE -dNOSAFER -q -dNumCopies#1 -sDEVICE#mswinpr2 -sOutputFile#"%%printer%%HP LaserJet Professional P1109w" "\2-DYQJKC2\c$\Webs\myfolder\Public\Reports\HIPAACert9\H01519447A2191016103332.pdf"
mswinpr2 设备需要能够 select Windows 打印机,是的。如果由于任何原因它不能(例如,打错打印机名称是一个典型的原因),那么它将弹出打印机 selection 对话框。它必须这样做,否则它不知道将输出发送到哪里。我猜这是你的问题(与添加额外开关无关)
您应该从命令行使用 %printer%,您只需要在批处理文件中将 % 加倍,因为批处理文件处理会尝试解释 %,因此您必须将其转义。因此,如果您在命令行中将 % 加倍,那么是的,它确实会弹出一个对话框,因为 %printer% 与 %%printer%% 不同,因此 Ghostscript 不会将其识别为打印机。
我建议您继续在命令行中工作,直到得到结果,所以不要加倍 %。
除此之外,很难评论。你在后台通道上得到了什么吗(你也想在调试时删除 -q )?显然我不是坐在你的系统前,所以我看不到打印机叫什么.....
FWIW 我在这里用 "Adobe PDF" 打印机试过,它可以工作,但使用 "Microsoft XPS Document Writer" 不行,事实上,甚至 select 从对话框中输入失败 "Unable to open the initial device".
[编辑]
稍后进行一些调试.... Microsoft XPS Document Writer 函数 DocumentProperties() 失败。我怀疑这是因为 Windows 上的打印系统针对 Vista 及更高版本进行了重大修改,并且 Windows 10 消除了许多遗留代码。我怀疑这个旧的 Win32 API 调用根本不适用于较新的设备。
如果您的打印机在您从打印对话框 select 时工作,但是,这不是同一个问题。对我来说,即使从打印对话框中输入select,这台打印机也会失败。似乎它只是与旧的 Win32 不兼容 API.
注意这也会显示错误 "Printer StartDoc failed (error 00000006)"。
所以我仍然怀疑您的打印机名称有问题。也许一个快速测试是将名称设置为非常简单的名称,例如“Printer1”,然后尝试一下。
我想不出 ljet4 设备中发生的任何变化会导致问题,您没有说明错误是什么,甚至没有说明错误发生在打印机上或由 Ghostscript 报告的位置,所以在这方面我真的无能为力。
我最近 运行 遇到了同样的问题。我添加了一个 -dQueryUser=3 参数。有关使用 -dQueryUser=N 的文档可在以下位置找到: https://www.ghostscript.com/doc/9.25/Devices.htm#Win 在里面 10.2 支持的选项(设备属性) 部分。
在 Windows 10 的批处理文件中说明这一点的代码是:
SET MY_EXECUTABLE_PATH=C:\Program Files\gs\gs9.53.3\bin
for %%i in (*.pdf) do "%MY_EXECUTABLE_PATH%"\gswin64c.exe -sDEVICE=mswinpr2 -dBATCH -dNOPAUSE -dPDFFitPage -dQueryUser=3 -sOutputFile="%printer%Printer_Name" "%%i"