浏览器打印 window.print

5,558 阅读3分钟

浏览器打印

前言:前段时间做了一个功能,打印富文本编辑的业务模板。用到了浏览器打印功能,总结一下常见的问题。

如何调用浏览器打印

  • 在浏览器中可以通过快捷键 ctrl + p 调用
  • 在 js 脚本中通过 window.print() 调用

window.print() 方法用于打印当前窗口的内容。 调用 print() 方法所引发的行为就像用户单击浏览器的打印按钮。通常,这会产生一个对话框,让用户可以取消或定制打印请求。

钩子方法

  • onbeforeprint

    在调用 print() 方法后执行该方法

  • onafterprint

    在打印完成或者点击取消按钮后执行该方法

window.print() 方法非常不方便的地方是无法通过传参的方式对打印操作进行设置,需要在 css 中进行设置。

设置打印的样式

当需要针对打印的内容设置特殊的样式,比如隐藏部分区域、对某个区域设置特殊的字体大小。

  • 当样式内容比较多时,可以通过外链样式表。
    <link rel="stylesheet" href="css/printstylesheet.css" media="print" />
  • 当样式比较少时,可以通过媒体查询内联样式。
    @media print {
        .ad {
            display: none;
        }
    }

设置打印的区域

有些场景下需要打印页面中部分区域内容

  • 通过设置打印样式,将不需要打印的内容设置为 display: none,只留下需要打印的区域。
  • 获取需要打印的 dom 节点,替换当前 body 下的节点。完成打印后恢复 body 下的节点。
    const bodyHtml = document.body.innerHTML
    const printContentHtml = document.getElementById('print').innerHTML
    document.body.innerHTML= printContentHtml
    window.print()
    document.body.innerHTML = bodyHtml
  • 动态创建一个不可见的 iframe, 将需要打印的 dom 节点插入 iframe 内,调用 iframe 的 print 方法。(推荐)
    const printContentHtml = document.getElementById('print').innerHTML
    const iframe = document.createElement('iframe')
    iframe.setAttribute('style', 'position:absolute;width:0px;height:0px;left:-500px;top:-500px;')
    document.body.appendChild(iframe)
    iframe.contentDocument.write(printContentHtml)
    iframe.contentDocument.close()
    iframe.contentWindow.print()
    document.body.removeChild(iframe)
  • 在新打开的页面中进行打印
    const printContentHtml = document.getElementById('print').innerHTML
    const printPage = window.open()
    printPage.document.write(printContentHtml)
    printPage.document.close()
    printPage.print()
    printPage.close()

设置打印的方向

默认的打印方向是纵向的,可以通过 css 设置为横向打印

  • 横向 @page { size: landscape; }
  • 纵向 @page { size: portrait; }

设置了打印方向之后,浏览器打印弹窗中无法再次进行打印方向的设置

设置打印的纸张类型

默认的纸张类型是 A4,可以通过 css 设置为其他纸张类型,但是只有 A5, A4 , A3 为有效值

    @page {
        size: A3;  // A5, A4 or A3
    }

如果既要设置方向又要设置纸张类型

    @page {
        size: A3 landscape;  
    }

设置打印的边距

    @page {
        margin: 1cm;
    }

设置打印的页眉页脚

默认的打印会带有页眉页脚。页眉包括日期、title,页脚包括链接和分页等信息。 可以通过 margin 设置边距达到隐藏页眉页脚的目的。

  • 去除页眉
    @page {
        margin-top: 0;
    }
  • 去除页脚
    @page {
        margin-bottom: 0;
    }
  • 如果想把页眉页脚全部去掉可以通过下面的方式。
    @page {
        margin: 0;
    }

如果需要边距,可以通过设置 body 的 margin 值来模拟边距。至于如何单独去除页眉中的某项或者页脚中某项暂时还没发现方法。