Highcharts导出图片

概述:

Highcharts是在做项目涉及到统计图的时候大家的首选,同时也会用到highcharts的export功能,将统计图导出为图片,刚好,最近也遇到了这样的事情,总结出来,以备后用。

导出方式:

highcharts导出图片实现有三种:highcharts服务器导出、局域网服务器导出、本地后台导出。

首先,highcharts服务器导出是默认的导出方式,不需要任何操作,只需在chart中配置export参数即可,但是这种导出方式需要联网;

其次,局域网服务器导出,需要在局域网内配置导出的服务器,可参考http://www.highcharts.com/docs/export-module/setting-up-the-server进行配置;

最后,本地后台导出,既不需要联网,也不需要局域网服务器,直接在后台写对应的servlet即可,是本文讲解的重点内容。

导出原理:

Highcharts图表导出(或下载)本质上是将SVG代码转换为不同文件格式的过程,用到的工具是batik,所以所谓导出服务器,只不过是调用batik,将SVG代码转换并下载。参见下图:

在Java中通过SVG生成图片的代码如下:

package com.lzugis.demo;

import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.StringReader;

import org.apache.batik.transcoder.Transcoder;
import org.apache.batik.transcoder.TranscoderException;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.batik.transcoder.image.JPEGTranscoder;
import org.apache.batik.transcoder.image.PNGTranscoder;

public class CreateImg {
	public static void main(String[] args) throws Exception {
		String svg = "<svg height=\"200\" xmlns=\"http://www.w3.org/2000/svg\"><polygon points=\"10,10 75,150 150,60\" style=\"fill:#63BCF7;stroke:black;stroke-width:3\"/></svg>";
		String type="image/png";
		String filename="svg";
		if (null != type && null != svg) {
			svg = svg.replaceAll(":rect", "rect");
			String ext = "";
		    Transcoder t = null;
		    if (type.equals("image/png")) {
				ext = "png";
				t = new PNGTranscoder();
		    }
		    else if (type.equals("image/jpeg")) {
				ext = "jpg";
				t = new JPEGTranscoder();
		    }
		    if (null != t) {
		    	OutputStream out = new FileOutputStream("D:\\"+filename+"."+ext);
		    	TranscoderInput input = new TranscoderInput(new StringReader(svg));
				TranscoderOutput output = new TranscoderOutput(out);
				try{
				    t.transcode(input, output);
				    System.out.println("out");
				}
				catch (TranscoderException e) {
				    e.printStackTrace();
				}
		    }
		}
	}
}

生成后图片效果如下:

在web中,servlet的编写代码如下:

package com.lzugis.demo;

import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.StringReader;

import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.batik.transcoder.Transcoder;
import org.apache.batik.transcoder.TranscoderException;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.batik.transcoder.image.JPEGTranscoder;
import org.apache.batik.transcoder.image.PNGTranscoder;

public class SaveAsImage extends HttpServlet {
	private static final long serialVersionUID = 1L;
	public SaveAsImage() {
		super();
	}

	/**
	 * Destruction of the servlet. <br>
	 */
	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");//设置编码,解决乱码问题
		String type = request.getParameter("type");
		String svg = request.getParameter("svg");
		String filename = request.getParameter("filename");
		filename = filename==null?"chart":filename;
		ServletOutputStream out = response.getOutputStream();
		if (null != type && null != svg) {
		    svg = svg.replaceAll(":rect", "rect");
		    String ext = "";
		    Transcoder t = null;
		    if (type.equals("image/png")) {
				ext = "png";
				t = new PNGTranscoder();
		    }
		    else if (type.equals("image/jpeg")) {
				ext = "jpg";
				t = new JPEGTranscoder();
		    }
		    else if(type.equals("image/svg+xml"))
	            ext = "svg";
		    response.addHeader("Content-Disposition", "attachment; filename="+ filename + "."+ext);
		    response.addHeader("Content-Type", type);

		    if (null != t) {
				TranscoderInput input = new TranscoderInput(new StringReader(svg));
				TranscoderOutput output = new TranscoderOutput(out);

				try {
				    t.transcode(input, output);
				} catch (TranscoderException e) {
				    out.print("Problem transcoding stream. See the web logs for more details.");
				    e.printStackTrace();
				}
		    } else if (ext.equals("svg")) {
		    	OutputStreamWriter writer = new OutputStreamWriter(out, "UTF-8");
		    	writer.append(svg);
		    	writer.close();
		    } else
		    	out.print("Invalid type: " + type);
		} else {
		    response.addHeader("Content-Type", "text/html");
		    out.println("Usage:\n\tParameter [svg]: The DOM Element to be converted." +
		    		"\n\tParameter [type]: The destination MIME type for the elment to be transcoded.");
		}
		out.flush();
		out.close();
	}

	/**
	 * Initialization of the servlet. <br>
	 *
	 * @throws ServletException if an error occurs
	 */
	public void init() throws ServletException {
		// Put your code here
	}

}

web.xml中的servlet的配置如下:

  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>SaveAsImage</servlet-name>
    <servlet-class>com.foxconn.highcharts.demo.SaveAsImage</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>SaveAsImage</servlet-name>
    <url-pattern>/SaveAsImage</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>basic_line.jsp</welcome-file>
  </welcome-file-list>

在前台,调用的方式如下:

        var chart;
        $(document).ready(function(){
            Highcharts.setOptions({
                lang: {
                    printChart:"打印图表",
                    downloadJPEG: "下载JPEG 图片" ,
                    downloadPDF: "下载PDF文档"  ,
                    downloadPNG: "下载PNG 图片"  ,
                    downloadSVG: "下载SVG 矢量图" ,
                    exportButtonTitle: "导出图片"
                }
            });
            chart = new Highcharts.Chart({
                chart: {
                    renderTo: 'container',
                    defaultSeriesType: 'line',
                    marginRight: 130,
                    marginBottom: 25
                },
                title: {
                    text: 'Monthly Average Temperature',
                    x: -20    //center
                },
                subtitle: {
                    text: '测试中文乱码',
                    x: -20
                },
                xAxis: {
                    categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
                        'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
                },
                yAxis: {
                    title: {
                        text: 'Temperature (°C)'
                    },
                    plotLines: [{
                        value: 0,
                        width: 1,
                        color: '#808080'
                    }]
                },
                exporting:{
                    enabled:true,
                    filename:'class-booking-chart',
                    url:'http://localhost:8081/HighChartsDemo/SaveAsImage'
                },
                tooltip: {
                    formatter: function(){
                        return '<b>' + this.series.name + '</b><br/>' +
                                this.x + ': ' + this.y + '°C';
                    }
                },
                legend: {
                    layout: 'vertical',
                    align: 'right',
                    verticalAlign: 'middle',
                    borderWidth: 0
                },
                series: [{
                    name: 'Tokyo',
                    data: [7.0, 6.9, 9.5, 14.5, 18.2, 21.5, 25.2, 26.5, 23.3, 18.3, 13.9, 9.6]
                },{
                    name: 'New York',
                    data: [-0.2, 0.8, 5.7, 11.3, 17.0, 22.0, 24.8, 24.1, 20.1, 14.1, 8.6, 2.5]
                },{
                    name: 'Berlin',
                    data: [-0.9, 0.6, 3.5, 8.4, 13.5, 17.0, 18.6, 17.9, 14.3, 9.0, 3.9, 1.0]
                },{
                    name: 'London',
                    data: [3.9, 4.2, 5.7, 8.5, 11.9, 15.2, 17.0, 16.6, 14.2, 10.3, 6.6, 4.8]
                }]
            });

同样,如果不想将导出按钮不显示在图片上的话,你可以通过chart.getSVG()函数来获取到chart的svg元素,并以ajax的方式传给后台,代码如下:

            $("#export").click(function(){
            	var svg = chart.getSVG();
            	$.ajax({
            		type: "post",
            		url: 'http://localhost:8081/HighChartsDemo/SaveAsImage',
            		data:{
            			type:"image/png",
            			filename:"chart",
            			svg:svg
            		},
            		success: function(data){
            			console.log("success");
            		}
            	});
            });

batik的lib包下载地址:http://pan.baidu.com/s/1dDwEvqL

时间: 2024-08-05 19:37:43

Highcharts导出图片的相关文章

highcharts 导出图片 .net Demo

highcharts 的Net导出服务  GitHub上整理的https://github.com/imclem/Highcharts-export-module-asp.net 引用两个程序集 sharpPDF.dll,Svg.dll (实际上就是将svg转化成其他格式的图片) 两种导出情况:   1.只需要图片,修改自带导出按钮的请求路径路径就行2.需要插入到word等二次处理再导出时 页面: @{ ViewBag.Title = "Index"; } @section css{

Highcharts使用phantomjs导出图片

Highcharts使用phantomjs导出图片 ?Highcharts使用phantomjs导出图片 描述 在用Highcharts这个强大的图标组件时,你一定在某些时刻想把画出来的图标导出为一个图片并下载到本地.Highcharts本身提供了导出功能,只需要导入exporting.js文件,就可以在图表右上角找到导出按钮了.这已经基本满足的大多数情况我们的需求.但是这原始到导出是发送请求到Highcharts的服务器上进行转化的,很多时候我们并不想把我们的数据信息暴露给他们,所以我们必须在

Highcharts 本地导出图片 Java

下载的 Highcharts-2.3.5.zip 解压后 有 E:\Highcharts\Highcharts-2.3.5\exporting-server\java 目录 提供了Java实现的导出应用. 1)安装maven,配置环境变量. (http://maven.apache.org/download.cgi)  1.jdk 我装的是E:\java\jdk\jdk1.6.0_02-windows.exe  2.我的电脑-----属性----高级-----环境变量-----环境变量-----

基于one2team框架的Highcharts图表图片导出方案

这篇文章已经没有什么意义了,新版的HIghcharts提供Java图片导出解决方案,你需要做的就是下个Maven,bulid一个war就Ok了.---addedy on 2012-11-15 多说一句废话:我觉得这个功能其实对于大多数应用场景来说是多余的. Highcharts是一个纯JSWeb图表绘制解决方案,它的功能之丰富,使用之简单可能是目前开源领域排名比较考前的优秀解决方案,它对个人使用是免费的. 它的默认版本也有图片导出功能,不过导出服务器是Highcharts官方服务器,我开发的过程

解决highCharts导出功能汉化问题

转自:http://www.cnblogs.com/jyh317/p/4191841.html 本文以highCharts中文网上的例子为原型,处理解决highCharts导出功能为英文的问题. 我们使用highCharts当然希望所有提示或文本都是中文的了,但是highCharts的默认语言是英语,如下图. 那么怎么把图片中导出功能的提示换成中文呢? 本文利用highCharts的在线测试平台来解决这个问题. 只需要加入一个全局设置,即可解决这个问题. Highcharts.setOption

highchart本地化导出图片

由于项目运行在内容,而且本身自带的功能是想highcharts  服务器写文件然后再下载的,所以 highchart本地化导出图片 就很需要. 第一步修改export.js 里的URl 在在exporting.js中放心的将http://export.highcharts.com/改为我们自己的地址了,我这里改为了http://192.168.0.32:8080/highchart-export/export这个地址:然后就可以在图表中显示我们自己的地址了,如下图所示: 第二步修改参数 在网上找

hightchart导出图片

通常在使用highchart导出图片pdf等文件时,我们一般直接引入exporting.js即可 执行导出操作则会直接请求highchart服务器,执行生成图片等操作,然后下载到客户端: 但这一切的操作可执行的前提,必须用户使用的pc客户端连接到外网上,否则无法执行下载操作. 我们必须通过自定义的模式,来实现转换.生成图片pdf等操作. 查询hightchart官网,highchart官网提供了三三种服务端模式,java,php 以及phantomjs(+node),针对我们asp.net程序,

keynote如何无损导出图片?怎么把图片导出来

在做工作汇报的时候,keynote是我们经常使用的工具,里面会有很多我们用的上的图片素材,那么keynote如何无损导出图片?如何在不丢失画质的情况导出这些图片呢,小编总结了具体的步骤,可以帮您完成这个问题,如果你get了就可以快速导出他们了哦!下面看看具体是如何操作的吧! keynote无损导出图片步骤: 第一步:选中图片 第二步:选择"格式"-"图像" 第三步:在右侧属性栏右上角的位置,将会出现"文件信息",里面包含了这张图片的jpeg图标以

fusioncharts批量导出图片之后自动提交表单

最近一个项目  一个页面有多个fusioncharts,需要将他们一次性导出之后再利用图片做一下操作,制作一个可以客户下载的质检简报. 对客户效果来说,我只需要点击一个按钮就能生成简报并且下载,对开发人员来说就需要,先将图片导出(当然不能挨个导出,要同时执行导出,因为fusioncharts导出太慢了),要确认全部导出了才能提交表单,要不然提交表单之后,图片没有生成出来必然产生异常.下面我们来看一下实现 首先我给每一个fusionchartschart指定一个有规律的id,作用有两个: 一个是导