前言

[Ext JS 4] 实战之将chart导出为png, jpg 格式的文件

承接上一篇, 我们可以做到在Browser端打开一个Chart,并导出为png或是jpg 等格式的图档。

但实际的需求会更高级, 希望可以自动产生图档, 并发送email .

对报表的需求从主动获取到被动接受, 系统要做得更智能。 需要解决的技术问题:

如果在不打开浏览器或是模拟浏览器的状况下产生svg 的代码, 在使用上一篇的技术实现图档?

不打开Browser 获取 SVG 代码段

Ext JS 使用的是浏览器前端的SVG技术来呈现图档, 不使用浏览器就能获取SVG代码段, 目前还没有什么好的解法。

模拟Browser获取SVG代码

既然不打开Browser要获取SVG不可能, 或是难度很大, 是否可以模拟浏览器打开, 产生HTML以及SVG代码段,再产生图档呢?

正好之前使用过Selenium 用来自动化前端测试, 调研了一下, 果然可以.

实现步骤:

1. 下载Selenium Client & WebDriver Language Bindings

http://docs.seleniumhq.org/download/

因为这边使用的是Java 来开发, 所以下载java版的。

这个API 可以用来与WebDriver 交互, 打开一个Browser的窗口, 访问给定的地址, 返回对应的html

2. 下载WebDriver

这里使用的是Chrome 浏览器, 所以下载Chrome 的WebDriver

下载地址:

http://chromedriver.storage.googleapis.com/index.html

选择合适的版本,

解压后把  chromedriver.exe,放入google 的安装目录 。

(一般位于:
C:\Program Files (x86)\Google\Chrome\Application)

3. 代码准备好之后就是代码呼叫了;

直接上代码

import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.TimeUnit;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;

public class DashHTMLDriverProcessor {

	/**
	 *
	 * @param chromeDriverUrl
	 * @param chartUrl
	 * @param idDivMap
	 *            {"9011-panel","9011-div"}
	 *
	 * @return  {
	 *   "image":{
	 *   	"ContentID":["image1","image2","image3"],
	 *   	"image1":"../image1.png";,
	 *   	"image2":"../image2.png";,
	 *   	"image3":"../image3.png";
	 * 	 }
	 * }
	 */
	public JSONObject getImageUrlObj(String chromeDriverUrl, String chartUrl, Map<String, String> idDivMap) {
		JSONObject imageUrlObj = null;
		if (chromeDriverUrl != null && chartUrl != null && idDivMap != null) {
			JSONObject imageObj = new JSONObject();
			JSONArray contentArray = new JSONArray();

			System.getProperties().setProperty("webdriver.chrome.driver", chromeDriverUrl);
			WebDriver webDriver = new ChromeDriver();
			webDriver.get(chartUrl);
			webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

			@SuppressWarnings("rawtypes")
			Iterator it = idDivMap.entrySet().iterator();
			while (it.hasNext()) {
				@SuppressWarnings("unchecked")
				Entry<String, String> entry = (Entry<String, String>) it.next();
				String chartId = entry.getKey();
				String divId = entry.getValue();
				WebElement webElement = webDriver.findElement(By.id(divId));
				WebElement svgElement = webElement.findElement(By.xpath(".//*[name()='svg']"));

				// String htmlstr = webElement.toString();
				// String htmlstr = webElement.getAttribute("innerHTML");
				String htmlstr = svgElement.getAttribute("outerHTML");
				contentArray.add(chartId);
				imageObj.put(chartId, htmlstr);
			}
			imageObj.put("ContentID", contentArray);
			JSONObject criObj = new JSONObject();
			criObj.put("image", imageObj);

			ChartImageExportServiceImpl imageExportSvr = new ChartImageExportServiceImpl();
			try {
				imageUrlObj = imageExportSvr.doExportImageAction(criObj);
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			webDriver.close();
			webDriver.quit();
		}
		return imageUrlObj;
	}
}

解释两处代码

1. webDriver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

因为浏览器打开显示需要时间, 所以要等页面出来之后才能进行解析。(这个时间设定可以根据实际状况进行设定)

2. WebElement svgElement = webElement.findElement(By.xpath(".//*[name()='svg']"));

这个是用来找SVG代码段的。语法是Xpath 的语法

[Ext JS 4]后台自动产生图档的更多相关文章

  1. 【转】Ext JS 集合1713个icon图标的CSS文件

    原文:http://extjs.org.cn/node/715 由于最近在研究Extjs4.1.1,没想到Extjs没有自带的iconCls所使用的图标样式css,就是用那个写那个的,纠结了半天,网上 ...

  2. 【翻译】Ext JS最新技巧——2014-8-13

    原文:Top Support Tips Greg Barry:新的框架. 新的文档类型(Doctype) 在Ext JS 5,只支持IE8+,因此不再古力用户使用严格的HTML文档类型.现在,推荐使用 ...

  3. 《Ext JS模板与组件基本知识框架图----模板》

    最近在整理Ext JS的模板和组件,在参考<Ext JS权威指南>,<Ext JS Web应用程序开发指南>,<Ext JS API>等相关书籍后才写下这篇< ...

  4. Ext JS 6学习文档–第1章–ExtJS入门指南

    Ext JS 入门指南 前言 本来我是打算自己写一个系列的 ExtJS 6 学习笔记的,因为 ExtJS 6 目前的中文学习资料还很少.google 搜索资料时找到了一本国外牛人写的关于 ExtJS ...

  5. Ext JS 6学习文档–第2章–核心概念

    核心概念 在下一章我们会构建一个示例项目,而在这之前,你需要学习一些在 Ext JS 中的核心概念,这有助于你更容易理解示例项目.这一章我们将学习以下知识点: 类系统,创建和扩展类 事件 Ext JS ...

  6. Ext JS 6学习文档-第8章-主题和响应式设计

    Ext JS 6学习文档-第8章-主题和响应式设计 主题和响应式设计 本章重点在 ExtJS 应用的主题和响应式设计.主要有以下几点内容: SASS 介绍和入门 主题 响应式设计 SASS 介绍和入门 ...

  7. Ext JS 6学习文档-第7章-图表

    Ext JS 6学习文档-第7章-图表 使用图表 本章中将探索在 ExtJS 中使用不同类型的图表并使用一个名为费用分析的示例项目结束本章所学.以下是将要所学的内容: 图表类型 条形图 和 柱形图 图 ...

  8. Ext JS 6学习文档-第6章-高级组件

    Ext JS 6学习文档-第6章-高级组件 高级组件 本章涵盖了高级组件,比如 tree 和 data view.它将为读者呈现一个示例项目为 图片浏览器,它使用 tree 和 data view 组 ...

  9. Ext JS 6学习文档-第5章-表格组件(grid)

    Ext JS 6学习文档-第5章-表格组件(grid) 使用 Grid 本章将探索 Ext JS 的高级组件 grid .还将使用它帮助读者建立一个功能齐全的公司目录.本章介绍下列几点主题: 基本的 ...

随机推荐

  1. BZOJ1563/洛谷P1912 诗人小G 【四边形不等式优化dp】

    题目链接 洛谷P1912[原题,需输出方案] BZOJ1563[无SPJ,只需输出结果] 题解 四边形不等式 什么是四边形不等式? 一个定义域在整数上的函数\(val(i,j)\),满足对\(\for ...

  2. python基础(4)

    条件判断和循环 条件判断 计算机之所以能做很多自动化的任务,因为它可以自己做条件判断. 比如,输入用户年龄,根据年龄打印不同的内容,在Python程序中,用if语句实现: age = 20 if ag ...

  3. C内存对齐问题-bus error!总线错误!其实是 字符串字面量修改问题!

    最近写个小程序,出现bus error! int main(void) { /** * char :1个字节 * char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也 ...

  4. bzoj3036: 绿豆蛙的归宿(期望DP)

    刷水反被水题日,拓扑写炸WA了2发T T... 因为是DAG图,可以直接递推,不需要高斯消元 #include<iostream> #include<cstring> #inc ...

  5. mysql三-2:数据类型

    一 介绍 存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的 详细参考: http://www.runoob.com/mysql/mysql-data ...

  6. python创建多维列表

    By francis_hao    Mar 24,2018   "*"操作符可以用于列表,表示将列表内容重复n次.如下,   但是当列表内容是列表的时候就出问题了,如果我只是修改多 ...

  7. bzoj 2530 [Poi2011]Party 构造

    2530: [Poi2011]Party Time Limit: 10 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 364  Solved:  ...

  8. IOS性能调优系列:使用Time Profiler发现性能瓶颈

    硬广:<IOS性能调优系列>第五篇,预计会有二十多篇,持续更新,欢迎关注. 之前四篇都是关注于内存方面,分析了内存泄漏.僵尸对象.内存分配,本篇介绍Time Profiler工具的使用,开 ...

  9. varchar字段

    varchar  最长26000多,实际使用最好不要超过255,会占内存 可以考虑text

  10. mysql 自动记录数据最后修改时间

    原文 -- mysql ,还真有这样的说法: mysql> create table test( ), -> uptime timestamp on update current_time ...