nodejs+phantom html转pdf问题整理

简单说下背景:为了实现本人一个云开发小程序《微作简历》的简历下载,不得不自己摸索着搞一搞简单服务端。于是就有了这一次的爬坑经历。在决定通过接口下载文件之后。选了选使用的技术(++加黑字体是我最终选用的技术++).

  1. 搭建简易后台服务器:nodejs+express
  2. 实现html转pdf的工具:html-pdf,wkhtmltopdf,phantom
  3. phantom要爬取的web网页以便生成pdf: 绘制简历模板页面放入web服务器上

一,实现需求的思路

a: 小程序客户端

b: 小程序云开发

c: nodejs+express后台服务

d: nodejs web 网页服务

==a== 长按事件触发下载接口调用 ==c== 的接口触发==d==网页请求==c==向==b==请求数据返回渲染页面后由==d==抓取页面并生成pdf文件后返回流至==a==

graph LR

a --> c

c --> d

d --> c

c --> b

二,问题及处理

1. web服务器通过ip+端口号访问可行,通过域名加端口号访问不可行?

可以看出之所以域名+端口号访问不成功是因为刚开始启动的serve.js中listen()未入参hostname,加入hostname之后就可以了。参照nodejs/server.listen

    web 服务器启动脚本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)
    // 问题产生及解决 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}/`);
    // });
    // 问题产生及解决 end
    function normalizePort(val) { // 判断有无端口号
        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) {
        // 解析请求
        let pathName = __dirname + url.parse(request.url).pathname
        let pageUrl = pathName.charAt(pathName.length - 1) == "/"?(pathName+="index.html"):pathName
        // 获得对应本地文件路径
        // let filepath = path.join(root, pageUrl)
        // 获取文件状态
        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. 后台服务器phantom做的html2pdf接口,本地测试可行,上传服务器后不可行,具体问题细分如下:(后台服务器搭建参照nodejs,express,mysql搭建web服务器(提供api接口))
  • linux cents os系统 npm安装phantom失败
代码上传至服务器,npm i。会报错phantomjs-2.1.1-linux-x86_64.tar.bz2解压失败
经排查.bz2解压需要安装bzip2,yum -y install bzip2.x86_64。安装成功之后再次npm就可以了  
  • 服务器上 phantom 执行报错EPIPE Write

stark overflow / PhantomJS from Node on Windows

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

此错误,查询半天在stark overflow的一篇相关问答中,回答者提出依赖环境相关概念,而后在一篇博客中有着linux/cents os下部署phantomjs。

yum install fontconfig freetype2

执行语句安装依赖之后,该问题解决

  • 本地转化生成pdf数据健全,服务器上生成pdf缺失

phantomjs乱码问题生产环境处理方案

服务器上生成pdf,打开一看里面只有数字,或者英文,数据残缺。
一开始我以为是phantomjs在页面未渲染完毕前转化导致,后经一位
后端开发朋友提醒可能是缺失中文字体导致的。遂按照这个思路在csdn上的一篇文章中按照步骤安装字体后成功解决。

  1. http添加ssl使用https供小程序调用
    本人使用的阿里云服务器,按照相关文档使用了免费的ssl.不做细说
  1. 参数路由传递过程中,解析报错

js字符串转换为对象格式

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

解析testObj时报错
string转obj的三种方式
1,JSON.parse(str)
2, new Function('return '+str)()
3, eval("(" + str + ")");
最终解决,严格按照JSON格式传入数据{"key":"value","key2":"value2"}采用JSON.parse(str)


end

以上为本次dome所遇到的问题,以及翻阅的相关文章。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343

推荐阅读更多精彩内容