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. 循环打印

当打印需要实现多个页面内容同时打印且分别需要循环时(如:打印单据,有五种单据样式,每种单据有多张,打印时需要将五种单据的全部数据同时打印)

  1. 如果打印的内容一页对应一条数据,那可以直接给组件高度设置为100vh,然后在组件外层添加循环操作。
  2. 如果打印内容,多条数据对应一页(比如一张纸打印三条单据时),此时应给组件的外层设置一个动态高度,否则可能会出现打印内容重叠的情况。动态样式设置方法:
<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中实现打印功能的方法与注意事项相关推荐

  1. VUE中实现打印功能插件—vue-easy-print

    话不多说直接上代码 1.安装插件:注意版本号 npm install vue-easy-print --save 我用的是0.0.8版本 npm install vue-easy-print@0.0. ...

  2. Android 各层中日志打印功能的应用

    Android 各层中日志打印功能的应用 1. HAL层 头文件:#include <utils/Log.h>  对应的级别 打印方法   VERBOSE LOGV() DEBUG LOG ...

  3. created写法_在vue中created、mounted等方法使用小结

    created:html加载完成之前,执行.执行顺序:父组件-子组件 mounted:html加载完成后执行.执行顺序:子组件-父组件 methods:事件方法执行 watch:watch是去监听一个 ...

  4. 在vue中methods互相调用的方法

    在vue中methods互相调用的方法 转载于:https://www.cnblogs.com/macT/p/10212878.html

  5. php excel 函数,php实现excel中rank函数功能的方法

    php实现excel中rank函数功能的方法 发布于 2015-10-28 18:54:25 | 77 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hyperte ...

  6. ehlib的DBGridEh控件中使用过滤功能的方法

     关于在ehlib的DBGridEh控件中使用过滤功能的方法 在ehlib的DBGridEh控件中使用过滤功能很方便,但使用过程中有几个容易被忽略的地方,它曾经困绕了我很长时间,过滤功能就是用不起来. ...

  7. vue中DPlayer视频播放器使用方法

    vue中DPlayer视频播放器使用方法 1通过npm下载 npm install dplayer - s 2在需要使用的组件中导入 import Dplayer from 'Dplayer' 3页面 ...

  8. 在组态软件中开发脚本功能的方法

    一.概述 大多数的组态软件都具有脚本功能,脚本可能是VBS.Lua.C#等语言,也可能是厂家自定义的一种语言.通过脚本,组态软件可以实现非常灵活的功能. 脚本的功能,基本可以定义为:读入外部数据,改变 ...

  9. Vue中v-bind=“$attrs”的使用方法

    $attrs 主要用于组件之间的隔代传值.例如有 父组件A,子组件B,孙组件C 三个组件. 在A组件中传值给C,可直接在B中的C上设置v-bind="$attrs",然后在C组件中 ...

最新文章

  1. 如何用Python实现超级玛丽的人物行走和碰撞检测?
  2. 测试安装详解_Linux的/opt目录(测试实用篇)
  3. Linux下VSFTP配置全攻略
  4. LINUX内核之普通自旋锁
  5. stm32代码_ME3616 NB-IoT模组对接OneNET教程以及STM32代码
  6. 利用 GitHub Actions 在 GitHub 上进行加密挖矿?
  7. RabbitMQ系列(三)RabbitMQ交换器Exchange介绍与实践
  8. PHP GZ压缩与解压
  9. 系列(一):加解密字符串及配置文件(CSASPNETEncryptAndDecryptConfiguration)
  10. 《东周列国志》第一百回 鲁仲连不肯帝秦 信陵君窃符救赵
  11. android windows 共享文件,安卓手机如何访问电脑局域网共享的文件
  12. OpenCV开发笔记(四十一):红胖子8分钟带你深入了解scharr滤波器算子边缘检测(图文并茂+浅显易懂+程序源码)
  13. 使用File类查找室友私藏的小电影后,你猜我看到了啥!!??
  14. 最新码支付源码+完整版+免挂监听回调+微信、支付宝、qq监控APP打包教程
  15. 人体的神经元有多少个,人体的神经元有多少支
  16. 计算机表格数字怎么,电脑怎么在表格里填字-在EXCEL中数字怎么输入到方框□内??...
  17. Linux的文件操作
  18. HDU1856(More is better)
  19. append的使用+抽奖(作弊)+打开关闭另一个页面+倒计时
  20. linux中国vi,使用 Vi/Vim 编辑器:高级概念 | Linux 中国

热门文章

  1. 纪念一下我那块分区表坏了的60G硬盘
  2. css 长度单位的理解
  3. Python实现聚类K-means算法
  4. 软件系统测试方法有哪些?
  5. 各国浏览器语言代码对照表
  6. android 浏览器 遥控器 光标,Unified Remote!让手机变身电视遥控器
  7. SLAM如何发论文?SLAM领域大牛的总结
  8. 26、灭火系统中最不利点处洒水喷头的工作压力是多少
  9. 荷兰语翻译软件测试面试,‎App Store 上的“荷兰语学习 - 荷兰语单词和短语 - 荷兰语翻译和发音”...
  10. Java码农进阶之路~数组的深进浅出