vue使用vue-print-nb实现打印功能

1、安装vue-print-nb依赖

(1)vue2安装方式

npm install vue-print-nb --save

(2)vue3安装方式

npm install vue3-print-nb --save

2、在main.js中全局注册

(1)vue2注册方式

import Print from 'vue-print-nb'
Vue.use(Print)

(2)vue3注册方式

import { createApp } from 'vue'
import App from './App.vue'
import print from 'vue3-print-nb'
const app = createApp(App)
app.use(print)
app.mount('#app')

3、基础使用案例

(1)设置打印区域id和打印按钮自定义属性

① id方式——在需要打印的单据内容最外面的div设置唯一的id,在打印弹框里的打印按钮设置自定义属性v-print,该属性值为打印单据div的唯一id

print1.png

② 对象配置方式——在js中定义一个对象,对象中可配置打印区域相关属性,在需要打印的单据内容最外面的div设置唯一的id,id值为js对象中的id值,在打印弹框里的打印按钮设置自定义属性v-print,该属性值为打印区域的对象

print3.png

(2)打印预览和设置

点击打印按钮,就会弹出打印预览和设置的弹框,在设置区域可以选择打印机、可以选择打印布局(横向、纵向)、打印纸张尺寸、边距和页眉页脚等

print2.png

4、其他需求

(1)打印隐藏内容

在打印弹框中需求显示查看的内容,但是在打印的时候需要隐藏,不打印显示

print4.png

(2)打印单据有2个以上,打印时需要自动分页打印

在一个打印弹框中显示所有的打印单据,但在打印时需要自动分页打印

有多个单据时,可以循环展示,在单据内容的最外层的div设置样式page-break-after:always,即可在打印时自动分页

print5.png
print6.png
print7.png

5、打印功能完整代码(安装好包,导入包后,可直接复制粘贴使用)

<template>
  <div class="index-box">
    <el-button type="primary" @click="print">打印</el-button>
    <el-dialog
      title=""
      :visible.sync="dialogVisible"
      width="30%">
      <div id="printView">
        <div style="page-break-after:always">
          <h2 style="font-size: 22px;font-weight: bold;text-align: center;margin: 0;line-height: 122px;">采购单1</h2>
          <div style="padding-bottom: 7px;">
            <div style="display: inline-block;text-align: left;font-size: 18px;width: 33%;">
              姓名:张三
            </div>
            <div style="display: inline-block;text-align: center;font-size: 18px;width: 33%;">
              部门:软件研发部
            </div>
            <div style="display: inline-block;text-align: right;font-size: 18px;width: 33%;">
              职务:前端开发工程师
            </div>
          </div>
          <div style="padding-top: 10px;">
            <table
              border="1px solid #ccc"
              cellspacing="0"
              cellpadding="0"
              style="width: 100%;"
            >
              <thead>
                <tr>
                  <th style="padding: 4px;font-weight: normal;font-size: 18px;">
                    名称
                  </th>
                  <th style="padding: 4px;font-weight: normal;font-size: 18px;">
                    数量
                  </th>
                  <th style="padding: 4px;font-weight: normal;font-size: 18px;">
                    金额
                  </th>
                  <th style="padding: 4px;font-weight: normal;font-size: 18px;">
                    备注
                  </th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td style="padding: 4px;font-weight: normal;font-size: 18px;">
                    显示屏
                  </td>
                  <td style="padding: 4px;font-weight: normal;font-size: 18px;">
                    1台
                  </td>
                  <td style="padding: 4px;font-weight: normal;font-size: 18px;">
                    700
                  </td>
                  <td style="padding: 4px;font-weight: normal;font-size: 18px;">
                    下周一前需要使用
                  </td>
                </tr>
              </tbody>
            </table>
          </div>
          <div style="padding-top: 40px;">
            <div
              style="display: inline-block;text-align: left;font-size: 18px;width: 33%;"
            >
              <span
                style="display: inline-block;vertical-align: top;width: 100px;"
              >
                申请人:
              </span>
              <span
                style="display: inline-block;vertical-align: top;width: calc(100% - 140px);border-bottom: 1px solid #333;height: 30px;"
              ></span>
            </div>
            <div
              style="display: inline-block;text-align: left;font-size: 18px;width: 33%;"
            >
              <span
                style="display: inline-block;vertical-align: top;width: 100px;"
              >
                审批人:
              </span>
              <span
                style="display: inline-block;vertical-align: top;width: calc(100% - 140px);border-bottom: 1px solid #333;height: 30px;"
              ></span>
            </div>
            <div
              style="display: inline-block;text-align: left;font-size: 18px;width: 33%;"
            >
              <span
                style="display: inline-block;vertical-align: top;width: 100px;"
              >
                采购员:
              </span>
              <span
                style="display: inline-block;vertical-align: top;width: calc(100% - 140px);border-bottom: 1px solid #333;height: 30px;"
              ></span>
            </div>
          </div>
          <div class="hidden">打印区域不需要打印的内容</div>
        </div>
        <div style="page-break-after:always">
          <h2 style="font-size: 22px;font-weight: bold;text-align: center;margin: 0;line-height: 122px;">采购单2</h2>
          <div style="padding-bottom: 7px;">
            <div style="display: inline-block;text-align: left;font-size: 18px;width: 33%;">
              姓名:张三
            </div>
            <div style="display: inline-block;text-align: center;font-size: 18px;width: 33%;">
              部门:软件研发部
            </div>
            <div style="display: inline-block;text-align: right;font-size: 18px;width: 33%;">
              职务:前端开发工程师
            </div>
          </div> 
          <div style="padding-top: 10px;">
            <table
              border="1px solid #ccc"
              cellspacing="0"
              cellpadding="0"
              style="width: 100%;"
            >
              <thead>
                <tr>
                  <th style="padding: 4px;font-weight: normal;font-size: 18px;">
                    名称
                  </th>
                  <th style="padding: 4px;font-weight: normal;font-size: 18px;">
                    数量
                  </th>
                  <th style="padding: 4px;font-weight: normal;font-size: 18px;">
                    金额
                  </th>
                  <th style="padding: 4px;font-weight: normal;font-size: 18px;">
                    备注
                  </th>
                </tr>
              </thead>
              <tbody>
                <tr>
                  <td style="padding: 4px;font-weight: normal;font-size: 18px;">
                    显示屏
                  </td>
                  <td style="padding: 4px;font-weight: normal;font-size: 18px;">
                    1台
                  </td>
                  <td style="padding: 4px;font-weight: normal;font-size: 18px;">
                    700
                  </td>
                  <td style="padding: 4px;font-weight: normal;font-size: 18px;">
                    下周一前需要使用
                  </td>
                </tr>
              </tbody>
            </table>
          </div>
          <div style="padding-top: 40px;">
            <div
              style="display: inline-block;text-align: left;font-size: 18px;width: 33%;"
            >
              <span
                style="display: inline-block;vertical-align: top;width: 100px;"
              >
                申请人:
              </span>
              <span
                style="display: inline-block;vertical-align: top;width: calc(100% - 140px);border-bottom: 1px solid #333;height: 30px;"
              ></span>
            </div>
            <div
              style="display: inline-block;text-align: left;font-size: 18px;width: 33%;"
            >
              <span
                style="display: inline-block;vertical-align: top;width: 100px;"
              >
                审批人:
              </span>
              <span
                style="display: inline-block;vertical-align: top;width: calc(100% - 140px);border-bottom: 1px solid #333;height: 30px;"
              ></span>
            </div>
            <div
              style="display: inline-block;text-align: left;font-size: 18px;width: 33%;"
            >
              <span
                style="display: inline-block;vertical-align: top;width: 100px;"
              >
                采购员:
              </span>
              <span
                style="display: inline-block;vertical-align: top;width: calc(100% - 140px);border-bottom: 1px solid #333;height: 30px;"
              ></span>
            </div>
          </div>
          <div class="hidden">打印区域不需要打印的内容</div>
        </div>
      </div>
      <span slot="footer" class="dialog-footer">
        <!-- <el-button v-print="'#printView'" type="primary">打 印</el-button> -->
        <el-button v-print="printViewInfo" type="primary">打 印</el-button>
        <el-button @click="dialogVisible = false">取 消</el-button>
      </span>
    </el-dialog>
  </div>
</template>

<script>
export default {
  components: {},
  data () {
    return {
      dialogVisible: false,
      msg: "打印",
      printViewInfo: {
        id: "printView", //打印区域的唯一的id属性
        popTitle: '配置页眉标题', // 页眉文字 (不设置时显示undifined)(页眉页脚可以在打印页面的更多设置的选项中取消勾选)
        extraHead: '打印,印刷', // 最左上方的头部文字,附加在head标签上的额外标签,使用逗号分割
        preview: false, // 是否启动预览模式,默认是false (开启预览模式ture会占满整个屏幕,不建议开启,除非业务需要)
        previewTitle: '预览的标题', // 打印预览的标题(预览模式preview为true时才显示)
        previewPrintBtnLabel: '预览结束,开始打印', // 打印预览的标题下方的按钮文本,点击可进入打印(预览模式preview为true时才显示)
        zIndex: 20002, // 预览窗口的z-index,默认是20002,最好比默认值更高
        previewBeforeOpenCallback (that) { console.log('正在加载预览窗口!'); console.log(that.msg, this) }, // 预览窗口打开之前的callback (预览模式preview为true时才执行) (that可以取到data里的变量值)
        previewOpenCallback () { console.log('已经加载完预览窗口,预览打开了!') }, // 预览窗口打开时的callback (预览模式preview为true时才执行)
        beforeOpenCallback () { console.log('开始打印之前!') }, // 开始打印之前的callback
        openCallback () { console.log('执行打印了!') }, // 调用打印时的callback
        closeCallback () { console.log('关闭了打印工具!') }, // 关闭打印的callback(无法区分确认or取消)
        clickMounted () { console.log('点击v-print绑定的按钮了!') },
        // url: 'http://localhost:8080/', // 打印指定的URL,确保同源策略相同
        // asyncUrl (reslove) {
        //   setTimeout(() => {
        //     reslove('http://localhost:8080/')
        //   }, 2000)
        // },
        standard: '',
        extarCss: ''
      }
    }
  },
  computed:{},
  created () {},
  mounted () {},
  methods: {
    print() {
      this.dialogVisible = true
    }
  }
}
</script>

<style lang="less">
@media print {
  .hidden{
    display: none;
  }
}
</style>

注意!!!

1、element-ui 组件在打印时会样式崩塌,所以在打印区域div中最好不要使用element-ui 组件,直接使用原生组件样式;

2、打印区域样式最好使用内联样式,或者先加载样式再加载组件,否则样式会崩塌。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,319评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,801评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,567评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,156评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,019评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,090评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,500评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,192评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,474评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,566评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,338评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,212评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,572评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,890评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,169评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,478评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,661评论 2 335

推荐阅读更多精彩内容