一、所需工具html
1》phantomjs:官網下載http://phantomjs.org/download.html 國內鏡像http://npm.taobao.org/dist/phantomjs/java
2》EChartConvert:https://gitee.com/saintlee/echartsconvertgit
二、Maven依賴apache
<dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.28</version> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.7</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.56</version> </dependency>
三、使用phantomjs裝載運行EChartConvertnpm
1》phantomjs、EChartConvert解壓便可使用json
解壓 phantomjs-2.1.1-windows.zip
和 saintlee-echartsconvert-master.zip。配置phantomjs環境變量。
windows
命令行輸入:<phantomjs路徑> <EChartsConvert路徑> -s -p <服務端口號>
Microsoft Windows [版本 6.1.7601] 版權全部 (c) 2009 Microsoft Corporation。保留全部權利。 C:\fyliu\software\phantomjs-2.1.1-windows\echartsconvert-gitee>phantomjs echarts -convert.js -s -p 6666 echarts-convert server start success. [pid]=2284
四、項目目錄結構服務器
1》HttpUtil.javaecharts
package com.lfy.cn.PhantomJSEChartsTest.util; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.apache.http.HttpEntity; import org.apache.http.NameValuePair; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; public class HttpUtil { public static String post(String url, Map<String, String> params, String charset) throws ClientProtocolException, IOException { String responseEntity = ""; // 建立CloseableHttpClient對象 CloseableHttpClient client = HttpClients.createDefault(); // 建立post方式請求對象 HttpPost httpPost = new HttpPost(url); // 生成請求參數 List<NameValuePair> nameValuePairs = new ArrayList<>(); if (params != null) { for (Entry<String, String> entry : params.entrySet()) { nameValuePairs.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); } } // 將參數添加到post請求中 httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs, charset)); // 發送請求,獲取結果(同步阻塞) CloseableHttpResponse response = client.execute(httpPost); // 獲取響應實體 HttpEntity entity = response.getEntity(); if (entity != null) { // 按指定編碼轉換結果實體爲String類型 responseEntity = EntityUtils.toString(entity, charset); } // 釋放資源 EntityUtils.consume(entity); response.close(); return responseEntity; } }
2》FreemarkerUtil.java工具
package com.lfy.cn.PhantomJSEChartsTest.util; import java.io.File; import java.io.IOException; import java.io.StringWriter; import java.util.Map; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; public class FreemarkerUtil { private static final String path = FreemarkerUtil.class.getClassLoader().getResource("").getPath(); public static String generateString(String templateFileName, String templateDirectory, Map<String, Object> datas) throws IOException, TemplateException { Configuration configuration = new Configuration(Configuration.VERSION_2_3_0); // 設置默認編碼 configuration.setDefaultEncoding("UTF-8"); // 設置模板所在文件夾 configuration.setDirectoryForTemplateLoading(new File(path + templateDirectory)); // 生成模板對象 Template template = configuration.getTemplate(templateFileName); // 將datas寫入模板並返回 try (StringWriter stringWriter = new StringWriter()) { template.process(datas, stringWriter); stringWriter.flush(); return stringWriter.getBuffer().toString(); } } }
3》EchartsUtil.java
package com.lfy.cn.PhantomJSEChartsTest.util; import java.io.IOException; import java.util.HashMap; import java.util.Map; import org.apache.http.client.ClientProtocolException; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; public class EchartsUtil { private static String url = "http://localhost:6666"; private static final String SUCCESS_CODE = "1"; public static String generateEchartsBase64(String option) throws ClientProtocolException, IOException { String base64 = ""; if (option == null) { return base64; } option = option.replaceAll("\\s+", "").replaceAll("\"", "'"); // 將option字符串做爲參數發送給echartsConvert服務器 Map<String, String> params = new HashMap<>(); params.put("opt", option); String response = HttpUtil.post(url, params, "utf-8"); // 解析echartsConvert響應 JSONObject responseJson = JSON.parseObject(response); String code = responseJson.getString("code"); // 若是echartsConvert正常返回 if (SUCCESS_CODE.equals(code)) { base64 = responseJson.getString("data"); } // 未正常返回 else { String string = responseJson.getString("msg"); throw new RuntimeException(string); } return base64; } }
option.ftl
{ title: { text:'${title}', x:'middle', textAlign:'center' }, xAxis: { type: 'category', data: ${categories} }, yAxis: { type: 'value' }, series: [{ data: ${values}, type: 'bar' }] }
App.java
package com.lfy.cn.PhantomJSEChartsTest; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.util.HashMap; import org.apache.http.client.ClientProtocolException; import com.alibaba.fastjson.JSON; import com.lfy.cn.PhantomJSEChartsTest.util.EchartsUtil; import com.lfy.cn.PhantomJSEChartsTest.util.FreemarkerUtil; import freemarker.template.TemplateException; import sun.misc.BASE64Decoder; public class App { public static void main(String[] args) throws ClientProtocolException, IOException, TemplateException { // 變量 String title = "水果"; String[] categories = new String[] { "蘋果", "香蕉", "西瓜" }; int[] values = new int[] { 3, 2, 1 }; // 模板參數 HashMap<String, Object> datas = new HashMap<>(); datas.put("categories", JSON.toJSONString(categories)); datas.put("values", JSON.toJSONString(values)); datas.put("title", title); // 生成option字符串 String option = FreemarkerUtil.generateString("option.ftl", "/com/lfy/cn/PhantomJSEChartsTest/template", datas); // 根據option參數 String base64 = EchartsUtil.generateEchartsBase64(option); System.out.println("BASE64:" + base64); generateImage(base64, "C:/Users/lfy/Desktop/test.png"); } public static void generateImage(String base64, String path) throws IOException { BASE64Decoder decoder = new BASE64Decoder(); try (OutputStream out = new FileOutputStream(path)){ // 解密 byte[] b = decoder.decodeBuffer(base64); for (int i = 0; i < b.length; ++i) { if (b[i] < 0) { b[i] += 256; } } out.write(b); out.flush(); } } }
運行結果:生成一張ECharts圖片
注:本文出自https://www.jianshu.com/p/dfc28fd7d786,支持原創。