Ghostscript - 如何在 Windows10 或 Windows Server 2012 上抑制打印对话框

Posted

技术标签:

【中文标题】Ghostscript - 如何在 Windows10 或 Windows Server 2012 上抑制打印对话框【英文标题】:Ghostscript - how to suppress print dialog on Windows10 or Windows Server 2012 【发布时间】:2019-10-25 17:58:31 【问题描述】:

我正在从 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\HIPAACert\189\H01519447A2191016103332.pdf"

【问题讨论】:

【参考方案1】:

mswinpr2 设备需要能够选择 Windows 打印机,是的。如果由于任何原因(例如,错误输入打印机名称是一个典型的原因)它不能,那么它将弹出打印机选择对话框。它必须否则它不知道将输出发送到哪里。我不得不猜测这是你的问题(与添加额外的开关无关)

您应该在命令行中使用 %printer%,您只需将批处理文件中的 % 加倍,因为批处理文件处理会尝试解释 %,因此您必须对其进行转义。因此,如果您在命令行中将 % 加倍,那么是的,它确实会弹出一个对话框,因为 %printer% 与 %%printer%% 不同,因此 Ghostscript 不会将其识别为打印机。

我建议您继续从命令行工作直到得到结果,所以不要加倍 %。

除此之外,很难评论。您是否在后台通道上得到任何东西(您也想在调试时删除 -q )?显然我不是坐在你的系统前面,所以我看不到打印机叫什么.....

FWIW 我在这里用“Adobe PDF”打印机试过,它可以工作,但使用“Microsoft XPS Document Writer”却不行,事实上,即使从对话框中选择它也会失败“无法打开初始设备”。

[编辑]

稍后进行一些调试.... 函数 DocumentProperties() 因 Microsoft XPS Document Writer 而失败。我怀疑这是因为 Windows 上的打印系统针对 Vista 及更高版本进行了重大改造,并且 Windows 10 取消了大部分遗留代码。我怀疑这个旧的 Win32 API 调用根本不适用于新设备。

如果您的打印机在您从打印对话框中选择时可以正常工作,那么这不是同一个问题。对我来说,即使从打印对话框中选择,这台打印机也会失败。似乎它与旧的 Win32 API 不兼容。

注意,这也会显示错误“Printer StartDoc failed (error 00000006)”。

所以我仍然怀疑您的打印机名称有问题。也许一个快速的测试是将名称设置为非常简单的名称,例如“Printer1”并尝试一下。

我想不出 ljet4 设备中的任何更改会导致问题,您不说错误是什么,甚至不说错误发生在打印机上或由 Ghostscript 报告的位置,所以真的在这方面我无能为力。

【讨论】:

我重新使用 ljet4 而不是 mswinpr2,并且我还将打印机上的双百分比替换为单百分比。这是有效的。我现在将尝试将这些知识重新整合到 C# 程序中。 Ghostscript 似乎还需要打印机的完整 UNC 名称。在我们的 Windows 2008 服务器上,我们在打印机名称前加上“\\spool\”(不使用 %printer% 变量 - 这是在我之前)。在 Server 2012R2 上,“\\spool\”前缀不起作用(gs 认为打印机名称是一个文件并且找不到它),但是当我给出打印机的完整 UNC 路径时(即前缀为“\ \servername\printername" 一切正常,文件打印成功。这个有很多挑剔的部分。 那是因为 \\spool 只对本地机器有效。这是一种 Windows 主义,根本不是真正的 Ghostscript。我可能会指出,Ghostscript 并非旨在用作打印服务器(它是 PostScript RIP),我确信有专为该任务设计的产品。【参考方案2】:

我最近遇到了同样的问题。我添加了一个 -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"

【讨论】:

以上是关于Ghostscript - 如何在 Windows10 或 Windows Server 2012 上抑制打印对话框的主要内容,如果未能解决你的问题,请参考以下文章

Ghostscript:如何在 Windows 上将 PDF 与通配符合并

让 Graphic Magick 检测 Ghostscript 以在 Windows 上阅读 pdf。如何将 WINDOWS CMD 上的 Ghostscript 调用名称更改为“gs”?

如何在ghostscript中调用字体目录

在 Windows 10 上导入 Ghostscript

在 Windows 8 上用 Python 导入 Ghostscript

java - 如何在文件路径中使用空格从java调用ghostscript