前端调用谷歌打印方法实现自定义打印

... 2025-7-10 Code 大约 2 分钟

Print.js 主要是为了帮助我们直接在我们的应用程序中打印 PDF 文件,无需离开界面,也无需使用嵌入。

针对于用户无需打开或下载 PDF 文件,而只需打印它们的特殊情况。

例如,当服务端返回的是 PDF 文件流时,前端接收后无需下载或者打开这些文件,就可以直接在当前页面调用打印。

# 下载

官网 (opens new window)

npm install print-js --save
1

# 引入

// Vue 引入
import printjs from 'print-js'
import 'print-js/dist/print.css'
Vue.prototype.$print = printjs;

// link链接引入
<script src="print.js"></script>
<link rel="stylesheet" type="text/css" href="print.css">
1
2
3
4
5
6
7
8

# 使用

this.$print({
  // 文档来源<null>:pdf或图像的url,html元素的id或json数据的对象
  printable: 'main',
  // 可打印类型<pdf>:pdf,html,image,json和raw-html。
  type: 'html',
  header: '标题,放在页面顶部',
  // 要应用于标题文本的可选标题样式
  headerStyle: 'font-weight:300;',
  // 最大文档宽度(像素)。根据需要更改此项。在打印HTML,图像或JSON时使用。
  maxWidth: '',
  // 默认情况下,在打印HTML元素时,库仅处理某些样式。
  // 传递要处理的样式数组。例如:['padding-top','border-bottom']
  targetStyles: ['*'],
  // 在检索或处理大型PDF文件时显示遮罩层
  showModal: true,
  // 遮罩层显示的文本信息
  modalMessage: '正在载入文档...',
  // 打印结束后的回调 / 打印弹窗关闭后的回调
  onLoadingEnd: () => {
    document.querySelector('#printJS').remove()
  },
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

注意: 实现最基本的打印效果,不考虑用户体验可不传 showModal modalMessage onLoadingEnd 等参数。

这些参数会在一些低端机器上出现错误:卡顿,调不出来打印页面

# PDF 文件流 转 URL

后端返回 PDF 文件流时,将 PDF 文件流转换为 blob 协议的 URL 在新窗口打开 新窗口默认展示 PDF 预览页面,有打印按钮

// res:后端返回的PDF文件流
let blob = new Blob([res], { type: 'application/pdf' })
let PDF_URL = URL.createObjectURL(blob)
window.open(PDF_URL)
1
2
3
4

# Base64 转 URL

图片、PDF 等等格式的 Base64 文件转为 Blob 协议的 URL 地址

let bstr = atob(base64)
let n = bstr.length
let u8arr = new Uint8Array(n)
while (n--) {
  u8arr[n] = bstr.charCodeAt(n)
}
// new File() 第二个参数 为文件类型
let file = new File([u8arr], `image/jpeg`)
let url = URL.createObjectURL(file)
1
2
3
4
5
6
7
8
9

# Blob 协议的地址,销毁

URL.revokeObjectURL(url)
1
上次编辑于: 2025年7月10日 04:01
贡献者: HugStars