天天看點

Java 背景擷取echarts圖檔

java背景擷取echarts圖檔

    • 使用場景
    • Selenium
    • ChromeDriver
    • 準備一個html
    • 背景代碼
    • 效果
      • 在linux伺服器部署時出現exited abnormally錯誤

使用場景

最近項目中需要将頁面中展示的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這個路徑下

Java 背景擷取echarts圖檔

準備一個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方法控制台輸出

Java 背景擷取echarts圖檔

生成的圖檔

Java 背景擷取echarts圖檔

在linux伺服器部署時出現exited abnormally錯誤

Java 背景擷取echarts圖檔

解決方法:

//linux 下讓Chrome在root權限下跑
        chromeOptions.addArguments("--no-sandbox");
           

繼續閱讀