我的问题可能问错了,所以我会尝试对问题进行彻底的描述。
我们有一个 Windows 服务,它接受 XML 文件并生成 PDF。然后,它根据 XML 文件中的数据,使用
-sOutputFile="%printer%"
参数将生成的 PDF 输出到 Ghostscript,后跟我们的网络打印机之一的名称。
我们之前使用过
-sDEVICE=mswinpr2
,但这会生成大约 70-80MB 大小的打印命令,当我们在本地网络上时,这并不是特别有用。现在我们有一个用于多个站点的中央打印服务器,考虑到这些荒谬的文件大小,这些 PDF 的打印时间已成为天文数字。
这些文件是使用以下方式生成的:
" -sDEVICE=mswinpr2 -sPAPERSIZE=a4" _
& " -dBATCH -dNOPAUSE -dSAFER -dNoCancel" _
& " -sOutputFile=""%printer%" & [somePrinter] & """"
我一直在尝试 Ghostscript 的设置,并认为我已经找到了 PNG 的答案,使用以下 Ghostscript 命令:
" -sDEVICE=png16m -r600x600 -sPAPERSIZE=a4" _
& " -dBATCH -dNOPAUSE -dSAFER -dNoCancel -dQUIET" _
& " -sOutputFile=""%printer%" & [somePrinter] & """"
这对于单页效果很好,对于单页文档仅生成大约 150kb 的数据,但在多页上,仅打印第一页。我通过输出到文件而不是打印机进行了一些测试,结果发现正在创建某种奇怪的多页 PNG,我认为打印机只是感到困惑。
实际问题:
我唯一的真正的限制是我需要将 PDF 文件作为输入,然后直接输出到打印机,无需用户交互,并且文件大小很小。
有人可以向我推荐一个 GhostScript 设置(或 GhostScript 的替代方案)来实现这一目标,因为我已经没有想法了?
mswinpr2 设备使用 Windows 打印系统来完成处理多种不同打印机的工作。它的工作原理是将传入文件渲染为位图,将位图传输到打印机设备上下文,然后告诉设备上下文打印到打印机。显然,高分辨率全彩页面可以生成相当大的位图。 A4 页面 @600 dpi,CMYK 颜色约为 130Mb (8.26600 * 11.69600 * 4)
因此您最终总是将位图发送到打印机。当然,这可能很大,通常打印机会理解一些打印语言,这些语言可以使输出更小,但这需要 Ghostscript “了解”打印机并产生正确的输出。 mswinpr2 的优点在于它利用操作系统来完成繁重的工作。缺点是它总是生成位图,但至少它可以打印到 Windows 支持的任何打印机。
看来您很幸运拥有第一台打印机,因为它可以理解 PNG;正如您所发现的,大多数打印机不会这样做,并且会将传入的数据视为本机打印机数据。其效果可能是任何东西,但不太可能产生任何有用的打印输出。
如果您知道给定的打印机支持 PCL 或 PostScript,那么您可以使用适当的 Ghostscript 设备将 PDF 文件转换为其中一种语言(PCL 文件可能仍然很大)。
请注意,包含透明度的 PDF 文件仍需要转换(至少部分转换为位图),因为没有其他打印语言支持 PDF 的透明度概念。
我发现你自己已经发现了这一点。我建议您使用 ps2write 而不是 pswrite,它会产生更小的输出,运行速度更快。此外,pswrite 设备已被弃用,不再受支持。
您可能还应该设置适合您的打印机的分辨率。 ps2write 有时必须将页面区域渲染为位图(例如,为了 PDF 透明度)并使用分辨率参数来决定要创建的图像分辨率。默认值为 720 dpi,几乎可以在任何设备上打印良好。然而,它对于大多数设备来说太大了,并且在某些情况下会再次生成大位图(开罗生成的 PDF 文件特别容易出现此问题,因为它们声明每个页面的整个部分都是透明的)。
我最终的解决方案是使用
-sDEVICE=pswrite
而不是 -sDEVICE=png16m -r600x600
。
此输出为 PostScript,我们所有的打印机都能够解释。
所以,遗憾的是,这不是答案,但仍然是一个解决方案。