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 相关文章推荐
jquery UI 1.72 之datepicker
Dec 29 Javascript
Javascript跨域请求的4种解决方式
Mar 17 Javascript
Jquery 模拟用户点击超链接或者按钮的方法
Oct 25 Javascript
JQuery对表格进行操作的常用技巧总结
Apr 23 Javascript
javascript中的正则表达式使用指南
Mar 01 Javascript
js实现同一个页面多个渐变效果的方法
Apr 10 Javascript
js实现多图左右切换功能
Aug 04 Javascript
Jquery获取当前城市的天气信息
Aug 05 Javascript
JS Select下拉框(支持输入模糊查询)
Feb 04 Javascript
vue图片加载与显示默认图片实例代码
Mar 16 Javascript
vue移动端写的拖拽功能示例代码
Sep 09 Javascript
js禁止查看源文件屏蔽Ctrl+u/s、F12、右键等兼容IE火狐chrome
Oct 01 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 iconv函数的使用详解
2013/06/09 PHP
Linux中用PHP判断程序运行状态的2个方法
2014/05/04 PHP
php经典算法集锦
2015/11/14 PHP
PHP全功能无变形图片裁剪操作类与用法示例
2017/01/10 PHP
js程序中美元符号$是什么
2008/06/05 Javascript
用JavaScript实现单继承和多继承的简单方法
2009/03/29 Javascript
无限树Jquery插件zTree的常用功能特性总结
2014/09/11 Javascript
node.js中的emitter.on方法使用说明
2014/12/10 Javascript
ECMAScript6新增值比较函数Object.is
2015/06/12 Javascript
jQuery ajax时间差导致的变量赋值问题分析
2016/01/22 Javascript
适用于javascript开发者的Processing.js入门教程
2016/02/24 Javascript
仿Angular Bootstrap TimePicker创建分钟数-秒数的输入控件
2016/07/01 Javascript
jquery实现页面加载效果
2017/02/21 Javascript
AngularJS折叠菜单实现方法示例
2017/05/18 Javascript
使用 Javascript 实现浏览器推送提醒功能的示例
2017/11/03 Javascript
微信小程序swiper组件用法实例分析【附源码下载】
2017/12/07 Javascript
JavaScript 跨域之POST实现方法
2018/05/07 Javascript
JavaScript的Object.defineProperty详解
2018/07/09 Javascript
IE9 elementUI文件上传的问题解决
2018/10/17 Javascript
[33:28]完美世界DOTA2联赛PWL S3 PXG vs GXR 第三场 12.19
2020/12/24 DOTA
Python中Collections模块的Counter容器类使用教程
2016/05/31 Python
在Python中居然可以定义两个同名通参数的函数
2019/01/31 Python
如何修复使用 Python ORM 工具 SQLAlchemy 时的常见陷阱
2019/11/19 Python
Python基础之函数基本用法与进阶详解
2020/01/02 Python
python实现发送带附件的邮件代码分享
2020/09/22 Python
html5清空画布方法(三种)
2017/10/16 HTML / CSS
SOA面试题:如何在SOA中实现松耦合
2013/07/21 面试题
大学生的四年学习自我评价
2013/12/13 职场文书
就业表自我评价分享
2014/02/06 职场文书
公务员年终个人总结
2015/02/12 职场文书
售票员岗位职责
2015/02/15 职场文书
2015婚礼主持词开场白
2015/05/28 职场文书
nginx如何将http访问的网站改成https访问
2021/03/31 Servers
Python OpenCV快速入门教程
2021/04/17 Python
给numpy.array增加维度的超简单方法
2021/06/02 Python
奥特曼十大神器:奥特手镯在榜,第一是贝利亚的神器
2022/03/18 日漫