nodejs+phantom html轉(zhuǎn)pdf問(wèn)題整理

簡(jiǎn)單說(shuō)下背景:為了實(shí)現(xiàn)本人一個(gè)云開(kāi)發(fā)小程序《微作簡(jiǎn)歷》的簡(jiǎn)歷下載,不得不自己摸索著搞一搞簡(jiǎn)單服務(wù)端。于是就有了這一次的爬坑經(jīng)歷。在決定通過(guò)接口下載文件之后。選了選使用的技術(shù)(++加黑字體是我最終選用的技術(shù)++).

  1. 搭建簡(jiǎn)易后臺(tái)服務(wù)器:nodejs+express
  2. 實(shí)現(xiàn)html轉(zhuǎn)pdf的工具:html-pdf,wkhtmltopdf,phantom
  3. phantom要爬取的web網(wǎng)頁(yè)以便生成pdf: 繪制簡(jiǎn)歷模板頁(yè)面放入web服務(wù)器上

一,實(shí)現(xiàn)需求的思路

a: 小程序客戶(hù)端

b: 小程序云開(kāi)發(fā)

c: nodejs+express后臺(tái)服務(wù)

d: nodejs web 網(wǎng)頁(yè)服務(wù)

==a== 長(zhǎng)按事件觸發(fā)下載接口調(diào)用 ==c== 的接口觸發(fā)==d==網(wǎng)頁(yè)請(qǐng)求==c==向==b==請(qǐng)求數(shù)據(jù)返回渲染頁(yè)面后由==d==抓取頁(yè)面并生成pdf文件后返回流至==a==

graph LR

a --> c

c --> d

d --> c

c --> b

二,問(wèn)題及處理

1. web服務(wù)器通過(guò)ip+端口號(hào)訪(fǎng)問(wèn)可行,通過(guò)域名加端口號(hào)訪(fǎng)問(wèn)不可行?

可以看出之所以域名+端口號(hào)訪(fǎng)問(wèn)不成功是因?yàn)閯傞_(kāi)始啟動(dòng)的serve.js中l(wèi)isten()未入?yún)ostname,加入hostname之后就可以了。參照nodejs/server.listen

    web 服務(wù)器啟動(dòng)腳本serve.js
    
    let http = require("http");
    let fs = require("fs");
    let url = require("url");
    let path = require("path");

    let root = path.resolve(process.argv[2]||'.')
    let dir = process.argv[2] || ''

    console.log("path/root:"+root)
    console.log(__dirname)
    // 問(wèn)題產(chǎn)生及解決 start
    // const hostname = '0.0.0.0';
    const port = normalizePort(process.env.PORT || '8081');

    const server = http.createServer(app);
    server.listen(port, () => {
        console.log(`Server running at prot:${port}/`);
    });
    // server.listen(port, hostname, () => {
    //    console.log(`Server running at http://${hostname}:${port}/`);
    // });
    // 問(wèn)題產(chǎn)生及解決 end
    function normalizePort(val) { // 判斷有無(wú)端口號(hào)
        var port = parseInt(val, 10);
      
        if (isNaN(port)) {
          // named pipe
          return val;
        }
      
        if (port >= 0) {
          // port number
          return port;
        }
      
        return false;
    }

    function app(request, response) {
        // 解析請(qǐng)求
        let pathName = __dirname + url.parse(request.url).pathname
        let pageUrl = pathName.charAt(pathName.length - 1) == "/"?(pathName+="index.html"):pathName
        // 獲得對(duì)應(yīng)本地文件路徑
        // let filepath = path.join(root, pageUrl)
        // 獲取文件狀態(tài)
        fs.stat(pageUrl,(err, stats)=>{
            if(!err && stats.isFile()) {
                // 文件存在且正常
                response.writeHead(200);
                fs.createReadStream(pageUrl).pipe(response)
            } else {
                response.writeHead(404);
                // response.end('404 Page')
                fs.createReadStream(__dirname + "/index.html").pipe(response)
            }
        })
    }

    
  1. 后臺(tái)服務(wù)器phantom做的html2pdf接口,本地測(cè)試可行,上傳服務(wù)器后不可行,具體問(wèn)題細(xì)分如下:(后臺(tái)服務(wù)器搭建參照nodejs,express,mysql搭建web服務(wù)器(提供api接口))
  • linux cents os系統(tǒng) npm安裝phantom失敗
代碼上傳至服務(wù)器,npm i。會(huì)報(bào)錯(cuò)phantomjs-2.1.1-linux-x86_64.tar.bz2解壓失敗
經(jīng)排查.bz2解壓需要安裝bzip2,yum -y install bzip2.x86_64。安裝成功之后再次npm就可以了  
  • 服務(wù)器上 phantom 執(zhí)行報(bào)錯(cuò)EPIPE Write

stark overflow / PhantomJS from Node on Windows

Linux/Centos下安裝部署phantomjs 及使用

此錯(cuò)誤,查詢(xún)半天在stark overflow的一篇相關(guān)問(wèn)答中,回答者提出依賴(lài)環(huán)境相關(guān)概念,而后在一篇博客中有著linux/cents os下部署phantomjs。

yum install fontconfig freetype2

執(zhí)行語(yǔ)句安裝依賴(lài)之后,該問(wèn)題解決

  • 本地轉(zhuǎn)化生成pdf數(shù)據(jù)健全,服務(wù)器上生成pdf缺失

phantomjs亂碼問(wèn)題生產(chǎn)環(huán)境處理方案

服務(wù)器上生成pdf,打開(kāi)一看里面只有數(shù)字,或者英文,數(shù)據(jù)殘缺。
一開(kāi)始我以為是phantomjs在頁(yè)面未渲染完畢前轉(zhuǎn)化導(dǎo)致,后經(jīng)一位
后端開(kāi)發(fā)朋友提醒可能是缺失中文字體導(dǎo)致的。遂按照這個(gè)思路在csdn上的一篇文章中按照步驟安裝字體后成功解決。

  1. http添加ssl使用https供小程序調(diào)用
    本人使用的阿里云服務(wù)器,按照相關(guān)文檔使用了免費(fèi)的ssl.不做細(xì)說(shuō)
  1. 參數(shù)路由傳遞過(guò)程中,解析報(bào)錯(cuò)

js字符串轉(zhuǎn)換為對(duì)象格式

http://url?testObj={"a":123,"b":456}

解析testObj時(shí)報(bào)錯(cuò)
string轉(zhuǎn)obj的三種方式
1,JSON.parse(str)
2, new Function('return '+str)()
3, eval("(" + str + ")");
最終解決,嚴(yán)格按照J(rèn)SON格式傳入數(shù)據(jù){"key":"value","key2":"value2"}采用JSON.parse(str)


end

以上為本次dome所遇到的問(wèn)題,以及翻閱的相關(guān)文章。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,825評(píng)論 6 546
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,814評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 178,980評(píng)論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 64,064評(píng)論 1 319
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,779評(píng)論 6 414
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 56,109評(píng)論 1 330
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,099評(píng)論 3 450
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 43,287評(píng)論 0 291
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,799評(píng)論 1 338
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,515評(píng)論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,750評(píng)論 1 375
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,221評(píng)論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,933評(píng)論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 35,327評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,667評(píng)論 1 296
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,492評(píng)論 3 400
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,703評(píng)論 2 380

推薦閱讀更多精彩內(nèi)容