vue中实现打印功能的方法与注意事项
vue中实现打印功能的方法与注意事项
- 一、使用方法:
- 1. 在HTML中
- 2. 在VUE项目中
- 二、问题总结
- 1. 设置打印方向
- 2. 设置打印高度
- 1. 单张打印
- 2. 循环打印
- 3. 获取打印操作的回调
- 4. 添加强制分页
- 5. 媒体查询设置打印样式常用内容:
常见的实现打印的方式:
1.javaSript 的 window.print() ------------打印范围不可控
2.C-Lodop (打印插件) -----------------要装插件太麻烦
3.jquery.PrintArea.js打印 -----------------简单易用
项目采用的实现方式:第三种,引用jquery.PrintArea.js打印插件
一、使用方法:
1. 在HTML中
1.引入要用的js
<script type="text/javascript" src="../jquery/jquery.PrintArea.js"></script>
2.设置要打印的区域, html+css语句实现打印内容的绘制,id定义打印区域
<div id="print">//打印区域------
</div>
3.打印语句 ,通过id获取元素实现打印
$("#print").printArea();
2. 在VUE项目中
将需要打印的页面绘制成组件,在需要实现打印功能的页面引入。
<!-- 实例化引用的打印组件 --><print-index style="display: none;" ref="PrintIndex"/><!-- 引入打印组件 -->import PrintIndex from '@/components/Print/index'<!-- 引入打印插件 -->
import Print from '@/utils/printarea.js';<!-- 注册组件 -->components: {PrintIndex},<!-- 点击打印按钮,调用打印方法,先通过$refs方法给组件赋值,然后 new Print()调用打印方法 -->async handleOk() {await this.$refs.PrintIndex.see(this.printDatas);console.log("打印中");this.$nextTick(() => {let print = new Print({el: "#PrintIndex",});})},
二、问题总结
1. 设置打印方向
横向:landscape;
纵向:portrait ;
自定义 :auto ;
定义为A4纸:A4
更多配置及具体描述参见此链接
@page {size: auto; // 自定义// size:a4;//定义为a4纸// margin:0 0 0 50px;//页面的编剧
}//定义纸张旋转
#PrintIndex{page: rotated; //引用旋转page-break-before:avoid;//前面不加空页page-break-after:avoid;//后面不加空页
}
*注 : 应尽可能不在@page{}事件中,定义当前页面打印内容的特殊样式,全局有多个打印组件、组件内多次定义了@page{}时,可能会引起正式环境打印样式的混乱,页面方向和间距可能会互相影响。
2. 设置打印高度
1. 单张打印
直接调用即可,一般不会出现什么问题。
2. 循环打印
当打印需要实现多个页面内容同时打印且分别需要循环时(如:打印单据,有五种单据样式,每种单据有多张,打印时需要将五种单据的全部数据同时打印)
- 如果打印的内容一页对应一条数据,那可以直接给组件高度设置为100vh,然后在组件外层添加循环操作。
- 如果打印内容,多条数据对应一页(比如一张纸打印三条单据时),此时应给组件的外层设置一个动态高度,否则可能会出现打印内容重叠的情况。动态样式设置方法:
<div><!-- 设置打印id --><div id="PrintIndex"><!-- 动态设置高度 --><div :style="{height: bodyHeight}"><!-- 数据循环 --><div v-for='(item,index) in resultData' class="container"><!-- 此处绘制打印内容 --></div></div></div>
</div>// 绑定动态样式
:style="{height: bodyHeight}"// 初始化时根据数据条数计算打印页面所占高度
this.bodyHeight = `${Math.ceil(res.length / 3) * 100}vh`
3. 获取打印操作的回调
在PrintArea.js文件中,this.settings对象中自己添加success: ()=>{}方法,并在 print()方法中添加"afterprint"时间监听,在监听中调用 this.settings.success():
print(PAWindow) {let paWindow = PAWindow;paWindow.addEventListener('afterprint', () => {console.log('print after')this.settings.success()})console.log('---调用打印 focus-----');paWindow.focus();paWindow.print();console.log('---调用打印 print-----');};
即可在页面调用打印时获取到打印操作的回调:
async handleOk() {await this.$refs.PrintIndex.see(this.printDatas);console.log("打印中");this.$nextTick(() => {let print = new Print({el: "#PrintIndex",success: () =>{// 打印时间的回调,打印后要进行的操作或判断写在这里}});})
},
*注:此打印方式是唤起浏览器自带的打印功能,点开后有“打印”和“取消”两个按钮,但无法监听到用户到底是进行了什么操作,success的回调只能监听到打印预览页面关闭的操作,即我们只能知道页面中成功唤起了打印页面后,打印的预览页面被关闭了。
*注:如果打印内容中有表格,为避免表格打印时,一行的内容被两张纸断开打印,需要给表格增加 break-inside: avoid属性。
4. 添加强制分页
如果打印的内容高度无法确定,且需要循环打印,为了保证打印的每一份内容都是独立的,不产生断页,需要在一次循环打印的内容尾部添加分页符,可以将下方语句放到循环打印的代码段最下方,即可实现分页效果。
<p style="page-break-after:always;"></p>
将打印内容转化为pdf预览的另一种方式
打印样式中不推荐使用背景,因为浏览器默认情况下并不能打印出CSS中的背景内容,只有当浏览器被设置可以打印背景的情况下才能打印出背(ie的高级选项中可选),如果需要使用此方式可以参照此链接
或此链接
打印网络资源图片不显示,解决方案 : 等待网络资源图片加载完成后,在打印,代码:
$(doc).find('.qrcode-down').load(function () {iframe.contentWindow.print();window.location.reload()
})
5. 媒体查询设置打印样式常用内容:
@media print {@page {/* 纵向打印 */// size: portrait;/* 横向打印 */size: landscape;/* 去掉页眉页脚*/margin-top: 0;margin-bottom: 0;}/* 告诉浏览器在渲染它时不要对框进行颜色或样式调整 */* {-webkit-print-color-adjust: exact !important;-moz-print-color-adjust: exact !important;-ms-print-color-adjust: exact !important;print-color-adjust: exact !important;}/*打印不显示打印按钮*/.print-button-container {display: none !important;}/* 伪类 :first 用于匹配到文档的第一页, 首页上页边距设置为 10cm */@page :first {margin-top: 10cm; }/* 通过分别设置左页和右页不同的左右页面距,为装订边留出更多的空间 *//**/@page :left {margin-left: 2.5cm;margin-right: 2.7cm;}@page :right {margin-left: 2.7cm;margin-right: 2.5cm;}}
vue中实现打印功能的方法与注意事项相关推荐
- VUE中实现打印功能插件—vue-easy-print
话不多说直接上代码 1.安装插件:注意版本号 npm install vue-easy-print --save 我用的是0.0.8版本 npm install vue-easy-print@0.0. ...
- Android 各层中日志打印功能的应用
Android 各层中日志打印功能的应用 1. HAL层 头文件:#include <utils/Log.h> 对应的级别 打印方法 VERBOSE LOGV() DEBUG LOG ...
- created写法_在vue中created、mounted等方法使用小结
created:html加载完成之前,执行.执行顺序:父组件-子组件 mounted:html加载完成后执行.执行顺序:子组件-父组件 methods:事件方法执行 watch:watch是去监听一个 ...
- 在vue中methods互相调用的方法
在vue中methods互相调用的方法 转载于:https://www.cnblogs.com/macT/p/10212878.html
- php excel 函数,php实现excel中rank函数功能的方法
php实现excel中rank函数功能的方法 发布于 2015-10-28 18:54:25 | 77 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hyperte ...
- ehlib的DBGridEh控件中使用过滤功能的方法
关于在ehlib的DBGridEh控件中使用过滤功能的方法 在ehlib的DBGridEh控件中使用过滤功能很方便,但使用过程中有几个容易被忽略的地方,它曾经困绕了我很长时间,过滤功能就是用不起来. ...
- vue中DPlayer视频播放器使用方法
vue中DPlayer视频播放器使用方法 1通过npm下载 npm install dplayer - s 2在需要使用的组件中导入 import Dplayer from 'Dplayer' 3页面 ...
- 在组态软件中开发脚本功能的方法
一.概述 大多数的组态软件都具有脚本功能,脚本可能是VBS.Lua.C#等语言,也可能是厂家自定义的一种语言.通过脚本,组态软件可以实现非常灵活的功能. 脚本的功能,基本可以定义为:读入外部数据,改变 ...
- Vue中v-bind=“$attrs”的使用方法
$attrs 主要用于组件之间的隔代传值.例如有 父组件A,子组件B,孙组件C 三个组件. 在A组件中传值给C,可直接在B中的C上设置v-bind="$attrs",然后在C组件中 ...
最新文章
- 如何用Python实现超级玛丽的人物行走和碰撞检测?
- 测试安装详解_Linux的/opt目录(测试实用篇)
- Linux下VSFTP配置全攻略
- LINUX内核之普通自旋锁
- stm32代码_ME3616 NB-IoT模组对接OneNET教程以及STM32代码
- 利用 GitHub Actions 在 GitHub 上进行加密挖矿?
- RabbitMQ系列(三)RabbitMQ交换器Exchange介绍与实践
- PHP GZ压缩与解压
- 系列(一):加解密字符串及配置文件(CSASPNETEncryptAndDecryptConfiguration)
- 《东周列国志》第一百回 鲁仲连不肯帝秦 信陵君窃符救赵
- android windows 共享文件,安卓手机如何访问电脑局域网共享的文件
- OpenCV开发笔记(四十一):红胖子8分钟带你深入了解scharr滤波器算子边缘检测(图文并茂+浅显易懂+程序源码)
- 使用File类查找室友私藏的小电影后,你猜我看到了啥!!??
- 最新码支付源码+完整版+免挂监听回调+微信、支付宝、qq监控APP打包教程
- 人体的神经元有多少个,人体的神经元有多少支
- 计算机表格数字怎么,电脑怎么在表格里填字-在EXCEL中数字怎么输入到方框□内??...
- Linux的文件操作
- HDU1856(More is better)
- append的使用+抽奖(作弊)+打开关闭另一个页面+倒计时
- linux中国vi,使用 Vi/Vim 编辑器:高级概念 | Linux 中国
热门文章
- 纪念一下我那块分区表坏了的60G硬盘
- css 长度单位的理解
- Python实现聚类K-means算法
- 软件系统测试方法有哪些?
- 各国浏览器语言代码对照表
- android 浏览器 遥控器 光标,Unified Remote!让手机变身电视遥控器
- SLAM如何发论文?SLAM领域大牛的总结
- 26、灭火系统中最不利点处洒水喷头的工作压力是多少
- 荷兰语翻译软件测试面试,App Store 上的“荷兰语学习 - 荷兰语单词和短语 - 荷兰语翻译和发音”...
- Java码农进阶之路~数组的深进浅出