1 /** 2 * 将pdf文件转化为多张png图片 3 * @param string $pdf pdf所在路径 (/www/pdf/abc.pdf pdf所在的绝对路径) 4 * @param string $path 新生成图片所在路径 (/www/pngs/) 5 * 6 * @return array|bool 7 */ 8 function pdf2png($pdf, $path) 9 { 10 if (!extension_loaded('imagick')) { 11 return false; 12 } 13 if (!file_exists($pdf)) { 14 return false; 15 } 16 $im = new Imagick(); 17 $im->setResolution(120, 120); //设置分辨率 值越大分辨率越高 18 $im->setCompressionQuality(100); 19 $im->readImage($pdf); 20 foreach ($im as $k => $v) { 21 $v->setImageFormat('png'); 22 $fileName = $path . md5($k . time()) . '.png'; 23 if ($v->writeImage($fileName) == true) { 24 $return[] = $fileName; 25 } 26 } 27 return $return; 28 } 29 30 /** 31 * 将pdf转化为单一png图片 32 * @param string $pdf pdf所在路径 (/www/pdf/abc.pdf pdf所在的绝对路径) 33 * @param string $path 新生成图片所在路径 (/www/pngs/) 34 * 35 * @throws Exception 36 */ 37 function pdf2png2($pdf, $path) 38 { 39 try { 40 $im = new Imagick(); 41 $im->setCompressionQuality(100); 42 $im->setResolution(120, 120);//设置分辨率 值越大分辨率越高 43 $im->readImage($pdf); 44 45 $canvas = new Imagick(); 46 $imgNum = $im->getNumberImages(); 47 //$canvas->setResolution(120, 120); 48 foreach ($im as $k => $sub) { 49 $sub->setImageFormat('png'); 50 //$sub->setResolution(120, 120); 51 $sub->stripImage(); 52 $sub->trimImage(0); 53 $width = $sub->getImageWidth() + 10; 54 $height = $sub->getImageHeight() + 10; 55 if ($k + 1 == $imgNum) { 56 $height += 10; 57 } //最后添加10的height 58 $canvas->newImage($width, $height, new ImagickPixel('white')); 59 $canvas->compositeImage($sub, Imagick::COMPOSITE_DEFAULT, 5, 5); 60 } 61 62 $canvas->resetIterator(); 63 $canvas->appendImages(true)->writeImage($path . microtime(true) . '.png'); 64 } catch (Exception $e) { 65 throw $e; 66 } 67 }
PS: 无论是转化为多张还是单张图片,都需要安装PHP的Imagick扩展。
其实,这两个方法还可以再优化,比如可以自定义设置图片的分辨率,存放图片的地址不存在的时候,可以自动创建目录之类的。这些问题和转化图片,就不多写了。