最近公司做一個附件管理,需要上傳pdf轉圖片,上網查了一大堆資料,順利的安裝好,並轉圖片成功,中間也走過很多坑,所以記錄下來,供大家參考。
安裝imagick擴展之前先要了解下ImageMagick和ghostscript 的關系:
yum install wget make gcc gcc-c++ gtk±devel zlib-devel openssl openssl-devel pcre-devel kernel keyutils patch perl
wget http://downloads.ghostscript.com/public/ghostscript-9.02.tar.gz
tar zxf ghostscript-9.02.tar.gz
cd ghostscript-9.02
./configure
make
make install
cd /usr/local/src #進入軟件包存放目錄
wget http://www.imagemagick.org/download/ImageMagick.tar.gz #下載ImageMagick
tar zxvf ImageMagick.tar.gz #解壓
cd ImageMagick-6.7.9-3 #進入安裝目錄
./configure --prefix=/usr/local/imagemagick #配置
make #編譯
make install #安裝
export PKG_CONFIG_PATH=/usr/local/imagemagick/lib/pkgconfig/ #設置環境變量
cd /usr/local/src
wget http://pecl.php.net/get/imagick-3.0.1.tgz #下載imagick
tar zxvf imagick-3.0.1.tgz
cd imagick-3.0.1
/usr/bin/phpize #用phpize生成configure配置文件 這個是我的phpize路徑,可以用whereis phpize查看
./configure --with-php-config=/usr/bin/php-config --with-imagick=/usr/local/imagemagick #配置 php-config路徑同上查看方式
make #編譯
make install #安裝
#vi /etc/php.ini
extension=“imagick.so”
#:wq! #保存退出
#service php-fpm reload
如果是apache 則 #service httpd restart
- 在代碼中phpinfo();
- 命令行中 php -m
都可以查看到是否安裝成功擴展,有imagick說明安裝成功
可能出現的錯誤
-
我之前安裝過很多次都提示安裝失敗,安裝完imagick后沒有任何提示,從網上搜索了一下,還有一種方法安裝,通過pecl安裝imagick擴展,代碼如下:
pecl install imagick -
在安裝過程中出現錯誤,一般是由於缺少編譯工具包導致,可根據提示參照第一步安裝相應的工具包即可,可能還需要安裝libpng,libjpeg
-
安裝好了,可能pdf轉的圖片格式也不是都可以轉的,需要進入imagick目錄,用命令行查看一下可以轉的格式支不支持,命令如下:
convert -list format
沒有對應的格式就需要重新安裝版本了 -
安裝好了,需要pdf轉圖片,代碼如下
下面展示一些 代碼片
。
private function _pdf2png($pdf,$path){
if(!extension_loaded('imagick')){
return false;
}
if(!file_exists($pdf)){
return false;
}
$image = new Imagick();
$image->setResolution( 300, 300 );
$image->setcompressionquality(100);
$image->readimage($pdf);
$pages = count($image);
if($pages == 0){
return false;
}
FoxCommon::createdir(Yii::app()->params['staticPath'] . $path);
foreach ($image as $k => $v){
$v->setImageFormat( "jpg" );
$fileName = $path . '/' . $k . '.jpg';
$filePath = Yii::app()->params['staticPath'] . '/' .$fileName;
if(file_exists($filePath)){
$files[] = $fileName;
}else{
if($v->writeImage($filePath) == true){
$files[] = $fileName;
};
}
}
return $files;
}
后來上傳到線上,實際使用中發現,上傳10兆以上的文件,轉圖片就很慢了,而且服務器Imagick沒轉圖片成功會占用很多磁盤空間,就算轉成功了一個圖片也2到3兆,太大了,后來一查是圖片轉的質量的問題,下面兩段代碼的問題:
$image->setResolution( 300, 300 ); // 設置圖像分辨率
$image->setcompressionquality(100); // 設置對象的默認壓縮質量
將上面兩段代碼改外
$image->setResolution( 80, 80 ); // 設置圖像分辨率
//$image->setcompressionquality(100); // 設置對象的默認壓縮質量不設置,一個介於1和100之間的整數,1 =高壓縮,100=低壓縮,也可以根據自己的實際情況來
改完后轉十幾兆的pdf就很快了,幾秒鍾就行了,而且轉出來的圖片就幾百K,圖片的質量還是可以的,至此就大功告成了。
ps:有興趣的可以關注下我的公眾號和小程序,謝謝啦~~