【问题标题】:Ghostscript converting PostScript to PDF seems to ignore the page size / BoundingBoxGhostscript 将 PostScript 转换为 PDF 似乎忽略了页面大小/BoundingBox
【发布时间】:2017-10-21 12:22:20
【问题描述】:

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

我使用的命令行是:

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

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

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

%!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,即 US Letter。它应该是 697 x 1129 pt,即 PostScript 文件中边界框的大小。

我使用 Acrobat Distiller 创建了一个自定义 .joboptions 文件,该文件设置了图像压缩等,如果我在最后指定页面大小,则生成的 PDF 文件大小正确:

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

现在这对于一次性转换来说不是一个大问题,但我必须转换大量图像,而且我不想为每个文件手动设置页面大小。

【问题讨论】:

    标签: pdf ghostscript imagemagick-convert postscript


    【解决方案1】:

    您在上面引用的行是 cmets,从目前的 cmets 来看,这表明这是一个 EPS 文件,而不是 PostScript 程序。

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

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

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

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

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

    【讨论】:

    • 再次感谢您抽出宝贵时间撰写详细而全面的答案。我的印象是 ImageMagick 给了我一个完整的 PostScript 文件,而不是 EPS。我确实尝试过使用 -dEPSCrop,但似乎仍然给了我相同的美国信函页面大小。我将从我的 .joboptions 文件中删除硬编码的页面大小定义,并尝试使用 -dEPSCrop 使用 gs 再次转换。
    • 如果你在某处提供它,我可以查看实际文件,我是在“猜测”而不是当我说它只是基于 cmets 的 EPS 时,因为解释器 cmets 被忽略了,所以你可以在里面放任何你喜欢的东西。仅仅因为 cmets“看起来像”一个 EPS 文件,并不意味着它是一个 EPS 文件.....
    • 我已经从文件中删除了图像数据(因为它超过 300 MB),只留下了其他 PostScript 代码......我已经将它上传到 pastebin:pastebin.com/HTrRygga Cheers!
    • 好的,所以它不是 EPS 文件,它是 PostScript 文件,但它没有媒体大小请求。由于 cmets 只是 cmets,因此任何 PostScript 打印机都只会在默认介质上打印它。由于这通常是 US Letter 或 A4,因此内容将被截断。您可以继续使用您的 joboptions 方法,也可以编写一个 DSC 解析器来读取 cmets 并执行来自它们的媒体大小请求。 Ghostscript 不会“开箱即用”,因为默认情况下它会忽略 cmets。真的 IM 应该发送媒体请求。
    • FWIW 你可以使用 libtiff 代替,或者如果你真的很绝望,我(很久以前)写了一个 PostScript 程序来直接读取 TIFF 文件。不久前有人挖了一个 Google 群组链接并将其发布在这里,为了完整起见,我将再次复制它groups.google.com/forum/#!msg/comp.lang.postscript/xLMTVNzGNXQ/…
    猜你喜欢
    • 1970-01-01
    • 2016-12-02
    • 1970-01-01
    • 2015-04-18
    • 2017-04-07
    • 1970-01-01
    • 2011-06-12
    • 2011-03-30
    • 2016-11-07
    相关资源
    最近更新 更多