1、依賴:imagick擴展以及ghostscript
docker: apt-get update && \ apt-get install -y --no-install-recommends libmagickwand-dev && \ pecl install imagick-3.4.3 && \ apt-get install ghostscript && \ docker-php-ext-enable imagick php.ini添加 extension=imagick.so centos: yum install ImageMagick yum install ImageMagick-devel pecl install imagick yum install -y ghostscript
注意:
一般網上很多都會提到imagick,但是會忽視ghostscript,其實ghostscript也是必須要的,這裏被坑的不行,浪費一天時間,如果不裝ghostscript會報‘failed to read the file’ ,看到這個錯誤一般會想到權限、路徑什麼的,其實都不是,所以很難排查;
這個不能直接處理遠程的pdf文件,需要處理的話需要先下載到本地
實現簡單代碼:
/** * 將pdf轉化爲單一png圖片 * * @param string $pdf pdf所在路徑 (/www/pdf/abc.pdf pdf所在的絕對路徑) * @param string $path 新生成圖片所在路徑 (/www/pngs/) * * @param string $picExtension * * @return string * @throws \ImagickException */ function pdf2Png($pdf, $path, $picExtension = 'png') { $im = new Imagick(); $im->setCompressionQuality(100); $im->setResolution(120, 120);//設置分辨率 值越大分辨率越高 $im->readImage($pdf); $canvas = new Imagick(); $imgNum = $im->getNumberImages(); foreach ($im as $k => $sub) { $sub->setImageFormat('png'); //$sub->setResolution(120, 120); $sub->stripImage(); $sub->trimImage(0); $width = $sub->getImageWidth() + 10; $height = $sub->getImageHeight() + 10; if ($k + 1 == $imgNum) { $height += 10; } //最後添加10的height $canvas->newImage($width, $height, new ImagickPixel('white')); $canvas->compositeImage($sub, Imagick::COMPOSITE_DEFAULT, 5, 5); } $canvas->resetIterator(); $picPath = sprintf('%s%s.%s', $path, self::getRandStr(), $picExtension); $canvas->appendImages(true)->writeImage($picPath); return $picPath; } public static function getRandStr() { $str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'; $randStr = str_shuffle($str);//打亂字符串 $rands = substr($randStr, 0, 6); return $rands; }