highcharts 结合phantomjs纯后台生成图片
highcharts 结合phantomjs纯后台生成图片
highcharts 这个图表展示插件我想大家应该都知道,纯javascript编写,相比那些flash图表插件有很大的优势,至少浏览器不用考虑是否装了flash插件,功能也非常的强大,详细请看官网 ,我就不做多介绍了。
那今天咱们讨论的难题是我们平时用highchart生成图片时,首先要在前端展示出图表,然后通过图表的API 按钮或者自定义的按钮 来向后台发起请求,后台获取到图片的SVG信息时,然后根据SVG的信息生成对应的图片或者PDF文件输出到流供客户端下载或者直接保存在服务端。
那么这个图片生成必须依赖前台生成的图表来触发,那有些图片我们又想自动生成又不需要前端,生成后直接通过邮件发送或者写入word文件,该如何做呢?
有人会想可以模拟前台自动向后台发送请求,我这样试过,效率非常不敬人意!后来看了官方的一些介绍,引入了phantomjs 这个好东西,它是个javascript引擎库,基于webkit内核,能解析前台的HTML及javascript并生成对应的图片,最重要的一点是它能够以服务的形式独立运行在后端,接下来是详细步骤:
下载phantomjs,在网站任意目录下新建一个文件夹放入 phantomjs.exe 和highchart官方出的 phantomjs解析插件highcharts-convert.js和一些相关js如下图所示:

注解: 红线方框的是必备文件。
- 准备好这些文件后,我们开始来写后台代码(这里我用的C#,其他语言也应该有对应的写法,就是调用exe文件有点点区别)
1
/// <summary>
/// 控制台应用程序处理保存图片
/// </summary>
/// <param name="ListChartJsonPath">图片数组</param>
/// <returns>返回hashtable</returns>
private Hashtable HandleImages(List<string> ListChartJsonPath)
{
#region 启动进程保存图片
Hashtable ht = new Hashtable();
for (int i = 0; i < ListChartJsonPath.Count; i++)
{
Process p = new Process();
p.StartInfo.FileName = Server.MapPath(@"\GenerateImage\phantomjs.exe");
//定义图片名称
string filename = "divchart" + (i + 1).ToString() + Guid.NewGuid().ToString();
ht.Add("divchart" + (i + 1).ToString(), filename);
string outfile = Server.MapPath(@"\ImageTemp\" + filename + ".png");
string infile = ListChartJsonPath[i];
string ExcuteArg = Server.MapPath(@"\GenerateImage\highcharts-convert.js") + " -infile " + infile + " -outfile " + outfile + " -scale 2.5 -width 700 -constr Chart";
p.StartInfo.Arguments = string.Format(ExcuteArg);
p.StartInfo.CreateNoWindow = true;
p.StartInfo.UseShellExecute = false;
//重定向标准输出
p.StartInfo.RedirectStandardOutput = true;
//重定向错误输出
p.StartInfo.RedirectStandardError = false; ;
p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;
if (!p.Start())
{ throw new Exception("无法启动Headless测试引擎."); }
//string[] result = p.StandardOutput.ReadToEnd().Split(new char[] { '\r', '\n' });
p.WaitForExit();
p.Close(); }
return ht;
#endregion
}
分析:
这段代码大家应该不会太陌生,主要是调用web应用程序下的 phantomjs.exe 无窗口模式,它有几个参数需要为大家解释下,outfile是输出的图片路径,infile是输入图片的参数,格式和生成图表的写法一致,可以是json,也可以是一个js文件。(有部分人不太理解infile ,实际就是传入json格式文本,我highchart所有图片数据都是事先生成好json文件,上面ListChartJsonPath集合实际上保存了所有图片json的路径,将此路径传入phantomjs会根据 highcharts-convert.js 去解析json),width是宽度。这里定义了一个hashtable用来存放图片的名称和和路径,最后返回hashtable。
下面是事先生成好的json文件如以下截图的文件,文件里的内容就是json文本:

1 |
{
|
总结与梳理
- 准备相关文件
- 准备生成图片的json文件,这个json文件可以批量生成,请看上面截图,我是如何批量生成的?我在文件夹的目录下建了一个通用的highchart json模板文件(如我上面截图里的 OptionsTemp.json 文件),这个文件将报表的 通用参数给抽离出来,后台生成json文件里直接读取这个文件,然后从数据库获取数据替换json里面的变量重新生成一份新的json文件。
- 后台方法调用phantomjs.exe 传入图片生成的路径、json文件(或者json),定义图片的宽度和质量
- 最后生成完毕,如何处理接下来的图片就看你们自己的业务需求了
另外还有一种方式是将phantomjs部署成服务,一直运行着,后台发送请求给这个服务生成图片,
java和php web服务版本请参考 http://www.highcharts.com/docs/export-module/setting-up-the-server
.net web版请参考 https://github.com/imclem/Highcharts-export-module-asp.net
部署 phantomjs.exe webServer 版本请参考 http://www.highcharts.com/docs/export-module/render-charts-serverside
很高兴大家关注我的文章,最近很多人发邮件给我留言让我分享下代码,满足大家的要求,提供了一个.NET winform 版本的项目。里面函盖 利用phantomjs 截取网页快照 及 纯后台生成 highchart 图片。

下载地址:点击此处下载DEMO
highcharts 结合phantomjs纯后台生成图片的更多相关文章
- highcharts 结合phantomjs纯后台生成图片系列二之php2
上篇文章中介绍了phantomjs的使用场景,方法. 本篇文章详细介绍使用php,highcharts 结合phantomjs纯后台生成图片.包含一步步详细的php代码 一.highcharts 结合 ...
- highcharts 结合phantomjs纯后台生成图片系列二之php
上篇文章中介绍了phantomjs的使用场景,方法.本篇文章详细介绍使用php,highcharts 结合phantomjs纯后台生成图片. 一.准备: 下载phantomjs解析插件,从 highc ...
- 纯后台生成highcharts图片有哪些方法?
比如说,领导抛给你一个需求,把一些数据做成图表,每天通过邮件发送,让领导能在邮件中就看到图片,你会有什么思路呢?本人使用的是phantomjs这个神器,它的内核是WebKit引擎,不提供图形界面,只能 ...
- Highcharts结合PhantomJS在服务端生成高质量的图表图片
项目背景 最近忙着给部门开发一套交互式的报表系统,来替换原有的静态报表系统. 老系统是基于dotnetCHARTING开发的,dotnetCHARTING的优势是图表类型丰富,接口调用简单,使用时只需 ...
- Phantomjs实现后端生成图片文件
目录 PhantomJS简介 了解rasterize.js 使用方法 今天,给大家分享一个Java后端利用Phantomjs实现生成图片的功能,同学们使用的时候,可以参考下! PhantomJS简介 ...
- C#曲线分析平台的制作(四,highcharts+ajax加载后台数据)
在上一篇博客:C#曲线分析平台的制作(三,三层构架+echarts显示)中已经完成了后台的三层构架的简单搭建,为实现后面的拓展应用开发和review 改写提供了方便.而在曲线分析平台中,往往有要求时间 ...
- Windows Phone 使用 WriteableBitmap后台生成图片
这几天项目是遇到一个需求,需要后台把几个元素生成到一张图片上,并保存到文件中 private void cutscreen_Click(object sender, EventArgs e) { Gr ...
- Highcharts.js -纯javasctipt图表库初体验
一.highcharts简介以及引入 highcharts作为免费提供给个人学习.个人网站和非商业用途使用的前端图表演示插件的确使用起来十分方便和轻便.在我最近完成一个需求的时候用到了它, 它的兼容性 ...
- Django开发纯后台服务的时候遇到CSRF引起的报错
Django视图: 当请求为post请求时会遇到CSRF的报错,Django针对CSRF的保护措施是在生成的每个表单中放置一个自动生成的令牌,通过这个令牌判断POST请求是否来自同一个网站,只需要在f ...
随机推荐
- Perl 关于 use strict 的用法
什么场合要用 use strict 当你的程序有一定的行数时,尤其是在一页放不下时,或者是你找不到发生错误的原因时. 为什么要用 use strict? 众多的原因之一是帮你寻找因为错误拼写造成的错误 ...
- XAML 概述四
这一节我们来简单介绍一下XAML的加载和编译,它包括如下三种方式: · 只使用代码 · 使用代码和未编译的XAML · 使用代码和编译过的BAML 一. 只使用代码 我们首先创建一个简单的控制台 ...
- CentOS thrift python demo
编辑接口文件 hellowworld.thrift service HelloWorld { string ping(), string say(1:string msg) } 编辑 server.p ...
- vim中执行shell命令小结
vim中执行shell命令,有以下几种形式 1):!command 不退出vim,并执行shell命令command,将命令输出显示在vim的命令区域,不会改变当前编辑的文件的内容 例如:!ls -l ...
- Text Template Transformation Toolkit
Text Template Transformation Toolkit 1.且算简介 笔者以一个英文字母和一个数字取了一个简单的名字.名唤"T4"(名 ...
- UML类图关系大全-转
1.关联 双向关联: C1-C2:指双方都知道对方的存在,都可以调用对方的公共属性和方法. 在GOF的设计模式书上是这样描述的:虽然在分析阶段这种关系是适用的,但我们觉得它对于描述设计模式内的类关系来 ...
- div 布局2
转:http://www.kwstu.com/ArticleView/divcss_2013929173533658 关于DIV+CSS布局中用到的CSS必备知识请看:http://www.kwstu ...
- asp.net 中插入数据到access
这样报语法错误: insert into Menu_wx(userid,menutype,MenuID,menuname,MenuTitle,Url,Key,OrderValue,State) val ...
- 1084: [SCOI2005]最大子矩阵 - BZOJ
Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. Input 第一行为n,m,k(1≤n≤100,1≤m≤2 ...
- 2064: 分裂 - BZOJ
Description 背景: 和久必分,分久必和... 题目描述: 中国历史上上分分和和次数非常多..通读中国历史的WJMZBMR表示毫无压力. 同时经常搞OI的他把这个变成了一个数学模型. 假设中 ...