Преобразование PDF в PNG с помощью Imagick

У меня есть веб-страница, на которой много pdf-документов, представляющих собой 1-страничные изображения в CMYK. Мне нужно преобразовать их в 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. Но на своем сервере я заметил, что иногда цвета совершенно неточны.

Вот пример:

Исходный файл pdf

Локальный результат преобразования

Результат преобразования сервера

Единственная разница, которую я заметил, заключается в версиях Imagick, о которых сообщает phpinfo:

Локально: PHP 5.5.9 Imagick: 6.7.7-10 06.03.2014 Q16

Сервер: PHP 5.4.42 Imagick: 6.8.9-7 Q16 x86_64 21 марта 2015 г.

Кто-нибудь знает, как заставить сервер использовать правильное цветовое пространство для преобразования 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

Однако до сих пор нет ожидаемого результата.


person Zefiryn    schedule 30.06.2015    source источник
comment
Какие версии PHP вы используете в локальной и серверной? Похоже, та же проблема: bugs.php.net/bug.php?id=59606   -  person Fabien Sa    schedule 30.06.2015
comment
Я добавил информацию о версии php в исходный пост.   -  person Zefiryn    schedule 30.06.2015
comment
Я пытался использовать профили icc, но безуспешно (см. обновление)   -  person Zefiryn    schedule 30.06.2015
comment
ПРИВЕТ. Я ИСПОЛЬЗУЮ СОВЕРШЕННО РАЗНЫЕ ВЕРСИИ ПРОГРАММ ЛОКАЛЬНО И НА СВОЕМ СЕРВЕРЕ, И ОНИ НЕ ДАЮТ ОДИНАКОВОГО РЕЗУЛЬТАТА. ЧТО МОЖЕТ БЫТЬ ПРИЧИНОЙ ЭТОГО?!! ОДИН!   -  person Danack    schedule 30.06.2015
comment
Это должен быть полезный комментарий? Я понимаю, что разные версии могут давать разные результаты. В этом случае преобразование неверно (чего не должно быть, поскольку документация не содержит никакой информации об изменениях цветового пространства между версиями), поэтому мой вопрос: если кто-нибудь знает или имеет представление о том, как заставить мою серверную версию работать правильно.   -  person Zefiryn    schedule 30.06.2015
comment
Это должен быть полезный комментарий? Нет, это должен быть сарказм. Вы используете какой-то код для совершенно разных версий библиотек — неудивительно, что есть разница.   -  person Danack    schedule 01.07.2015


Ответы (1)


Похоже, версия 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 док. пдф

введите здесь описание изображения

Ghostscript версии 9.16, загруженный с http://ghostscript.com/download/gsdnld.html

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

введите здесь описание изображения

person Danack    schedule 30.06.2015