Ghostscript从PDF生成大型PostScript文件

时间:2018-12-26 04:38:05

标签: ghostscript postscript

我试图将不同的PDF文件(仅包含文本)转换为PS。之后,其中有些很小,有些很大。 例如:

169 kb PDF => 409 kb PS

82 kb PDF => 5749 kb PS

我尝试了以下ghostscript选项:

-dASCII85EncodePages=false
-r300
-dBATCH
-dPDFFitPage
-dFIXEDMEDIA
-dNOTRANSPARENCY
-dNOINTERPOLATE
-dDEVICEWIDTHPOINTS=595
-dDEVICEHEIGHTPOINTS=841
-dcupsBitsPerColor=8
-dcupsColorOrder=0
-dcupsColorSpace=1
-dcupsCompression=1
-scupsPageSizeName=A4
-sDEVICE=ps2write

原始PDF可能有问题,但是我完全无法理解。我可以将源文件发送到哪里?

1 个答案:

答案 0 :(得分:0)

这里的问题是由于ps2write设备的局限性以及文件创建方式的怪异。

两个PDF文件都使用CIDFonts,ps2write设备仅实现基本的2级PostScript输出,并且CIDFonts不包含在原始2级规范中(它们是在补充文件中添加的)。

这意味着ps2write设备当前无法输出PDF文件中定义的CIDFonts,它必须将它们转换为“其他”。它的作用是将字形形状渲染为位图,并构造3型位图字体,然后将其用于PostScript程序的主体中。当然,这不是理想的,因为位图字体的质量比字形形状的矢量描述差。由于您已将渲染固定为300 dpi,因此会降低字形位图的质量,但是对于在台式打印机上进行打印应该是可以接受的。

因此,鉴于两个文件都包含CIDFonts,为什么文件要大得多?这是文件创建方式的“怪癖”。文件test1.pdf在PDF文件中嵌入了它使用的字体,并且它们以子集的形式嵌入,即每种字体仅包含其使用的字形的形状描述。另一个文件使用Arial和Arial-Bold(IIRC),但未嵌入 CIDFont。

字体最多只能寻址255个字形,而CIDFonts具有或多或少的无限范围。当ps2write创建类型3字体来表示嵌入式CIDFonts时,它无法创建具有CIDFont具有完整可寻址范围的字体,因此,如果给定字体使用了超过255个字形,则它必须创建多个类型3字体。

因此,我们随即填充字体,直到达到255个字形,然后开始创建新字体。问题是,如果我们随后遇到一个较早使用的字形,并因此以先前的字体定义,则我们不能简单地切换字体(这是ps2write工作方式的限制)。因此,我们还必须在当前创建的字体中包含该字形。这意味着我们最终在输出中获得了位图的两个副本。一个是使用它的第一个字体,另一个是第二个字体。

这就是这里正在发生的事情。 Test1.pdf使用嵌入式子集,因此我们基本上不会溢出3型字体,并且输出PostScript程序包含约300个字形的位图。 Test2.pdf多次超出255个限制,因此输出的PostScript程序包含字形的〜2120位图。

您无能为力,除非您可以控制输入PDF文件的生成,所以问题就变成了“这对您来说是一个问题,如果是,为什么?”

[编辑]

我怀疑尺寸是否会对印刷时间有任何实际影响。 PostScript被流式传输到打印机,因此它一经发送就开始处理数据。

当然,首先将PDF转换为PostScript是一个耗时的步骤。假设您的打印机不能直接打印PDF,最明显的答案是使用-sOutputFile=out%d.ps语法将每一页打印到单独的PostScript文件中。

总体性能将降低,因为需要打开和关闭多个文件,序言将写入每个文件,并且页面之间不能重复使用资源,因此必须将共享资源写入每个文件文件。这意味着作为单独文件写入的所有页面的总大小将比作为一个较大文件写入的总页面大得多。

但是,这样做的好处是,在将第一页发送到打印机之前,您不必处理PDF文件中的所有页面。第1页完成后,文件out1.ps将关闭并准备发送到打印机,因此您可以在Ghostscript继续产生第2页以后开始发送第1页。