年前也做了一些東西,由於過年只顧瘋了,也沒有整理,年后補上把~ 今天整理一下個phantomjs截圖實踐中遇到的問題。
最近做的一個項目,需要在首頁展示已經做的一些項目的縮略圖,方便在查找的時候,更方便的知道這個項目是一個什么樣的頁面。本身使用的thinkjs寫的系統,所以找到了使用phantomjs進行截圖,所以查到了phantomjs的Web Page Module,可以完成截圖。同時找到了截圖的例子,簡單的截圖就可以直接使用了。但是現實永遠是殘酷的,在使用過程中遇到了一下一些問題:亂碼問題,圖片大小問題,登錄狀態問題。
接下來就上述提到的一些問題,給出我的一些解決方案。
第一:亂碼問題
- gbk亂碼,也就是截圖出現口等亂碼
yum install bitmap-fonts bitmap-fonts-cjk //centos apt-get install xfonts-wqy //ubuntu
安裝了上面的字體,基本上就不會出現亂碼問題了,但是字體還是存在粗細不一致的問題。
- 字體粗細不一致問題
這個問題的原因是截圖服務器上沒有安裝頁面所需的字體,解決方案就是安裝所需字體。如何在centos上安裝字體?
,這里需要注意的是,/usr/share/fonts這個目錄是root權限,可以通過上傳到其他目錄然后移動過來。
第二:圖片大小問題
大致有四種途徑調整:
- viewportSize,這個設置的是頁面預覽的窗口大小,直接影響生成圖片的大小,如果需要全屏,那么這個配置不能過小
- clipRect可以配合viewportSize使用,可以剪切出某個固定大小的圖片
- zoomFactor可以縮放,感覺用起來效果不好
- 如果圖片是在頁面展示的話,可以改變img的大小,這個的問題是有可能壓縮圖片質量,並且原始圖片太大的話,資源比較大(這個方法比較奇葩,慎用)。
第三:登錄狀態問題(cookie問題)
這里需要設置cookie也是一個比較特殊的場景,就是我需要截圖的頁面是需要登錄狀態的,所以需要把頁面的cookie帶過去,這里以登錄cookie為例,其他的cookie是相同的處理方式。
/*以下都是不可缺少的,特別是domain,沒有默認值,這里踩過坑*/ phantom.addCookie({ 'name' : 'cookie-name', 'value' : 'cookie-value', 'path' : '/', 'domain' : domain, 'expires' : (new Date()).getTime() + (1000 * 60 * 60) });
這樣簡單的截圖基本上都可以搞定了,需要注意的時候,如果訪問https的頁面還需要配置:--ignore-ssl-errors=true,簡單的調用例子如下:
phantomjs [options] somescript.js [arg1 [arg2 [...]]]
//option填寫需要的一些參數,比如:--ignore-ssl-errors=true
其他的一些option參數,可以參考:Command Line Interface
phantomjs功能比較多,因為項目需要學習了一下,截圖這個API,其他的需要的可以自己看看。
參考資料: