当前位置: 首页 > news >正文

Print 前端打印 (调用 windows 自带打印功能,打印指定 dom 元素内容)

Print 前端打印 (调用 windows 自带打印功能,打印指定 dom 元素内容)

打印相关方法

纯 js 手写打印方法@雨季的泪

window.print 打印自带页眉页脚

window.print 打印自带页眉页脚,用于存放打印 url,日期时间,页面名称等内容

/* 屏蔽页眉页脚 等自带样式 */
@page {margin: 0;//控制是使用a4还是使用其它纸张规格size: auto;
}/* 如果只屏蔽页脚 */
@page {margin-bottom: 0;
}

print.js 方法封装

export default function printHtml(html) {const style = getStyle();const container = getContainer(html);document.body.appendChild(style);document.body.appendChild(container);getLoadPromise(container).then(() => {window.print();document.body.removeChild(style);document.body.removeChild(container);});
}// 设置打印样式
function getStyle() {const styleContent = `#print-container {display: none
}
@media print {body > :not(.print-container) {display: none}html,body {display: block !important;}#print-container {display: block}@page {margin: 0mm;}
}`;const style = document.createElement("style");style.innerHTML = styleContent;return style;
}// 清空打印内容
function cleanPrint() {const div = document.getElementById("print-container");if (div) {document.querySelector("body").removeChild(div);}
}// 新建DOM,将需要打印的内容填充到DOM
function getContainer(html) {cleanPrint();const container = document.createElement("div");container.setAttribute("id", "print-container");container.innerHTML = html;return container;
}// 图片完全加载后再调用打印方法
function getLoadPromise(dom) {let imgs = dom.querySelectorAll("img");imgs = [].slice.call(imgs);if (imgs.length === 0) {return Promise.resolve();}let finishedCount = 0;return new Promise((resolve) => {function check() {finishedCount++;if (finishedCount === imgs.length) {resolve();}}imgs.forEach((img) => {img.addEventListener("load", check);img.addEventListener("error", check);});});
}

使用方法:

// 在需要打印的页面引入
import printHtml from '@/utils/print.js'// 调用方法
onPrint() {const printData = document.getElementById('printcontent').innerHTML // 需要打印的DOM元素printHtml(printData) // 将需要打印的DOM元素传入方法中
},

Print.js 案例解释

vue2 项目,复制代码即可看见效果

<template><div class="container"><el-button type="text" @click="printHandler">打印预览</el-button><el-tableclass="tableDom"ref="tableRef":data="tableData"style="width: 100%"border><el-table-column type="selection" width="55"> </el-table-column><el-table-column prop="date" label="日期" width="180"> </el-table-column><el-table-column prop="name" label="姓名" width="180"> </el-table-column><el-table-column prop="sex" label="性别" width="180"> </el-table-column><el-table-column prop="address" label="地址"> </el-table-column></el-table><div style="background: tomato; width: 100%" class="printDom"><h1>hello world</h1><img :src="imageUrl" alt="" /></div></div>
</template><script>import domtoimage from "dom-to-image";import printHtml from "@/utils/print.js";export default {name: "Helloworld",mounted() {let tableDom = document.querySelector(".tableDom");//   将需要打印的DOM元素传入方法中(转成图片)this.domShot(tableDom);},data() {return {imageUrl: "",tableData: [{date: "2016-05-02",name: "王小虎",address: "上海市普陀区金沙江路 1518 弄",},{date: "2016-05-02",name: "王小虎",address: "上海市普陀区金沙江路 1518 弄",},{date: "2016-05-02",name: "王小虎",address: "上海市普陀区金沙江路 1518 弄",},{date: "2016-05-04",name: "王小虎",address: "上海市普陀区金沙江路 1517 弄",},{date: "2016-05-01",name: "王小虎",sex: "王小虎",address: "上海市普陀区金沙江路 1519 弄",},{date: "2016-05-01",name: "王小虎",sex: "王小虎",address: "上海市普陀区金沙江路 1519 弄",},{date: "2016-05-01",name: "王小虎",sex: "王小虎",address: "上海市普陀区金沙江路 1519 弄",},{date: "2016-05-01",name: "王小虎",sex: "王小虎",address: "上海市普陀区金沙江路 1519 弄",},{date: "2016-05-03",name: "王小虎",address: "上海市普陀区金沙江路 1516 弄",},],};},methods: {printHandler() {// 获取要打印的Dom内容let newDomHtml = document.querySelector(".printDom").innerHTML;printHtml(newDomHtml);},//  将需要打印的Dom转成图片domShot(dom) {domtoimage.toPng(dom, { quality: 0.92 }).then((dataUrl) => {//保存图片this.imageUrl = dataUrl;});},},};
</script><style lang="scss" scoped>@page {margin: 10px;//控制是使用a4还是使用其它纸张规格size: auto;}
</style>

print-js

npm 官网文档

官方文档

安装

npm install print-js --save

使用

下面只演示 html 打印,其他打印方式请查看官方文档

<form method="post" action="#" id="printJS-form">...</form><button type="button" onclick="printJS('printJS-form', 'html')">Print Form
</button>

vue-print-nb

npm 官网文档

安装

npm install vue-print-nb --save

使用 (Vue2)

下面只演示 html 打印,其他打印方式请查看 npm 官网文档

import Print from "vue-print-nb";
// Global instruction
Vue.use(Print);//or// Local instruction
import print from "vue-print-nb";directives: {print;
}

案例

<button v-print>Print the entire page</button><div id="printMe" style="background:red;"><p>葫芦娃,葫芦娃</p><p>一根藤上七朵花</p><p>小小树藤是我家 啦啦啦啦</p><p>叮当当咚咚当当 浇不大</p><p>叮当当咚咚当当 是我家</p><p>啦啦啦啦</p><p>...</p>
</div><button v-print="'#printMe'">Print local range</button>

vue-print-nb-jeecg

安装

npm install vue-print-nb-jeecg --save

注册

import Print from "vue-print-nb-jeecg";Vue.use(Print);

使用

<button v-print>Print the entire page</button><div id="printMe" style="background:red;"><p>葫芦娃,葫芦娃</p><p>一根藤上七朵花</p><p>小小树藤是我家 啦啦啦啦</p><p>叮当当咚咚当当 浇不大</p><p>叮当当咚咚当当 是我家</p><p>啦啦啦啦</p><p>...</p>
</div><button v-print="'#printMe'">Print local range</button>

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【机器学习算法基础】(基础机器学习课程)-11-k-means-笔记
  • 3.OpenFeign与负载均衡
  • “碳”为观止,奥运会也“卷”起来了
  • 虚拟电厂,GPS北斗卫星同步时钟守护智慧能源
  • API 接口设计原则:RESTful 与 GraphQL
  • Golang | Leetcode Golang题解之第321题拼接最大数
  • RemCom和impacket.psexec简介
  • 【计算机网络---OSI七层模型】
  • 用uniapp 及socket.io做一个简单聊天app 撤回聊天及保留聊天记录 6
  • 基于RHEL7的服务器批量安装
  • Vue前端面试基础(一)
  • ptrade排坑笔记——执行k_start.sh脚本发现没有生成日志?
  • html+css+js+jquery实现一个 飘零的树叶
  • 将元组类型的日期时间转换为字符串格式time.asctime([t])
  • RuoYi-Vue源码阅读(一):验证码模块
  • 收藏网友的 源程序下载网
  • 【许晓笛】 EOS 智能合约案例解析(3)
  • 30秒的PHP代码片段(1)数组 - Array
  • 4个实用的微服务测试策略
  • Android框架之Volley
  • angular学习第一篇-----环境搭建
  • leetcode386. Lexicographical Numbers
  • PHP面试之三:MySQL数据库
  • Redis学习笔记 - pipline(流水线、管道)
  • SegmentFault 2015 Top Rank
  • SOFAMosn配置模型
  • Spark VS Hadoop:两大大数据分析系统深度解读
  • 半理解系列--Promise的进化史
  • 大数据与云计算学习:数据分析(二)
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 聊聊hikari连接池的leakDetectionThreshold
  • 七牛云假注销小指南
  • 线上 python http server profile 实践
  • 小程序滚动组件,左边导航栏与右边内容联动效果实现
  • 自动记录MySQL慢查询快照脚本
  • 7行Python代码的人脸识别
  • Android开发者必备:推荐一款助力开发的开源APP
  • elasticsearch-head插件安装
  • MyCAT水平分库
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ​数据链路层——流量控制可靠传输机制 ​
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #{}和${}的区别?
  • #{}和${}的区别是什么 -- java面试
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • #我与Java虚拟机的故事#连载06:收获颇多的经典之作
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (16)Reactor的测试——响应式Spring的道法术器
  • (2)MFC+openGL单文档框架glFrame
  • (52)只出现一次的数字III
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (Ruby)Ubuntu12.04安装Rails环境
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (没学懂,待填坑)【动态规划】数位动态规划