ImageMagick:convert-im6.q16: 未定义任何图像

根据这个问题, 我怎样能在Linux命令行上将一系列图片转换成PDF文件?, ImageMagick可以将多张图片转换为一个PDF文件。
如何才能反过来操作,将一个多页的PDF文件转换为多张图片呢?
我尝试了下面的命令,但是出现了错误:
$ convert test.pdf test-%02.png
convert-im6.q16: attempt to perform an operation not allowed by the security policy `PDF' @ error/constitute.c/IsCoderAuthorized/408.
convert-im6.q16: no images defined `test-%02.png' @ error/convert.c/ConvertImageCommand/3258.

gs已安装:

$ gs --version
9.26

Ubuntu版本:

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 19.04
Release:    19.04
Codename:   disco

也许https://stackoverflow.com/q/2693820/12181862有一些技巧。 - DK Bose
你正在使用哪个版本的Ubuntu?看起来对/etc/ImageMagick-7/policy.xml进行一些明智的编辑应该能解决问题:在</policymap>之前添加<policy domain="coder" rights="read | write" pattern="PDF" /> - andrew.46
Ubuntu 19.04 @andrew.46 - AbstProcDo
这个错误信息也可以通过下面的答案来解决:convert-im6.q16: not authorized filename.pdf @ error/constitute.c/WriteImage/1037. - M.Viking
3个回答

有趣的是,在19.04版本的ImageMagick(以及其他Ubuntu版本!)中,禁用了许多ghostscript格式类型。可以在以下代码片段中看到这一点:/etc/ImageMagick-6/policy.xml
<!-- disable ghostscript format types -->
<policy domain="coder" rights="none" pattern="PS" />
<policy domain="coder" rights="none" pattern="EPS" />
<policy domain="coder" rights="none" pattern="PDF" /> <------- Here!!
<policy domain="coder" rights="none" pattern="XPS" />

当然,我已经添加了箭头以引起你的注意:)。将这个带箭头的行修改为:
<policy domain="coder" rights="read | write" pattern="PDF" />

你可以使用你喜欢的文本编辑器来完成这个任务,使用提升的权限,或者简单地使用以下的sed一行命令:
sudo sed -i_bak \
's/rights="none" pattern="PDF"/rights="read | write" pattern="PDF"/' \
/etc/ImageMagick-6/policy.xml

然后一切都应该没问题了,我已经在自己的19.04虚拟机上全面测试过了,你所期望的转换效果可以说是完美无瑕...
如果你希望将设置恢复为默认值,以下一行命令将还原使用sed创建的备份文件:
sudo mv /etc/ImageMagick-6/policy.xml_bak /etc/ImageMagick-6/policy.xml

命令行多酷啊!

关于https://cromwell-intl.com/open-source/pdf-not-authorized.html中描述的PostScript PDF的安全问题怎么样?这是一个值得关注的问题吗? - equivalent8
1@equivalent8 公平的说法,注意这篇文章的作者说过:“如果我们讨论的是您的桌面,那么您可能希望为ImageMagick启用那些数据类型。”这些是我愿意在自己的系统上进行的更改。 - andrew.46

另一个导致出现相同错误的原因是源图像太宽、太高或太重。 /etc/ImageMagick-6/policy.xml 文件控制着什么样的图像是可接受的。最大宽度和高度可以这样设置:
<policy domain="resource" name="width" value="10KP"/>
<policy domain="resource" name="height" value="10KP"/>

10KP代表1万像素。如果您的图像大于此大小,运行identify将无法在终端中显示图像信息,并且该图像基本上无法通过Image Magick访问。
影响图像是否可用的其他常见属性包括:memorymapareadisk
这里是描述policy.xml的文档:https://imagemagick.org/script/security-policy.php

+1 对以上所有内容的赞同。
另外请注意,我的Docker容器没有安装gs(Ghostscript),所以在这种情况下会抛出一个非常类似的错误信息:convert-im6.q16: no images defined。

3一样,容器中执行了apt-get install ghostscript命令后(并在policy.xml文件中注释掉策略行),一切都正常工作了。 - scandel