vue 打印、自定义打印、页面打印、隐藏页眉页脚

        花了一天时间搞了个打印功能,现则将整体实现过程进行整理分享。先来看看效果图:

1、页面展示为:

2、重组页面打印格式为:这里重组页面的原因是客户要求为一行两列打印 !内容过于多的行则独占一行显示完整。

 整体实现:

在你的项目的components目录下创建如下目录及文件:

 将以下代码粘贴到这个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{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');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')}}}}}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();var _this = thisiframe.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

 在views目录下创建重组页面,即要实现的打印页面。目录及页面文件如下:

粘贴以下代码进入index.vue组件中:注意阅读并分析这里面的实现,预留功能为一行N列实现,栅格布局计算!

<template><el-dialog :title="title" :visible.sync="visible" width="148mm" :before-close="handleClose" center append-to-body><div class="w-100 h-100"><div class="w-100" ref="print"><div class="header-view w-100"><div class="title-view w-100 single-line">{{ printData.title }}</div></div><div class="w-100 body-view"><div class="print-section" v-for="(item, tindex) in printData.data" :key="item"><div class="section-view">{{ item.title }}</div><el-row class="row-view bd-right" v-for="(a, aindex) in item.child" :key="a":class="{ 'bd-top': aindex == 0 }"><el-col :span="rowSpan" v-for="(p, index) in a.child" class="col-view flex-row":class="{ 'bd-left': index == 0 }"><div class="main-lb cell-view":class="[index > 0 ? 'bd-left' : '', `lb_${tindex}_${aindex}_${index}`]">{{ p.label| textFilter}}</div><div class="value-lb cell-view":class="[p.singLine ? 'value-pre' : '', `vlb_${tindex}_${aindex}_${index}`]">{{p.value}}</div></el-col></el-row><el-row class="row-view bd-right"><el-col :span="12" class="col-view flex-row bd-left"><div class="main-lb cell-view">备注</div><div class="value-lb cell-view" style="height: 50px;"></div></el-col></el-row></div></div></div></div><div slot="footer" class="w-100 flex-row no-print" style="height: 44px;"><el-button class="el-icon-printer" type="primary" @click="handlePrint">打印</el-button></div></el-dialog>
</template>
<script>export default{name: 'pagePrinter',components: {},data() {return {visible: false,inMobile: false,printData: {'title': '','titleClass': null,'subTitle': '','subTitleClass': null,'data': []},rowSpan: 12}},props:{title: {type: String,default: () => null},//是否随机项目printMap: {type: Object,default: () => {return {'title': '','titleClass': null,'subTitle': '','subTitleClass': null,'data': []}}},},watch: {printMap: {deep: true,handler(val) {if (val) {this.updatePrintData()}}},},created() {},filters: {textFilter(val) {let v = val.replace(/:/g, '');return v}},methods: {handleClose() {this.visible = false;this.$emit('update:visible', false)this.$emit('close', {})},updatePrintData() {this.inMobile = this.isMobile()let m = {'title': this.printMap.title,'titleClass': this.printMap.titleClass,'subTitle': this.printMap.subTitle,'subTitleClass': this.printMap.subTitleClass,'data': this.printMap.data}let dataList = []let col = 24 / this.rowSpanthis.printMap.data.forEach(e => {let ae = {title: e.title,child: []}let list = []e.child?.forEach((c, cdex) => {c.span = this.rowSpanlist.push(c)if (list.length % col == 0 || cdex == e.child.length - 1 || c.singLine) {if (c.singLine) {list.forEach(n => {n.singLine = truelet cx = {child: [n]}ae.child.push(cx)})}else {let cx = {child: list}ae.child.push(cx)}list = []}});dataList.push(ae)});m.data = dataListthis.printData = mthis.visible = truethis.$nextTick(() => {dataList.forEach((a, aindex) => {a.child.forEach((b, bindex) => {let maxHeight = 0b.child.forEach((c, cindex) => {let csName = `.lb_${aindex}_${bindex}_${cindex}`let atarget = document.querySelector(csName)let aht = atarget.offsetHeightlet bsName = `.vlb_${aindex}_${bindex}_${cindex}`let btarget = document.querySelector(bsName)let bht = btarget.offsetHeightmaxHeight = Math.max(maxHeight, Math.max(aht, bht))atarget.style.height = maxHeight + 'px';btarget.style.height = maxHeight + 'px';});b.child.forEach((c, cindex) => {let csName = `.lb_${aindex}_${bindex}_${cindex}`let atarget = document.querySelector(csName)let bsName = `.vlb_${aindex}_${bindex}_${cindex}`let btarget = document.querySelector(bsName)atarget.style.height = maxHeight + 'px';btarget.style.height = maxHeight + 'px';});});})})},handlePrint() {this.$print(this.$refs.print);},}}
</script><style lang="scss" scoped>
.header-view {width: 100%;padding: 10px 0px;//border-bottom: 1px solid #ccc;
}.section-view {font-size: 12px;text-align: left;color: #333;margin-left: 10px;padding-bottom: 5px;
}.title-view {font-size: 18px;text-align: center;color: black;
}.cnt-view {height: calc(100% - 44px);
}.body-view {height: calc(100% - 64px);
}.bd-left {border-left: 1px solid #ccc;
}.bd-right {border-right: 1px solid #ccc;
}.bd-top {border-top: 1px solid #ccc;
}.row-view {border-bottom: 1px solid #ccc;
}.flex-row {display: flex;flex-direction: row;justify-content: center;align-items: center;
}.cell-view {//min-height: 38px;display: flex;flex-direction: row;justify-content: flex-start;align-items: center;
}.main-lb {font-size: 10px;color: #444;width: 40%;font-weight: 500;padding-left: 5px;//border-right: 1px solid #ccc;
}.value-lb {font-size: 11px;color: black;width: 60%;border-left: 1px solid #ccc;white-space: pre-line;word-break: break-all;padding: 4px 10px;
}.value-pre {white-space: pre;
}::v-deep {.el-dialog {width: 100%;//height: 100%;}.el-dialog__body {height: 100%;padding: 10px 20px;}.el-dialog--center {margin-top: 30px !important;margin-bottom: 30px !important;}.el-divider--horizontal {margin: 0;}.is-horizontal {height: 0px;display: none;}.el-scrollbar__wrap {overflow-x: hidden;}
}//隐藏页眉页脚
@media print {body {margin: 0;padding: 0;}@page {margin: 0 10px;}header,footer {display: none;}
}
</style>

隐藏页眉页脚: 

//隐藏页眉页脚
@media print {body {margin: 0;padding: 0;}@page {margin: 0 10px;}header,footer {display: none;}
}

 在使用打印功能的父组件页面中引入上述子组件;

 

组装数据格式为,传到打印页面,最终打印页面会计算布局,根据一行显示多少列来遍历child进行布局后显示打印页面。

singLine意即为是否独占一行打印显示,封装数据后传入组件内部会根据预设来布局显示完成打印预览及打印功能。

[{"title": "起搏器工作情况:","child": [{"label": "植入型号:","value": "MDT-SEDRL1","singLine": false},{"label": "随访时间","value": "2024-05-23 11:26:41","singLine": false},{"label": "模式","value": "DDDR","singLine": false},{"label": "基础频率:","value": "60(bpm)","singLine": false},{"label": "最大跟踪频率:","value": "130(bpm)","singLine": false},{"label": "更多频率:","value": "否","singLine": false},{"label": "心房阈值:","value": "0.5(V)","singLine": false},{"label": "心房脉宽:","value": "0.4(ms)","singLine": false},{"label": "心房输出电压:","value": "1.5(V)","singLine": false},{"label": "心房电极阻抗","value": "738(Ω)","singLine": false},{"label": "心房感知:","value": ">2.8(mV)","singLine": false},{"label": "心房起搏比例:","value": "74.8(%)","singLine": false},{"label": "右室阈值:","value": "0.625(V)","singLine": false},{"label": "右室脉宽:","value": "0.4(ms)","singLine": false},{"label": "右室输出电压:","value": "2.0(V)","singLine": false},{"label": "右室电极阻抗:","value": "385(Ω)","singLine": false},{"label": "右室感知:","value": "5.6-8.0(mV)","singLine": false},{"label": "右室起搏比例:","value": "2.5(%)","singLine": false},{"label": "PAV间期:","value": "150/120-320/290(ms)","singLine": false},{"label": "起搏器预计使用年限:","value": "10","singLine": false},{"label": "电池电压:","value": "2.79(V)","singLine": false},{"label": "磁铁频率:","value": "100","singLine": false},{"label": "电池阻抗:","value": "181(Ω)","singLine": false},{"label": "ICD/CRTD选项:","value": "否","singLine": false},{"label": "CRT选项","value": "否","singLine": false},{"label": "是否有心律失常:","value": "是","singLine": false},{"label": "何种心律失常:","value": "室性心动过速、房性心动过速","singLine": false},{"label": "心律失常信息:","value": "2023-04-18  VHR A/V:116/180bpm  1  3S  /;\\n2023-06-30  AHR  A/V:191/128bpm  1  14min54s  /;\\n","singLine": true},{"label": "是否放电:","value": "否","singLine": false},{"label": "其他情况登记:","value": "2 VHR 3S 2023.4.18;2024.1.17 \\n86 AHR 37S-1h13min36s  2023.6.26-2023.7.6 ","singLine": false}]}
]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/15119.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

区块链论文总结速读--CCF A会议 USENIX Security 2024 共7篇 附pdf下载

Conference&#xff1a;33rd USENIX Security Symposium CCF level&#xff1a;CCF A Categories&#xff1a;网络与信息安全 Year&#xff1a;2024 Num&#xff1a;7 1 Title: Practical Security Analysis of Zero-Knowledge Proof Circuits 零知识证明电路的实用安全…

hbase版本从1.2升级到2.1 spark读取hive数据写入hbase 批量写入类不存在问题

在hbase1.2版本中&#xff0c;pom.xml中引入hbase-server1.2…0和hbase-client1.2.0就已经可以有如下图的类。但是在hbase2.1.0版本中增加这两个不行。hbase-server2.1.0中没有mapred包&#xff0c;同时mapreduce下就2个类。版本已经不支持。 <dependency><groupId>…

安全访问python字典:避免空键错误的艺术

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、直接访问字典键的问题 三、使用get方法安全访问字典键 四、get方法的实际应…

Could not create connection to database server的错误原因

1、使用MyBatis 连接数据库报错 org.apache.ibatis.exceptions.PersistenceException: ### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. ### The error may …

用队列实现栈,用栈实现队列

有两个地方会讨论到栈&#xff0c;一个是程序运行的栈空间&#xff0c;一个是数据结构中的栈&#xff0c;本文中讨论的是后者。 栈是一个先入后出&#xff0c;后入先出的数据结构&#xff0c;只能操作栈顶。栈有两个操作&#xff0c;push 和 pop&#xff0c;push 是向将数据压…

电脑如何远程监控?如何远程监控电脑屏幕?

远程监控是指通过网络技术和远程视频传输技术&#xff0c;实现对某一特定区域、设备或场景进行远程实时监测、管理、控制的一种技术手段。 它将视频传输、图像采集、数据存储和远程操作等多种技术相结合&#xff0c;能够在任意时间、任意地点实现对被监测对象的远程监控。 远程…

IO模型:同步阻塞、同步非阻塞、同步多路复用、异步非阻塞

目录 stream和channel对比 同步、异步、阻塞、非阻塞 线程读取数据的过程 同步阻塞IO 同步非阻塞IO 同步IO多路复用 异步IO 优缺点对比 stream和channel对比 stream不会自动缓冲数据&#xff0c;channel会利用系统提供的发送缓冲区、接收缓冲区。stream仅支持阻塞API&am…

轻松拿捏C语言——【字符函数】字符分类函数、字符转换函数

&#x1f970;欢迎关注 轻松拿捏C语言系列&#xff0c;来和 小哇 一起进步&#xff01;✊ &#x1f308;感谢大家的阅读、点赞、收藏和关注&#x1f495; &#x1f339;如有问题&#xff0c;欢迎指正 感谢 目录&#x1f451; 一、字符分类函数&#x1f319; 二、字符转换函数…

hive3从入门到精通(二)

第15章:Hive SQL Join连接操作 15-1.Hive Join语法规则 join分类 在Hive中&#xff0c;当下版本3.1.2总共支持6种join语法。分别是&#xff1a; inner join&#xff08;内连接&#xff09;left join&#xff08;左连接&#xff09;right join&#xff08;右连接&#xff09;…

力扣HOT100 - 136. 只出现一次的数字

解题思路&#xff1a; class Solution {public int singleNumber(int[] nums) {int single 0;for (int num : nums) {single ^ num;}return single;} }

基于卷积神经网络的交通标志识别(pytorch,opencv,yolov5)

文章目录 数据集介绍&#xff1a;resnet18模型代码加载数据集&#xff08;Dataset与Dataloader&#xff09;模型训练训练准确率及损失函数&#xff1a;resnet18交通标志分类源码yolov5检测与识别&#xff08;交通标志&#xff09; 本文共包含两部分&#xff0c; 第一部分是用re…

C++学习笔记(21)——继承

目录 1. 继承的概念及定义1.1 继承的概念1.2 继承定义1.2.1 定义格式1.2.2 继承关系和访问限定符1.2.3 继承基类成员访问方式的变化 继承的概念总结&#xff1a; 2. 基类和派生类对象赋值转换3.继承中的作用域4.派生类的默认成员函数知识点&#xff1a;派生类中6个默认成员函数…

win11 wsl ubuntu24.04

win11 wsl ubuntu24.04 一&#xff1a;开启Hyper-V二&#xff1a;安装wsl三&#xff1a;安装ubuntu24.04三&#xff1a;桥接模式&#xff0c;固定IP四&#xff1a;U盘使用五&#xff1a;wsl 从c盘迁移到其它盘参考资料 一&#xff1a;开启Hyper-V win11家庭版开启hyper-v 桌面…

Pytorch-01 框架简介

智能框架概述 人工智能框架是一种软件工具&#xff0c;用于帮助开发人员构建和训练人工智能模型。这些框架提供了各种功能&#xff0c;如定义神经网络结构、优化算法、自动求导等&#xff0c;使得开发人员可以更轻松地实现各种人工智能任务。通过使用人工智能框架&#xff0c;…

虚拟机使用的是此版本 VMware Workstation 不支持的硬件版本。 模块“Upgrade”启动失败。 未能启动虚拟机。

问题&#xff1a; 虚拟机使用的是此版本 VMware Workstation 不支持的硬件版本。 模块“Upgrade”启动失败。 未能启动虚拟机。 分析&#xff1a; 该虚拟机环境之前使用的VMware版本与你所使用的VMware版本不一致。大概率你使用的是刚从别人电脑里拷过来的虚拟机环境。 解决&…

游戏后台开发技术全面解析

在这个数字时代&#xff0c;游戏产业已经成为全球最受欢迎的娱乐方式之一。从简单的手机游戏到复杂的大型多人在线角色扮演游戏&#xff08;MMORPG&#xff09;&#xff0c;游戏的世界正变得越来越丰富和多样化。而这一切的背后&#xff0c;都离不开强大的游戏后台技术支持。在…

Java重写

方法重写的意义 在java中&#xff0c;子类可以继承父类中的方法&#xff0c;而不需要重新编写相同的方法&#xff0c;但是有时子类并不想原封不动的继承父类方法&#xff0c;需要做一定的修改&#xff0c;这时候就需要使用方法重写 方法重写的定义 在继承的前提下 子类可以根据…

Python使用连接池操作MySQL

测试环境说明&#xff1a;Python版本是 3.8.10 &#xff0c;DBUtils版本是3.1.0 &#xff0c;pymysql版本是1.0.3 首先安装指定版本的连接池库DBUtils 、还有pymysql pip install DBUtils3.1.0 pip install pymysql1.0.3创建文件 sqlConfig.py # sqlConfig.pyimport pymysql…

YOLOv10论文解读:实时端到端的目标检测模型

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

618购物节快递量激增,EasyCVR视频智能分析助力快递网点智能升级

随着网络618购物节的到来&#xff0c;物流仓储与快递行业也迎来业务量暴增的情况。驿站网点和快递门店作为物流体系的重要组成部分&#xff0c;其安全性和运营效率日益受到关注。为了提升这些场所的安全防范能力和服务水平&#xff0c;实施视频智能监控方案显得尤为重要。 一、…