zoukankan      html  css  js  c++  java
  • Java导出Highcharts生成的图表为图片源码

    本文转载自:http://blog.csdn.net/dengsilinming/article/details/7352054

    需要的jar包:

    需要的js文件:(可以通过http://www.highcharts.com/download下载highcharts对应的js文件)

    下面是一些主要部分

    web.xml

    <?xml version="1.0" encoding="UTF-8"?>  
    <web-app version="2.5"   
        xmlns="http://java.sun.com/xml/ns/javaee"   
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
        http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
      <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>  
    </web-app>

    servlet部分

    package com.foxconn.highcharts.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;  
    //import org.apache.fop.svg.PDFTranscoder;  
      
      
      
      
    public class SaveAsImage extends HttpServlet {  
      
        /** 
         *  
         */  
        private static final long serialVersionUID = 1L;  
      
        /** 
         * Constructor of the object. 
         */  
        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 {  
      
            /*导成pdf做了很久,但还是没能做出来,因为一直报 
            * java.lang.NoSuchMethodError: org.apache.avalon.framework.configuration.DefaultConfiguration.<init>(Ljava/lang/String;)V的错误, 
            * 如果你知道如何解决这个错误,请告诉我一下,在此先谢过了。现在已经可以正确地将图片导成pdf了,程序是没有问题的 
            * */  
            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("application/pdf")) {  
                    ext = "pdf";  
                    t =(Transcoder) new PDFTranscoder();//我将这儿的注释去掉了,因为导成pdf的问题已经解决  
                } 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")) {  
                //  out.print(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:
    	Parameter [svg]: The DOM Element to be converted." +  
                        "
    	Parameter [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  
        }  
      
    } 

    jsp

    <%@ page language="java" contentType="text/html; charset=UTF-8"  
        pageEncoding="UTF-8"%>  
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">  
    <html>  
    <head>  
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">  
    <title>Basic Line</title>  
    <script src="js/jquery.min.js" type="text/javascript"></script>  
        <script src="js/excanvas.compiled.js" type="text/javascript"></script>  
        <script src="js/highcharts.js" type="text/javascript"></script>  
          
        <script src="js/highcharts.src.js" type="text/javascript"></script>  
        <script type="text/javascript" src="js/exporting.js"></script>  
        <script type="text/javascript">  
            var chart;  
            $(document).ready(function(){  
                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,  
                         1,  
                        color: '#808080'  
                    }]  
                },  
                exporting:{  
                    filename:'chart',  
                    url:'http://localhost:8080/HighChartsDemo/SaveAsImage'//这里是一个重点哦,也可以修改exporting.js中对应的url  
                },  
                tooltip: {  
                    formatter: function(){  
                        return '<b>' + this.series.name + '</b><br/>' +  
                        this.x + ': ' + this.y + '°C';  
                    }  
                },  
                legend: {  
                    layout: 'vertical',  
                    align: 'right',  
                    verticalAlign: 'middle',  
                    x: 10,  
                    y: 100,  
                    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]  
                }]  
                });  
            });  
        </script>  
    </head>  
    <body>  
        <div id="container" style=" 100%; height: 400px"></div>  
    </body>  
    </html>  

    项目源码可以通过点此下载 

    注意:请下载源码的同学,将源码中的

    /* else if (type.equals("application/pdf")) { 
                    ext = "pdf"; 
                    t =(Transcoder) new PDFTranscoder(); 
                }*/   

    上面的注释去掉,程序是可以成功导出pdf的。

  • 相关阅读:
    win8 需要管理员权限才能删除此应用程序
    windows 8 解决端口(COM和LPT)问题:Prolific USBtoSerial Comm Port(COM4)驱动异常的问题
    sqlite 获取数据库中的所有表
    ListView simpleAdapter的基本使用
    一根长度为133米的材料需要截成长度为19米和23米的短料,求两种短料各截多少根时剩余的材料最少?
    打印输出九九乘法表
    写一个函数,输入一个十六进制,输出相应的十进制数。
    求3100的素数!
    从键盘输入若干个同学的成绩,统计并输出最高成绩 最低成绩 平均分,当输入负数时结束输入
    编写两个函数,分别求由键盘输入两个整数的最大公约数和最小公倍数。用主函数调用这两个函数,并输出结果
  • 原文地址:https://www.cnblogs.com/dreammyle/p/3847521.html
Copyright © 2011-2022 走看看