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