在網上找了很多方法,發現與自己最初的思路也是大同小異,那就是HTML——》PDF——》JPG。從上午9點鍾一直搞到下午6點鍾,代碼方面其實很簡單,更多的還是環境和PHP拓展上面,忙了一天的成果有必要分享一下。
第一步:HTML——》PDF
1、利用html2fpdf將html轉成pdf
1 require('html2fpdf/html2fpdf.php'); 2 $pdf=new HTML2FPDF(); 3 $pdf->AddPage(); 4 // yourfile.html 你要轉化的HTML文件 5 $yourfile_html = "index.html"; 6 // yourfile.pdf 轉化成功后的pdf文件名 7 $yourfile_pdf = "yourfile.pdf"; 8 $fp = fopen($yourfile_html,"r"); 9 $strContent = fread($fp, filesize($yourfile_html)); 10 fclose($fp); 11 $pdf->WriteHTML($strContent); 12 $pdf->Output($yourfile_pdf );
html2fpdf類庫網上都可以下載到,這個方法的一個缺點就是會出現中文亂碼,所以我后來又找到了下面這種方法:
2、利用mpdf將html轉成pdf
基本解決了中文(以及日語、韓語及東南亞和全球語言)亂碼的問題,在Windows/Linux開發環境下測試可用,不需要安裝別的組件支持
這里是官方下載地址是:http://www.mpdf1.com/,已經更新到6.0版,不過我不建議下載6.0版本,原因有兩個:相比其他版本要大很多;再就是我第一次用的就是這個版本,里面報各種錯誤(這才是主要原因),后來換成5.7就沒問題了。
代碼如下:
1 include('mpdf/mpdf.php'); 2 $mpdf=new mPDF('UTF-8','A4','','',0,0,0,0);//設置編碼、頁面大小,以及在pdf上面的頂點坐標 3 $mpdf->useAdobeCJK = true; 4 $mpdf->SetAutoFont(AUTOFONT_ALL); 5 $mpdf->SetDisplayMode('fullpage'); 6 //$mpdf->watermark_font = 'GB'; 7 //$mpdf->SetWatermarkText('中國水印',0.1); 8 $url = 'index.html'; 9 $strContent =file_get_contents($url); 10 //print_r($strContent);die; 11 $mpdf->showWatermarkText = true; 12 $mpdf->SetAutoFont(); 13 //$mpdf->SetHTMLHeader( '頭部' ); 14 //$mpdf->SetHTMLFooter( '底部' ); 15 $mpdf->WriteHTML($strContent); 16 $mpdf->Output('ss.pdf'); 17 //$mpdf->Output('tmp.pdf',true); 18 //$mpdf->Output('tmp.pdf','d'); 19 //$mpdf->Output();
這個方法看起來都要比第一種高大上,編碼,水印,紙張大小什么的都能設置。
第二步:PDF——》JPG
這一步才是整個功能最麻煩的地方,麻煩在什么地方?麻煩在imagick系統環境的安裝和php動態鏈接庫,動態鏈接庫必須和操作系統版本、php版本一致,否則無法使用。也是悲催,我自己在windows下試了幾個小時,換了幾台電腦都沒成功,一換到linux環境,按照網上的方法一裝,跑得好好的。不管怎么樣方法還是提供一下吧,萬一你運氣好一下就裝好了也說不定呢!
本地windows開發環境,安裝過程:
1、下載ImageMagick
我下載的是ImageMagick-6.8.6-9-Q16-x86-dll.exe版本
http://vdisk.weibo.com/s/uJehmAky5Zlib?sudaref=www.baidu.com
2. 安裝 ImageMagick
安裝 ImageMagick 到 PC 上。安裝路徑不能出現空格,否則無法使用。安裝時,記得選中第二個選項把執行路徑添加到 path 上,否則你就得手動去添加 path 路徑了。
3. 測試安裝
打開windows 命令行窗口,輸入convert,回車。會出現convert的幫助文檔,如果沒有出現,說明沒有安裝成功,或沒有把安裝目錄添加到環境變量 path 中。
添加到環境變量:
我的電腦 -> 右鍵點擊 -> 高級系統設置 -> 高級 -> 環境變量 -> 系統變量 -> path -> 選擇並編輯 -> 把你的安裝目錄,添加到其中
4. 下載 php擴展 php_imagick.dll
更新自己的php版本和系統環境下載相對應的dll。下載地址 http://www.peewit.fr/imagick/
5. 把dll文件重命名為php_imagick.dll,並放到php 擴展文件目錄 php/ext 中。
6. 在 php.ini 配置文件中添加,extension=php_imagick.dll。
7. 重啟電腦,只重啟apache不管用的情況下,重啟下PC。因為擴展底層使用的是imageMagic軟件,所以軟件重啟電腦,重新加載軟件,並刷新path路徑。
8. 重啟后,打開 phpinfo頁面,查看,擴展已經安裝成功。如果還未安裝成功,極有可能imagemagick軟件版本過高,請選擇更低一級的版本安裝。
Linux安裝ImageMagick
1. 依次運行以下命令
yum install ImageMagick yum install ImageMagick-devel yum install php-pear [for PECL]
安裝php-pear是為了使用pecl 中的 phpize
yum -y install php-devel
2. 安裝C編譯器
yum install gcc
如果裝不了gcc就用這個命令:
yum install gcc gcc-c++ autoconf automake
3. 安裝imagick
pecl install imagick
4. 加載imagick到php
在/etc/php.ini 加上extension=imagick.so
5. 重啟service httpd restart
6. 使用 phpinfo() 或運行 php -m | grep imagick 來查看是否安裝成功
好了,環境安裝完了,下面就是代碼實現了(用下面的代碼也可以測試環境是否真的安裝成功,windows環境下php_imagick擴展已經有了但還是報imagick錯誤,弄好久也沒解決我也很絕望)
簡單一點的代碼如下:
1 $pdfpath="yourfile.pdf"; 2 $im = new Imagick(); 3 $im->readImage($pdfpath); 4 $im -> resetIterator(); 5 $imgs = $im->appendImages(true); 6 $imgs->setImageFormat( "jpg" ); 7 $img_name ="123.jpg"; 8 $imgs->writeImage($img_name); 9 $imgs->clear(); 10 $imgs->destroy(); 11 $im->clear(); 12 $im->destroy();
封裝好的代碼如下:
1 /** 2 * PDF2PNG 3 * @param $pdf 待處理的PDF文件 4 * @param $path 待保存的圖片路徑 5 * @param $page 待導出的頁面 -1為全部 0為第一頁 1為第二頁 6 * @return 保存好的圖片路徑和文件名 7 */ 8 function pdf2png($pdf,$path,$page=-1) 9 { 10 if(!extension_loaded('imagick')) 11 { 12 return false; 13 } 14 if(!file_exists($pdf)) 15 { 16 return false; 17 } 18 19 $im = new Imagick(); 20 $im->setResolution(500,500);//設置圖像分辨率 21 $im->setCompressionQuality(100);//設置默認的壓縮質量 22 if($page==-1) 23 $im->readImage($pdf); 24 else 25 $im->readImage($pdf.'['.$page.']'); 26 foreach ($im as $Key => $Var) 27 { 28 $Var->setImageFormat('jpg'); 29 $filename = $path.'/'. md5($Key.time()).'.jpg'; 30 if($Var->writeImage($filename) == true) 31 { 32 $Return[] = $filename; 33 } 34 } 35 return $Return; 36 } 37 $path='images';//請確保當前目錄下有這個文件夾PHP Fatal error: Uncaught exception 'ImagickException' with message 'PostscriptDelegateFailed `test.pdf': No such file or directory' 38 $s=pdf2png('123.pdf',$path); 39 40 $scount=count($s); 41 42 for($i=0;$i<$scount;$i++) 43 { 44 echo '<div align=center><font color=red>Page '.($i+1).'</font><br><a href=\''.$s[$i].'\' target=_blank><img border=3 height=400 width=300 src=\''.$s[$i].'\'></a></div><p>'; 45 }
如果出現下面的報錯,那就需要安裝GhostScript了
PHP Fatal error: Uncaught exception 'ImagickException' with message 'PostscriptDelegateFailed `test.pdf': No such file or directory'
linux安裝方法如下:
yum install ghostscript
最后附上整個代碼:https://git.coding.net/fallstar/htmltojpg.git
好了,這就是整個的實現過程,經過測試轉一些簡單的網頁是沒有問題的,但要是一些復雜的網頁就沒辦法執行了,其實整個功能的代碼還可以進行封裝一下的,這里就不實現了。雖然整個的過程比較艱辛,中間也試了很多其他的方法,效果不怎么樣就舍棄了,每個功能都是要一步步完善才能做到更加完美的,總得來說收獲還是很大的。