根据这个问题,如何在 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
答案1
有趣的是,19.04 版(以及其他 Ubuntu 版本!)下的 ImageMagick 禁用了许多 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 VM 上全面测试了这一点,你所追求的转换是有效的完美无瑕...
如果你想将设置改回默认下面一行代码将恢复运行中创建的备份文件sed
:
sudo mv /etc/ImageMagick-6/policy.xml_bak /etc/ImageMagick-6/policy.xml
命令行有多酷啊!
答案2
出现同样错误的另一个原因是源图像太宽、太高或太重。
该/etc/ImageMagick-6/policy.xml
文件控制哪些内容可以作为图像。最大宽度和高度设置如下:
<policy domain="resource" name="width" value="10KP"/>
<policy domain="resource" name="height" value="10KP"/>
10KP 代表 10000 像素。如果您的图像大于该值,则运行identify
将不会在终端中显示图像信息,并且该图像基本上超出了 Image Magick 的范围。
影响图像是否可用的其他常见属性是:memory
、map
和area
。disk
以下是文档描述policy.xml
:https://imagemagick.org/script/security-policy.php
答案3
以上全部+1。
还要注意,我的 Docker 容器没有gs
安装(Ghostscript),因此convert-im6.q16: no images defined
在这种情况下会抛出非常相似的错误消息。