vue前端实现打印功能

2023-11-02

方案一:window.print()   

这个命令默认打印整个页面的内容,所以,如果想要实现局部打印功能的话,就要重新给body赋值,并且后续执行完之后再还原回去,这样的话会造成一些非预期的结果,很麻烦并且在当前也操作,window.document.body的内容重新渲染,打印完会有刷新,影响用户的体验所以不推荐

方案二:利用iframe,iframe.contentDocument.execCommand('

Print')

<template>
    <div>
        <!--需要打印的页面的某个div-->
        <div id="dynamic-table-page">
            <div>我是需要打印的内容</div>
        </div>
        <!--打印用的隐藏的iframe-->
        <iframe width="0" height="0" frameborder="0" id="oprs-iframe"></iframe>
	</div>
</template>

<script>
    export default {
		mounted() {
			this.setIframeCss();
		},
		methods: {
	        setIframeCss() {
				// 在打印的iframe里加入项目已经写好的样式
				let syfPrint = document.getElementById('oprs-iframe');
				let documentHead = document.getElementsByTagName('head')[0];
				let iframeHead = syfPrint.contentDocument.getElementsByTagName('head')[0];
				iframeHead.innerHTML = documentHead.innerHTML;
			},
            doPrint(){
                this.setIframeCss(); // 打印的时候加入样式
                setTimeout(() => {
                    let printHtml = document.getElementById('dynamic-table-page').innerHTML;
					let syfPrint = document.getElementById('oprs-iframe');
					syfPrint.contentDocument.body.innerHTML = printHtml;
                    // 也可在此处修改要打印的html内容再调用打印
                    syfPrint.contentDocument.execCommand('Print');
                    // this.$refs.iframe.contentWindow.print(); // 也可试试这个方法打印
                }, 200);
            }
        }
    }
</script>

要注意样式引入之后再处理打印逻辑,否则有可能打印的页面会没有样式,也可以单独引入一个print.scss或者使用@media print {}再调整一些样式 

效果图:

方案三:将要打印的内容生成一个图片然后放在iframe中,利用html2canvas 生成截图

1、首先需要在package.json先安装html2canvas

2、代码如下

<template>
    <div>
        <div ref="printContent">
            <div>我是需要打印的内容></div>
        </div>
        <!--打印用的隐藏的iframe-->
        <iframe width="0" height="0" frameborder="0" id="print-iframe"></iframe>
    </div>
</template>
<script>
import html2canvas from 'html2canvas';
export default {
	methods: {
        setIframeCss() {
            // 在打印的iframe里加样式
			let syfPrint = document.getElementById('print-iframe');
			let documentHead = document.getElementsByTagName('head')[0];
			let iframeHead = syfPrint.contentDocument.getElementsByTagName('head')[0];
			iframeHead.innerHTML = documentHead.innerHTML;
		},
		doPrint() {
			let _this = this;
			this.loading = true;
			this.setIframeCss();
			let dataURL;
			html2canvas(this.$refs.printContent, {
              backgroundColor: null,
              scale: 1
            }).then(canvas => {
				dataURL = canvas.toDataURL('image/png');
				let img = new Image();
				console.log(dataURL, 'ddwdwdw');
				img.src = dataURL;
				img.onload = function() {
					let syfPrint = document.getElementById('print-iframe');
					syfPrint.contentDocument.body.innerHTML = '<div class="common-form print-img-form">' + `<img src="${dataURL}"/>` + '</div>';
					syfPrint.contentDocument.execCommand('Print');
                    // this.$refs.iframe.contentWindow.print()
					_this.loading = false;
				};
			});
		}
    }
}
</script>

将截图放在iframe中的img打印,截图一般会有些模糊,调整html2canvas的参数scale,放大缩小的比例,要根据实际情况调整 

总结:

大家肯定实际情况选择合适的方法打印

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

vue前端实现打印功能 的相关文章

随机推荐

  • SpringBoot:使用 @Lazy 注解懒加载

    为什么需要懒加载 我们知道 在 SpringBoot 应用程序启动的时候 会实例化一些对象加入到 IOC 容器里边 这个过程是非常耗时的 那我们想要减少这个耗时的过程就需要 Lazy 注解 对象加入容器的时机 如下代码 package co
  • [JQuery]分页插件jQuery pager plugin功能扩展

    原文地址 http blog csdn net starfd article details 25292019 http blog csdn net nz360 article details 52326232 牛逼分页 http www
  • python:使用 PythonMagick 生成 icon 图标

    目录 PythonMagick 下载与安装 把图片转化成 icon PythonMagick 下载与安装 使用 pip install PythonMagick是不行的 会提示没有这个模块 因此 需要到第三方去把该模块下载下来 再安装 下载
  • 【数据库】B树、B+树、索引

    B树 B 树 索引 二叉树是二分树 多分树是二叉树的推广 多分树主要适用于静态的索引数据文件 在插入和删除的时候需要把插入位置之后的每个记录都要向后移动 从而导致增加新的索引项和索引页块 需要对外存上的页块进行大量的调整 因此对于经常需要插
  • flutter聊天界面-TextField输入框buildTextSpan实现@功能展示高亮功能

    flutter聊天界面 TextField输入框buildTextSpan实现 功能展示高亮功能 最近有位朋友讨论的时候 提到了输入框的高亮展示 在flutter TextField中需要插入特殊样式的标签 比如 请 张三 回答一下 这一串
  • TypeScript Variable Type: never

    目录 never 的定义 never 的特点 never 的定义 never 是其它类型 包括 null 和 undefined 的子类型 代表从不会出现的值 never 通常有两种表现形式 抛出异常 返回值为 never 的函数可以是抛出
  • mysql查询课程的前三名

    看了下网上的查询课程前三名的 真是五花八门 真是 I服了U还各种错 看来啥事还是得自己动手 表结构 CREATE TABLE student id bigint 20 NOT NULL AUTO INCREMENT s no bigint
  • pygame安装教程(python)

    1 安装好python 2 打开cmd 3 输入 pip version 如果显示未安装pip 那么输入pip 等待安装完毕 检查pip是否安装 pip version 4 输入 pip install pygame 可能会出现这种错误 输
  • 软件产品设计的学习总结

    一个成功的软件产品通常需要包含以下几个方面 可靠性 软件产品需要稳定可靠 能够正确地运行 并且在用户使用中没有频繁崩溃或者其他问题 安全性 软件产品在使用过程中需要保证数据的安全性 包括用户的个人和商业隐私等方面 易用性 软件产品需要具有高
  • JAVA中的高并发,解决高并发的方案

    java高并发 如何解决 什么方式解决 一 什么是高并发 二 高并发的解决方法有两种 三 追加 一 什么是高并发 1 1 高并发 High Concurrency 是互联网分布式系统架构设计中必须考虑的因素之一 它通常是指 通过设计保证系统
  • 实现spawn-fcgi的守护监控功能

    http blog csdn net cleanfield article details 6409830 这几天做公司平台的api部分 决定采用c c 版本的fcgi 于是采用了spawn fcgi作为启动框架 不过遇到个问题就是spaw
  • matlab练习程序(神经网络识别mnist手写数据集)

    记得上次练习了神经网络分类 不过当时应该有些地方写的还是不对 这次用神经网络识别mnist手写数据集 主要参考了深度学习工具包的一些代码 mnist数据集训练数据一共有28 28 60000个像素 标签有60000个 测试数据一共有28 2
  • 苹果Swift语言入门教程

    目录 1 简介 2 Swift入门 3 简单值 4 控制流 5 函数与闭包 6 对象与类 7 枚举与结构 1 简介 今天凌晨Apple刚刚发布了Swift编程语言 本文从其发布的书籍 The Swift Programming Langua
  • python三引号作用是什么_python中三引号的作用(逗号的两点总结)

    三引号 1 三引号注释 程序中我使用 来做单行注释 可以使用三引号可以做多行注释 三个引号能包含多行字符串 同时常常出现在函数的声明的下一行 来注释函数的功能 与众不同的地方在于 这个注释作为函数的一个默认属性 可以通过 函数名 doc 来
  • 相信AI的力量——「AI中国」2021年度十大开源事件揭晓

    自2017 年设立以来 机器之心 Synced Machine Intelligence Awards 年度奖项评选活动自已连续举办至第五届 是目前国内人工智能界规模最大 评选最权威的年度奖项 已成为我国人工智能产业的风向标 2021年底
  • Visual Studio 和 Visual Studio Code的区别?

    Visual Studio 是一个全能的 方便的开发环境 即 IDE 像代码自动完成 调试器 数据库集成 服务器设置和配置等 Visual Studio Code VSCode 只是一个跨平台的编辑器 但是用户可以根据自己的需求去增加插件
  • cmath(常用函数)

    cmath包含了许多数学函数 非常实用 1 三角函数 double sin double 正弦 double cos double 余弦 double tan double 正切 2 反三角函数 double asin double 结果介
  • 上MES系统的目的是什么?

    上MES系统的目的是什么 实现透明制造 柔性制造 精益制造 创新制造 观点 太空洞 太空洞 太空洞 开发者的观点 计划 质量 生产 物流一体化管理 要接地气 客户说aps需要 前台傻瓜 后台智能 操作APS的起码有点水准的人吧 太傻瓜能操作
  • pt_session流程

    pt 即 prime time 数字IC后端设计人员用于check pr之后的path timing 的重要工具 在从后端拿到pt session的前提下 确认sdc或者cdc sdc是否有语法问题等 完成脚本的快速迭代 确保前端交付质量
  • vue前端实现打印功能

    方案一 window print 这个命令默认打印整个页面的内容 所以 如果想要实现局部打印功能的话 就要重新给body赋值 并且后续执行完之后再还原回去 这样的话会造成一些非预期的结果 很麻烦 并且在当前也操作 window docume