使用convert进行批量将.png转换为.pdf时遇到了问题。

convert /home/bill/TempScan/*.png  myfile.pdf

显示错误信息:

convert-im6.q16: not authorized `myfile.pdf' @ error/constitute.c/WriteImage/1037.

任何帮助都将不胜感激!

1你应该从标题中删除“批处理”这个词。谷歌会将搜索结果重定向到重复的链接https://askubuntu.com/questions/1127260/imagemagick-convert-not-allowed,这是因为常见的搜索词。 - user643722
如果你将一个GIF文件转换为JPG格式并遇到错误信息,你需要移除-write命令。请在imagemagick论坛的https://legacy.imagemagick.org/discourse-server/viewtopic.php?t=36460中查看详细信息。 - Avatar
5个回答

convert 是一个强大的命令行工具,用于转换图形。它通过Ghostscript提供对PDF的支持。由于Ghostscript在9.24版本之前存在一个重大的安全漏洞,因此使用convert处理PDF文件时被阻止。该问题已在Ghostscript 9.24版本中修复。尽管Ghostscript版本在所有支持的Ubuntu版本(从Ubuntu 16.04开始)都已更新为安全版本,但使用限制可能仍然存在。

策略文件位于/etc/ImageMagick-6/policy.xml。您可以以root用户身份编辑该文件以更改策略。

消除所有使用限制

对于不运行Web服务器的桌面用户来说,简单地消除这些限制可能已经足够了。为此,您可以删除该文件,但最好的做法是将其“移出”而不是直接删除。使用以下命令,您可以重命名该文件。结果是解除了所有策略限制,但如果需要,您仍然可以恢复:

sudo mv /etc/ImageMagick-6/policy.xml /etc/ImageMagick-6/policy.xmlout

要恢复到原始状态,只需将名称改回原始名称:
sudo mv /etc/ImageMagick-6/policy.xmlout /etc/ImageMagick-6/policy.xml
请注意,移动策略文件会降低系统安全性。
仅消除合并为PDF的限制
对于您的特定情况,gene_wood在评论中指出了通过注释掉一行来选择性放宽与PDF文件一起工作的策略的可能性:

<policy domain="coder" rights="none" pattern="PDF" />

编辑文件,并在此行周围放置注释标记以禁用此规则:

<!-- <policy domain="coder" rights="none" pattern="PDF" /> -->

如果您不想消除所有安全策略,这是一个可行的方法。

1谢谢钒,我按照建议重新命名了文件,结果非常成功。 - bill-lancaster
6我进入了policy.xml文件,并找到了防止我将png文件组合成pdf的行,并将其注释掉。如果您想保留其他规则但允许使用pdf工作,则该行为<policy domain="coder" rights="none" pattern="PDF" /> - gene_wood
2@gene_wood,谢谢你:我在帖子中添加了这些内容,因为它为希望更加小心地消除限制的用户提供了更多的见解和选择。 - vanadium
3好的,这在Ubuntu 18.04上可以运行,使用的是imagemagick 8:6.9.7.4+dfsg-16ubuntu6.4版本。谢谢。 - Geppettvs D'Constanzo
第二种方法对我有效,但第一种方法没有。 - The Ledge
1我是唯一一个认为默认启用这个“功能”相当愚蠢的人吗?这让我想起了早期版本的php中自动开启的“魔术引号”。 - qwertz
@qwertz 显然,他们这样做是因为Ghostscript中存在一个漏洞bug,现在应该已经解决了。所以可能,在未来的Ubuntu版本中,对于使用Ghostscript的convert命令将不再设置此限制。 - vanadium
还有一个与这个安全问题相关的链接:https://cromwell-intl.com/open-source/pdf-not-authorized.html,但在这篇文章中,作者指出“PostScript定义了一种存在无法修复的安全问题的语言。”和“在允许不受信任的用户上传数据进行处理的服务器上,应该禁用ImageMagick的PostScript和PDF功能。”值得一读。 - equivalent8

根据vanadium发布的内容, 你需要更改ImageMagick策略。
sudo vim /etc/ImageMagick-6/policy.xml

并替换该行

<policy domain="coder" rights="none" pattern="PDF" />

使用

<policy domain="coder" rights="read|write" pattern="PDF" />

如果你只想允许写入,而不是阅读,你也可以删除上面一行中的 read| 部分。


顺便说一句,对于那些对ImageMagick漏洞感兴趣的人,这里有两个信息链接:

简短而直截了当。非常棒的答案。 - Francisco Luz

与其重新放宽ImageMagick的安全限制,我更倾向于使用img2pdf
它专门为这种用例设计。
如果您的优先事项是(按顺序排列): - 始终无损: PDF中嵌入的图像每个像素的颜色信息都与输入图像完全相同 - 文件较小: 如果可能,输入图像和输出PDF之间的文件大小差异仅为PDF容器本身的开销 - 速度快: 如果可能,输入图像将直接粘贴到PDF文档中,而不需要对像素数据进行耗费CPU资源的重新编码
传统的转换软件(如ImageMagick)要么: 1. 不是无损的,因为会进行有损的JPEG重新编码 2. 不是文件较小的,因为使用了浪费的flate编码原始像素数据 3. 不是速度快的,因为输入数据会被重新编码
不需要重新编码输入的另一个优点(在大多数常见情况下),是img2pdf能够处理比其他软件更大的输入,因为原始像素数据永远不需要加载到内存中。
以下是等效的命令:
img2pdf --out myfile.pdf /home/bill/TempScan/*.png 

如果由于某种原因你无法这样做(例如无法安装新软件包),另一种无损转换的可能途径是将你的图像转换为多页TIFF文件,然后使用libtiff工具中的tiff2pdf进行转换。

3+1 为了避免ImageMagick的安全限制寻找好的解决方法 :-) - sudodus

abu_bua的解决方案对我非常有效。为了方便起见,这里使用一个命令行和sed来实现:
sudo sed -i 's/rights="none" pattern="PDF"/rights="read|write" pattern="PDF"/g' /etc/ImageMagick-6/policy.xml

这里有一种更方便的方法,它可以自动获取policy.xml文件的位置,并对所有文件进行搜索/替换。
for file in `convert -list policy | grep "Path:" | grep -v built | sed 's/Path: \(.*\)/\1/g'`; do sed -i 's/domain="coder" rights="none" pattern="PDF"/domain="coder" rights="read|write" pattern="PDF"/g' $file; done