Ghostscript 将 PostScript 转换为 PDF 似乎忽略了页面大小/BoundingBox

Ghostscript converting PostScript to PDF seems to ignore the page size / BoundingBox

我使用 ImageMagick 从 TIFF 图像创建了一个 PostScript 文件。

我用的command-line是:

convert input.tif[0] -density 600 -alpha Off -size 5809x9408 -depth 16 intermediate.ps

这会获取我输入的 tiff 图像(只是主图像,而不是使用 [0] 的缩略图)并从位图中创建一个 .ps 文件。

当我查看我的 PostScript 文件的 header 时,我可以看到它具有正确的页面大小:

%!PS-Adobe-3.0
%%Creator: (ImageMagick)
%%Title: (intermediate.ps)
%%CreationDate: (2017-05-22T08:43:44+10:00)
%%BoundingBox: -0 -0 697 1129
%%HiResBoundingBox: 0 0 697.08 1129
%%DocumentData: Clean7Bit
%%LanguageLevel: 1
%%Orientation: Portrait
%%PageOrder: Ascend
%%Pages: 1
%%EndComments

然而,当我使用 GhostScript 将其转换为 PDF 时,除非我费很大力气以其他方式指定,否则 gs 会裁剪它并将其放在美国信纸大小的页面上。

gs -dPDFA=1 -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -sDefaultRGBProfile=AdobeRGB1998.icc -dOverrideICC -sOutputFile=output.pdf -r600 -P PDFA_def.ps intermediate.ps

当我打开生成的 PDF 时,裁剪框为 612 x 792 pt,是美国信函。它应该是 697 x 1129 pt,即 PostScript 文件中边界框的大小。

我使用 Acrobat Distiller 创建了一个自定义的 .joboptions 文件,它设置了图像压缩等,在这个文件中,如果我在末尾指定了页面大小,那么生成的 PDF 就会显示正确的大小:

<<
  /HWResolution [600 600]
  /PageSize [697.080 1128.960]
>> setpagedevice

现在这对于 one-off 转换来说不是什么大问题,但是我必须转换大量图像并且我不想为每个文件手动设置页面大小。

您在上面引用的行是 comments 并且从目前的评论来看,建议这是一个 EPS 文件,而不是 PostScript程序。

主要区别在于 EPS 是 'encapsulated',这意味着它旨在逐字放置在 PostScript 程序中。封闭程序包含有关媒体大小的智能信息,并安排设置上下文,以便缩放、旋转、平移 EPS,使其适合媒体。

为了成功地做到这一点,EPS 文件必须遵循一定的规则;特别是它不能自己设置任何媒体大小(因为那会弄乱封闭的程序)。

所以在我看来,您所拥有的可能是一个 EPS 文件,它根本不需要任何媒体大小。因此,您必须告诉 Ghostscript 您想要用它做什么也就不足为奇了。

现在为了让封闭程序放置 EPS,它需要知道它的特性、内容的大小和形状。这就是评论的目的。通常,EPS 文件由应用程序(例如 MS Word、LibreOffice 等)读取,该应用程序解析出这些注释并在生成最终 PostScript 程序时使用这些信息。 EPS 使用注释来存储此信息的原因恰恰是因为它对 EPS 的实际内容没有影响,因此可以包含整个 EPS 而无需应用程序进一步处理。

简短的回答是,如果您阅读 Ghostscript 文档 here,您会找到对 EPSCropEPSFitPage 命令行开关的描述,它们将为您完成所有工作。