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,页眉页脚默认去掉了;

 
设置分页:在外层盒子上加上css:page-break-after:always;
 

打印方案:

方案一:打印指定页面区域,将指定区域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、火狐下设置页眉页脚的更多相关文章

  1. 使用window.print()后,未关闭打印页面,原网页不能操作

    使用window.print()后,未关闭打印页面,原网页不能操作,此时可以试着用window.location.reload()重新加载页面解决问题.

  2. 关于JavaScript打印去掉页眉页脚

    因为这个问题,Google和百度都查了个遍,网上主要解决方案都是这一个代码: <script language="JavaScript"> var hkey_root, ...

  3. 使用js打印时去除页眉页脚

    写在前面 今天的开发遇到了使用window.print()功能进行当前页面打印的功能,因为页脚左边部分显示了url,这是不能存在的,已解决,写在这里. 正文 很多网上的方法都是不能用的,最后我找到一个 ...

  4. js中window.print()去除页眉页脚

    //jsp打印时去除页眉页页脚 打印前加入下面代码即可 var HKEY_Root,HKEY_Path,HKEY_Key; HKEY_Root="HKEY_CURRENT_USER" ...

  5. IE浏览器打印的页眉页脚设置解决方法

    首先说明问题: 默认情况下,通过IE的打印对话框,打印出来的内容都有页眉和页脚的. 查看ie的页面设置发现如右图中,页眉页脚 下面先说明&w&bPage&p of &P ...

  6. window.print() 去掉页眉页脚及打印链接【转载】

    页面中添加样式: <style media="print"> @page { size: auto; /* auto is the initial value */ m ...

  7. 【转】jqprint打印时自定义页眉页脚

    需求:自定义页眉,实现打印时分页时每页页眉都显示相同的信息 打印所用插件jqprint 解决方法: <div class="divHeader"> <span s ...

  8. C#操作word的一些基本方法(word打印,插入文件,插入图片,定位页眉页脚,去掉横线)

    Microsoft.Office.Interop.Word.Application wordApp = new ApplicationClass() word对象 2. Microsoft.Offic ...

  9. js打印去掉页眉页脚

    <style type="text/css" media="print"> @page /* 实现代码 */ { size: auto; /* au ...

  10. 用window.print()打印如何去掉页眉和页脚

    用window.print()打印如何去掉页眉和页脚 2007-07-12 11:44:52|  分类: javascript 知识|举报|字号 订阅     <script language= ...

随机推荐

  1. LLVM 参考链接

    https://www.llvm.org/ LLVM Essentials(Paperback) LLVM 编译器 https://www.cs.cmu.edu/afs/cs.cmu.edu/acad ...

  2. 【Logging 日志库】Cpp 日志库 boost::log 以及 glog 的对比

    日志能方便地诊断程序原因.统计程序运行数据,是大型软件系统必不可少的组件之一.本文将从设计上和功能上对比 C++ 语言常见的两款日志库: boost::log 和 google-glog . 设计 b ...

  3. P1379 八数码难题 ( A* 算法 与 IDA_star 算法)

    P1379 八数码难题 题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初 ...

  4. Python pydot与graphviz库在Anaconda环境的配置

      本文介绍在Anaconda环境中,安装Python语言pydot与graphviz两个模块的方法.   最近进行随机森林(RF)的树的可视化操作,需要用到pydot与graphviz模块:因此记录 ...

  5. Spring Boot 自动配置注解源码解析

    前言 为什么Spring Boot这么火?因为便捷,开箱即用,但是你思考过为什么会这么便捷吗?传统的SSM架构配置文件至少要写半天,而使用Spring Boot之后只需要引入一个starter之后就能 ...

  6. new关键字执行过程

    在javascript中,现阶段我们可以采用三种方式创建对象(object) 利用字面量创建对象 利用new Object创建对象 利用构造函数创建对象 new关键字执行过程 // new关键字执行过 ...

  7. freeswitch的多租户模式

    概述 freeswitch是一款简单好用的VOIP开源软交换平台. 现在的VOIP服务越来越倾向于云端服务,包括呼叫中心云服务,线路云平台. 而云平台对多个客户的服务就需要做好隔离,包括数据隔离.线路 ...

  8. 通过 Feign 进行文件上传

    转载请注明出处: 项目为spring cloud 项目,项目中对各部分能力业务进行了拆分,将公共的服务能力放在一个模块当中,通过 Feign 的方式 进行调用,feign 调用的本质还是http内部通 ...

  9. 【scikit-learn基础】--『回归模型评估』之偏差分析

    模型评估在统计学和机器学习中具有至关重要,它帮助我们主要目标是量化模型预测新数据的能力. 本篇主要介绍模型评估时,如何利用scikit-learn帮助我们快速进行各种偏差的分析. 1. **R² ** ...

  10. [转帖]SQL Server 中如何移动tempdb到新的位置

    https://www.cnblogs.com/OpenCoder/p/10322904.html 操作步骤:1.检查tempdb的逻辑名字和它的存在位置.可以使用下面语句: SELECT name, ...