首页 > 解决方案 > Ghostscript 将 PDF 2 转换回 PDF 版本 1.7

问题描述

我需要通过读取大量 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”,但当文件为空白时,这并不是很好。非常感谢任何帮助!

标签: pdfcommand-line-interfaceghostscript

解决方案


好的,所以我认为问题出在您的命令行上(正如我的一位同事向我指出的那样)。您已指定 - 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 附带的某些实用程序确实使用 -sFileName 确实(并且可能是您混淆的根源),但 Ghostscript 本身却没有,它只是使用该名称定义了一个 PostScript 变量,以便程序可以读取它。

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

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


推荐阅读