【问题标题】:Ghostscript generate large PostScript file from PDFGhostscript 从 PDF 生成大型 PostScript 文件
【发布时间】:2019-05-24 10:41:35
【问题描述】:

我尝试将不同的 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 的问题,但我无法理解究竟是什么。我可以将源文件发送到哪里?

【问题讨论】:

  • 将文件放在方便的站点上(例如DropBox)并将链接放在这里。请注意,您在命令行中放置的各种 cups 开关对 ps2write 设备没有影响,它们影响 CUPS 设备。
  • 这需要我一两天的时间。
  • 没问题,我等着,谢谢

标签: ghostscript postscript


【解决方案1】:

这里的问题是由于 ps2write 设备的限制,以及文件创建方式的怪癖。

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

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

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

字体最多只能处理 255 个字形,而 CIDFonts 具有或多或少的无限范围。当 ps2write 创建类型 3 字体来表示嵌入的 CIDFont 时,它无法创建具有 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 文件中。

整体性能会降低,因为需要打开和关闭多个文件,prolog会写入每个文件,并且页面之间无法重用资源,因此必须将共享资源写入每个文件文件。这意味着作为单独文件写入的所有页面的总大小将大大大于作为一个大文件写入的总大小。

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

【讨论】:

  • 那是可悲的。感谢您的解释。这是一个问题,因为输入的 PDF 包含超过 1000 页,我无法更改它们的制作。长渲染延迟打印(打印机队列中的 1000 页 > 1GB)。是否有更快的方法来打印这些 PDF?
  • 添加回答。
猜你喜欢
  • 2016-12-02
  • 2015-07-19
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 2017-04-07
  • 1970-01-01
相关资源
最近更新 更多