无法将 Imagemagick 与来自 PHP 的 exec() 的 PDF 一起使用,从 CLI 没问题
Can't use Imagemagick with PDFs from PHP's exec(), fine from CLI
我正在尝试使用 PHP 中的 Imagemagick 管理一些 PDF,使用 exec()
。我简化了我的测试用例,发现虽然 PDF 在命令行中运行良好,但它们在 PHP.
中不起作用
从命令行:
$ identify /var/tmp/doc-98563.png
/var/tmp/doc-98563.png PNG 2550x3300 2550x3300+0+0 8-bit Gray 256c 1.24178MiB 0.000u 0:00.009
$ identify /var/tmp/doc-35765.pdf
/var/tmp/doc-35765.pdf[0] PDF 419x595 419x595+0+0 16-bit ColorSeparation CMYK 997321B 0.120u 0:00.119
/var/tmp/doc-35765.pdf[1] PDF 419x595 419x595+0+0 16-bit ColorSeparation CMYK 997321B 0.110u 0:00.109
太棒了!正确识别我的文件,PNG 或 PDF。
我还可以确认文件的权限没问题:
$ ls -la /var/tmp/doc*
-rw-r--r-- 1 _www wheel 1.6M 15 May 10:05 /var/tmp/doc-35765.pdf
-rw-r--r-- 1 _www wheel 1.2M 15 May 10:01 /var/tmp/doc-98563.png
运行 相当于 PHP...
exec('identify /var/tmp/doc-98563.png', $output, $exitcode);
var_dump($output);
var_dump($exitcode);
unset($output);
exec('identify /var/tmp/doc-35765.pdf', $output, $exitcode);
var_dump($output);
var_dump($exitcode);
...产生不同的结果:
array(1) {
[0]=>
string(93) "/var/tmp/doc-98563.png PNG 2550x3300 2550x3300+0+0 8-bit Gray 256c 1.24178MiB 0.000u 0:00.000"
}
int(0)
array(0) {
}
int(1)
所以 PNG 在这两个地方的工作方式完全相同(正如预期的那样),但 PDF 只是……不是。
我已经检查了两者的 convert -version
和 convert -list format
,它们是相同的(ImageMagick 7.0.7-32,PDF PDF rw+ Portable Document Format
)。我还指定了完整路径 /usr/local/bin/identify ...
以验证它确实是 运行 相同的 IM 实例。对于我所看到的与 PDF 和 PNG 相关的所有内容,文件权限都是相同的,所以不要认为是那样。
运行 gs
从 PHP 使用相同的文件可以正常工作,但 gs 不能满足我的需要。
还有什么我可以尝试的吗?
作为参考,我在 OSX 使用 PHP7.2,它和 ImageMagick(和 Ghostscript)都与 Brew 一起安装。
这是一个常见问题。似乎 PHP 环境通常找不到 Ghostscript。解决该问题的一种方法是编辑已安装的 delegates.xml 文件,将完整路径放入 ghostscript,即 gs 在 command=""gs" 的所有条目中。这适用于 PDF,PS, EPS。另一种方法是修改你的 PHP 环境变量,将 GS 放在你的 PHP PATH 中。
我正在尝试使用 PHP 中的 Imagemagick 管理一些 PDF,使用 exec()
。我简化了我的测试用例,发现虽然 PDF 在命令行中运行良好,但它们在 PHP.
从命令行:
$ identify /var/tmp/doc-98563.png
/var/tmp/doc-98563.png PNG 2550x3300 2550x3300+0+0 8-bit Gray 256c 1.24178MiB 0.000u 0:00.009
$ identify /var/tmp/doc-35765.pdf
/var/tmp/doc-35765.pdf[0] PDF 419x595 419x595+0+0 16-bit ColorSeparation CMYK 997321B 0.120u 0:00.119
/var/tmp/doc-35765.pdf[1] PDF 419x595 419x595+0+0 16-bit ColorSeparation CMYK 997321B 0.110u 0:00.109
太棒了!正确识别我的文件,PNG 或 PDF。
我还可以确认文件的权限没问题:
$ ls -la /var/tmp/doc*
-rw-r--r-- 1 _www wheel 1.6M 15 May 10:05 /var/tmp/doc-35765.pdf
-rw-r--r-- 1 _www wheel 1.2M 15 May 10:01 /var/tmp/doc-98563.png
运行 相当于 PHP...
exec('identify /var/tmp/doc-98563.png', $output, $exitcode);
var_dump($output);
var_dump($exitcode);
unset($output);
exec('identify /var/tmp/doc-35765.pdf', $output, $exitcode);
var_dump($output);
var_dump($exitcode);
...产生不同的结果:
array(1) {
[0]=>
string(93) "/var/tmp/doc-98563.png PNG 2550x3300 2550x3300+0+0 8-bit Gray 256c 1.24178MiB 0.000u 0:00.000"
}
int(0)
array(0) {
}
int(1)
所以 PNG 在这两个地方的工作方式完全相同(正如预期的那样),但 PDF 只是……不是。
我已经检查了两者的 convert -version
和 convert -list format
,它们是相同的(ImageMagick 7.0.7-32,PDF PDF rw+ Portable Document Format
)。我还指定了完整路径 /usr/local/bin/identify ...
以验证它确实是 运行 相同的 IM 实例。对于我所看到的与 PDF 和 PNG 相关的所有内容,文件权限都是相同的,所以不要认为是那样。
运行 gs
从 PHP 使用相同的文件可以正常工作,但 gs 不能满足我的需要。
还有什么我可以尝试的吗?
作为参考,我在 OSX 使用 PHP7.2,它和 ImageMagick(和 Ghostscript)都与 Brew 一起安装。
这是一个常见问题。似乎 PHP 环境通常找不到 Ghostscript。解决该问题的一种方法是编辑已安装的 delegates.xml 文件,将完整路径放入 ghostscript,即 gs 在 command=""gs" 的所有条目中。这适用于 PDF,PS, EPS。另一种方法是修改你的 PHP 环境变量,将 GS 放在你的 PHP PATH 中。