起因
突然,老板说需要把后台的数据能够打印出来, 然后呢还得是按照设计稿的或者说按照单据的,还得有二维码或者条形码这些;害,之前从来没有做过,但是只要思想不滑坡,办法总比困难多;搞吧,努力的去调研吧
需求
- 可以打印,能打印出来东西就行
- 我想要按照设计稿来搞一下,这个可以打印不?
- 我要打印二维码,条形码在上面;
目标
- 简单的打印一下,意思意思
- 针对需求的打印等
实现
浏览器HTML自带打印
打印整页
- window.print() 直接调用的话是打印的当前html中的整个body
window.print() // 调用浏览器的
不过这样会把整体的所有信息都打印出来
- 想要打印指定的区域的话,我们可以在把需要展示的部分,放在一个DOM中,然后在打印的时候将DOM放到Iframe中,再调用
iframe.contentWindow.print(), 浏览器在调用打印的时候,则只会将这个DOM中的元素进行打印出来;然后移除元素用iframe
这样打印出来的就只是想展示的部分
window.print 纸张打印样式设置
- 去除页脚页眉
参考 你不能用 @page 规则来修改所有的 CSS 属性。你只能修改文档的 margin、orphans、widows 和分页符。试图对其他属性的修改都是无效的。
// 直接插入
<style media="print">
// 去除页眉
@page {
margin-top: 0;
}
// 去除页脚
@page {
margin-bottom: 0;
}
// 去除页眉页脚
@page {
margin: 0mm;
}
</style>
// 样式中采用媒体查询
@media print {
@page {
margin-top: 0;
}
}
// @import 引入
@import url('print.css) print;
- 纸张大小控制
打印的纸张的大小,方向我们同样可以通过css 样式来进行控制;
@page {
size: A4 portrait; /* landscape:横向 portrait:竖向 auto: 浏览器控制 */
}
@page {
size: 5.5in 8.5in; /* 5.5英寸宽 8.5英寸高 */
}
设置纸张左右的距离
/* 设置打印时的左侧文档样式 */
@page :left {
margin: 2in 3in;
}
/* 当打印时会选择所有文档右页 */
@page :right {
margin: 2in 3in;
}
分页: 通常当打印的内容过长的时候,打印会进行自动分页,但是当遇到问题分页的时候,可能会被截断;
这个时候可以通过CSS样式进行处理进行分页;需要手动判断DOM可能分页的位置,在DOM 之前加入page-break-before: always;
@media print { h1 {page-break-before: always;} }
插件打印(hiprint)打印
hiprint 可以自定义模板进行打印,支持自定义条形码等;
需要引入jquery 依赖
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="utf-8">
<title>hiprint</title>
<!-- hiprint -->
<link href="hiprint/css/hiprint.css" rel="stylesheet">
<link href="hiprint/css/print-lock.css" rel="stylesheet">
<link href="hiprint/css/print-lock.css" media="print" rel="stylesheet">
</head>
<body>
<!-- jQuery (hiprint 的所有 JavaScript 插件都依赖 jQuery,所以必须放在前边) -->
<script src="https://cdn.jsdelivr.net/npm/jquery@1.12.4/dist/jquery.min.js"></script>
<!-- 加载 hiprint 的所有 JavaScript 插件。你也可以根据需要只加载单个插件。 -->
<!-- polyfill.min.js解决浏览器兼容性问题v6.26.0-->
<script src="hiprint/polyfill.min.js"></script>
<!-- hiprint 核心js-->
<script src="hiprint/hiprint.bundle.js"></script>
<!-- 条形码生成组件-->
<script src="hiprint/plugins/JsBarcode.all.min.js"></script>
<!-- 二维码生成组件-->
<script src="hiprint/plugins/qrcode.js"></script>
<!-- 调用浏览器打印窗口helper类,可自行替换-->
<script src="hiprint/plugins/jquery.hiwprint.js"></script>
</body>
</html>
可以自定义模版;指定固定的模版之后,进行封装传输数据即可打印对应的数据;
总结
如果只是简单的打印图片或者二维码这些,那可以直接采用浏览器自带的window.print() 打印即可;如果需要复杂的打印例如发票和对应的面单等,可能许久需要采用hiprint 去进行打印,进行封装,处理;