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

bil*_*ter 239 pdf convert png imagemagick

convert /home/bill/TempScan/*.png  myfile.pdf
Run Code Online (Sandbox Code Playgroud)

给出错误信息:

convert-im6.q16: not authorized `myfile.pdf' @ error/constitute.c/WriteImage/1037.
Run Code Online (Sandbox Code Playgroud)

任何帮助,将不胜感激!

van*_*ium 321

convert是一个强大的命令行工具来转换图形。它对 PDF 的支持由 Ghostscript 提供。由于9.24 版之前的Ghostscript中存在重大安全漏洞,convert因此作为权宜之计阻止了对 PDF 文件的使用。自 Ghostscript 9.24 版以来,该问题已得到修复。虽然 Ghostscript 版本已更新为所有支持的 Ubuntu 版本中的安全版本(此时从 Ubuntu 16.04 开始),但使用限制可能仍然存在。

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

取消所有使用限制

对于没有运行网络服务器的桌面用户,简单地消除这些限制可能就足够了。为此,可以删除文件,但最好通过重命名来“移出文件”。使用此命令,您正在重命名文件。因此,所有政策都已取消,但您仍可以根据需要恢复:

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" /> -->

如果您不想消除所有安全策略,这就是要走的路。

  • 我进入了 `policy.xml` 文件,找到了阻止我将 `png` 文件合并到 `pdf` 中的行,并将其注释掉。如果您想保留其他规则不变但允许使用 pdf ,那一行是 `&lt;policy domain="coder" rights="none" pattern="PDF" /&gt;`。 (6认同)
  • 好的,这适用于带有 imagemagick 8:6.9.7.4+dfsg-16ubuntu6.4 的 Ubuntu 18.04。谢谢你。 (3认同)
  • @gene_wood,谢谢:我添加到帖子中是因为它为希望在消除限制方面更加谨慎的用户提供了更多的洞察力和选项。 (2认同)

abu*_*bua 94

正如钒发布的那样,您必须更改 ImageMagick 政策。

sudo vim /etc/ImageMagick-6/policy.xml
Run Code Online (Sandbox Code Playgroud)

并更换线

<policy domain="coder" rights="none" pattern="PDF" />
Run Code Online (Sandbox Code Playgroud)

<policy domain="coder" rights="read|write" pattern="PDF" />
Run Code Online (Sandbox Code Playgroud)

如果您只想允许写入,不允许读取,您也可以擦除read|上面一行中的部分。


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


sso*_*low 13

而不是重新放松 ImageMagick 的安全限制,我只是使用img2pdf

它是专门为这种用例设计的。

如果您的优先级是(按此顺序),您应该使用 img2pdf:

  • 始终无损:嵌入在 PDF 中的图像对于每个像素将始终具有与输入完全相同的颜色信息
  • 小:如果可能,输入图像和输出 PDF 之间的文件大小差异将仅是 PDF 容器本身的开销
  • 快速:如果可能,输入图像将按原样粘贴到 PDF 文档中,无需对像素数据进行任何 CPU 占用的重新编码

传统的转换软件(如 ImageMagick)要么:

  1. 不是无损的,因为有损重新编码为 JPEG
  2. 不小,因为使用原始像素数据的浪费平面编码
  3. 不快,因为输入数据被重新编码

无需重新编码输入(在大多数常见情况下)的另一个优点是,img2pdf 能够处理比其他软件大得多的输入,因为原始像素数据永远不必加载到内存中。

这应该是等效的命令:

img2pdf --out myfile.pdf /home/bill/TempScan/*.png 
Run Code Online (Sandbox Code Playgroud)

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

  • +1 以获得避免 ImageMagick 安全限制的良好解决方法 :-) (2认同)

小智 7

abu_bua 的解决方案对我来说真的很好用。为方便起见,在一个命令行中使用sed

sudo sed -i 's/rights="none" pattern="PDF"/rights="read|write" pattern="PDF"/g' /etc/ImageMagick-6/policy.xml
Run Code Online (Sandbox Code Playgroud)