东莞清洁服务网站建设,wordpress 机器学习,网站项目计划说明书,wordpress添加wow前言 通过echarts的jar包#xff0c;Java后台生成一张图片#xff0c;并把图片插入到word中。关于word插图片的代码在下一章。 需要用到的工具PhantomJS,Echarts-convert.js,jquery.js,echarts.js。
1.PhantomJS 介绍
PhantomJS是一个不需要浏览器的富客户端。
官方介绍Java后台生成一张图片并把图片插入到word中。关于word插图片的代码在下一章。 需要用到的工具PhantomJS,Echarts-convert.js,jquery.js,echarts.js。
1.PhantomJS 介绍
PhantomJS是一个不需要浏览器的富客户端。
官方介绍PhantomJS是一个基于 WebKit 的服务器端JavaScript API。它全面支持web而不需浏览器支持支持各种Web标准DOM处理CSS选择器, JSONCanvas和SVG。
PhantomJS常用于页面自动化网络监测网页截屏以及无界面测试等。通常我们使用PhantomJS作为爬虫工具。传统的爬虫只能单纯地爬取html的代码对于js渲染的页面就无法爬取如Echarts统计图。而PhantomJS正可以解决此类问题。 我们可以这么理解PhantomJSPhantomJS是一个无界面、可运行脚本的谷歌浏览器。 1.1 PhantomJS下载安装
PhantomJS安装非常简单官网http://phantomjs.org/download.html下载最新的安装包 安装包有WindowsMac OS X, Linux 64/32 bit选择对应的版本下载解压即可使用在下载包里有个example文件夹里面对应了许多示例供参考。
为方便使用我们将phantomjs添加至环境变量中。 windows下操作 path 下添加 C:\Users\ming\Desktop\java-echarts\phantomjs-2.1.1-windows\bin
打开cmd查看是否配置成功
C:\Users\mingphantomjs --version
2.1.1 linux 下操作: export PHANTOMJS/usr/local/phantomjs/phantomjs-2.1.1-linux-x86_64
export PATH$PATH:$PHANTOMJS/bin
# or
export PATH$PATH:/usr/local/phantomjs/phantomjs-2.1.1-linux-x86_64/bin
# 刷新配置
source /etc/profile 注linux虽然不需要其他的依赖包但仍旧需要GLIBCXX_3.4.9和GLIBC_2.7当然大多数linux是有这两个依赖包的。 1.2 运行脚本测试 安装包下 example 文件夹下提供了好多示例这里以hello.js 为例在example文件夹下输入 phantomjs hello.js 命令 会输出 Hello, world! 更多用法可参考官方文档。 C:\Users\ming\Desktop\java-echarts\phantomjs-2.1.1-windows\examplesphantomjs hello.js
Hello, world! 2.Echartsconvert
上面讲述了PhantomJS如何使用下面我们就从Echarts官网使用JS截图的方式来获取我们想要的图片
Echartsconvert Giteecopy下来代码注意因为该源码长期没有更新script目录下echarts.min.js太过于老旧无法支持目前Echarts的图形请大家copy下代码后更新替换其文件 。最新echarts.min.js下载传送门
其中echarts-convert.js就是我们要使用到的主C这个Js就相当于帮我们去Echarts官方运行Dome-生成折线图/柱状图-保存到指定文件夹下
jquery.js自行下载对应版本我的是3.6.3
附上echarts-converts.js文件 ;(function (window, document, undefined) {use strict;// 引入modulevar system require(system), // 获取参数path phantom.libraryPath,command require(path /module/command.js);// 参数module/*** phantomJs 全局异常监听* param msg* param trace*/phantom.onError function (msg, trace) {var msgStack [Convert ERROR: msg];if (trace trace.length) {msgStack.push(TRACE:);trace.forEach(function (t) {msgStack.push( - (t.file || t.sourceURL) : t.line (t.function ? (in function t.function ) : ));});}console.error(msgStack.join(\n));phantom.exit(1);};/*** 参数* type {Command}*/var commandParams command.version(0.0.1).option(-s, --server, provide echarts convert http server).option(-p, --port number, change server port when add -s or --server, 9090).option(-o, --opt json, add the param of echarts method [ eChart.setOption(opt) ]).option(-t, --type value, provide file/base64 for image, default file, /^(file|base64)$/i, base64).option(-f, --outfile path, add output of the image file path).option(-w, --width number, change image width, 600).option(-h, --height number, change image height, 400).parse(system.args);// ***********************************// Echarts转换器// ***********************************function Convert(params) {this.params params || commandParams; // 参数命令this.external {JQUERY3: path /script/jquery-3.6.3.min.js,ECHARTS: path /script/echarts.min.js,ECHARTS_CHINA: path /script/china.js}; // 外部js}/*** 初始化*/Convert.prototype.init function () {var params this.params;this.check(params);if (params.server) {this.server(params);} else {this.client(params);}};/*** 参数检查* param params*/Convert.prototype.check function (params) {if (undefined params.server undefined params.opt) {this.error(option argument missing -o, --opt json);}if (undefined ! params.opt) {var isJson this.checkJson(params.opt);if (!isJson) {this.error(--opt json args not json string);}}if (file params.type undefined params.outfile) {this.createTmpDir();}};/*** 检查是否是json字符串* param value* returns {boolean}*/Convert.prototype.checkJson function (value) {var re /^\{[\s\S]*\}$|^\[[\s\S]*\]$/;// 类型为stringif (typeof value ! string) {return false;}// 正则验证if (!re.test(value)) {return false;}// 是否能解析try {value \ value \;JSON.parse(value);} catch (err) {return false;}return true;};/*** 创建临时目录并指定输出路径*/Convert.prototype.createTmpDir function () {var fs require(fs); // 文件操作var tmpDir fs.workingDirectory /tmp;// 临时目录是否存在且可写if (!fs.exists(tmpDir)) {if (!fs.makeDirectory(tmpDir)) {this.error(Cannot make tmpDir directory\n);}}this.params.outfile tmpDir / new Date().getTime() .png;};/*** 服务* param params*/Convert.prototype.server function (params) {var server require(webserver).create(), // 服务端convert this;var listen server.listen(params.port, function (request, response) {/*** 输出* param data* param success*/function write(data, success, msg) {response.statusCode 200;response.headers {Cache: no-cache,Content-Type: application/json;charsetutf-8};response.write(convert.serverResult(data, success, msg));response.close();}//获取参数var args convert.serverGetArgs(request);if (args.opt ! undefined) {var check convert.serverCheckAndSet(params, args);if (check) {convert.client(params, write);} else {write(, false, failed to get image, please check parameter [opt] is a JSON);}} else {write(, false, failed to get image, missing parameter [opt]);}});// 判断服务是否启动成功if (!listen) {this.error(could not create echarts-convert server listening on port params.port);} else {console.log(echarts-convert server start success. [pid] system.pid);}};/*** 服务参数检查和赋值* param params* param args* returns {boolean}*/Convert.prototype.serverCheckAndSet function (params, args) {if (this.checkJson(args.opt)) {params.opt args.opt;} else {return false;}if (/^(file|base64)$/i.exec(args.type)) {params.type args.type;}if (!isNaN(args.width)) {params.width args.width;}if (!isNaN(args.height)) {params.height args.height;}return true;};/*** 结果返回* param data* param success* param msg*/Convert.prototype.serverResult function (data, success, msg) {var result {code: success ? 1 : 0,msg: undefined msg ? success ? success : failure : msg,data: data};return JSON.stringify(result);};/*** 获取参数* param request* returns {{}}*/Convert.prototype.serverGetArgs function (request) {var args {};if (GET request.method) {var index request.url.indexOf(?);if (index ! -1) {var getQuery request.url.substr(index 1);args this.serverParseArgs(getQuery);}} else if (POST request.method) {var postQuery request.post;args this.serverParseArgs(postQuery);}return args;};/*** 解析参数* param query 字符串* returns {{}} 对象*/Convert.prototype.serverParseArgs function (query) {var args {},pairs query.split();for (var i 0; i pairs.length; i) {var pos pairs[i].indexOf();if (pos -1)continue;var key pairs[i].substring(0, pos);var value pairs[i].substring(pos 1);// 中文解码必须写两层value decodeURIComponent(decodeURIComponent(value));args[key] value;}return args;};/*** 访问渲染* param params* param fn*/Convert.prototype.client function (params, fn) {var page require(webpage).create(); // 客户端var convert this,external this.external,render,output;/*** 渲染* returns {*}*/render function () {switch (params.type) {case file:// 渲染图片page.render(params.outfile);return params.outfile;case base64:default:var base64 page.renderBase64(PNG);return base64;}};/*** 输出* param content 内容* param success 是否成功*/output function (content, success, msg) {if (params.server) {fn(content, success, msg);page.close();} else {console.log(success ? [SUCCESS]: : [ERROR]: content);page.close();convert.exit(params);// exit}};/*** 页面console监听* param msg* param lineNum* param sourceId*/page.onConsoleMessage function (msg, lineNum, sourceId) {console.log(msg);};/*** 页面错误监听* param msg* param trace*/page.onError function (msg, trace) {output(, false, msg); // 失败,返回错误信息};// 空白页page.open(about:blank, function (status) {// 注入依赖js包var hasJquery page.injectJs(external.JQUERY3);var hasEchart page.injectJs(external.ECHARTS);var hasEchartChina page.injectJs(external.ECHARTS_CHINA);// 检查js是否引用成功if (!hasJquery !hasEchart) {output(Could not found external.JQUERY3 or external.ECHARTS, false);}// 创建echartspage.evaluate(createEchartsDom, params);// 定义剪切范围如果定义则截取全屏page.clipRect {top: 0,left: 0,width: params.width,height: params.height};// 渲染var result render();// 成功输出返回图片或其他信息output(result, true);});};/*** 创建eCharts Dom层* param params 参数*/function createEchartsDom(params) {// 动态加载js获取options数据$(script).attr(type, text/javascript).html(var options params.opt).appendTo(document.head);// 取消动画,否则生成图片过快会出现无数据if (options ! undefined) {options.animation false;}// body背景设置为白色$(document.body).css(backgroundColor, white);// echarts容器var container $(div).attr(id, container).css({width: params.width,height: params.height}).appendTo(document.body);var eChart echarts.init(container[0]);eChart.setOption(options);}/*** debug,将对象转成json对象* param obj*/Convert.prototype.debug function (obj) {console.log(JSON.stringify(obj, null, 4));};/*** 错误信息打印并退出* param str 错误信息*/Convert.prototype.error function (str) {console.error(Error: str);this.exit();};/*** 退出参数为空或是server时不退出* param params 参数*/Convert.prototype.exit function (params) {if (undefined params || undefined params.server) {phantom.exit();}};// 构建,入口new Convert(commandParams).init();}(this, this.document)); 结构如下 2.1 启动命令 windows下启动命令 端口默认 9090 C:\Users\ming\Desktop\java-echarts\echartsconvertphantomjs echarts-convert.js -s linux 下启动命令 端口默认 9090 nohup phantomjs /usr/local/phantomjs/echartsconvert/echarts-convert.js -s 2.2 中文字体乱码问题 linux 下 phantonjs 没有支持的中文 需要进行安装对应包。也可安装其它字体库这里不做更多叙述。 此处执行linux字符集安装即可
在centos中执行yum install bitmap-fonts bitmap-fonts-cjk
在ubuntu中执行sudo apt-get install xfonts-wqy 2.3 饼图无法生成Null异常等问题
饼图绘制不了request时就卡住的问题 solution1此处并不是饼图绘制不了而是只要opt中含有%都会挂原因是作者在代码里执行了两次decodeURIComponent详情参考echarts-convert.js源码259行所以%传递时也必需encode两次否则会造成%后的json串无法被decode导致卡住的问题。此处可以将%替换为%25解决或是改源码将decodeURIComponent改为一次暂时没有发现改为一次decode会出现中文问题 3.JSON格式数据生成图表图片 import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
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;import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;/*** 以 EchartsData 示例中 getBar() 数据为例将生成的Echarts数据转为base64图片** author demain_lee* since 2022/12/28*/
public class EchartData2Base64 {public static void main(String[] args) throws IOException {// json 格式数据String jsonData {xAxis:[{type:category,data:[Matcha Latte,Milk Tea,Cheese Cocoa,Walnut Brownie]}],yAxis:[{type:value}],tooltip:{trigger:item},legend:{},series:[{type:bar,name:2020,data:[43.3,83.1,86.4,72.4]},{type:bar,name:2021,data:[85.8,73.4,65.2,53.9]},{type:bar,name:2022,data:[93.7,55.1,82.5,39.1]}]};// PhantomJS 服务器地址String url http://localhost:9090;MapString, String map new HashMap();//此处已将%处理为%25jsonData jsonData.replaceAll(\\s, ).replaceAll(\, ).replaceAll(%, %25);map.put(opt, jsonData);String resultData post(url, map, utf-8);System.out.println(resultData);}public static String post(String url, MapString, String map, String encoding) throws IOException {String body ;// 创建httpclient对象CloseableHttpClient client HttpClients.createDefault();// 创建post方式请求对象HttpPost httpPost new HttpPost(url);// 装填参数ListNameValuePair nvp new ArrayList();if (map ! null) {for (Map.EntryString, String entry : map.entrySet()) {nvp.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));}}// 设置参数到请求对象中httpPost.setEntity(new UrlEncodedFormEntity(nvp, encoding));// 执行请求操作并拿到结果同步阻塞CloseableHttpResponse response client.execute(httpPost);// 获取结果实体HttpEntity entity response.getEntity();if (entity ! null) {// 按指定编码转换结果实体为String类型body EntityUtils.toString(entity, encoding);}EntityUtils.consume(entity);// napsresponse.close();return body;}
}
3.1 base64格式数据 resultData 返回的数据包含base64格式数据 //返回数据
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.2在线查看Base64图片
Base64/图片转换 - 在线工具 (try8.cn) 注意添加data:image/png;base64, 3.3在线修改图表样式
Examples - Apache ECharts 3.4在线将opt转换为Json 在线JS对象转JSON工具 - UU在线工具 (uutool.cn)
注意只需要将opt的内容进行转换不需要带上option;
4.结束语 本篇文章到这里就结束了本文介绍了如何通过Java 第三方库去处理对应的图表数据以及通过基于PhantomJS的第三方开源项目echartsconvert进行数据转换获取最后需要的Base64格式的图片数据。有了这个数据可以把它运用到自己需要的地方。比如写到Word或PDF文档中 将Base64图片通过POI插入Word中
Echarts图表Java后端生成Base64图片格式,POI写入Base64图片到Word中_青冘的博客-CSDN博客