-sDEVICE是图像格式时,将多个页面打印到%打印机%?

时间:2012-05-17 12:44:48

标签: .net pdf printing ghostscript

我可能会用我的问题咆哮错误的树,所以我会尝试对问题进行彻底的描述。

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

我们以前使用过-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的替代品)来实现这一目标,因为我的想法已经用完了吗?

2 个答案:

答案 0 :(得分:2)

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

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

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

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

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

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

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

答案 1 :(得分:1)

我的最终解决方案是使用-sDEVICE=pswrite代替-sDEVICE=png16m -r600x600

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

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