使用window.print进行前端打印,批量打印,设置分页,ie、火狐下设置页眉页脚
window.print()
print() 方法用于打印当前窗口的内容。谷歌调用 print() 方法会产生一个打印预览弹框,让用户可以设置打印请求。

但谷歌貌似不能自定义设置页眉页脚的文字;ie和火狐可以,如下所示
火狐:菜单-->打印

ie:文件-->打印预览,样子和上面差不多
使用或编辑打印样式的几种方式:
引入样式表
<link href="/path/print.css" media="print" rel="stylesheet" />
@import url("/path/print.css") print;
媒体查询:
@media print {
h1 {
font-size: 20px;
color: red;
}
}
<style type="text/css" media="print">
// 打印样式
</style>
设置打印纸张的外边距(去掉页眉页脚):
@page{margin:2cm 3cm;} margin若设为0,页眉页脚默认去掉了;

打印方案:
方案一:打印指定页面区域,将指定区域dom赋值给全局innerHTML,简单粗暴;但由于打印后回到页面,页面元素卡主,无法操作,需要刷新;
function printpage(id){
var newstr = document.getElementById(id).innerHTML;
var oldstr = document.body.innerHTML;
document.body.innerHTML = newstr;
window.print();
document.body.innerHTML = oldstr;
window.location.reload() // 若不刷新,打印后页面无法操作
}
方案二:新开一个窗口,不会有刷新后返回页面无法操作问题,但不方便设置调试分页,布局样式之类的
const printWindow = window.open()
printWindow.document.write(document.getElementById('printDiv')).innerHTML
printWindow.print()
printWindow.close()
方案三:在本页面新建iframe,不会有刷新后返回页面无法操作问题;目前用的这种;
代码中打印的css 需要将之前所有是px 的单位改为 pt ,包括border;我之前设置border:1px 打印时火狐下表格的边框有的显示了,有的显示很浅;
代码中注释地方也需要注意一下
let printHtml = document.getElementById('printDiv').innerHTML
let iframe = document.createElement('iframe')
// ie下打印时,iframe会在页面中闪一下,所以设置推出屏幕外
iframe.setAttribute('style','position:absolute;width:0px;height:0px;left:-500px;top:-500px;')
let ieStr = '' // 设置ie下的样式,同样设置的字体大小为18pt,ie下打印出来显示的更大,行高也是;ie下需要设置小一点
if('ActiveXObject' in window){
ieStr = 'HTML,body,div{font-size:13pt;}'+
'.lineHeight{line-height:28pt;}'
}else{
ieStr = 'HTML,body,div{font-size:18pt;}'+
'.lineHeight{line-height:40pt;}'
}
// 设置样式
// 注意点:设置了浮动元素一定要清除浮动;不然打印元素排版异常;浮动元素清除了浮动还异常则不用浮动;试试display:inline-block;
let style = '<style>'+
ieStr+
'@page{margin:2cm 3cm;}'+
// ···
// ···
// ···
'</style>'
document.body.appendChild(iframe)
iframe.contentDocument.write(style+printHtml)
iframe.contentDocument.close()
// 加延时是为了解决火狐下,打印按钮点击一次没反应,需要连续点击好多下才出个弹框提示是否阻止弹框的内容出现;
iframe.contentWindow.onload = setTimeout(() =>{
iframe.contentWindow.focus() // 兼容ie,不加这句ie默认打印还是全部的网页,不是局部创建的iframe
iframe.contentWindow.print()
document.body.removeChild(iframe)
},0)
下面两张图分别是 样式没完全用pt 和 完全用pt 且浏览器做兼容的对比


批量打印
我这里处理的比较简单粗暴,一般批量打印的数据不会太多,几十条左右,表格的一页;将要打印的几十条数据提前展示并display:none;
然后 let printHtml = document.getElementById('批量打印的盒子').innerHTML,执行上面的打印方法;
方案四:设计复杂的打印页面建议用插件;比如打印票据,包含图片,二维码的页面;可以使用hiprint;
参考 https://github.com/alexwjj/vue-iframe-print
使用window.print进行前端打印,批量打印,设置分页,ie、火狐下设置页眉页脚的更多相关文章
- 使用window.print()后,未关闭打印页面,原网页不能操作
使用window.print()后,未关闭打印页面,原网页不能操作,此时可以试着用window.location.reload()重新加载页面解决问题.
- 关于JavaScript打印去掉页眉页脚
因为这个问题,Google和百度都查了个遍,网上主要解决方案都是这一个代码: <script language="JavaScript"> var hkey_root, ...
- 使用js打印时去除页眉页脚
写在前面 今天的开发遇到了使用window.print()功能进行当前页面打印的功能,因为页脚左边部分显示了url,这是不能存在的,已解决,写在这里. 正文 很多网上的方法都是不能用的,最后我找到一个 ...
- js中window.print()去除页眉页脚
//jsp打印时去除页眉页页脚 打印前加入下面代码即可 var HKEY_Root,HKEY_Path,HKEY_Key; HKEY_Root="HKEY_CURRENT_USER" ...
- IE浏览器打印的页眉页脚设置解决方法
首先说明问题: 默认情况下,通过IE的打印对话框,打印出来的内容都有页眉和页脚的. 查看ie的页面设置发现如右图中,页眉页脚 下面先说明&w&bPage&p of &P ...
- window.print() 去掉页眉页脚及打印链接【转载】
页面中添加样式: <style media="print"> @page { size: auto; /* auto is the initial value */ m ...
- 【转】jqprint打印时自定义页眉页脚
需求:自定义页眉,实现打印时分页时每页页眉都显示相同的信息 打印所用插件jqprint 解决方法: <div class="divHeader"> <span s ...
- C#操作word的一些基本方法(word打印,插入文件,插入图片,定位页眉页脚,去掉横线)
Microsoft.Office.Interop.Word.Application wordApp = new ApplicationClass() word对象 2. Microsoft.Offic ...
- js打印去掉页眉页脚
<style type="text/css" media="print"> @page /* 实现代码 */ { size: auto; /* au ...
- 用window.print()打印如何去掉页眉和页脚
用window.print()打印如何去掉页眉和页脚 2007-07-12 11:44:52| 分类: javascript 知识|举报|字号 订阅 <script language= ...
随机推荐
- AtCoder ABC 206
比赛链接:Here AB水题,跳过 C - Swappable 在数组中找到满足条件的数对 \((i,j)\) \(1 \le i < j \le N (N\in[2,3e5])\) \(A_i ...
- Spark SQL 字段血缘在 vivo 互联网的实践
作者:vivo互联网服务器团队-Hao Guangshi 一.背景 字段血缘是在表处理的过程中将字段的处理过程保留下来.为什么会需要字段血缘呢? 有了字段间的血缘关系,便可以知道数据的来源去处,以及字 ...
- 探究Presto SQL引擎(2)-浅析Join
作者:vivo互联网技术-Shuai Guangying 在<探究Presto SQL引擎(1)-巧用Antlr>中,我们介绍了Antlr的基本用法以及如何使用Antlr4实现解析SQL查 ...
- 2023陕西省大学生信息安全竞赛web writeup
前言 早写好了,忘发了,题目质量还行,够我坐大牢 ezpop 简单的反序列化,exp如下 <?php class night { public $night; } class day { pub ...
- 活动回顾|阿里云云原生 Serverless 技术实践营 深圳站回放&PPT下载
11月24日"阿里云云原生 Serverless 技术实践营"深圳站圆满落幕.活动受众以关注 Serverless 技术的开发者.企业决策人.云原生领域创业者为主,活动形式为演讲 ...
- S3C2440移植linux3.4.2内核之修改分区以及制作根文件系统
上一节S3C2440移植linux3.4.2内核之内核框架介绍及简单修改我们简单配置了内核,这节来根据继续修改内核. 启动内核 内核启动的打印信息如下图所示 可以看到内核有8个分区,而我们的u ...
- 每天学五分钟 Liunx 0001 | 存储篇:swap
swap swap ,内存交换空间,它是磁盘上的一块空间,主要作用是为了防止物理内存不足. CPU 从内存中读取数据.当内存的空间不足时, CPU 难以读取到数据,导致程序无法正常工作.所以诞生了 s ...
- Spring boot 自定义kafkaTemplate的bean实例进行生产消息和发送消息
本文为博主原创,未经允许不得转载: 目录: 1. 自定义生产消息 kafkaTemplate 实例 2. 封装 kafka 发送消息的service 方法 3. 测试 kafka 发送消息ser ...
- 凡是有但是-varchar和nvarchar的初步学习之一
凡是有但是-varchar和nvarchar的初步学习之一 背景 高应用开发, 在涉及到国内国外的问题时,重要的事情有两个: 时区转换, 字符集转换. 时区转换虽然是很难理清楚, 各种规范不统一的事情 ...
- [转帖]充分利用 Oracle SQL监控
https://zhuanlan.zhihu.com/p/397834311 经常被问到查看执行计划的最佳工具是什么,对我来说,答案总是SQL Monitor(包含在 Oracle Tuning Pa ...