【问题标题】:Ghostscript mswinpr2 does not autoselect the printerGhostscript mswinpr2 不会自动选择打印机
【发布时间】:2016-04-14 16:28:37
【问题描述】:

我创建了一个小脚本,通过 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% 选择什么,它都会弹出“选择打印机”对话框。

我正在运行 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" 指定应使用的打印机。打印机名称应与打印机控制面板中显示的完全相同,包括 空格。

真正回答我最初的问题。必须更改命令行脚本,以转义 %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

这按最初的计划工作。

【问题讨论】:

  • 首先,不要引用你的脚本,而是尝试一个命令行,然后你可以给出一个示例命令行来演示你的问题,而不是让我们破译你的脚本并想知道哪些 % 是变量的值你懒得提了。我强烈怀疑它在批处理文件中处理 % (即 %printer% 是否正在扩展)。但是,据我所知,有 NO 选项用于静默打印,除非您要打印到默认打印机。
  • 如你所愿,我会为你展开 setup.ps。
  • 批处理命令正确解析所有变量。我可以在 setup.ps 中看到预期的结果。打印作业名称正确显示在队列中,但未自动选择打印机。
  • 我确定您可以看到最终结果,但是(直到您上传 setup.ps),我看不到。但是....您已将与 /OutputDevice 键关联的值替换为 (WIndows 打印机名称),这实际上什么也没告诉我。 PLEASE 引用一个确切的命令行,而不是您修改过的内容。我再次敦促您在测试时使用命令行,而不是脚本。 mswinpr2 出现对话框的最可能原因是它无法找到打印机。如果您输入错误的打印机名称(即您隐藏的位),或者您没有具有该名称的本地打印机,则会发生这种情况。
  • 我明白,但是如果没有我系统上可用打印机的完整列表,您无法判断我输入的文本是真正的名称还是只是胡言乱语。我现在已经按照您的要求添加了确切的命令行,为了让您能够真正分析这一点,我在系统上添加了一个打印机列表。我真的很困惑我做错了什么,任务似乎很简单。

标签: windows printing ghostscript


【解决方案1】:

我已将此移至答案,因为 cmets 中空间不足。

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

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% 被视为环境变量。由于它没有设置,所以它被什么都替换了。

所以,我建议您首先使用您提供的命令行,但包括 setup.ps 并查看它的作用。如果这有效,那么您就知道问题所在了。为了在批处理文件中使用 %printer%,您需要“转义”“%”,这意味着您将需要(我认为)%%printer%%

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

【讨论】:

  • KenS:谢谢你的洞察力,我其实知道我在做什么,而且我是故意这样做的,因为我在交付给客户时需要在奇怪的打印机上打印。如果客户的打印机不工作或者客户实际上没有 PS 打印机,则使用 winprint.cmd 只是我的选择。我们经常遇到后记问题,您无法解决:在我的打印机上工作,但在客户的打印机上不行,第一页打印良好,第二页打印 PS 错误页 - 但相同类型的 10 页表单,但使用其他数据(兄弟 HL30xx)。只是最新的例子。
  • 鉴于您的评论:-sOutputFile="%printer%C364SeriesPCL" 实际上是 -sOutputFile="C364SeriesPCL",当它将被移交给 gswin32c 时,因为 %printer% 在命令行上也被替换了。所以, setup.ps 和我给你的命令行实际上没有区别。命令行应该是 -sOutputFile="%%printer%%C364SeriesPCL" 但这对我也不起作用(我在 setup.ps 中取消了 OutputFile 的注释)。但是在设置中使用它对我来说更好。
  • 对该决议的另一条评论:我从一位同事那里收到了该参数。我发现,分辨率实际上似乎对输出没有影响,至少在柯尼卡驱动程序上没有。我将它设置为 300、600 - 所有文件在后台处理程序中的大小相同,并且没有显着差异。
  • 哦,感谢您抽出宝贵时间。当我终于得到它时,那个 %printer% 是一个字面量,我居然把头撞在了桌子上……
  • :-) 我对 -r 没有任何区别并不感到惊讶,因为我认为 mswinpr2 设备从设备属性中获得了要渲染的分辨率,但是我不确定要这么说(仍然不确定,也不想通读代码)。 FWIW 我们经常遇到问题,因为我们的 ps2write 设备从(例如)PDF 或 PCL 输入创建 PostScript 输出的廉价打印机(你好兄弟)上的语言实现不佳。在某些情况下,我们甚至设法让制造商实施修复.....
猜你喜欢
  • 2018-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-08
相关资源
最近更新 更多