我有一个网页,其中有许多pdf文档,这些文档是CMYK中的1页图像。我需要将它们转换为png / jpg以在网页上显示它。我试图使用PHP原生的Imagick,但偶然发现了奇怪的问题。执行转换的代码如下所示:
$im = new Imagick();
$im->setResolution(200, 200);
$im->readimage($file->getAbsolutePath());
$im->setImageFormat('png');
$im->transformImageColorspace(Imagick::COLORSPACE_SRGB);
$im->writeImage($file->getAbsolutePath() . '.png');
现在我的本地安装一切正常,PNG文件看起来像PDF文档。但是在我的服务器上,我注意到有时候颜色是完全不准确的。
以下是一个例子:
我注意到的唯一区别是phpinfo报告的Imagick版本:
本地:PHP 5.5.9 Imagick:6.7.7-10 2014-03-06 Q16
服务器:PHP 5.4.42 Imagick:6.8.9-7 Q16 x86_64 2015-03-21
有谁知道如何让服务器使用正确的色彩空间将pdf转换为png?
[编辑/更新]
正如@ fab-sa所建议的,我现在尝试使用icc配置文件,代码如下:
$icc_cmyk = file_get_contents(dirname(__FILE__).'/USWebUncoated.icc');
$icc_rgb = file_get_contents(dirname(__FILE__).'/sRGB_v4_ICC_preference.icc');
$im->setResolution(200,200);
$im->readimage($file->getAbsolutePath());
$im->setImageFormat('png');
$im->profileImage('icc', $icc_cmyk);
$im->profileImage('icc', $icc_rgb);
$im->transformImageColorspace(Imagick::COLORSPACE_SRGB);
$im->writeImage($file->getAbsolutePath().'.png');
和icc简介:
https://github.com/vivid-planet/library/blob/master/icc/sRGB_v4_ICC_preference.icc
然而,仍然没有预期的结果。
答案 0 :(得分:2)
看起来您服务器上使用的Ghostscript版本没有正确处理pdf。我使用gs版本8.7获得了相同的错误结果,并使用9.16
获得了正确的结果gs -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap = 500000000 -dAlignToPixels = 0 -dGridFitTT = 1 -sDEVICE = pngalpha -dTextAlphaBits = 4 -dGraphicsAlphaBits = 4 -r50 -sOutputFile = docgs8-%d。 png doc.pdf
./ gs-916-linux_x86_64 -q
-dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap = 500000000 -dAlignToPixels = 0 -dGridFitTT = 1 -sDEVICE = pngalpha -dTextAlphaBits = 4 -dGraphicsAlphaBits = 4 -r50 -sOutputFile = docgs9-%d.png doc。 PDF