no images defined / FailedToExecuteCommand 'gs'
ImageMagick 没有 Ghostscript 就读不了 PDF 和 EPS。如何确认是这个原因,在 Linux、macOS 和 Windows 上安装,以及验证是否生效。
你转 PDF 或 EPS 时遇到下面之一:
convert: no images defined 'output.png' @ error/convert.c/ConvertImageCommand/3234
convert: FailedToExecuteCommand 'gs' -sstdout=%stderr ... @ error/pdf.c/InvokePDFDelegate/292
这是什么意思
ImageMagick 自己解不了 PDF 和 PostScript,它是去调用外部的 Ghostscript 程序 gs。这个程序不存在时,Ghostscript 根本没被调起来,ImageMagick 读入了零张图,然后抱怨没东西可写 —— 所以报错信息说的是输出文件,而不是输入。
「no images defined」这个措辞把很多人引到了错误的方向。问题在输入,不在输出。
确认一下
which gs
gs --version
如果没有输出,那这页就是你要的答案。如果 Ghostscript 确实装了,那你的问题几乎肯定是PDF 安全策略。
安装
apt install ghostscript # Debian / Ubuntu
dnf install ghostscript # Fedora / RHEL
apk add ghostscript # Alpine
brew install ghostscript # macOS
pacman -S ghostscript # Arch
Windows 用户到 ghostscript.com 下载安装包,并确认它的 bin 目录加进了 PATH。ImageMagick 的 Windows 安装程序会把 Ghostscript 作为可选组件提供 —— 很容易顺手点过去。
验证委托是否注册成功
magick -list delegate | grep -i ps
应该能看到 eps、ps、pdf 映射到 gs 的条目。然后测试:
magick -density 150 input.pdf page.png
identify page.png
装了还是不行
- 检查策略。 装 Ghostscript 并不会解除
policy.xml的封锁 —— 这是两道独立的门,你可能要依次撞两次。见策略那一页。 - 重开终端。 Windows 安装程序改的 PATH 需要新开一个终端才生效。
- 检查 PDF 有没有加密。 Ghostscript 会拒绝有密码的文件。只有所有者密码、没有用户密码的简单情况可以用
qpdf --decrypt in.pdf out.pdf处理。 - 检查文件真的是 PDF。
file input.pdf—— 下载下来被改了扩展名的情况出乎意料地常见。
在 Docker 里
精简基础镜像几乎从不包含 Ghostscript:
RUN apt-get update \
&& apt-get install -y --no-install-recommends imagemagick ghostscript \
&& rm -rf /var/lib/apt/lists/*
另一个选择
如果你只需要把 PDF 光栅化,poppler 更轻,也没有 Ghostscript 那段历史:
apt install poppler-utils
pdftoppm -png -r 300 input.pdf page