Java 后台获取echarts图片

使用场景

最近项目中需要将页面中展示的echarts折线图保存到word中生成简报

使用的是Selenium 与 ChromeDriver(这里就不说明了,大家自行百度)

Selenium

compile group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '3.7.1'

ChromeDriver

ChromeDriver下载链接
ps:这里注意一下,下载的版本一定要和你本地安装的chrome版本对应
对照表

我用的:Google Chrome版本 73.0.3683.103(正式版本)
下载的ChromeDriver 是73.0.3683.68

下载完之后,我这里是放到D:\chromedriver\chromedriver.exe这个路径下
在这里插入图片描述

准备一个html

<html>
<meta charset="UTF-8">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<head>
    <script src="http://gssn.fw121.com/js/jquery-3.2.1.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/echarts/3.8.0/echarts.min.js"></script>
</head>
<body>
<!-- 因为我需要生成两个图片 所以定义了两个echarts -->
<!-- 为 ECharts 准备一个具备大小(宽高)的 DOM  -->
<div id="temEcharts" style="height:400px;width:550px"></div>
<div id="rhEcharts" style="height:400px;width:550px"></div>
</body>
<script>
    var rhEcharts = null;
    $(function () {
        // 基于准备好的dom,初始化echarts实例
        rhEcharts = echarts.init(document.getElementById('rhEcharts'));
    });
    function showImg(data) {
//        var option = {
//            xAxis: {
//                type: 'category',
//                data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
//            },
//            yAxis: {
//                type: 'value'
//            },
//            series: [{
//                data: [820, 932, 901, 934, 1290, 1330, 1320],
//                type: 'line'
//            }]
//        };
//        rhEcharts.setOption(option);
        rhEcharts.setOption(data);
    }

    function returnEchartImg() {
        var url = rhEcharts.getDataURL();
        //清空绘画内容,清空后实例可用
        rhEcharts.clear();
        return url;
    }


</script>
</html>


后台代码


public class WebDriverUtil {


    private static BASE64Decoder decoder = new sun.misc.BASE64Decoder();



    public static void main(String []s){
        getImgByte("{     xAxis: {         type: 'category',         data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']     },     yAxis: {         type: 'value'     },     series: [{         data: [820, 932, 901, 934, 1290, 1330, 1320],         type: 'line'     }] }");
    }

    /**
     * 获取图片byte
     */
    public static byte[] getImgByte(String option) {
        WebDriver driver = null;
        try {
            driver = getWebDriver();
            //访问网址
            String osName = System.getProperties().getProperty("os.name");
            if (osName.equals("Linux")) {
                driver.get("file:///usr/local/project/test/api/html/zhixiantu.html");
            } else {
                Resource resource = new ClassPathResource("html/zhixiantu.html");
                driver.get(resource.getFile().getPath());
            }
            System.out.println(driver.getCurrentUrl());
            JavascriptExecutor js = (JavascriptExecutor) driver;
            js.executeScript("showImg(" + option + ")");
            //延迟1秒等待折线图绘制完成
            Thread.sleep(1000);
            String imgTxt = js.executeScript("return returnEchartImg()").toString().replace("data:image/png;base64,", "");
            System.out.println("----------------" + imgTxt);
            base64StringToImage(imgTxt);
            return decoder.decodeBuffer(imgTxt);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            driver.close();
            driver.quit();
        }
        return null;
    }


    /**
     * 初始化WebDriver
     *
     * @return
     */
    public static WebDriver getWebDriver() {
        // 设置ChromeDriver的路径加载驱动
        System.setProperty("webdriver.chrome.driver", "D:\\chromedriver\\chromedriver.exe");
        //设置 chrome 的无头模式
        ChromeOptions chromeOptions = new ChromeOptions();
        //无头模式
        chromeOptions.setHeadless(true);
        //地址出现data:,
//        chromeOptions.addArguments("--user-data-dir=C:/Users/Administrator/AppData/Local/Google/Chrome/User Data/Default");
        //Chrome正在受到自动软件的控制  不显示提示语
        chromeOptions.addArguments("disable-infobars");
        //启动一个 chrome 实例
        return new ChromeDriver(chromeOptions);
    }


    /**
     * 保存图片
     *
     * @param base64String
     */
    public static void base64StringToImage(String base64String) {
        try {
            byte[] bytes1 = decoder.decodeBuffer(base64String);
            ByteArrayInputStream bais = new ByteArrayInputStream(bytes1);
            BufferedImage bi1 = ImageIO.read(bais);
            File file= new File("d://123345457.jpg");
            ImageIO.write(bi1, "jpg", file);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}

效果

运行main方法控制台输出运行main方法控制台输出
生成的图片生成的图片

在linux服务器部署时出现exited abnormally错误

在这里插入图片描述
解决方法:

        //linux 下让Chrome在root权限下跑
        chromeOptions.addArguments("--no-sandbox");
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
ECharts是一个强大的JavaScript图表库,常用于数据可视化。在Java后台使用ECharts,通常涉及以下几个步骤: 1. **前端引入ECharts库**:在前端HTML中引入ECharts的JS和CSS文件,确保项目中已经包含了这些资源。 ```html <script src="https://cdn.jsdelivr.net/npm/echarts@latest/dist/echarts.min.js"></script> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/echarts@latest/theme/macarons.min.css"> ``` 2. **数据传输**:Java后端需要处理并返回JSON格式的数据,这是ECharts渲染图表所需的数据结构,例如柱状图、折线图等的基础数据。 ```json { "title": {"text": "My Chart"}, "series": [ { "name": "Data", "type": "bar", "data": [1, 2, 3, 4, 5] } ] } ``` 3. **后端处理和返回数据**:Java服务端根据业务逻辑,比如数据库查询结果,将其转换为上述的JSON格式。 4. **前端调用接口获取数据**:在Java Servlet或Spring MVC的后端代码中,设置好响应头以返回JSON,然后前端通过Ajax或Fetch请求获取数据。 5. **在前端渲染ECharts**:前端使用JavaScript创建ECharts实例,并传入获取到的数据,进行图表的绘制。 ```javascript $.get('/api/chart-data', function(data) { var chart = echarts.init(document.getElementById('main')); chart.setOption(data); }); ``` 6. **事件监听和交互**:可以根据需要添加ECharts的交互功能,如点击事件、鼠标悬浮等。 相关问题: 1. 如何在Java后端生成动态的数据供前端ECharts渲染? 2. ECharts的哪些系列类型适合用于Java后台展示? 3. 前端如何通过ECharts的API进行数据绑定和事件处理?

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr . zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值