推荐一款免费的网页打印控件

做过网页打印的应该都清楚,如果想使用js直接调用本地打印机进行打印任务都需要基于打印控件,因为js不能直接调用打印机,即使是google浏览器也是内置的打印控件。

网页打印控件比较出名的露肚皮(lodop),不过要收费,虽然可以免费用但是有不定期的弹提示和打免费水印,对于小作坊来说成本太高了,这里推荐一款github上的免费打印控件(目前没有看到收费),它的实现原理是通过html2canvas将html的dom节点转成base64的图片数据,再使用POST(打印控件内部做了跨域处理)将数据发送给打印控件(在本地运行一个http服务【只支持windows】来接收打印任务,通过控件来调用本地打印机进行打印)。

git地址:https://github.com/xuejike/web_print_service

打印控件启动文件:printWin.exe

jquery使用git上有demo,这里不做说明;

以下是在vue中使用说明:

依赖安装

// 安装html2canvas
# npm install --save html2canvas
// 或
# yarn add html2canvas

// 安装axios
# npm install axios

// 代码中引入
import html2canvas from 'html2canvas'
import axios from 'axios'

完整示例

<template>
  <div>
    <div ref="PrintMain">
      这里是打印内容,可以用CSS控制位置
    </div>
    <button @click="print">打印</button>
  </div>
</template>

<script>
import axios from 'axios'
import html2canvas from 'html2canvas'
export default {
  methods: {
    print() {
      // 使用html2canvas将html转换为canvas画布
      html2canvas(this.$refs.PrintMain).then((canvas) => {
        // 画布转成图片的Base64格式数据
        let dataURL = canvas.toDataURL('image/png')
        // 纸张宽度
        const paperWidth = this.width
        // 纸张高度
        const paperHeight = this.height
        // 打印机名称
        const printerName = ''
        // 打印控件服务地址
        const url = `http://127.0.0.1:19999/?paperWidth=${paperWidth}&paperHeight=${paperHeight}&printerName=${printerName}`
        // 发送POST请求给打印控件服务
        axios({
          method: 'POST',
          url: url,
          data: dataURL,
          headers: {
            Accept: 'text/plain',
            'Content-Type': 'text/plain',
          },
        }).then((res) => {
           if (res.data.startsWith('success')) {
            // 打印任务已正确提交给打印控件服务
          } else {
            // 控件返回异常
          }
        }).catch(() => {
          // 未启动打印控件
        })
      })
    },
  },
}
</script>

 

Intoep小程序

微信扫一扫,打开小程序浏览更便捷

原创文章,作者:howkunet,如若转载,请注明出处:https://www.intoep.com/frontend/2641.html

发表回复

登录后才能评论