Extjs6+svg实现类似pdf图片预览页面
来源:互联网 发布:600756浪潮软件腾讯网 编辑:程序博客网 时间:2024/06/02 04:12
一、创建项目
本项目采用的是extjs6.2,话说个人感觉ext4到ext6变化其实也并不大,大部分之前写的ext4的代码迁移至ext6上,并没有太大的问题,修改的地方并不多。至于前端项目是否采用cmd进行创建,看个人喜欢。本人是不太喜欢,虽然编译后代码做了压缩,但是页面耦合性太紧,很难共用某些页面(iframe)方式。废话少说,具体实现页面如下:
主要分两部分,左侧为导航栏(文档缩略图),右侧为文档主视图;
设计思想是把它作为单独模块,能够被其他页面所引用,所以建一个文件以document命名,其他页面要引用直接Ext.create或者iframe方式就行了。
document下的文件有:Config.js(配置页)、Document.js(主入口页)、PageIndex.js(左侧菜单栏)、PagePanel.js(主视图页)、PageSvg.js(主视图svg)、Statusbar.js(工具栏);
document.js负责装载PageIndex和PagePanel两个主件;
Ext.define('App.document.Document', { extend: 'Ext.panel.Panel', layout: 'border', initComponent: function () { var me = this; me.pageIndex = Ext.create('App.document.PageIndex', { region: 'west', scrollable: 'y', width: '10%', split: true, parent: me }); me.pagePanel = Ext.create('App.document.PagePanel', { region: 'center', parent: me }); me.items = [me.pageIndex, me.pagePanel]; me.callParent(arguments); }});接着是左侧导航栏PageIndex.js,用容器Ext.container.Container装载Ext.Img和Ext.form.Label:
Ext.define('App.document.PageIndex', { extend: 'Ext.panel.Panel', requires: [ 'Ext.Img', 'Ext.form.Label' ], title: '文档页导航', autoScroll: true, layout: 'column', frame: true, collapsible: true, currentPage: null, load: function (doc) { var me = this, pageList = []; for (var i = 0; i < doc.total; i++) { var url = url; pageList[i] = Ext.create('Ext.container.Container', { layout: 'column', items: [ Ext.create('Ext.Img', { margin: '10 15 10 15', columnWidth: 1, src: url }), Ext.create('Ext.form.Label', { columnWidth: 1, cls: 'PageCode', text: (i + 1), style: 'text-align:center' }) ], columnWidth: 1, margin: '20 40 20 20', border: 2, style: { borderColor: 'red', borderStyle: 'hidden' } }); } me.add(pageList); }});完成了左侧导航栏后,接着是主视图PagePanel,投机取巧的方法是采用和左侧导航栏相同的方式实现,不过这里存在个问题,当页面多的时候,滑动会卡;因为本人会对主视图进行编辑等操作,故不用此方式,转而用svg的方式实现,同时为了避免卡顿,默认只显示两页,代码如下:
Ext.define('App.document.PagePanel', { extend: 'Ext.panel.Panel', layout: 'absolute', frame: false, autoScroll: true, reality: null, initComponent: function () { var me = this; me.bbar = me.statusbar = Ext.create('App.document.Statusbar', {}); me.callParent(arguments); }, load: function (doc) { var me = this; me.doc = doc; var next = me.body.first(); while (next) { next.setSize(0, 0); next = next.next(); } me.pageMap = {}; for (var i = 0; i < doc.total; i++) { me.pageMap[i] = Ext.create('App.document.PageSvg', { canvas: me, parent: me, doc: doc, page: i }); } }});
PageSvg.js
Ext.define('App.document.PageSvg', { hidden: true, layers: null, constructor: function (config) { var me = this; if (config) { Ext.apply(me, config); } me.init(); }, init: function () { var me = this; me.layers = {}; me.body = me.canvas.body.createChild(); me.buildHTML(); }, getDPI: function () { var dpiX, dpiY; if (window.screen.deviceXDPI != undefined) { dpiX = window.screen.deviceXDPI; dpiY = window.screen.deviceYDPI; } else { var tmpNode = document.createElement("DIV"); tmpNode.style.cssText = "width:1in;height:1in;position:absolute;left:0px;top:0px;z-index:99;visibility:hidden"; document.body.appendChild(tmpNode); dpiX = parseInt(tmpNode.offsetWidth); dpiY = parseInt(tmpNode.offsetHeight); tmpNode.parentNode.removeChild(tmpNode); } return dpiX === dpiY ? dpiX : {dpiX: dpiX, dpiY: dpiY}; }, buildHTML: function () { var me = this, canvas = me.canvas, reality = canvas.reality, scale = me.parent.getPageScale(); var doc = me.doc, pageInfo = doc.children[me.page]; me.realHeight = (pageInfo.height * 2.54 / (pageInfo.ydpi || me.getDPI())).toFixed(2); me.realWidth = (pageInfo.width * 2.54 / (pageInfo.xdpi || me.getDPI())); var margin = (reality || canvas).getPageMargin() * scale, width = (reality || canvas).body.getWidth(); me.realWidth = parseInt(me.realWidth * me.getDPI() / 2.54); width = width > me.realWidth ? width : me.realWidth; var layer_name = 'page'; me.layers[layer_name] = { tag: 'g', name: layer_name, children: [ { tag: 'image', width: pageInfo.width, height: pageInfo.height, style: 'border: 1px solid #000', 'xlink:href': url } ] }; var children = []; for (var key in me.layers) { children.push(me.layers[key]); } var svg = { tag: 'svg', width: (width * scale) - 40, height: me.realHeight * scale + 'cm', viewBox: '0 0 {width} {height}'.replace('{width}', pageInfo.width).replace('{height}', pageInfo.height), preserveAspectRatio: 'xMidYMin meet', style: 'margin:' + [margin, margin, margin, margin].join(' '), children: me.hidden ? null : children }; var svgHtml = Ext.DomHelper.markup(svg); me.body.setHtml(''); me.body.setHtml(svgHtml); me.svg = me.body.child('svg'); }, onScale: function () { var me = this; me.buildHTML(); }, show: function () { var me = this; me.hidden = false; me.buildHTML(); }, hide: function () { var me = this; me.hidden = true; me.buildHTML(); }});Statusbar.js
Ext.define('App.document.Statusbar', { extend: 'Ext.toolbar.Toolbar', initComponent: function () { var me = this; me.pageDisplay = Ext.create('Ext.form.Field', { width: 100, originValue: '第{page}/{pageTotal}' + '页' }); me.items = ['->', me.pageDisplay, '->']; me.callParent(arguments); }, paging: function (page, total) { var me = this; me.pageDisplay.setValue(me.pageDisplay.originValue .replace('{page}', page + 1) .replace('{pageTotal}', total)); }});
大概就是这样,还有一些点击触发事件,以及页面编辑的事件,可以在这里的基础上进行扩展;
阅读全文
0 0
- Extjs6+svg实现类似pdf图片预览页面
- jasperReport实现页面嵌套pdf预览
- 如何实现页面在线预览PDF文档
- Extjs6.2 Form上传图片之前预览
- MFC中实现类似图片预览的功能
- previewImage.js实现类似微信朋友圈图片预览功能
- 页面实现图片传输放大预览JS
- office转pdf和图片实现在线预览
- 浏览器实现PDF预览
- 浏览器实现PDF预览
- Android实现pdf预览
- struts2 图片上传至服务器 页面预览及页面及时图片预览功能实现方式
- 在html页面显示pdf,实现pdf的预览和下载
- jquery实现页面无刷新动态上传图片预览功能
- Android实现PDF预览打印
- 移动端实现预览pdf
- 图片预览器(类似百度)
- 页面设置预览实现
- 【线索化二叉树】中序遍历创建线索二叉树
- SPI学习之:SPI编程
- [BZOJ4326][NOIP2015]运输计划(二分+dfs序+树上差分)
- 树莓派初次使用
- 谷歌解释了如何从谷歌搜索中移除AMP内容
- Extjs6+svg实现类似pdf图片预览页面
- 使用nhmicro使分库分表支持排序后的分页查询
- homework1
- 优化高并发的系统
- python字符串拼接速度对比
- 一、编程规约 (一)命名风格
- 关于闭包的学习
- eclipse中安装Spring ide出现的问题,安装了spring ide 却在perferences中没有
- 《机器学习实战》之Adaboost