Imagemagick安全策略似乎不允许我执行从pdf到png的转换。转换其他扩展似乎是工作的,只是不是从pdf。我没有改变任何imagemagick设置自从我安装它…我使用的是Arch Linux,如果操作系统很重要的话。

user@machine $ convert -density 300 -depth 8 -quality 90 input.pdf output.png
convert: attempt to perform an operation not allowed by the security policy `PDF' @ error/constitute.c/IsCoderAuthorized/408.
convert: no images defined `output.png' @ error/convert.c/ConvertImageCommand/3288.

当前回答

在我的情况下,我使用ubuntu 20.10和Imagick-7。

在我的/etc/ imagemagick -6/policy.xml文件中,我删除了以下几行, 重启我的机器,我就搞定了。

  <policy domain="coder" rights="none" pattern="PS" />
  <policy domain="coder" rights="none" pattern="PS2" />
  <policy domain="coder" rights="none" pattern="PS3" />
  <policy domain="coder" rights="none" pattern="EPS" />
  <policy domain="coder" rights="none" pattern="PDF" />
  <policy domain="coder" rights="none" pattern="XPS" />

其他回答

我使用nextcloud时遇到了这个问题,它无法为pdf文件创建缩略图。

然而,这些建议的步骤都不能解决我的问题。

最终我找到了原因:接受的答案确实有效,但我必须在编辑policy.xml文件后重新启动php-fpm:

 sudo systemctl restart php7.2-fpm.service

适用于Ubuntu 20.04

在<policymap>中添加这一行

<policy domain="module" rights="read|write" pattern="{PS,PDF,XPS}" />

注释这些行:

  <!--
  <policy domain="coder" rights="none" pattern="PS" />
  <policy domain="coder" rights="none" pattern="PS2" />
  <policy domain="coder" rights="none" pattern="PS3" />
  <policy domain="coder" rights="none" pattern="EPS" />
  <policy domain="coder" rights="none" pattern="PDF" />
  <policy domain="coder" rights="none" pattern="XPS" />
   -->

在Ubuntu 19.10上,我在/etc/ imagemagick -6/policy.xml中完成了这个操作

取消这

<policy domain="module" rights="read | write" pattern="{PS,PDF,XPS}" />

评论一下

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

在此之后,该命令正常工作,没有错误

convert -thumbnail x300 -background white -alpha remove sample.pdf sample.png 

对于Arch Linux的我来说,我不得不这样评论:

  <policy domain="delegate" rights="none" pattern="gs" />

在Ghostscript修复之后,ImageMagick的修改被保留了下来,因为应用程序(尤其是web应用程序)经常向ImageMagick提供任意用户提供的文件,并不总是正确地执行格式限制,而且,由于Postscript (PDF使用的)是一种在沙盒中运行的图turing-complete编程语言,沙盒中总是有另一个漏洞的可能性。

最好保持配置,以便ImageMagick拒绝处理需要运行程序的文件,而是在有意允许Postscript呈现时直接调用Ghostscript。

这可以通过如下的Ghostscript命令来完成:

gs -dSAFER -r600 -sDEVICE=pngalpha -o foo.png myfile.pdf

是的,这是ImageMagic调用的GhostScript命令的变体。(参见ImageMagick的delegation .xml。-o是-dBATCH -dNOPAUSE -sOutputFile=)的简写

重要的是ImageMagick保持锁定状态,无需调用中间程序,并且可以更好地控制呈现参数。(如。-r600是渲染的DPI,改变-sDEVICE=pngalpha可以让你直接渲染到你想要的格式)