Printing 重影脚本-如何在Windows 10或Windows Server 2012上抑制打印对话框

Printing 重影脚本-如何在Windows 10或Windows Server 2012上抑制打印对话框,printing,ghostscript,Printing,Ghostscript,我正在从windows 10或windows Server 2012 C程序下的windows服务调用以下命令,该程序将执行命令,但没有打印任何内容。我可以将发送的命令复制并粘贴到命令提示符中,但它会弹出一个打印对话框,我必须单击“确定”才能打印文件。我需要添加什么开关,这样对话框就不会出现,文件将在没有用户干预的情况下直接打印,因为这样做的目的是作为windows服务在无人参与的情况下工作?这是GhostScript9.50,它是今天最新的。在ghostscript的早期版本中,如果设备设置为

我正在从windows 10或windows Server 2012 C程序下的windows服务调用以下命令,该程序将执行命令,但没有打印任何内容。我可以将发送的命令复制并粘贴到命令提示符中,但它会弹出一个打印对话框,我必须单击“确定”才能打印文件。我需要添加什么开关,这样对话框就不会出现,文件将在没有用户干预的情况下直接打印,因为这样做的目的是作为windows服务在无人参与的情况下工作?这是GhostScript9.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"

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

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

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

除此之外,很难评论。在调试时,您是否在后台通道中得到了想要删除-q的内容?很明显我不是坐在你的系统前面,所以我看不到打印机叫什么

FWIW我在这里用AdobePDF打印机试过,它可以工作,但使用MicrosoftXPS Document Writer不行,事实上,即使从对话框中选择它也无法打开初始设备

[编辑]

稍后进行一点调试。。。。 Microsoft XPS Document Writer的DocumentProperties函数失败。我怀疑这是因为Windows上的打印系统对Vista及以上版本进行了重大改造,而Windows 10删除了许多遗留代码。我怀疑这个旧的Win32 API调用根本不适用于较新的设备

但是,如果从“打印”对话框中选择打印机时打印机仍能工作,则这不是同一个问题。对我来说,即使从“打印”对话框中选择,此打印机也会失败。它似乎与旧的Win32 API不兼容

注意:这还显示错误打印机StartDoc failed error 0000000 6

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


我想不出ljet4设备中发生了什么变化,会导致问题,你不会;我不知道错误是什么,甚至不知道它发生在打印机上或Ghostscript报告的什么地方,所以在这方面我真的没有什么可以提供的。

我最近遇到了同样的问题。我添加了一个-dQueryUser=3参数。有关-dQueryUser=N的使用说明文件,请访问: 在 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"

我继续使用ljet4而不是mswinpr2,并且我还将打印机上的双百分比替换为单百分比。这是有效的。现在,我将尝试将这些知识重新整合到C程序中。另外,Ghostscript似乎还需要打印机的完整UNC名称。在Windows 2008服务器上,我们在打印机名称前加上\\spool\n前缀,而不是使用%printer%变量-这是在我工作之前。在服务器2012R2上,\\spool\前缀不起作用,gs认为打印机名称是一个文件,无法找到它,但当我给出打印机ie的完整UNC路径时,\\servername\printername前缀一切都起作用,文件打印成功。这是因为\\spool只对本地机器有效。这是一个Windows ism,根本不是真正的鬼脚本。我可能会指出,Ghostscript并不是一个打印服务器,而是一个PostScript RIP,我确信有一些产品是为这项任务设计的。