Ghostscript mswinpr2 不自动选择打印机

Ghostscript mswinpr2 does not autoselect the printer

我已经通过 windows 打印机驱动程序为 运行 我的 PS 文件创建了一个小脚本用于打印输出。

我使用这个代码:

echo mark /NoCancel true /BitsPerPixel 4 /OutputFile (%printer%%PNAME%) /UserSettings ^<^</DocumentName (%MYDOCNAME%) ^>^> (mswinpr2) finddevice putdeviceprops setdevice>setup.ps

gswin32c -dNOPAUSE -dBATCH -r84 setup.ps %1

脚本正在按照 mswinpr2 驱动程序的 gs 文档的建议创建一个 setup.ps 文件。

看起来像这样:

   mark
   /NoCancel true
   /BitsPerPixel 4
   /OutputFile (Windows printer name)  
   /UserSettings 
   <<
      /DocumentName (the text for the job in the spooler queue)
   >>
   (mswinpr2)
   finddevice
   putdeviceprops
   setdevice

%printer% 在我的机器上解析为空字符串。 %PNAME% 是 windows 打印机的名称,"C364PS" 对我来说。

%printer%%PNAME%取自文档,给出了想要的目标打印机。为了继续使用示例打印机,它将解析为 C364PS

gs 然后被称为

gswin32c -dNOPAUSE -dBATCH -r84 setup.ps <name of desired ps file here>

关于打印结果,这按预期工作。但是我想要一个无声的打印输出,因为我之前已经选择了打印机。无论我为 %PNAME% 选择什么,它都会弹出 "select printer" 对话框。

我是 运行ning Windows 8.1,试过 gs 8.70 和 9.19。

如果我将 /QueryUser 3 添加到 setup.ps,打印输出将在没有进一步确认打印机的情况下开始,但它只会在默认打印机上打印,而不是在 /OutputFile.

我错过了什么?

更新:我已经检查了这个问题的结果,但它对我不起作用,对话框不断弹出:https://superuser.com/questions/807027/how-to-print-with-ghostscript-in-silent-mode

更新 2:我现在(根据要求)尝试了命令行,结果相同。我也试过没有 %printer%,这里没有区别:

gswin32c -dNOPAUSE -dBATCH -dNOPROMPT -dNOQUERY -sOutputFile="%printer%C364SeriesPCL" -r84 setup.ps 151008172940@123@000001@000001@PR_CCCC_Vertragspruef_4@CCCC_CAAA.358636.ps

setup.ps是这样的,没有加换行:

mark /NoCancel true /BitsPerPixel 4 /OutputFile (C364SeriesPCL) /UserSettings <</DocumentName (151008172940@123@000001@000001@PR_CCCC_Vertragspruef_4@CCCC_CAAA.358636) >> (mswinpr2) finddevice putdeviceprops setdevice

解决方案:

字符串%printer%实际上是setup.ps/OutputFile ()或命令行中的文字。所以改变 setup.ps 有效:

mark /NoCancel true 
/BitsPerPixel 4 
/OutputFile (%printer%C364SeriesPCL) 
/UserSettings <<
    /DocumentName (151008172940TBS000001000001PR_CONT_Vertragspruef_4CONT_CONT.358636) 
>> 
(mswinpr2) 
finddevice 
putdeviceprops 
setdevice

这样,打印机就找到了。我尝试使用命令行开关 -sOutputFile 复制行为,但没有 setup.ps 无法使对话框消失 - 我尝试了 %%printer%%,但无济于事。因为我对 setup.ps 没意见,所以我不会进一步关注它。

我的问题的根源在于,ghostscript 文档是正确的,然而,这里很容易被误解。特别是在 windows 的上下文中,明确说明 %printer% 实际上不是环境变量,而是一个字符串文字,必须出现在输出文件名中。

-sOutputFile="%printer%printer_name" Specifies which printer should be used. The printer_name should be typed exactly as it appears in the Printers control panel, including spaces.

真正回答我最初的问题。必须更改命令行脚本,以转义 %printer% 文字中的 % 符号:

echo mark /NoCancel true /BitsPerPixel 4 /OutputFile (%%printer%%%PNAME%) /UserSettings ^<^</DocumentName (%MYDOCNAME%) ^>^> (mswinpr2) finddevice putdeviceprops setdevice>setup.ps

gswin32c -dNOPAUSE -dBATCH -dNOPROMPT -r84 setup.ps %1

这按最初计划进行。

由于评论空间不足,我已将此移至答案。

所以,我通常希望看到的(简单的)命令行是:

gswin32c -dNOPAUSE -dBATCH -dNOPROMPT -dNOQUERY -sOutputFile="%printer%C364SeriesPCL"  151008172940@123@000001@000001@PR_CCCC_Vertragspruef_4@CCCC_CAAA.358636.ps

您的命令行包括 -r84,它通常会将分辨率设置为 84 dpi,如果这真的得到尊重,您将打印一张分辨率极低的 PostScript 图像,我非常怀疑您是否真的想要那。

除此之外,您还在实际的 PostScript 程序之前发送 setup.ps。问题是 setup.ps 会覆盖您在命令行上设置的值。所以你的 -sOutputFile="%printer%C364SeriesPCL" 被你定义 /OutputFile (C364SeriesPCL)

的 setup.ps 的内容覆盖

现在,正如我之前建议的那样,您的问题是打印机的正确语法是“%printer%printer name”,而您在 setup.ps 中缺少 %printer%。我想 %printer% 丢失的原因是因为您将它放在批处理文件中并且 %printer% 被视为环境变量。由于未设置,因此不会被替换。

因此,我建议您从使用您提供的命令行开始,但 NOT 包括 setup.ps 并查看其作用。如果可行,那么您就知道问题出在哪里了。为了在批处理文件中使用 %printer%,您需要 'escape' '%',这意味着您将需要(我认为)%%printer%%

既然您有 PostScript 打印机 (C364SeriesPS),为什么不直接发送原始 PostScript 文件呢?您在这里所做的是让 Ghostscript 将 PostScript 呈现为图像(实际上是 Windows 位图),然后将其传递给打印系统,打印系统会将位图发送到打印机。这很慢,并且涉及到大量数据的混洗,而您可以直接将 PostScript 发送到打印机。