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 相关文章推荐
Javascript miscellanea -display data real time, using window.status
Jan 09 Javascript
用javascript实现点击链接弹出&quot;图片另存为&quot;而不是直接打开
Aug 15 Javascript
Mootools 1.2教程 设置和获取样式表属性
Sep 15 Javascript
Javascript/Jquery——简单定时器的多种实现方法
Jul 03 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
Jan 12 Javascript
javascript实现简单的分页特效
Aug 12 Javascript
jQuery 1.9.1源码分析系列(十四)之常用jQuery工具
Dec 02 Javascript
学习JavaScript图片预加载模块
Nov 07 Javascript
AngularJS路由删除#符号解决的办法
Sep 28 Javascript
angularjs中$http异步上传Excel文件方法
Feb 23 Javascript
你点的 ES6一些小技巧,请查收
Apr 25 Javascript
JS实现拖拽元素时与另一元素碰撞检测
Aug 27 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
VOLVO车载收音机
2021/03/02 无线电
浅谈PHP语法(1)
2006/10/09 PHP
php strnatcmp()函数的用法总结
2013/11/27 PHP
Web程序工作原理详解
2014/12/25 PHP
php使用parse_url和parse_str解析URL
2015/02/22 PHP
Thinkphp5框架实现获取数据库数据到视图的方法
2019/08/14 PHP
Egret引擎开发指南之发布项目
2014/09/03 Javascript
JS弹出对话框实现方法(三种方式)
2015/12/18 Javascript
jQuery实现鼠标选文字发新浪微博的方法
2016/04/02 Javascript
AngularJS  $modal弹出框实例代码
2016/08/24 Javascript
js两种拼接字符串的简单方法(必看)
2016/09/02 Javascript
用js制作淘宝放大镜效果
2020/10/28 Javascript
微信小程序 页面跳转如何实现传值
2017/04/05 Javascript
nodejs项目windows下开机自启动的方法
2017/11/22 NodeJs
vue动画之点击按钮往上渐渐显示出来的实例
2018/09/29 Javascript
Vue.js 父子组件通信的十种方式
2018/10/30 Javascript
Vue中img的src是动态渲染时不显示的解决
2019/11/14 Javascript
vue实现计算器功能
2020/02/22 Javascript
[01:01:01]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第一场 10.29
2020/10/29 DOTA
python共享引用(多个变量引用)示例代码
2013/12/04 Python
python中随机函数random用法实例
2015/04/30 Python
python 调用c语言函数的方法
2017/09/29 Python
Python设计模式之代理模式简单示例
2018/01/09 Python
基于python实现ROC曲线绘制广场解析
2020/06/28 Python
英国体育器材进口商店:UK Sport Imports
2017/03/14 全球购物
StubHub意大利:购买和出售全球演唱会和体育赛事门票
2017/11/21 全球购物
保加利亚运动鞋购物网站:SneakerStudio.bg
2020/12/23 全球购物
这段代码难道不该打印出56吗
2013/02/27 面试题
仓库保管员岗位职责
2013/12/20 职场文书
就业协议书的作用
2014/04/11 职场文书
2014年会策划方案
2014/05/11 职场文书
离职证明范本(5篇)
2014/09/19 职场文书
银行竞聘报告范文
2014/11/06 职场文书
2019毕业典礼主持词!
2019/07/05 职场文书
小程序与后端Java接口交互实现HelloWorld入门
2021/07/09 Java/Android
Java Socket实现多人聊天系统
2021/07/15 Java/Android