2

我的问题可能是错误的树,所以我将尝试对问题进行详尽的描述。

我们有一个 Windows 服务,它接受一个 XML 文件并生成一个 PDF。然后它根据 XML 文件中的数据,使用参数将生成的 PDF 输出到 Ghostscript -sOutputFile="%printer%",后跟我们的一台网络打印机的名称。

我们以前使用过-sDEVICE=mswinpr2,但是这会生成大小约为 70-80MB 的打印命令,当我们在本地网络上时,这并不是特别有用。现在我们有一个用于多个站点的中央打印服务器,考虑到这些荒谬的文件大小,这些 PDF 的打印时间已经成为天文数字。

这些文件是使用以下方法生成的:

  " -sDEVICE=mswinpr2 -sPAPERSIZE=a4" _
& " -dBATCH -dNOPAUSE -dSAFER -dNoCancel" _
& " -sOutputFile=""%printer%" & [somePrinter] & """"

我一直在玩弄 Ghostscript 的设置,并认为我已经使用以下 Ghostscript 命令找到了 PNG 的答案:

  " -sDEVICE=png16m -r600x600 -sPAPERSIZE=a4" _
& " -dBATCH -dNOPAUSE -dSAFER -dNoCancel -dQUIET" _
& " -sOutputFile=""%printer%" & [somePrinter] & """"

这适用于单页,单页文档仅生成大约 150kb 的数据,但在多页上,仅打印第一页。我通过输出到文件而不是打印机进行了一些测试,结果发现正在创建某种奇怪的多页 PNG,我认为打印机只是变得混乱。

实际问题:

我唯一真正的限制是我需要将 PDF 文件作为输入,然后直接输出到打印机,无需用户交互,而且文件大小很小。

有人可以向我推荐一个可以实现这一目标的 GhostScript 设置(或 GhostScript 的替代品)吗,因为我的想法已经不多了?

4

2 回答 2

2

mswinpr2 设备使用 Windows 打印系统来完成处理大量不同打印机的工作。它的工作原理是将传入的文件渲染为位图,将位图传送到打印机设备上下文,然后告诉设备上下文打印到打印机。显然,高分辨率全彩页面可以产生相当大的位图。A4 页面@600 dpi,CMYK 颜色大约为 130Mb (8.26*600 * 11.69*600 * 4)

因此,您最终总是将位图发送到打印机。当然这可能很大,通常打印机会理解一些可以使输出更小的打印语言,但这需要 Ghostscript“了解”打印机并产生正确的输出。mswinpr2 的美妙之处在于它利用操作系统来完成繁重的工作。缺点是它总是生成位图,但至少它可以打印到任何 Windows 支持的打印机。

似乎您很幸运拥有您的第一台打印机,因为它理解 PNG,但大多数打印机不理解 PNG,正如您所发现的,并且会将传入数据视为本机打印机数据。这样做的效果可能是任何东西,但它不太可能产生任何有用的打印输出。

如果您知道给定的打印机支持 PCL 或 PostScript,那么您可以使用适当的 Ghostscript 设备将您的 PDF 文件转换为其中一种语言(PCL 文件可能仍然很大)。

请注意,包含透明度的 PDF 文件仍必须至少部分转换为位图,因为没有其他打印语言支持 PDF 的透明度概念。

我看到你自己发现了这一点。我建议您使用 ps2write 而不是 pswrite,它会产生运行速度更快的更小输出。pswrite 设备也已弃用且不再受支持。

您可能还应该设置适合您的打印机的分辨率。ps2write 有时会将页面区域渲染为位图(例如,用于 PDF 透明度),并使用分辨率参数来决定要创建的图像分辨率。默认值为 720 dpi,几乎可以在任何设备上打印。然而,它对于大多数设备来说太大了,并且在某些情况下会再次产生大的位图(开罗制作的 PDF 文件特别容易出现这个问题,因为它们声明每个页面的整个部分都是透明的)

于 2012-05-18T07:40:34.587 回答
1

我最终的解决方案是使用-sDEVICE=pswrite而不是-sDEVICE=png16m -r600x600.

PostScript中的此输出,我们所有的打印机都能够解释。

因此,遗憾的是,这不是一个答案,但仍然是一个解决方案。

于 2012-05-18T07:27:19.377 回答