登录
注册
关于我们
简体中文
ENGLISH
搜索
购物车
0 ITEMS ON YOUR CART
首页
动态
方案
案例
专栏
期刊
联系我们
首页
期刊
[Ext JS 4] 实战之将chart导出为png, jpg 格式的文件
Ext JS开发大全
第1章 Ext JS快速入门示例[4/4]
第12章[12.10]富文本编辑器 CKEditor与Ext JS的整合
第12章[12.10.1] Ext JS + CKEditor+Spring Boot 实现编辑器图片上传
第11章[11.6] Ext JS 自行搭建远端库的包升级版本后找不到的问题解决
[Ext JS 4] 实战之Grid, Tree Gird编辑
ext命令集
第12章[12.3] Ext JSGrid中的超链接列及其功能实现
[Ext JS]textfield添加compositionstart、compositionupdate 和compositionend _os
[Ext JS ] 动添切换字段的必填与非必填
3.1 Ext JS 组件总览
[Ext JS] Grid表格批量编辑的实现
Ext JS 快速开发工具
带触发器按钮的输入框
Ext JS的布尔对象类型处理及便捷方法
Ext JS的Object类型处理及便捷方法
ExtJS RadioGroup(单选按钮组) 使用及注意事项
Ext JS 模拟后端数据实现
ToolTip 实现全介绍
Ext JS下拉单选框(Combobox,TagFied)使用及疑难问题解决
Ext JS应用测试概览
Sencha Studio 监视工具( Inspect Tool)
Ext JS 4 升级指南
Ext JS 如何定义公用方法(单例类 or 静态方法)
Ext JS的模块化开发(Package)
Ext3 -- Form 实例。 用来migrate file 数据到DB用的
ExtJS 3 在Tab下加入Form 实例
Extjs Grid 中给已经添加过Filter的列增加标识
Extjs 实战之 Ext.tree.TreePanel Tree无法显示
Extjs弹出框的异步执行
Grid 动态该表列( reconfigure)的性能改善
Spring Boot Ext JS准前后端框架应用的会话(Session)处理
[Ext JS 4] Extjs 图表 Legend(图例)的分行与分列显示
[Ext JS 4] Extjs 之 initComponent 和 constructor的区别
[Ext JS 4] Grid 中的单元格添加Tooltip 的效果
[Ext JS 4] Grid 实战之分页功能
[Ext JS 4] Grid 组件
[Ext JS 4] MVC 应用程序框架
[Ext JS 4] MVC 应用程序框架
发布 [Ext JS 4] contentEL,renderTo, applyTo 释义与区别
[Ext JS 4] 动态加载
[Ext JS 4] 实战之 ComboBox 和 DateField (消失之解决办法)
[Ext JS 4] 实战之 Picker 和 Picker Field
[Ext JS 4] 实战之 带week(星期)的日期选择控件(二)
[Ext JS 4] 实战之 ComboBox 和 DateField 的点击事件在IE下失效
## [Ext JS 4] 实战之 带week(星期)的日期选择控件(三)
[Ext JS 4] 实战之 带week(星期)的日期选择控件
[Ext JS 4] 实战之Chart 坐标控制(单坐标,双坐标)
[Ext JS 4] 实战之Chart, Column Chart 定制颜色
[Ext JS 4] 实战之Grid, Tree Gird 动态添加列
[Ext JS 4] 实战之Grid, Tree Gird 动态添加列续(性能考虑)
[Ext JS 4] 实战之Grid, Tree Gird 动态添加行
[Ext JS 4] 实战之Grid, Tree Gird 添加按钮列
[Ext JS 4] 实战之Grid, Tree Gird编辑Cell
[Ext JS 4] 实战之Load Mask - 在Grid Reconfigure的使用状况
[Ext JS 4] 实战之Load Mask(加载遮罩)的显示与隐藏
[Ext JS 4] 实战之多选下拉单 (带checkbox) 续 - 带ALL 选项
[Ext JS 4] 实战之多选下拉单 (带checkbox)
[Ext JS 4] 实战之升级系列一[Ext jS 3-->Ext JS 4]
[Ext JS 4] 实战之将chart导出为png, jpg 格式的文件
[Ext JS 4] 实战之浏览器兼容
[Ext JS 4] 布局之实战二 - 中间区块不会自动伸展 (tab)续
[Ext JS 4] 组件之图表
[Ext JS 4]后台自动产生图档
[Ext JS 4]性能优化
[Ext JS 7 ]7.5 自适应配置 - Responsive Configs
[Ext JS 7] 关联(Association)
[Ext JS 7]事件(Event)
[Ext JS 7]ClassRequire错误解决
[Ext JS 7]的开发模式
[Ext JS 7]基于NPM的开发
[Ext JS ] 动添切换字段的必填与非必填
[Ext JS4] 数据包
[Ext JS4系列]Ext JS4 入门
[Ext JS6] Grid不同列的关联编辑
[Ext JS6] ViewControllers-视图控制器
[Ext JS6]Ext.Template
[Ext JS6]Sencha Cmd
[Ext JS6]编码规范
[Ext JS6]多类型设备开发
[Ext JS6]工作区-Workspace
[Ext JS6]路由(Routing)及使用
[Ext JS6]视图模型和数据绑定
[Ext JS6实战] Ajax获取Tree Store
[Ext JS6实战] Ext.XTemplate
[Ext JS6实战]动态数据绑定
[Ext JS] Sencha Cmd命令参考之二
[Ext JS] Sencha Cmd命令参考之一
[Ext JS] Group Grid-分组网格
[Ext JS] Group Grid-分组网格
[Ext JS]嵌套Grid的实现及注意事项
[Ext JS]SimXhr.js__dc=1659315492151_65 Uncaught TypeError问题分析与解决
[Ext JS]Sencha Studio安装与快速介绍之一
[Ext JS]textfield 添加 compositionstart、compositionupdate 和 compositionend
[Ext JS]图片显示方式
[ExtJS 6]Grid分页工具栏无效问题解决
[ExtJS6]ResponsiveColumn-自适应列布局
[Extjs 4] 类系统
基于Ext JS的模块化应用框架搭建及开发
[Ext JS] 自行搭建远端库的包升级版本后找不到的问题解决-The following versions are available
[Ext JS]鼠标移入移除时弹出和关闭窗口
[Ext JS]富文本编辑器 CKEditor与Ext JS的整合
[Ext JS]可编辑列Grid的全场景开发
['Ext JS]Grid中的超链接列及其功能实现
[Ext JS]Ext JS + CKEditor+Spring Boot 实现编辑器图片上传
[Ext JS]介绍与快速入门1
[Ext JS]实现带动态数字的图标
Spring Boot+Ext JS 实现图形验证码
Ext JS介绍与快速入门2
Ext JS开发基本环境准备与项目创建
[Ext JS]开发模式及快速测试方式
[Ext JS]多类型终端-电脑、移动端(手机、平板)
[Ext JS]基于Ext JS的MVC/MVVM架构的应用开发模式
[Ext JS]Ext JS的类与类体系
[Ext JS]Ext JS组件、容器与布局
[Ext JS]组件与容器的选择与开发
[Ext JS]Ext JS数据模型与数据封装
[Ext JS]Ext JS的控制器类型及使用
[Ext JS]说透Ext JS的窗口及对话框用法
[Ext JS]说透Ext JS的窗口及对话框用法
[Ext js]Grid行选择的多种场景和实现方式
[Ext JS]Ext JS类的继承与混合
CmsWing
[Ext JS 4] 实战之将chart导出为png, jpg 格式的文件
## [Ext JS 4] 实战之将chart导出为png, jpg 格式的文件 ### 前言 [Web Chart系列之六] canvas Chart 导出图文件 Chart 导出的原理很基本方法,在上一篇已经有介绍过。 对于Extjs 来说,在 Ext.chart.Chart 这个类直接有提供一个 save( [config] ) 的方法, 调用这个方法, 就可以在browser 下载当前这个chart 的对应格式的图形文件。 ``` chart.save({ type: 'image/png' }); ``` 这里使用的技术是把数据传递到服务器端, 由服务器端产生图再传到前端。 所以, 在调用save 这个方法的时候, 你会发现, 请求会访问http://svg.sencha.io/ 这个地址。 曾经, 大概在 2013 的年中的时候, 这个地址都可以访问, 当时不知何时, 这个地址的访问就会报 503 (Service Unavailable)的错误了。 这样的话, 原本可以work 的chart 导出功能, 现在就不行了。 网上搜索一下, 是说部分版本已经不提供这个服务了。 不管如何, 讲自己的服务放在别的地方, 总也不踏实, 是否可以开发出这种服务呢? ### 原理 首先看一看, chart.save 时,前端传递了那些参数: ![](/upload/picture/2022-09-29/upload_735ec4d0857b47072b9c84e6db9499a0.png) 参数有四个: width 和 height 应该是图片的大小 type 应该是图的保存格式 svg 传递的就是xml方式的svg 格式的数据。 所以问题归结为一点: 在服务端如何解析这个svg 格式的数据并生成图片文件? ### 解决方法 看懂这些svg 数据, 并使用基本API生成一个图片不失为一种解法? 但是对java 语言来说, 是否已经存在第三方包来帮我们直接做这种事呢? 答案之一就是: Batik Batik是使用svg格式图片来实现各种功能的应用程序以及Applet提供的一个基于java的工具包。 它是属于 Apache软件基金会 的一个项目, 应该是值得信赖的。 项目主页: http://xmlgraphics.apache.org/batik/ 下载地址:http://mirrors.cnnic.cn/apache/xmlgraphics/batik/、 开发步骤: 1. 下载batik-1.7.zip ( 目前的最新版) 并解压 2. 把根目录, lib 和 extensions 目录下的所有lib 包拷入项目的web lib 中。(可以选择) 3. 写一个servlet ImageExportService.java /** * author:oscar999 */ ``` import java.io.IOException; import java.io.OutputStream; import java.io.StringReader; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.batik.transcoder.TranscoderException; import org.apache.batik.transcoder.TranscoderInput; import org.apache.batik.transcoder.TranscoderOutput; import org.apache.batik.transcoder.image.JPEGTranscoder; import org.apache.batik.transcoder.image.PNGTranscoder; publicclassImageExportServiceextendsHttpServlet { /** * */ privatestaticfinallongserialVersionUID=1L; /** * Post File to Client * Input Parameters: * type(image type, as png, jpeg), * svg(svg string, post by extjs), * filename(save file name) */ @Override protectedvoiddoPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { Stringtype= request.getParameter("type"); Stringsvg= request.getParameter("svg"); Stringfilename="chart"; if( request.getParameter("filename")!=null&&request.getParameter("filename").length()>0) { filename = request.getParameter("filename"); } String postfix; if ("image/jpeg".equals(type)) { response.setContentType("image/jpeg"); postfix = "jpg"; } else { response.setContentType("image/png"); postfix = "png"; } response.setHeader("Content-Disposition", "attachment; filename=" + filename + "." + postfix); StringReaderstringReader=newStringReader(svg); OutputStreamout= response.getOutputStream(); try { TranscoderInputinput=newTranscoderInput(stringReader); TranscoderOutputoutput=newTranscoderOutput(out); if ("image/jpeg".equals(type)) { newJPEGTranscoder().transcode(input, output); } else { newPNGTranscoder().transcode(input, output); } } catch (TranscoderException e) { thrownewServletException(e); } } } ``` 4. 在 web.xml 中配置此servlet 的请求路径 ```
ImageExportServiceservlet-name>
com.XXX.ImageExportServiceservlet-class> servlet>
ImageExportServiceservlet-name>
/ImageExportServiceurl-pattern> servlet-mapping> ``` 5. 让Extjs 的Chart.save 切换到新的服务器。 Ext.draw.engine.ImageExporter.defaultUrl = 'ImageExportService'; (注意, 这部分是写在web端的, 可以放在 Ext.onReady 里面) 6. 全部完成, 写个例子测试一下 ```javascript //author: oscar999
var chart; var panel1; Ext.require(['*']); Ext.onReady(function() { Ext.draw.engine.ImageExporter.defaultUrl = '/'+WEB_PROJECT_NAME+'/ImageExportService'; var store = Ext.create('Ext.data.JsonStore', { fields: ['name', 'data'], data: [ { 'name': 'metric one', 'data':100000 }, { 'name': 'metric two', 'data': 7 }, { 'name': 'metric three', 'data': 5 }, { 'name': 'metric four', 'data': 2 }, { 'name': 'metric five', 'data':27 } ] }); var chart = Ext.create('Ext.chart.Chart', { renderTo: Ext.getBody(), width: 500, height: 300, animate: true, store: store, axes: [{ type: 'Numeric', position: 'bottom', fields: ['data'], label: { renderer: Ext.util.Format.numberRenderer('0,0') }, title: 'Sample Values', grid: true, minimum: 0 }, { type: 'Category', position: 'left', fields: ['name'], title: 'Sample Metrics' }], series: [{ type: 'bar', axis: 'bottom', highlight: true, tips: { trackMouse: true, width: 140, height: 28, renderer: function(storeItem, item) { this.setTitle(storeItem.get('name') + ': ' + storeItem.get('data') + ' views'); } }, label: { display: 'insideEnd', field: 'data', renderer: Ext.util.Format.numberRenderer('0'), orientation: 'horizontal', color: '#333', 'text-anchor': 'middle' }, xField: 'name', yField: 'data' }] }); Ext.MessageBox.confirm('Confirm Download', 'Would you like to download the chart as an image?', function(choice){ if(choice == 'yes'){ chart.save({ type: 'image/png', filename:'testfile' }); } }); }); script> ``` ### 跨浏览器处理 可能想到会有一个问题, IE 的低版本还只是支持vml 绘图, 那在这些版本的IE中, 导出图是否就不行了呢? 其实不用担心, Extjs 已经帮我们处理好了, 即使在这些版本的IE中, 传递到服务器的也是 svg 格式的数据。 (另外发现的一点是, 如果要传入自己定义的参数, 比如filename 等, 直接从save 中可能不行,可以考虑从呼叫url 传入)
网站导航
首页
动态
方案
案例
专栏
期刊
联系我们