You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

147 lines
5.7 KiB

package com.fr.plugin.pielinecomb.comp;
import com.fr.general.IOUtils;
import com.fr.json.JSONObject;
import com.fr.stable.StringUtils;
import com.fr.stable.os.OperatingSystem;
import com.fr.third.org.apache.commons.io.FileUtils;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStreamReader;
/**
* @author duan.jingliang
* @date 2022/9/28
*/
public class WebPageRender {
private static String CHART_PATH = "";
private static WebPageRender webPage = new WebPageRender();
private WebPageRender() {
}
public static WebPageRender getInstance() {
return webPage;
}
public String makeChartImage(JSONObject options, int width, int height) {
Process process = null;
try {
prepareChartDir(options);
String cmd = "";
if (OperatingSystem.isWindows()) {
cmd += "cmd /c cd " + CHART_PATH + " && phantomjs ";
} else {
cmd += "cd " + CHART_PATH + " && phantomjs ";
}
cmd += "export.js -chartname PieLineCombChartWrapper -width " + width + " -height " + height;
process = Runtime.getRuntime().exec(cmd);
/**
* 获取控制台输出信息
* 通过JS中使用console.log()打印输出base64编码
* 获取进程输入流,进行base64编码获取
*/
BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = "";
StringBuffer base64Img = new StringBuffer();
while ((line = input.readLine()) != null) {
base64Img.append(line);
}
String imgStr = base64Img.toString();
if (imgStr.indexOf(",") > 0) {
imgStr = imgStr.substring(imgStr.indexOf(",") + 1);
}
return imgStr;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != process) {
process.destroy();
}
}
return "";
}
private void prepareChartDir(JSONObject options) {
try {
options.put("isLoadAnimal", false);
String optionStr = options.toString();
optionStr = "window.chartOptions = " + optionStr;
if (StringUtils.isEmpty(CHART_PATH)) {
String path = this.getClass().getProtectionDomain().getCodeSource().getLocation().getFile();
path = java.net.URLDecoder.decode(path, "UTF-8");
System.out.println("path: " + path);
File pluginDir = new File(path);
CHART_PATH = pluginDir.getParent() + File.separator + "chartexport";
}
File chartPath = new File(CHART_PATH);
chartPath.mkdirs();
File delFile = new File(CHART_PATH + File.separator + "chartdata.js");
if (delFile.exists()) {
delFile.delete();
}
/*if (OperatingSystem.isWindows()) {
if (!new File(CHART_PATH + File.separator + "phantomjs.exe").exists()) {
IOUtils.copy(this.getClass().getResourceAsStream("/com/fr/plugin/boxplot/web/phantomjs.exe"), "phantomjs.exe", chartPath);
}
} else if (OperatingSystem.isMacos()) {
if (!new File(CHART_PATH + File.separator + "phantomjs").exists()) {
IOUtils.copy(this.getClass().getResourceAsStream("/com/fr/plugin/boxplot/web/phantomjs-mac"), "phantomjs", chartPath);
}
} else {
if (!new File(CHART_PATH + File.separator + "phantomjs").exists()) {
IOUtils.copy(this.getClass().getResourceAsStream("/com/fr/plugin/boxplot/web/phantomjs-linux"), "phantomjs", chartPath);
}
}*/
if (!new File(CHART_PATH + File.separator + "fr.js").exists()) {
IOUtils.copy(this.getClass().getResourceAsStream("/com/fr/plugin/pielinecomb/web/fr.js"), "fr.js", chartPath);
}
if (!new File(CHART_PATH + File.separator + "jquery.js").exists()) {
IOUtils.copy(this.getClass().getResourceAsStream("/com/fr/plugin/pielinecomb/web/jquery.js"), "jquery.js", chartPath);
}
if (!new File(CHART_PATH + File.separator + "echarts.js").exists()) {
IOUtils.copy(this.getClass().getResourceAsStream("/com/fr/plugin/pielinecomb/web/echarts.min.js"), "echarts.js", chartPath);
}
IOUtils.copy(this.getClass().getResourceAsStream("/com/fr/plugin/pielinecomb/web/export.js"), "export.js", chartPath);
IOUtils.copy(this.getClass().getResourceAsStream("/com/fr/plugin/pielinecomb/web/PieLineCombChartWrapper.js"), "chartwrapper.js", chartPath);
IOUtils.copy(new ByteArrayInputStream(optionStr.getBytes("UTF-8")), "chartdata.js", chartPath);
} catch (Exception e) {
e.printStackTrace();
}
}
public boolean isDataChanged(JSONObject options) {
try {
if (StringUtils.isEmpty(CHART_PATH)) {
return true;
}
String optionStr = options.toString();
optionStr = "window.chartOptions = " + optionStr;
File dataFile = new File(CHART_PATH + File.separator + "chartdata.js");
if (dataFile.exists()) {
String oldData = FileUtils.readFileToString(dataFile, "UTF-8");
if (StringUtils.isNotEmpty(oldData) && oldData.equals(optionStr)) {
return false;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return true;
}
}