php中網頁生成圖片的方式


在網上找了很多方法,發現與自己最初的思路也是大同小異,那就是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

好了,這就是整個的實現過程,經過測試轉一些簡單的網頁是沒有問題的,但要是一些復雜的網頁就沒辦法執行了,其實整個功能的代碼還可以進行封裝一下的,這里就不實現了。雖然整個的過程比較艱辛,中間也試了很多其他的方法,效果不怎么樣就舍棄了,每個功能都是要一步步完善才能做到更加完美的,總得來說收獲還是很大的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM