[Ext JS 4]后台自动产生图档
前言
[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]后台自动产生图档的更多相关文章
- 【转】Ext JS 集合1713个icon图标的CSS文件
原文:http://extjs.org.cn/node/715 由于最近在研究Extjs4.1.1,没想到Extjs没有自带的iconCls所使用的图标样式css,就是用那个写那个的,纠结了半天,网上 ...
- 【翻译】Ext JS最新技巧——2014-8-13
原文:Top Support Tips Greg Barry:新的框架. 新的文档类型(Doctype) 在Ext JS 5,只支持IE8+,因此不再古力用户使用严格的HTML文档类型.现在,推荐使用 ...
- 《Ext JS模板与组件基本知识框架图----模板》
最近在整理Ext JS的模板和组件,在参考<Ext JS权威指南>,<Ext JS Web应用程序开发指南>,<Ext JS API>等相关书籍后才写下这篇< ...
- Ext JS 6学习文档–第1章–ExtJS入门指南
Ext JS 入门指南 前言 本来我是打算自己写一个系列的 ExtJS 6 学习笔记的,因为 ExtJS 6 目前的中文学习资料还很少.google 搜索资料时找到了一本国外牛人写的关于 ExtJS ...
- Ext JS 6学习文档–第2章–核心概念
核心概念 在下一章我们会构建一个示例项目,而在这之前,你需要学习一些在 Ext JS 中的核心概念,这有助于你更容易理解示例项目.这一章我们将学习以下知识点: 类系统,创建和扩展类 事件 Ext JS ...
- Ext JS 6学习文档-第8章-主题和响应式设计
Ext JS 6学习文档-第8章-主题和响应式设计 主题和响应式设计 本章重点在 ExtJS 应用的主题和响应式设计.主要有以下几点内容: SASS 介绍和入门 主题 响应式设计 SASS 介绍和入门 ...
- Ext JS 6学习文档-第7章-图表
Ext JS 6学习文档-第7章-图表 使用图表 本章中将探索在 ExtJS 中使用不同类型的图表并使用一个名为费用分析的示例项目结束本章所学.以下是将要所学的内容: 图表类型 条形图 和 柱形图 图 ...
- Ext JS 6学习文档-第6章-高级组件
Ext JS 6学习文档-第6章-高级组件 高级组件 本章涵盖了高级组件,比如 tree 和 data view.它将为读者呈现一个示例项目为 图片浏览器,它使用 tree 和 data view 组 ...
- Ext JS 6学习文档-第5章-表格组件(grid)
Ext JS 6学习文档-第5章-表格组件(grid) 使用 Grid 本章将探索 Ext JS 的高级组件 grid .还将使用它帮助读者建立一个功能齐全的公司目录.本章介绍下列几点主题: 基本的 ...
随机推荐
- 输入三个数a,b,n,输出a和b不大于n的公倍数的个数
题:输入三个数a,b,n,输出a和b不大于n的公倍数的所有个数. 这题的思想是先求得a和b的最大公约数,然后用a和b的积除以最大公约数,得到最小公倍数,再持续加上最小公倍数,直到超过n,记下n的个数. ...
- 洛谷 P2604 [ZJOI2010]网络扩容 解题报告
P2604 [ZJOI2010]网络扩容 题目描述 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下,1到N的最大流: 2. ...
- 洛谷 P4066 [SHOI2003]吃豆豆 解题报告
P4066 [SHOI2003]吃豆豆 题目描述 两个PACMAN吃豆豆.一开始的时候,PACMAN都在坐标原点的左下方,豆豆都在右上方.PACMAN走到豆豆处就会吃掉它.PACMAN行走的路线很奇怪 ...
- 解题:POI 2009 TAB
题面 这也算是个套路题(算吗)?发现换来换去每行每列数的组成是不变的,那么就把每行每列拎出来哈希一下,复杂度$O(Tn^2log$ $n)$有点卡时=.=. 然而正解似乎不需要哈希,就像这样↓ ;i& ...
- 【cdq分治】【CF1093E】 Intersection of Permutations
传送门 果然前两天写完咕咕咕那个题的题解以后博客就开始咕咕咕了-- Description 给定整数 \(n\) 和两个 \(1~\sim~n\) 的排列 \(A,B\). \(m\) 个操作,操作有 ...
- Xml中SelectSingleNode方法,xpath查找某节点用法
Xml中SelectSingleNode方法,xpath查找某节点用法 最常见的XML数据类型有:Element, Attribute,Comment, Text. Element, 指形如<N ...
- socket编程学习step2
引言:主机之间如何相互交互呢?网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口“可以唯一标识主机中的应用进程.这样利用三元组(ip地址,协议,端口)就可以标识网络的进程了,网络中的 ...
- 手脱JDPack
1.PEID查壳 JDPack 2.载入OD,入口是一个pushad入栈,可以使用ESP,下硬件访问断点,shift+F9 0040E000 > pushad ; //入口 0040E001 E ...
- My97DatePicker 报错 My97DP is not defined
https://blog.csdn.net/BoomLee/article/details/80967926
- java项目转换依赖等问题
最近接手了一个原始的java项目,其实很久没有做了,自从两年前用maven,建立web项目,java project基本上就没有弄个,突然的接手,发现自己好多不足,可能对于一开始就做这样的容易,但是对 ...