前言

[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. Linux内核分析第六周学习笔记——分析Linux内核创建一个新进程的过程

    Linux内核分析第六周学习笔记--分析Linux内核创建一个新进程的过程 zl + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/U ...

  2. luoguP5105 不强制在线的动态快速排序

    emm 可重集合没用用.直接变成不可重复集合 有若干个区间 每个区间形如[L,R] [L,R]计算的话,就是若干个连续奇数的和.拆位统计1的个数 平衡树维护 加入一个[L,R],把相交的区间合并.之后 ...

  3. Work at DP

    转载请注明出处:http://www.cnblogs.com/TSHugh/p/8858805.html Prepared: (无notes的波兰题目的notes见我的波兰题目补全计划)BZOJ #3 ...

  4. linux命令行设置git提示符

    http://note.youdao.com/noteshare?id=3b6b2ee0925964928fd63d2c51e6bcef

  5. SpringBoot(三) :Spring boot 中 Redis 的使用

    前言: 这一篇讲的是Spring Boot中Redis的运用,之前没有在项目中用过Redis,所以没有太大的感觉,以后可能需要回头再来仔细看看. 原文出处: 纯洁的微笑 SpringBoot对常用的数 ...

  6. horizon源码分析(一)

    源码版本:H版 一.写在前面 本来应该搭建horizon的development环境的,这样方便debug,但是由于各种报错,本人没有搭建成功,这也导致有很多源码疑问没有解决,后续可以继续补充这一部分 ...

  7. spring boot 2.0.3+spring cloud (Finchley)4、熔断器Hystrix

    在分布式系统中服务与服务之间的依赖错综复杂,一种不可避免的情况就是某些服务会出现故障,导致依赖于他们的其他服务出现远程调度的线程阻塞.某个服务的单个点的请求故障会导致用户的请求处于阻塞状态,最终的结果 ...

  8. CSS 字体常用属性

    一.字体大小  font-size:参数 /** * 参数:一.数字固定值,如20px * 二.父元素字体的百分比 * 三.smaller 比父元素更小 * 四.larger 比父元素更大 * 五.i ...

  9. 【BZOJ】4555: [Tjoi2016&Heoi2016]求和 排列组合+多项式求逆 或 斯特林数+NTT

    [题意]给定n,求Σi=0~nΣj=1~i s(i,j)*2^j*j!,n<=10^5. [算法]生成函数+排列组合+多项式求逆 [题解]参考: [BZOJ4555][Tjoi2016& ...

  10. 源自人脑的神奇算法 -- 读《How to make your own neural network》有感

    最近读到了一本很好的关于机器学习-深度学习的书值得推荐下并特意做了这个学习总结. 为什么推荐 在我认为好书(计算机类)的评判有几个标准: 试图以通俗的语言阐述,并在引入任何新概念的时候都讲述来龙去脉, ...