vue print.js打印支持Echarts图表操作


Posted in Javascript onNovember 13, 2020

网上找的print.js做了修改,支持Echarts图表这里记录一下,不知道是哪家的代码了,我看都一样

这里是看到了两个源码

https://github.com/xyl66/vuePlugs_printjs/blob/master/print.js

https://github.com/denghao123/Print.js

以下是我修改过的

print.js

// 打印类属性、方法定义
/* eslint-disable */
const Print = function (dom, options) {
 if (!(this instanceof Print)) return new Print(dom, options);
 
 this.options = this.extend({
 'noPrint': '.no-print'
 }, options);
 
 if ((typeof dom) === "string") {
 this.dom = document.querySelector(dom);
 } else {
 this.isDOM(dom)
 this.dom = this.isDOM(dom) ? dom : dom.$el;
 }
 
 this.init();
};
Print.prototype = {
 init: function () {
 var content = this.getStyle() + this.getHtml();
 this.writeIframe(content);
 },
 extend: function (obj, obj2) {
 for (var k in obj2) {
  obj[k] = obj2[k];
 }
 return obj;
 },
 
 getStyle: function () {
 var str = "",
  styles = document.querySelectorAll('style,link');
 for (var i = 0; i < styles.length; i++) {
  str += styles[i].outerHTML;
 }
 str += "<style>" + (this.options.notPrint ? this.options.notPrint : '.no-print') + "{display:none;}</style>";
 str += "<style>.results{width:100%!important;} .result .title{width:100%;}</style>";
 
 return str;
 },
 
 getHtml: function () {
 var inputs = document.querySelectorAll('input');
 var textareas = document.querySelectorAll('textarea');
 var selects = document.querySelectorAll('select');
 var canvass = document.querySelectorAll('canvas');
 for (var k = 0; k < inputs.length; k++) {
  if (inputs[k].type == "checkbox" || inputs[k].type == "radio") {
  if (inputs[k].checked == true) {
   inputs[k].setAttribute('checked', "checked")
  } else {
   inputs[k].removeAttribute('checked')
  }
  } else if (inputs[k].type == "text") {
  inputs[k].setAttribute('value', inputs[k].value)
  } else {
  inputs[k].setAttribute('value', inputs[k].value)
  }
 }
 
 for (var k2 = 0; k2 < textareas.length; k2++) {
  if (textareas[k2].type == 'textarea') {
  textareas[k2].innerHTML = textareas[k2].value
  }
 }
 
 for (var k3 = 0; k3 < selects.length; k3++) {
  if (selects[k3].type == 'select-one') {
  var child = selects[k3].children;
  for (var i in child) {
   if (child[i].tagName == 'OPTION') {
   if (child[i].selected == true) {
    child[i].setAttribute('selected', "selected")
   } else {
    child[i].removeAttribute('selected')
   }
   }
  }
  }
 }
 //canvass echars图表转为图片
 for (var k4 = 0; k4 < canvass.length; k4++) {
  var imageURL = canvass[k4].toDataURL("image/png");
  var img = document.createElement("img");
  img.src = imageURL;
  img.setAttribute('style', 'max-width: 100%;');
  img.className = 'isNeedRemove'
  // canvass[k4].style.display = 'none'
  // canvass[k4].parentNode.style.width = '100%'
  // canvass[k4].parentNode.style.textAlign = 'center'
  canvass[k4].parentNode.insertBefore(img,canvass[k4].nextElementSibling);
 }
 //做分页
 //style="page-break-after: always"
 var pages = document.querySelectorAll('.result');
 for (var k5 = 0; k5 < pages.length; k5++) {
  pages[k5].setAttribute('style', 'page-break-after: always');
 }
 return this.dom.outerHTML;
 },
 
 writeIframe: function (content) {
 var w, doc, iframe = document.createElement('iframe'),
  f = document.body.appendChild(iframe);
 iframe.id = "myIframe";
 //iframe.style = "position:absolute;width:0;height:0;top:-10px;left:-10px;";
 iframe.setAttribute('style', 'position:absolute;width:' + document.querySelector('.results').clientWidth + 'px;height:0;top:-10px;left:-10px;');
 w = f.contentWindow || f.contentDocument;
 doc = f.contentDocument || f.contentWindow.document;
 doc.open();
 doc.write(content);
 doc.close();
 
 var removes = document.querySelectorAll('.isNeedRemove');
 for (var k = 0; k < removes.length; k++) {
  removes[k].parentNode.removeChild(removes[k]);
 }
 
 var _this = this
 iframe.onload = function(){
  _this.toPrint(w);
  setTimeout(function () {
  document.body.removeChild(iframe)
  }, 100)
 }
 },
 
 toPrint: function (frameWindow) {
 try {
  setTimeout(function () {
  frameWindow.focus();
  try {
   if (!frameWindow.document.execCommand('print', false, null)) {
   frameWindow.print();
   }
  } catch (e) {
   frameWindow.print();
  }
  frameWindow.close();
  }, 10);
 } catch (err) {
  console.log('err', err);
 }
 },
 isDOM: (typeof HTMLElement === 'object') ?
 function (obj) {
  return obj instanceof HTMLElement;
 } :
 function (obj) {
  return obj && typeof obj === 'object' && obj.nodeType === 1 && typeof obj.nodeName === 'string';
 }
};
const MyPlugin = {}
MyPlugin.install = function (Vue, options) {
 // 4. 添加实例方法
 Vue.prototype.$print = Print
}
export default MyPlugin

用法

this.$print(this.$refs.print,{'notPrint':'.el-button, .el-select'})

我这里取消显示了一些按钮和选择框,

页面是这样

vue print.js打印支持Echarts图表操作

打印出来是这样

vue print.js打印支持Echarts图表操作

可以看到页面是27,我在print.js加了

var pages = document.querySelectorAll('.result');
 for (var k5 = 0; k5 < pages.length; k5++) {
  pages[k5].setAttribute('style', 'page-break-after: always');
 }

用来分页,避免每块显示不完整被分割。

补充知识:vue项目中遇到的打印,以及处理重新排版后不显示echarts图片问题。

1. 项目中用到的打印

页面:

vue print.js打印支持Echarts图表操作

css: 控制好宽度一般A4 我调试的是794px多了放不下,小了填不满。当时多页打印的时候,一定要控制好每一个页面内容显示的高度不要超过一个页面,当然根据自己项目来。

由于我的项目是每一个页面固定一个页尾部,所以当显示的时候正常排版显示。但是一旦点击了打印预览需要修改这个区域的css让他固定在每一个页面的底部。

vue print.js打印支持Echarts图表操作

vue print.js打印支持Echarts图表操作

js代码,点击打印后执行(如果右键点击打印就会乱,所以给一个打印预览按钮让用户直接点):打印前先给要打印区域排版,这样预览打印的时候就不会乱,只打印要打印的内容。然后延迟调用系统的打印预览后即便用户没有打印,页面已经排好版了 这个时候右键打印也是可以的了。

print(){
  var that = this;
  $('.operatorBox').css({ //从新绘制这块区域让它固定在每一个页面底部
   'position':'fixed',
   'bottom':'15px'
  })//此方法仅限单页
  var div_print = document.getElementById('print-area');
  var newstr = div_print.innerHTML;
  var oldstr = document.body.innerHTML;
  document.body.innerHTML = newstr;
  // that.showCharts()
  // console.log(this.imgBase)
  // 吧charts图表弄成图片,在挨边替换空白图表
  /* Object.keys(this.imgBase).forEach(function(key){
   document.getElementById(key).innerHTML="<img style='width:100%' src="+that.imgBase[key]+">"
  }); */ 

  setTimeout(function(){
   window.print(); 
   alert('如未打印,请右键选择打印!')
   // window.location.reload();
   // document.body.innerHTML = oldstr;
  },1000)
 }

效果:

vue print.js打印支持Echarts图表操作

取消打印后页面排版已经改变了:

vue print.js打印支持Echarts图表操作

2. echarts打印,echarts如果是直接打印没问题,但是大多数情况是需要重新排列要打印的(就是不直接打印页面显示的,需要自定义打印内容),自定义打印的时候需要拿到要打印的html从新排版,但是这个时候拿不到echarts生成的图的,会显示空白。

所以解决方案是利用echarts的转成图片功能,提前把canvas图表转成图片,记录下来然后在从新排列的时候从新替换,或者是当echarts生成图片的时候立马换掉(这样处理显示效果不好)。

下面我的处理是把得到的图片全部按照echarts的id记录到一个对象里面,到时候在统一获取:

vue print.js打印支持Echarts图表操作

以上这篇vue print.js打印支持Echarts图表操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
js封装的textarea操作方法集合(兼容很好)
Nov 16 Javascript
js对象之JS入门之Array对象操作小结
Jan 09 Javascript
js获取GridView中行数据的两种方法 分享
Jul 13 Javascript
jQuery截取指定长度字符串的实现原理及代码
Jul 01 Javascript
js如何改变文章的字体大小
Jan 08 Javascript
详解用Node.js实现Restful风格webservice
Sep 29 Javascript
angularJs中json数据转换与本地存储的实例
Oct 08 Javascript
详解如何构建Promise队列实现异步函数顺序执行
Oct 23 Javascript
Vue 无限滚动加载指令实现方法
May 28 Javascript
使用Phantomjs和Node完成网页的截屏快照的方法
Jul 16 Javascript
在vue中使用Base64转码的案例
Aug 07 Javascript
vue实现移动端H5数字键盘组件使用详解
Aug 25 Javascript
vue 中使用print.js导出pdf操作
Nov 13 #Javascript
详解vue中在父组件点击按钮触发子组件的事件
Nov 13 #Javascript
Vue中nprogress页面加载进度条的方法实现
Nov 13 #Javascript
解决vue打包 npm run build-test突然不动了的问题
Nov 13 #Javascript
vue封装自定义指令之动态显示title操作(溢出显示,不溢出不显示)
Nov 12 #Javascript
解决vuex刷新数据消失问题
Nov 12 #Javascript
微信小程序对图片进行canvas压缩的方法示例详解
Nov 12 #Javascript
You might like
文件上传之SWFUpload插件(代码)
2015/07/30 PHP
THINKPHP截取中文字符串函数实例代码
2017/03/20 PHP
laravel实现上传图片的两种方式小结
2019/10/12 PHP
js网页版计算器的简单实现
2013/07/02 Javascript
javascript中的变量作用域以及变量提升详细介绍
2013/10/24 Javascript
使用JQ来编写最基本的淡入淡出效果附演示动画
2014/10/31 Javascript
jQuery中wrapInner()方法用法实例
2015/01/16 Javascript
jQuery插件Skippr实现焦点图幻灯片特效
2015/04/12 Javascript
canvas实现手机端用来上传用户头像的代码
2016/10/20 Javascript
Windows系统下安装Node.js的步骤图文详解
2016/11/15 Javascript
jQuery中checkbox反复调用attr('checked', true/false)只有第一次生效的解决方法
2016/11/16 Javascript
String字符串截取的四种方式总结
2016/11/28 Javascript
AngularJS模仿Form表单提交的实现代码
2016/12/08 Javascript
详解javascript获取url信息的常见方法
2016/12/19 Javascript
Node.js和Express简单入门介绍
2017/03/24 Javascript
详解VUE自定义组件中用.sync修饰符与v-model的区别
2018/06/26 Javascript
Vue实现table上下移动功能示例
2019/02/21 Javascript
在node中使用jwt签发与验证token的方法
2019/04/03 Javascript
Node.js创建一个Express服务的方法详解
2020/01/06 Javascript
TensorFlow.js 微信小程序插件开始支持模型缓存的方法
2020/02/21 Javascript
HTML+JS实现“代码雨”效果源码(黑客帝国文字下落效果)
2020/03/17 Javascript
手机浏览器唤起微信分享(JS)
2020/10/11 Javascript
[50:17]Newbee vs Serenity 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python数据结构之二叉树的统计与转换实例
2014/04/29 Python
Appium Python自动化测试之环境搭建的步骤
2019/01/23 Python
python数据预处理之数据标准化的几种处理方式
2019/07/17 Python
python 日志模块 日志等级设置失效的解决方案
2020/05/26 Python
HTML5之HTML元素扩展(上)—新增加的元素及使用概述
2013/01/31 HTML / CSS
Canon佳能美国官方商店:购买数码相机、数码单反相机、镜头和打印机
2016/11/15 全球购物
生产部统计员岗位职责
2014/01/05 职场文书
三八妇女节超市活动方案
2014/08/18 职场文书
少先队活动总结
2014/08/29 职场文书
公务员上班玩游戏检讨书
2014/09/17 职场文书
公务员政审材料范文
2014/12/23 职场文书
紧急通知
2015/04/17 职场文书
2015社区健康教育工作总结
2015/05/20 职场文书