专栏首页拂晓风起nodejs搭配phantomjs highcharts后台生成图表

nodejs搭配phantomjs highcharts后台生成图表

简单分享一下,后台使用nodejs结合highcharts、phantomjs生成报表图片的方法。这主要应用在日报邮件。

主要参考以下资料:

关键是使用phantomjs模拟浏览器环境,这个是一个绿色的程序,无需安装。win7和64bit linux上亲测ok。

然后,大概我们需要部署一个类似这样的环境(代码地址 https://github.com/kenkozheng/HTML5_research/tree/master/NodeJS-Highcharts ):

phantomjs是linux版,phantomjs.exe就是windows版。

那么在windows下,我们可以写:

var process = require("child_process");
process.exec('phantomjs.exe ./highcharts/highcharts-convert.js -infile options1.json -outfile chart1.png -constr Chart', {cwd: './'}, function (err, stdout, stderr) {
    console.log(err, stdout, stderr);
});

options1.json就是我们配置的数据。 需要注意的是,到了linux下,需要改为exec(‘./phantomjs …. 。 当然,熟悉linux的同学都可以忽略我说的废话了。

当然,为了更方便使用,稍稍修改一下highcharts-convert.js,增加一个input参数,直接传入数据,而不需要读文件。

为了避免空格引号什么的问题,这里encode一下。

          for (i = 0; i < system.args.length; i += 1) {
               if (system.args[i].charAt(0) === '-') {
                    key = system.args[i].substr(1, i.length);
                    if (key === 'infile' || key === 'callback' || key === 'dataoptions' || key === 'globaloptions' || key === 'customcode') {
                         // get string from file
                         try {
                              map[key] = fs.read(system.args[i + 1]).replace(/^\s+/, '');
                         } catch (e) {
                              console.log('Error: cannot find file, ' + system.args[i + 1]);
                              phantom.exit();
                         }
                    } else if(key === 'input'){
                    map['infile'] = decodeURIComponent(system.args[i + 1]);     //这里是修改的部分
                } else {
                    map[key] = system.args[i + 1];
                }
               }
          }

修改后就可以这么玩了:

var process = require("child_process");
var data = {
    xAxis: {
        categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
            'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
    },
    series: [{
        data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0,
            135.6, 148.5, 216.4, 194.1, 95.6, 54.4]
    }]
};
process.exec('phantomjs.exe ./highcharts/highcharts-convert.js -input ' + encodeURIComponent(JSON.stringify(data)) + ' -outfile chart1.png -constr Chart', {cwd: './'}, function (err, stdout, stderr) {
    console.log(err, stdout, stderr);
});

另外,在linux下,还可能遇到生成图片后,字体无法显示的问题。

到/usr/share/fonts/里边补回相应的字体文件即可(可以直接把windows的复制过去)。 复制过去后,需要fc -cache -fv一下,刷新一下系统的字体缓存。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 杀人游戏 捉鬼游戏 发牌器(Android安卓手机,苹果手机,智能手机通用)

    用户1258909
  • 关于前后端同构,我的一点思路和心得(vue、nodejs、react、模版)

    用户1258909
  • 让tomcat跑起php(caucho quercus简单用法,tomcat运行php)

    用户1258909
  • 一日一技:使用异或操作对数字进行加密解密

    假设密钥为88882222,QQ密码为4455661122,那么可以使用密钥对QQ密码进行加密:

    青南
  • 最最简单的~WordCount¬

    步骤1:textFile先生成HadoopRDD,然后再通过map操作生成MappedRDD.

    用户3003813
  • 【玩转腾讯云】Python安装第三方库/包的一些操作

    最近在腾讯云上进行Python装包比较频繁,又碰上一些特殊情况,现就此进行简单总结。

    ZNing
  • Python中 *args 和 **kwargs的用法

    总是会在一些代码中看到*args和**kwargs,一直不知道具体怎么用,今天整理了一下:

    BigYoung小站
  • 面向简历学习-数仓工程师成名之道

    废话不说,直奔主题,我们聊一下该如何学习。居士的观点很简单,就是标题的内容:面向简历学习!

    大蕉
  • JVMTI第二种实现Agent方式

    {JAVA_HOME}/include/win32 -LD Agent2.cpp -FeAgent2.dll

    用户1418372
  • 搭建websocket消息推送服务,必须要考虑的几个问题

    近年,不论是正在快速增长的直播,远程教育以及IM聊天场景,还是在常规企业级系统中用到的系统提醒,对websocket的需求越来越大,对websocket的要求也...

    GoEasy消息推送

扫码关注云+社区

领取腾讯云代金券