vue 实现纯 web H5 打印功能

安装

npm install vxe-pc-ui@4.3.22 vxe-table@4.9.19
// ...
import VxeUI from 'vxe-pc-ui'
import 'vxe-pc-ui/lib/style.css'
import VxeUITable from 'vxe-table'
import 'vxe-table/lib/style.css'
// ...

createApp(App).use(VxeUI).use(VxeUITable).mount('#app')
// ...

打印图片

 

<template>
  <div>
    <vxe-print ref="printRef" custom-layout>
      <img src="https://vxeui.com/resource/img/invoice345.png" style="width: 100%;">
    </vxe-print>
    <vxe-button @click="printEvent1">直接打印</vxe-button>
    <vxe-button @click="printEvent2">调用方法打印</vxe-button>
  </div>
</template>

<script>
import { VxeUI } from 'vxe-pc-ui'

export default {
  data () {
    return {}
  },
  methods: {
    printEvent1 () {
      const $print = this.$refs.printRef
      if ($print) {
        $print.print()
      }
    },
    printEvent2 () {
      VxeUI.print({
        html: `
        <img src="https://vxeui.com/resource/img/invoice345.png" style="width: 100%;">
        `
      })
    }
  }
}
</script>

 自定义页眉

<template>
  <div>
    <vxe-print ref="printRef">
      <template #header>
        <div style="font-size: 20px;padding-top: 20px;text-align: center;">自定义标题222222222</div>
      </template>

      <vxe-print-page-break>
        <div>第一页</div>
        <div>内容</div>
        <div>内容</div>
      </vxe-print-page-break>
      <vxe-print-page-break>
        <div>第二页</div>
        <div>内容</div>
        <div>内容</div>
      </vxe-print-page-break>
      <vxe-print-page-break>
        <div>第三页</div>
        <div>内容</div>
        <div>内容</div>
      </vxe-print-page-break>
    </vxe-print>
    <vxe-button @click="printEvent1">直接打印</vxe-button>
    <vxe-button @click="printEvent2">调用方法打印</vxe-button>
  </div>
</template>

<script>
import { VxeUI } from 'vxe-pc-ui'
export default {
  data () {
    return {}
  },
  methods: {
    printEvent1 () {
      const $print = this.$refs.printRef
      if ($print) {
        $print.print()
      }
    },
    printEvent2 () {
      VxeUI.print({
        headerHtml: '<div style="font-size: 20px;padding-top: 20px;text-align: center;">自定义标题222222222</div>',
        pageBreaks: [
          {
            bodyHtml: `
              <div>第一页</div>
              <div>内容</div>
              <div>内容</div>
              `
          },
          {
            bodyHtml: `
              <div>第二页</div>
              <div>内容</div>
              <div>内容</div>
              `
          },
          {
            bodyHtml: `
              <div>第三页</div>
              <div>内容</div>
              <div>内容</div>
              `
          }
        ]
      })
    }
  }
}
</script>

 自定义页尾和页数

 

<template>
  <div>
    <vxe-print ref="printRef" title="标题33">
      <vxe-print-page-break>
        <div>第一页</div>
        <div>内容</div>
        <div>内容</div>
      </vxe-print-page-break>
      <vxe-print-page-break>
        <div>第二页</div>
        <div>内容</div>
        <div>内容</div>
      </vxe-print-page-break>
      <vxe-print-page-break>
        <div>第三页</div>
        <div>内容</div>
        <div>内容</div>
      </vxe-print-page-break>

      <template #footer="{ currentPage, pageCount }">
        <div style="font-size: 20px;padding-top: 20px;text-align: center;">
          <span>自定义页尾,当前页码:{{ currentPage }}/{{ pageCount }}</span>
        </div>
      </template>
    </vxe-print>
    <vxe-button @click="printEvent1">直接打印</vxe-button>
    <vxe-button @click="printEvent2">调用方法打印</vxe-button>
  </div>
</template>

<script>
import { VxeUI } from 'vxe-pc-ui'
export default {
  data () {
    return {}
  },
  methods: {
    printEvent1 () {
      const $print = this.$refs.printRef
      if ($print) {
        $print.print()
      }
    },
    printEvent2 () {
      VxeUI.print({
        title: '标题33',
        footerHtml ({ currentPage, pageCount }) {
          return `
            <div style="font-size: 20px;padding-top: 20px;text-align: center;">
              <span>自定义页尾,当前页码:${currentPage}/${pageCount}</span>
            </div>`
        },
        pageBreaks: [
          {
            bodyHtml: `
              <div>第一页</div>
              <div>内容</div>
              <div>内容</div>
              `
          },
          {
            bodyHtml: `
              <div>第二页</div>
              <div>内容</div>
              <div>内容</div>
            `
          },
          {
            bodyHtml: `
              <div>第三页</div>
              <div>内容</div>
              <div>内容</div>
              `
          }
        ]
      })
    }
  }
}
</script>

 分页打印表格

 

<template>
  <div>
    <vxe-button @click="printEvent">分页打印表格</vxe-button>

    <vxe-table
      border
      height="500"
      ref="tableRef"
      :data="tableData">
      <vxe-column field="id" title="ID" width="60"></vxe-column>
      <vxe-column field="name" title="Name"></vxe-column>
      <vxe-column field="sex" title="Sex"></vxe-column>
      <vxe-column field="address" title="Address"></vxe-column>
    </vxe-table>
  </div>
</template>

<script>
import { VxeUI } from 'vxe-table'
import XEUtils from 'xe-utils'
export default {
  data () {
    return {
      tableData: []
    }
  },
  methods: {
    printEvent () {
      const $table = this.$refs.tableRef
      if ($table) {
        // 分割每页26条
        Promise.all(XEUtils.chunk(this.tableData, 26).map(pageData => {
          return $table.getPrintHtml({
            data: pageData
          }).then(({ html }) => {
            return {
              bodyHtml: html
            }
          })
        })).then(pageBreaks => {
          VxeUI.print({
            title: '分页打印表格',
            showPageNumber: true,
            pageBreaks
          })
        })
      }
    }
  },
  created () {
    const list = []
    for (let i = 0; i < 100; i++) {
      list.push({
        id: 10001 + i,
        name: 'Test1',
        role: 'Develop',
        sex: 'Man',
        address: 'test abc'
      })
    }
    this.tableData = list
  }
}
</script>

 

评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~风清扬~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值