Ghostscript 从 PDF 生成大型 PostScript 文件
Ghostscript generate large PostScript file from PDF
我尝试将不同的 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有问题,具体是什么我看不懂。我可以将源文件发送到哪里?
这里的问题是由于 ps2write 设备的限制,以及文件创建方式的怪癖。
两个 PDF 文件都使用 CIDFonts,ps2write 设备仅实现基本的 2 级 PostScript 输出,并且 CIDFonts 未包含在原始 2 级规范中(它们是在补充中添加的)。
这意味着 ps2write 设备当前无法输出 PDF 文件中定义的 CIDFonts,它必须将它们转换为 'something else'。它所做的是将字形渲染为位图,并构造类型 3 位图字体,然后在 PostScript 程序的主体中使用。当然,这并不理想,因为位图字体的质量比字形的矢量描述差。由于您已将渲染固定为 300 dpi,这会降低字形位图的质量,但它们对于在桌面打印机上打印应该是可以接受的。
那么,鉴于 两个 文件都包含 CIDFonts,为什么一个更大?这是文件创建方式的'quirk'。文件 test1.pdf 将其使用的字体嵌入到 PDF 文件中,并且它们作为子集嵌入,即每种字体仅包含其使用的字形的形状描述。另一个文件使用 Arial 和 Arial-Bold (IIRC) 但不嵌入 either CIDFont.
字体最多只能处理 255 个字形,而 CIDFonts 的范围或多或少是无限的。当 ps2write 创建 type 3 字体来表示嵌入的 CIDFonts 时,它无法创建具有 CIDFont 的完整可寻址范围的字体,因此如果从给定字体中使用超过 255 个字形,它必须创建多个 type 3字体。
所以我们边走边填充字体,直到我们达到 255 个字形,然后我们开始一个新字体。问题是如果我们随后遇到一个之前使用过的字形,因此在以前的字体中定义,我们不能简单地切换字体(这是 ps2write 工作方式的限制)。所以我们也必须在我们当前创建的字体中包含该字形。这意味着我们最终在输出中得到了位图的两个副本;一个用于使用它的第一种字体,一个用于第二种字体。
这正是这里发生的事情。 Test1.pdf 使用嵌入式子集,因此我们基本上不会溢出 type 3 字体,并且输出的 PostScript 程序包含约 300 个字形位图。 Test2.pdf 多次超出 255 的限制,因此输出的 PostScript 程序包含约 2120 个字形位图。
你对此无能为力,除非你能控制输入 PDF 文件的生成,所以问题就变成了 'is this a problem for you, and if so, why ?'
[编辑]
嗯,我怀疑尺寸对 打印 时间有任何实际影响。 PostScript 被流式传输到打印机,因此它会在数据发送后立即开始处理数据。
当然首先将PDF 转换为PostScript 是一个耗时的步骤。假设您的打印机无法直接打印 PDF,最明显的答案是使用 -sOutputFile=out%d.ps
语法将每一页打印到单独的 PostScript 文件。
整体性能会降低,因为需要打开和关闭多个文件,prolog会写到每个文件,页面之间无法复用资源,所以共享资源要写到每个文件。这意味着作为单独文件写入的所有页面的总大小将远远大于作为一个大文件写入的总大小。
但是优点是您不必在将第一页发送到打印机之前处理 PDF 文件中的所有页面。第 1 页完成后,文件 out1.ps 将关闭并准备发送到打印机,因此您可以开始发送第 1 页,同时 Ghostscript 继续生成第 2 页之后的内容。
我尝试将不同的 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有问题,具体是什么我看不懂。我可以将源文件发送到哪里?
这里的问题是由于 ps2write 设备的限制,以及文件创建方式的怪癖。
两个 PDF 文件都使用 CIDFonts,ps2write 设备仅实现基本的 2 级 PostScript 输出,并且 CIDFonts 未包含在原始 2 级规范中(它们是在补充中添加的)。
这意味着 ps2write 设备当前无法输出 PDF 文件中定义的 CIDFonts,它必须将它们转换为 'something else'。它所做的是将字形渲染为位图,并构造类型 3 位图字体,然后在 PostScript 程序的主体中使用。当然,这并不理想,因为位图字体的质量比字形的矢量描述差。由于您已将渲染固定为 300 dpi,这会降低字形位图的质量,但它们对于在桌面打印机上打印应该是可以接受的。
那么,鉴于 两个 文件都包含 CIDFonts,为什么一个更大?这是文件创建方式的'quirk'。文件 test1.pdf 将其使用的字体嵌入到 PDF 文件中,并且它们作为子集嵌入,即每种字体仅包含其使用的字形的形状描述。另一个文件使用 Arial 和 Arial-Bold (IIRC) 但不嵌入 either CIDFont.
字体最多只能处理 255 个字形,而 CIDFonts 的范围或多或少是无限的。当 ps2write 创建 type 3 字体来表示嵌入的 CIDFonts 时,它无法创建具有 CIDFont 的完整可寻址范围的字体,因此如果从给定字体中使用超过 255 个字形,它必须创建多个 type 3字体。
所以我们边走边填充字体,直到我们达到 255 个字形,然后我们开始一个新字体。问题是如果我们随后遇到一个之前使用过的字形,因此在以前的字体中定义,我们不能简单地切换字体(这是 ps2write 工作方式的限制)。所以我们也必须在我们当前创建的字体中包含该字形。这意味着我们最终在输出中得到了位图的两个副本;一个用于使用它的第一种字体,一个用于第二种字体。
这正是这里发生的事情。 Test1.pdf 使用嵌入式子集,因此我们基本上不会溢出 type 3 字体,并且输出的 PostScript 程序包含约 300 个字形位图。 Test2.pdf 多次超出 255 的限制,因此输出的 PostScript 程序包含约 2120 个字形位图。
你对此无能为力,除非你能控制输入 PDF 文件的生成,所以问题就变成了 'is this a problem for you, and if so, why ?'
[编辑]
嗯,我怀疑尺寸对 打印 时间有任何实际影响。 PostScript 被流式传输到打印机,因此它会在数据发送后立即开始处理数据。
当然首先将PDF 转换为PostScript 是一个耗时的步骤。假设您的打印机无法直接打印 PDF,最明显的答案是使用 -sOutputFile=out%d.ps
语法将每一页打印到单独的 PostScript 文件。
整体性能会降低,因为需要打开和关闭多个文件,prolog会写到每个文件,页面之间无法复用资源,所以共享资源要写到每个文件。这意味着作为单独文件写入的所有页面的总大小将远远大于作为一个大文件写入的总大小。
但是优点是您不必在将第一页发送到打印机之前处理 PDF 文件中的所有页面。第 1 页完成后,文件 out1.ps 将关闭并准备发送到打印机,因此您可以开始发送第 1 页,同时 Ghostscript 继续生成第 2 页之后的内容。