pdf轉圖片是通過php擴展imagick實現的,所以前提條件是已經安裝imagick拓展。
pdf轉圖片:
/** * PDF2PNG * @param $pdf 待處理的PDF文件 * @param $path 待保存的圖片路徑 * @param int $page 待導出的頁面 -1為全部 0為第一頁 1為第二頁 * @return array|bool 保存好的圖片路徑和文件名 * @throws \ImagickException * 注:此處為坑 對於Imagick中的$pdf路徑 和$path路徑來說, php版本為5+ 可以使用相對路徑。php7+版本必須使用絕對路徑。所以,建議大伙使用絕對路徑。 */ public function pdf2png($pdf, $path, $page = -1) { if (!extension_loaded('imagick')) { return false; } if (!file_exists($pdf)) { return false; } if (!is_readable($pdf)) { return false; } $im = new Imagick(); $im->setResolution(150, 150); $im->setCompressionQuality(100); if ($page == -1) $im->readImage($pdf); else $im->readImage($pdf . "[" . $page . "]"); foreach ($im as $Key => $Var) { $Var->setImageFormat('png'); $filename = $path . md5($Key . time()) . '.png'; if ($Var->writeImage($filename) == true) { $Return[] = $filename; } } //返回轉化圖片數組,由於pdf可能多頁,此處返回二維數組。 return $Return; }
遇到問題:提示無權限,解決方法(Linux):修改「/etc/ImageMagick-6/」目錄下的policy.xml文件,開通「讀寫pdf文件」的權限。(sudo vim policy.xml)
多張png圖片轉一張:
/** * Spliceimg * @param array $imgs pdf轉化png 路徑 * @param string $path 待保存的圖片路徑 * @return string 將多個圖片拼接為成圖的路徑 * 注:多頁的pdf轉化為圖片后拼接方法 */ /** * @param array $imgs * @param string $img_path * @return bool|string */ public function Spliceimg($imgs = array(), $img_path = '') { //自定義寬度 $width = 1230; //獲取總高度 $pic_tall = 0; foreach ($imgs as $key => $value) { $info = getimagesize($value); $pic_tall += $width / $info[0] * $info[1]; } // 創建長圖 $temp = imagecreatetruecolor($width, $pic_tall); //分配一個白色底色 $color = imagecolorAllocate($temp, 255, 255, 255); imagefill($temp, 0, 0, $color); $target_img = $temp; $source = array(); foreach ($imgs as $k => $v) { $source[$k]['source'] = Imagecreatefrompng($v); $source[$k]['size'] = getimagesize($v); } $num = 1; $tmp = 1; $tmpy = 2; //圖片之間的間距 $count = count($imgs); for ($i = 0; $i < $count; $i++) { imagecopy($target_img, $source[$i]['source'], $tmp, $tmpy, 0, 0, $source[$i]['size'][0], $source[$i]['size'][1]); $tmpy = $tmpy + $source[$i]['size'][1]; //釋放資源內存 imagedestroy($source[$i]['source']); } $returnfile = $img_path . date('Y-m-d'); if (!file_exists($returnfile)) { if (!$this->make_dir($returnfile)) { /* 創建目錄失敗 */ return false; } } $return_imgpath = $returnfile . '/' . md5(time() . $pic_tall . 'pdftopng') . '.png'; imagepng($target_img, $return_imgpath); return $return_imgpath; } /** * make_dir * @param string $folder 生成目錄地址 * 注:生成目錄方法 */ /** * @param $folder * @return bool */ public function make_dir($folder) { $reval = false; if (!file_exists($folder)) { /* 如果目錄不存在則嘗試創建該目錄 */ @umask(0); /* 將目錄路徑拆分成數組 */ preg_match_all('/([^\/]*)\/?/i', $folder, $atmp); /* 如果第一個字符為/則當作物理路徑處理 */ $base = ($atmp[0][0] == '/') ? '/' : ''; /* 遍歷包含路徑信息的數組 */ foreach ($atmp[1] AS $val) { if ('' != $val) { $base .= $val; if ('..' == $val || '.' == $val) { /* 如果目錄為.或者..則直接補/繼續下一個循環 */ $base .= '/'; continue; } } else { continue; } $base .= '/'; if (!file_exists($base)) { /* 嘗試創建目錄,如果創建失敗則繼續循環 */ if (@mkdir(rtrim($base, '/'), 0777)) { @chmod($base, 0777); $reval = true; } } } } else { /* 路徑已經存在。返回該路徑是不是一個目錄 */ $reval = is_dir($folder); } clearstatcache(); return $reval; }
刪除文件夾及文件夾內所有文件:
/** * 刪除文件夾及其文件夾下所有文件 * @param $dirName * @return bool */ public function removeDir($dirName) { if (!is_dir($dirName)) { return false; } $handle = @opendir($dirName); while (($file = @readdir($handle)) !== false) { //判斷是不是文件 .表示當前文件夾 ..表示上級文件夾 =2 if ($file != '.' && $file != '..') { $dir = $dirName . '/' . $file; is_dir($dir) ? $this->removeDir($dir) : @unlink($dir); } } closedir($handle); @rmdir($dirName); }