PHP Imagick处理PDF生成缩略图随机输出黑白/彩色异常问题求解
根本原因
该问题和PDF文件大小无直接关联,本质是Imagick底层调用Ghostscript渲染PDF时,会自动检测PDF首页的色彩空间,若原PDF第一页本身为灰度色彩空间,或Ghostscript对混合色彩的页面出现误判,就会输出灰度缩略图,看起来像是随机现象。
修复方案
你只需要在现有代码中增加强制指定色彩空间为SRGB的配置即可,修改后代码如下:
public function convertPdfToImage($_pdf) { if(file_prepare_directory($this->thumbnailDirectory, FILE_CREATE_DIRECTORY)) { try { $date = new \DateTime(); $thumbFileName = $date->getTimestamp() . '.png'; $imagick = new Imagick(); $imagick->setResolution(50,50); $imagick->readImage($_pdf); $imagick->setIteratorIndex(0); // 强制转换为SRGB色彩空间,避免灰度误判 $imagick->transformImageColorspace(Imagick::COLORSPACE_SRGB); // 强制指定为真彩色类型,避免PNG输出时自动降为灰度位深 $imagick->setType(Imagick::IMGTYPE_TRUECOLOR); $imagick->setImageFormat('png'); $thumbFile = \Drupal::service('file_system')->realpath($this->thumbnailDirectory . '/' . $thumbFileName); if($imagick->writeImage($thumbFile)) { $imagick->destroy(); return $this->thumbnailDirectory . '/' . $thumbFileName; }else{ \Drupal::logger('dtm_misc')->error('Error Saving PDF Thumbnail'); } $imagick->destroy(); }catch (\Exception $e) { if(isset($imagick)) { $imagick->destroy(); } \Drupal::logger('dtm_misc')->error('PDF To Image Exception: ' . $e->getMessage()); } } }
验证方法
如果需要确认问题根源,可以针对出现灰度缩略图的PDF,在读取后加一行日志输出色彩空间值:
\Drupal::logger('dtm_misc')->debug('PDF colorspace: ' . $imagick->getImageColorspace());
正常彩色PDF返回值为13(对应Imagick::COLORSPACE_SRGB常量),灰度PDF返回值为2(对应Imagick::COLORSPACE_GRAY常量)。
内容的提问来源于stack exchange,提问作者Edrisa Turay
相关产品推荐
相关产品推荐

