最近幫同事作pdf導出功能,他選擇了dompdf,結果在裏面遇到了幾個小坑。簡單記錄一下是什麼狀況和怎麼解決的
1.不支持漢字
最開始的時候發現只要是漢字的地方所有變成? ,查了一下才發現是字體支持的問題。找到了一個相對靠譜的方法,下載安裝了字體,結果卻發現沒什麼卵用。
按照連接裏面的內容要求,我檢查了各個地方都沒問題,然而卻不起做用,最後我抱着試一試的心態,除了修改dompdf_font_family_cache.php這個文件,還一併修改了dompdf_font_family_cache.dist.php,修改完以後問題順利解決,漢字能正常顯示。php
2.生成的pdf文件超大
漢字能正常顯示完了以後又發生了另外一個問題,我生成了三頁pdf可是文件大小卻達到了3.9M,去掉全部圖片以後也有3.6M,排查下來發現問題仍是出在漢字上,我當時選的是宋體,宋體的字體文件大小達到6.69M,彷佛在生成pdf的時候會把字體文件一塊兒嵌入。而後我開始尋找超小的字體文件,同時在github上跟做者反饋這個問題,詢問有沒有參數能解決這個問題。最後找到了一個比較合適的字體,方正超粗黑簡體,1.6M,生成了7頁pdf也只有2M不到,不過這個仍是偏大,用tcpdf生成能夠達到幾百k。以後做者回復我說有個參數,文檔裏面沒註明的,叫 啓用字體子集,isFontSubsettingEnabled,字體子集僅使用PDF中存在的字形從新建立字體。對於具備大量字符子集的任何表意語言,能夠節省大量空間。(文檔裏面沒寫真的是太坑爹了)html
$dompdf = new Dompdf() $dompdf->set_option('isFontSubsettingEnabled', true);
加了這個參數以後,7頁pdf的文件大小降到了729k。android
3.添加頁碼
這個方法是我在overstackflow裏面找到並改裝的,ios
$pdfManager = new DOMPDF(); $pdfManager->loadHtml($html); $pdfManager->render(); $canvas = $pdfManager->get_canvas(); $footer = $canvas->open_object(); $w = $canvas->get_width(); $h = $canvas->get_height(); $canvas->page_text($w-60,28," {PAGE_NUM} / {PAGE_COUNT}", '',12); $canvas->close_object(); $canvas->add_object($footer,"all"); return $pdfManager->stream();
$html就是html代碼,貼上以後應該是能夠直接生效的git
4.兼容
由於使用了冷門字體,致使pdf離開windows以後就漢字顯示不出來,只能用比較經常使用的中文字體來解決,親測用宋體能在windows/mac/ios/android同時顯示。在github上提了這個問題了。若是做者有回覆我再回來繼續更新github