需求描述:根據訂單經過模板合同生成新的PDF合同經過e籤寶簽約後轉爲圖片給用戶下載。php
需求整理:html
1.如何生成PDF文件:使用TCPDF擴展生成。思考:linux
⑴爲了方便將模板中的固定佔位符替換爲訂單中的內容,使用靜態html頁面保存合同模板的方式保存web
⑵使用TCPDF將html轉換爲pdf文檔,能夠儘可能保證合同格式的一致性canvas
2.將生成的PDF合同經過e籤寶的簽約流程進行圖章簽署。具體流程忽略:對比e籤寶簽約流程windows
3.將簽約後的新PDF合同轉換爲圖片。思考:服務器
⑴使用php的Imagick擴展實現(坑之所在)app
實現流程:composer
1.安裝TCPDF擴展,這個都是原生的PHP代碼庫比較簡單,依賴composer。在要安裝的目錄命令行直接敲:tcp
composer require smalot/pdfparser
2.安裝Imagick擴展,這個流程比較多。能夠參考下面連接(感謝感謝):
https://www.cnblogs.com/jinxiblog/p/8053008.html --windows環境安裝(我是windows開發環境,使用這個沒毛病)
https://www.osyunwei.com/archives/5327.html --linux環境安裝(沒測試過,留給之後測試)
https://blog.csdn.net/webben/article/details/64125470 --linux環境安裝(沒測試過,留給之後測試)
3.第一個坑,Imagick裝好就好了嗎?並否則,網上找了不少資料後表面Imagick的運行機制大概是php經過Imagick擴展調用本機安裝的Imagemagic提供的接口來處理圖片,另外若是你要readImage的是一個PDF文件那麼還有一個前提就是Imagemagic應用自己還會調用ghostscript這個玩意。
由於咱們的需求是將PDF轉換爲圖片而不是普通的圖片文件處理,因此ghostscript也是咱們必需要安裝的。linux下同理。若是沒安裝的話會出現諸以下面的錯誤:
Postscript delegate failed `/Uploads/Download/2016-09/57d0fb5b3612d.pdf': No such file or directory @ error/pdf.c/ReadPDFImage/664
看看Imagick下面官方說明:
4.安裝ghostscript,官網上根據本身的環境下載不一樣安裝包,若是phpinfo()中的php是X86的話記得要選32位的安裝包下載,裝完後記得重啓。本人重啓了n次才忽然間成功
https://www.ghostscript.com/download.html --下載連接
5.到這裏基本的依賴已經安裝完畢,貼下本地實驗代碼以下:
require_once 'vendor/autoload.php';
//PDF文件生成 $tcpdf = new TCPDF(); $tcpdf->SetCreator('Hello'); $tcpdf->SetAuthor('walter'); $tcpdf->SetTitle('test pdf'); $tcpdf->SetSubject('subject'); $tcpdf->SetKeywords('walter,pdf,php'); $tcpdf->setHeaderData('logo_example.png',20,'標題','子標題',array(0,64,255),array(0,64,128)); $tcpdf->setFooterData(array(0,64,0),array(0,64,128)); $tcpdf->setHeaderFont(['stsongstdlight', '', '10']); //設置字體 $tcpdf->setFooterFont(['helvetica', '', '8']); //設置字體 $tcpdf->SetDefaultMonospacedFont('courier'); //設置字體 $tcpdf->SetMargins(15,27,15); $tcpdf->setHeaderMargin(5); $tcpdf->setFooterMargin(10); $tcpdf->SetAutoPageBreak(true,25); $tcpdf->setImageScale(1.25); $tcpdf->setFontSubsetting(true); $tcpdf->SetFont('stsongstdlight','',14); //設置字體 // $tcpdf->AddPage(); $html = file_get_contents('contract.html'); $tcpdf->writeHTMLCell(0,0,'','',$html,0,1,0,true,'',true); //寫入html $tcpdf->Output(__DIR__.DIRECTORY_SEPARATOR.'contract.pdf','F'); //生成pdf文件並保存到本地 //pdf合併轉換一張圖片 function pdf2png($from_path,$target_path){ try{ $img = new Imagick(); $img->setCompressionQuality(100); $img->setResolution(120,120); $img->readImage($from_path); $canvas = new Imagick(); $imgNum = $img->getNumberImages(); foreach ($img as $k => $sub){ $sub->setImageFormat('png'); $sub->stripImage(); $sub->trimImage(0); $width = $sub->getImageWidth() + 10; $height = $sub->getImageHeight() + 10; if ($k + 1 == $imgNum) $height += 10; $canvas->newImage($width,$height,new ImagickPixel('white')); $canvas->compositeImage($sub,Imagick::COMPOSITE_DEFAULT,5,5); } $canvas->resetIterator(); $canvas->appendImages(true)->writeImage($target_path); return true; }catch (Exception $e){ echo $e->getMessage(); echo $e->getTraceAsString(); return false; } //pdf文件轉換爲一張圖片 $pdf_path = __DIR__.DIRECTORY_SEPARATOR.'contract.pdf'; if (is_file($pdf_path)){ var_dump(pdf2png($pdf_path,__DIR__.DIRECTORY_SEPARATOR.'contract.png')); }else{ echo 'file not exist'; }
至此本地測試沒毛病一切OK
PDF文件 生成的圖片
6.正式服務器上測試(最大的坑來了),生成PDF文件一切OK,到了轉換圖片的時候就:
一遍空白!!!!!!神坑
一遍度娘亂七八糟的資料後發現根本沒有這方面的資料。偶爾在百度提問裏面看到有人又相似說法是,Imagick->readImage的時候中文編碼的問題。雖然不太對可是在萬能的stackoverflow有人提過相似的問題
通過不停的踩坑發現是ghostscript這個坑貨的問題,在linux下安裝ghostscript的時候沒有對應生成cidfmap文件來支持各類字體,在windows環境安裝的時候已經在lib目錄下面生成了這個配置文件。因此須要在linux環境下新建一個cidfmap文件而且將咱們要支持的字體放到linux下來:
http://www.voidcn.com/article/p-fdqtdali-rx.html --參考連接
這樣就好了嗎?尚未.......看看代碼裏面我生成pdf時設置了什麼字體?這些是adobe公司默認的字體,可是比較不統一。你代碼裏面要設什麼字體就得把對應的ttf字體文件放到linux下從新對應cidfmap的字體格式設置一遍。
$tcpdf->SetFont('stsongstdlight','',14); $tcpdf->setHeaderFont(['stsongstdlight', '', '10']); $tcpdf->setFooterFont(['helvetica', '', '8']); $tcpdf->SetDefaultMonospacedFont('courier');
爲了不麻煩我在windows的字體庫裏面拿了一個simhei字體(簡體字)放到linux下配置好,最後發現這個字體不是TCPDF擴展內置的(坑)。還好tcpdf庫提供了一個添加字體的腳本,具體路徑以下:
把要新增的simhei字體放進來命令行輸入以下命令:
#\tools>php ./tcpdf_addfont.php -b -i simhei.ttf >>> Converting fonts for TCPDF: *** Output dir set to D:\phpStudy2016\WWW\mugua\muguaadmin\public\task\pdf\vendo r\tecnickcom\tcpdf/fonts/ +++ OK : D:\phpStudy2016\WWW\mugua\muguaadmin\public\task\pdf\vendor\tecnickco m\tcpdf\tools\simhei.ttf added as simhei >>> Process successfully completed!
恭喜你,爬坑完畢字體終於能夠正常使用,生成的圖片不再是空白了