使用Imagick进行PDF到PNG的转换

时间:2015-06-30 19:17:24

标签: php imagick cmyk

我有一个网页,其中有许多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文档。但是在我的服务器上,我注意到有时候颜色是完全不准确的。

以下是一个例子:

Source pdf

Local convert result

Server convert result

我注意到的唯一区别是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

https://github.com/nicolasfranck/Grim/blob/master/profiles/Adobe%20ICC%20Profiles/CMYK%20Profiles/USWebUncoated.icc

然而,仍然没有预期的结果。

1 个答案:

答案 0 :(得分:2)

看起来您服务器上使用的Ghostscript版本没有正确处理pdf。我使用gs版本8.7获得了相同的错误结果,并使用9.16

获得了正确的结果

ghostscript版本8.7

  

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

enter image description here

http://ghostscript.com/download/gsdnld.html

下载的ghostscript版本9.16
  

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

  

enter image description here