#Vue# Vue使用print实现打印及另存为PDF功能

2023-10-30

步骤

(1)在src--utils里面加入print.js

 这个文件里面,也解决了 //canvass echarts图表转为图片 的问题

// 打印类属性、方法定义
/* 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>html,body,div{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].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:' + document.querySelector('#details').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

(2)在main.js里面引入

 

import  print from '@/utils/print.js'
Vue.use(print)

(3)将要打印的内容,设置一个id选择器以及ref

<div class="teacherData">
    <div id='printBill' ref="print">
        <div class="report_item">
           【打印的内容区域】
        </div>
    </div>
</div>

 (4)在需要调用的页面进行引入

设置打印的点击事件

<div class="print_wrap">
     <el-button type="primary"  @click="billPrintClick" >打印报告</el-button>
</div>
 billPrintClick(){
    this.$print(this.$refs.print) // 使用
  },

(5)在进行了以上4个步骤以后,我们会发现虽然可以打印,可是打印内容的css样式全部丢失,这个时候,我们只需要在<style lang="scss" scoped></style>将css样式复制一份在@media print里面

<style lang="scss" scoped>
 @media print {
    //调整多出一页空白页
    @page {
        size: auto; 
        margin: 6mm;
    }
    html {
        background-color: #ffffff;
        margin: 0px;
    }

    body {
        border: solid 1px #ffffff;
        margin: 10mm 15mm 10mm 15mm; 
    }
    #printBill {
        max-width: 1200px;
        margin: auto;
        .report_item {}
    }
/*样式内容*/
.teacherData {
    #printBill {
        max-width: 1200px;
        margin: auto;
        .report_item {
             }
        }
    }

(注意勾选这个背景图形,若没有勾选,那打印内容里面所有的背景颜色都会丢失) 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

#Vue# Vue使用print实现打印及另存为PDF功能 的相关文章

随机推荐

  • locust

    python做性能测试首选库 内部使用requests库 可以基本将接口自动化的代码搬过来 稍微修改即可 内部使用协程的模式 单机并发远超jmeter 第一步 安装 pip install locust 第二步 使用 创建一个locustf
  • semtic kityy数据集信息和工具可视化

    0 sem11 21的提交测试地址 https competitions codalab org competitions 24025 learn the details evaluation 1 数据集结构 instance是panopt
  • 模板全特化和偏特化

    模板特化就是告诉编译器我这有更好的实现 走我这边 能更快的执行 类模板特化分为全特化和偏特化 全特化就是对所有的模板类型给一个限定 偏特化只限定一部分 可分为个数偏 范围偏 具体如下代码 模板类 tempalte
  • CHECK TABLE语法--MySql数据库

    CHECK TABLE tbl name tbl name option option QUICK FAST MEDIUM EXTENDED CHANGED 检查一个或多个表是否有错误 CHECK TABLE对MyISAM和InnoDB表有
  • 正一派道家奇门遁甲排盘算法python程序

    正一派道家奇门遁甲排盘算法python程序程序 首先声明 这篇文章可能很快就会消失了 毕竟已经2020年了 还有很多人觉得奇门遁甲是 剪纸成人 撒豆成兵 的法术 其实奇门遁甲是一种符号预测学 这里我写了一个python程序来排盘 因为奇门遁
  • Moveit编程——moveit 编程技巧笔记——圆弧轨迹规划+修改轨迹

    moveit 编程技巧笔记 圆弧轨迹规划 修改轨迹 1 笛卡尔空间圆弧轨迹规划 2 轨迹重定义 修改moveit生成的轨迹数据 1 笛卡尔空间圆弧轨迹规划 之前学习过笛卡尔空间下轨迹规划API plan fraction arm compu
  • jsp 有哪些域对象和内置对象及他们的作用?

    四大域对象 1 pageContext page 域 指当前页面 在当前 jsp 页面有效 跳到其它页面失效 2 request request 域 指一次请求范围内有效 从 http 请求到服务器处理结束 返回响应的整个过程 在这个过程中
  • 快速排序的代码

    一 快速排序的思想 通过一趟排序将要排序的数据分割成独立的两部分 分割点左边都是比它小的数 右边都是比它大的数 二 实例演示 第一次排序过程中left始终小于right 当left right表示第一次排序完成 此时以3为分割点左边的数都比
  • 物联网传输协议MQTT

    本文转载至 http www infoq com cn news 2014 12 mqtt ibm iot utm campaign infoq content utm source infoq utm medium feed utm te
  • C++设计模式之原型模式

    举一个最简单的例子来说明原型模式 记得上小学的时候 老师把需要做的课外习题写到黑板上 而下面的我们都要把这些题抄写到自己的本子上 回家做好 第二天交上来 也就是每道题 全班50个人 每个人都要抄写一遍 按照现在的时间理论来说 就是浪费了50
  • 马士兵python_马士兵老师的python入门教程

    01 Python编程语言历史及特性 mp4 02 Python编程语言初接触 mp4 03 Python程序文件结构 mp4 04 准备Python编程环境 mp4 05 Python编程语言基础技术框架 1 mp4 06 Python编
  • 如何用python进行数据分析

    1 Python数据分析流程及学习路径 数据分析的流程概括起来主要是 读写 处理计算 分析建模和可视化四个部分 在不同的步骤中会用到不同的Python工具 每一步的主题也包含众多内容 根据每个部分需要用到的工具 Python数据分析的学习路
  • 02-18 周六 图解机器学习之SMV 第五章5-2

    02 18 周六 图解机器学习之SMV 第五章5 2 时间 版本 修改人 描述 2023年2月18日11 47 18 V0 1 宋全恒 新建文档 环境 程序的基本环境 是使用了jupyter 在容器中运行的 简介 本程序主要演示支持向量的获
  • sockboom 更新日志

    2023 09 04 主域名 sockboom link 订阅域名 sockboom me 邀请域名 sockboom love
  • Js课堂笔记(二)

    一 基础 1 js的语言特点 lt 1 gt 是一种脚本语言 lt 2 gt 是基于客户端 lt 3 gt 是基于对象 lt 4 gt 是在浏览器直接执行 2 1 NaN 表示不是数字 例 console log parseInt 小李 2
  • 《安卓逆向》Magisk的编译踩坑记录-安装方法-分享魔改后的Magisk过root检测方法

    为什么 1 体验下如何编译面具源码 2 魔改面具 绕过更深的root检测 1 ubuntu 虚拟机下载地址 http mirrors aliyun com ubuntu releases 20 04 github https github
  • QT从零开始作单片机上位机-串口调试助手+波形显示-实现串口模块的配置

    目录 实现串口模块的配置 1 一 先列举需要思考的问题 二 所有的问题要由简单到复杂逐一解决 实现串口模块的配置 1 完成了基本的界面设计后 我们就要着手实现功能 下来的几章我们看串口数据收发的功能怎么实现 首先我需要阐明的是 由于做嵌入式
  • Linux 忘记密码解决方法

    很多同学经常会忘记Linux系统的用户密码 忘记密码的情况该怎么办呢 一般情况下 忘记密码有两种 忘记忘记超级用户密码和普通用户密码 本文将分别介绍解决方法 解决方法如下 超级用户忘记密码 在开机时进入到这个界面按上下键 打断其自动选择系统
  • Web 前端—HTML+CSS系列

    HTML CSS 一 HTML CSS 1 1什么是HTML CSS 1 2宇宙第一编辑器VS Code 1 3Chrome浏览器 1 4 深入了解网站开发 一 HTML基本操作 1 web前端三大核心技术 2 HTML初始代码 3 HTM
  • #Vue# Vue使用print实现打印及另存为PDF功能

    步骤 1 在src utils里面加入print js 这个文件里面 也解决了 canvass echarts图表转为图片 的问题 打印类属性 方法定义 eslint disable const Print function dom opt