vue 中使用print.js导出pdf操作


Posted in Javascript onNovember 13, 2020

1.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.noPrint ? this.options.noPrint : '.no-print') + "{display:none;}</style>";
 str += "<style>html,body,div,#preview-main,.report{width:100%!important;height: auto!important;font-size:14px}</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);
 }

 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:0;height:0;top:-10px;left:-10px;');
 w = f.contentWindow || f.contentDocument;
 doc = f.contentDocument || f.contentWindow.document;
 doc.open();
 doc.write(content);
 doc.close();
 
 // 避免重复打印echarts
 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

自己页面的样式添加

str += "<style>html,body,div,#preview-main,.report{width:100%!important;height: auto!important;font-size:14px}</style>";

解决echarts图表多点击一次 就会多一张bug

img.className = 'isNeedRemove'
canvass[k4].parentNode.insertBefore(img,canvass[k4].nextElementSibling);
var removes = document.querySelectorAll('.isNeedRemove');

2.用法

//调用系统打印机
print () {
 this.$print(this.$refs.print) // 使用
},

题外话

1.在自己需要的页面引用打印页面 这边我打印页面时preview.vue页面

<!-- 预览 -->
<Modal v-model="previewModal" fullscreen :mask-closable="false" :closable="false">
 <preview ref="print" :previewEditOldForm="previewEditForm"></preview>
 <div slot="footer" class="btn">
  <Button type="text" @click="closePreview">关闭</Button>
  <Button type="primary" @click="print">打印</Button>
 </div>
</Modal>
import Preview from '../operation_report/Preview'
export default {
 components: {
   Preview
 }
}

获取别的页面的表单内容 初始化

export default {
 data() {
 return{
 previewEditForm: {},
 }
 }
}
// 父组件向子组件传值
 on: {
  click: () => {
   // 父组件向子组件传值
   this.previewEditForm = params.row;
   setTimeout(() => {
    this.$refs.print.queryById();
    this.$refs.print.eventOverviews();
    this.previewModal=true;
   }, 2000)
  }
 }

隐藏打印页面不需要的按钮

<style scoped>
 @media print {
  .btn{
   display: none;
  }
 }
</style>

4.打印内容有echarts时 内容不自适应 调整width

width: 210mm;

最终如下

vue 中使用print.js导出pdf操作

补充知识:使用vue-cli脚手架 与 axios 请求数据 配置代理进行跨域访问数据问题

首先利用脚手架vue-cli 把项目搭建好 然后在 利用控制台 在项目中安装http-proxy-middleware中间件作为代理

控制台安装中间代理命令 如下:

npm install -S http-proxy-middleware

然后按照下图 一步步配置

配置结束 是不是 还是不行?

在这里 要关闭下项目 重新在控制台 npm run dev 重启项

目 就大功告成了

一点心得 体会 写得不好 还请大家多多包涵

vue 中使用print.js导出pdf操作

vue 中使用print.js导出pdf操作

vue 中使用print.js导出pdf操作

vue 中使用print.js导出pdf操作

以上这篇vue 中使用print.js导出pdf操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
利用XMLHTTP传递参数在另一页面执行并刷新本页
Oct 26 Javascript
Gird事件机制初级读本
Mar 10 Javascript
wordpress之js库集合研究介绍
Aug 17 Javascript
javascript 冒泡排序 正序和倒序实现代码
Dec 14 Javascript
ie下jquery.getJSON的缓存问题的处理方法
Mar 29 Javascript
JS实现鼠标经过好友列表中的好友头像时显示资料卡的效果
Jul 02 Javascript
Js控制滑轮左右滑动实例
Feb 13 Javascript
常见的javascript跨域通信方法
Dec 31 Javascript
Vue.js实现文章评论和回复评论功能
May 30 Javascript
Vue2实时监听表单变化的示例讲解
Aug 30 Javascript
在Vue 中使用Typescript的示例代码
Sep 10 Javascript
使用next.js开发网址缩短服务的方法
Jun 17 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
解决vuex改变了state的值,但是页面没有更新的问题
Nov 12 #Javascript
You might like
php获取用户IPv4或IPv6地址的代码
2012/11/15 PHP
PHP设计模式之装饰者模式代码实例
2015/05/11 PHP
利用PHP实现开心消消乐的算法示例
2017/10/12 PHP
原生JS实现Ajax通过POST方式与PHP进行交互的方法示例
2018/05/12 PHP
PHP文件操作实例总结【文件上传、下载、分页】
2018/12/08 PHP
FireFox JavaScript全局Event对象
2009/06/14 Javascript
写出更好的JavaScript之undefined篇(上)
2009/11/22 Javascript
js 设置选中行的样式的实现代码
2010/05/24 Javascript
jQuery实战之品牌展示列表效果
2011/04/10 Javascript
JavaScript中圆括号()和方括号[]的特殊用法疑问解答
2013/08/06 Javascript
使用jquery获取网页中图片高度的两种方法
2013/09/26 Javascript
JavaScript访问CSS属性的几种方式介绍
2014/07/21 Javascript
原生js实现图片层叠轮播切换效果
2016/02/02 Javascript
js简单时间比较的方法
2016/08/02 Javascript
详解Javascript数据类型的转换规则
2016/12/12 Javascript
jQuery实现的简单动态添加、删除表格功能示例
2017/09/21 jQuery
VUE element-ui 写个复用Table组件的示例代码
2017/11/18 Javascript
详解vue表单——小白速看
2018/04/08 Javascript
Vuex 在Vue 组件中获得Vuex 状态state的方法
2018/08/27 Javascript
详解angular2 控制视图的封装模式
2018/12/27 Javascript
JavaScript 绘制饼图的示例
2021/02/19 Javascript
详解Python各大聊天系统的屏蔽脏话功能原理
2016/12/01 Python
Python即时网络爬虫项目启动说明详解
2018/02/23 Python
Python实现截取PDF文件中的几页代码实例
2019/03/11 Python
pytorch 实现将自己的图片数据处理成可以训练的图片类型
2020/01/08 Python
在tensorflow中设置保存checkpoint的最大数量实例
2020/01/21 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
2020/11/18 Python
财务管理职业生涯规划范文
2013/12/27 职场文书
打架检讨书100字
2014/01/08 职场文书
九年级家长会邀请函
2014/01/15 职场文书
青春无悔演讲稿
2014/05/08 职场文书
2014司机年终工作总结
2014/12/05 职场文书
十七岁的单车观后感
2015/06/12 职场文书
医者仁心观后感
2015/06/17 职场文书
技术入股协议书
2016/03/22 职场文书
css实现左上角飘带效果的完整代码
2022/03/18 HTML / CSS