【问题标题】:Ghostscript to convert PDF 2 Back to PDF version 1.7Ghostscript 将 PDF 2 转换回 PDF 版本 1.7
【发布时间】:2019-08-22 15:42:17
【问题描述】:

我需要通过读取大量 PDF 并将每一页插入到新的多页 PDF 中来构建 PDF 服务器端。问题是 PDF 以 2.0 版格式提供,但我的应用程序只能读取 1.7 版。我想将版本 2 文件转换回版本 1.7 文件,以便我的应用程序可以读取它。

我正在使用 Ghostscript 9.27 版,并尝试了几个命令,但每次我都得到一个空的 PDF。示例:

/usr/local/bin/gs \
    -q -dNOPROMPT \
    -dBATCH \
    -dDEVICEWIDTH=595 \
    -dDEVICEHEIGHT=842 \
    -sDEVICE=pdfwrite \
    -dCompatibilityLevel=1.7 \
    -sFileName=pdf-version-2.pdf \
    -sOutputFile=fileout.pdf

没有错误,只是一个空的 PDF。 “文件”命令确实给出了预期的输出“PDF 文档,版本 1.7”,但当文件为空白时,这并不好。非常感谢任何帮助!

【问题讨论】:

  • 您将不得不提供一个示例文件。 FWIW PDF 规范的 2.0 版和 1.7 版之间没有太大区别。如果您遇到问题,那么我建议您删除 -q (queit),以防 GS 试图告诉您一些有用的信息,您也可以引用 GS 的反向通道输出。请注意,对于 PDF 输入,设置 -dDEVICEWIDTHPOINTS 和 -dDEVICEHEIGTHPOINTS 而不设置 -dFIXEDMEDCIA 不会做任何事情,因为它将被 PDF 输入文件中的 MediaBox 覆盖。
  • 谢谢,Ken,我想举个例子会很方便:demo.visualid.com/_mediafiles/demo/esign/pdf-version-2.pdf

标签: pdf command-line-interface ghostscript


【解决方案1】:

好的,所以我认为问题出在您的命令行上(正如我的一位同事向我指出的那样)。您指定了 -sFileName=pdf-version-2.pdf,看起来您正在尝试指定输入文件。

没有 Ghostscript 开关-sFileName,您只需将名称放在命令行上即可指定输入文件名。所以你真的想要:

/usr/local/bin/gs \
    -q -dNOPROMPT \
    -dBATCH \
    -dDEVICEWIDTH=595 \
    -dDEVICEHEIGHT=842 \
    -sDEVICE=pdfwrite \
    -dCompatibilityLevel=1.7 \
    -sOutputFile=fileout.pdf \
    pdf-version-2.pdf

出于 30 年前的良好原因,Ghostscript 命令行开关被复制到 PostScript 环境中,PostScript 程序可以在其中访问它们。因此,虽然 Ghostscript 附带的一些实用程序确实(可能是您混淆的根源)do 使用 -sFileName,但 Ghostscript 本身没有,它只是使用该名称定义了一个 PostScript 变量,以便程序可以读取它。

因为您指定了BATCHNOPROMPT,但没有指定输入文件,解释器启动,将当前页面擦除为白色,然后退出。关闭 pdfwrite 设备会导致它写出页面的当前内容,也就是白色,导致您的 PDF 文件为空。

上面稍微修改的命令行对我来说效果很好,但正如我在我的 cmets 中指出的那样,指定 DEVICEWIDTHPOINTS 和 DEVICEHEIGHTPOINTS 实际上不会做任何事情。

【讨论】:

  • 非常感谢你,Ken - 这真是太棒了。不介意,但我从来没有在我的任何其他 GS 命令中实际使用过 -sFileName,不知道我在哪里找到它(我猜是复制和粘贴)。无论如何,非常感谢您的帮助!
猜你喜欢
  • 2016-06-15
  • 2021-01-01
  • 1970-01-01
  • 2020-03-07
  • 1970-01-01
  • 1970-01-01
  • 2014-11-20
  • 1970-01-01
  • 2010-12-12
相关资源
最近更新 更多