Java编写的HighCharts服务端图表下载程序

     HighCharts一是款基于SVG的图表工具,用jQuery与SVG交互,具有动画效果,并能实现钻(这个字搞不好写错了)取功能。可能由于HighCharts是收费的,所以图表的下载代码并没有开放,大家一定会发现,只有连接了互联网,才能使用此功能,这在实际的项目中当然是不能用了,因为大部份的企业局域网是不能访问互联网的,那就只好自己来开发这块功能了。

    1、首先我们要讲讲SVG,那么什么是SVG呢?

    SVG可缩放矢量图形(Scalable Vector Graphics)是基于可扩展标记语言(XML),用于描述二维矢量图形的一种图形格式。SVG由W3C制定,是一个开放标准。 SVG严格遵从XML语法,并用文本格式的描述性语言来描述图像内容,因此是一种和图像分辨率无关的矢量图形格式。

    SVG在网络上有很多教程,这里我就不详细介绍了,大家可以参考以下链接:http://www.chinasvg.com;

   2、HighCharts下载图表提交到服务器的数据是SVG文档,这时候我们需要在服务端处理这SVG文档,我们可以有很多方式,自己开发OR采用现成框架,自己开发显然有点不现实,工作量太大了,我们还是用batik这个框架处理吧,batik是apache的一个开源项目,JAVA程序员好都在用apache的框架,哈哈!

     package cn.com.boc.statisticscharts.action; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.StringReader; import javax.servlet.ServletConfig; 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.SVGAbstractTranscoder; 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; import org.apache.fop.svg.PDFTranscoder; import cn.com.boc.statisticscharts.model.ChartsType; import cn.com.boc.statisticscharts.model.FileExtendsName; /** * 图表下载 * @author 死牛崇拜 * */ public class ChartDownload extends HttpServlet { private ServletConfig servletConfig; private static String serverPath; private static String pdfFileName; private static String jpgFileName; private static String pngFileName; private static String svgFileName; private static String serverFolder="/uploads/charts/"; @Override public void init(ServletConfig servletConfig) throws ServletException { super.init(servletConfig); this.servletConfig = servletConfig; serverPath=servletConfig.getServletContext().getRealPath("/"); } /** * */ private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String fileName = request.getParameter("filename"); String svg = request.getParameter("svg"); String type = request.getParameter("type"); String width = request.getParameter("width"); pdfFileName=serverPath+serverFolder+fileName+FileExtendsName.pdf.getGetFileExtendName(); jpgFileName=serverPath+serverFolder+fileName+FileExtendsName.jpg.getGetFileExtendName(); pngFileName=serverPath+serverFolder+fileName+FileExtendsName.png.getGetFileExtendName(); svgFileName=serverPath+serverFolder+fileName+FileExtendsName.svg.getGetFileExtendName(); File file = null; TranscoderInput transInput = new TranscoderInput(); transInput.setReader(new StringReader(svg)); SVGAbstractTranscoder transCoder = null; TranscoderOutput transOutput = null; if (ChartsType.image_png.getChartsTypeName().equalsIgnoreCase(type)) { transCoder = new PNGTranscoder(); file = new File(pngFileName); } if (ChartsType.image_jpeg.getChartsTypeName().equalsIgnoreCase(type)) { transCoder = new JPEGTranscoder(); file = new File(jpgFileName); } if (ChartsType.application_pdf.getChartsTypeName().equalsIgnoreCase(type)) { transCoder = new PDFTranscoder(); file = new File(pdfFileName); } if (ChartsType.image_svg_xml.getChartsTypeName().equalsIgnoreCase(type)) { file = new File(svgFileName); OutputStream output = new FileOutputStream(file); output.write(svg.getBytes()); output.flush(); output.close(); } if (transCoder != null) { transCoder.addTranscodingHint(JPEGTranscoder.KEY_WIDTH, new Float( width)); OutputStream output = new FileOutputStream(file); transOutput = new TranscoderOutput(output); try { transCoder.transcode(transInput, transOutput); output.flush(); output.close(); } catch (TranscoderException e) { e.printStackTrace(); } } if(file.exists()) { //复位response response.reset(); response.setContentType(ChartsType.contentType.getChartsTypeName()); response.setBufferSize(2048); response.setHeader(ChartsType.content_Disposition.getChartsTypeName(), ChartsType.attachment.getChartsTypeName()+file.getName()); response.setContentLength(Integer.parseInt(file.length()+"")); InputStream is=new FileInputStream(file); byte[] buf=new byte[2048]; int resultLength=0; ServletOutputStream sos=response.getOutputStream(); while((resultLength=is.read(buf))!=-1) { sos.write(buf,0,resultLength); } sos.flush(); sos.close(); response.flushBuffer(); } } public ServletConfig getServletConfig() { return servletConfig; } public void setServletConfig(ServletConfig servletConfig) { this.servletConfig = servletConfig; } }

    我用的是Servlet来开发的,当然,你可以用struts或者其他MVC框架。这个程序中,我还用到了两个枚举类,下面也贴出来,不然大家一定要晕了。

    package cn.com.boc.statisticscharts.model; /** * 图表类型 * * @author 死牛崇拜 * */ public enum ChartsType { image_png("image/png"), image_jpeg("image/jpeg"), application_pdf( "application/pdf"), image_svg_xml("image/svg+xml"),contentType("application/x-download"),content_Disposition("Content-Disposition"),attachment("attachment;filename="); private String chartsTypeName; private ChartsType(String chartsTypeName) { this.chartsTypeName = chartsTypeName; } public String getChartsTypeName() { return chartsTypeName; } public void setChartsTypeName(String chartsTypeName) { this.chartsTypeName = chartsTypeName; } }

    package cn.com.boc.statisticscharts.model; /** * 文件扩展名 * * @author 死牛崇拜 * */ public enum FileExtendsName { svg(".svg"), pdf(".pdf"), png(".png"), jpg(".jpg"); private String getFileExtendName; public String getGetFileExtendName() { return getFileExtendName; } private FileExtendsName(String getFileExtendName) { this.getFileExtendName = getFileExtendName; } }

  3、修改exporting.js中的服务端url,默认是http://export.highcharts.com/,我们需要改成自己项目中的URL。这样,我们就可以实现图表下载了,代码大概在这个位置:

     B.exporting = { type : "image/png", url : "../chartsDownload",

4、贴上一个效果图,免得本文有纸上谈兵的闲凝!

Java编写的HighCharts服务端图表下载程序_第1张图片

5、代码在我的空间中提供下载

  

  

你可能感兴趣的:(java,String,image,File,图形,output)