vue中批量下载pdf

文章介绍了如何在Vue.js应用中使用自定义插件批量导出PDF,包括导入模块,注册插件,以及处理页面样式和元素,确保输入框、复选框和选择框的值能正确显示在PDF中。在页面模板中设置ref,通过数据响应渲染页面,并在打印完成后清空数据。
摘要由CSDN通过智能技术生成

学习内容:批量导出pdf

  1. 在main.js中导入并注册

import PrintPdf from'@/views/registration/system/admissionticketprint/apllyMsgAct/pdf'
Vue.use(PrintPdf)

2.pdf.js

 const Print = function (dom, options) {
     if (!(this instanceof Print)) return new Print(dom, options)

  this.options = this.extend({
    noPrint: '.no-print',
    onStart: function () {},
    onEnd: function () {}
  }, options)

  if ((typeof dom) === 'string') {
    this.dom = document.querySelector(dom)
  } else {
    this.dom = dom
  }

  this.init()
}
Print.prototype = {
  init: function () {
    let content = this.getStyle() + this.getHtml()
    // TODO

this.writeIframe(content)

  },
  extend: function (obj, obj2) {
    for (let k in obj2) {
      obj[k] = obj2[k]
    }
    return obj
  },

  getStyle: function () {
    let str = ''
    let styles = document.querySelectorAll('style,link')
    for (let i = 0; i < styles.length; i++) {
      str += styles[i].outerHTML
    }
    str += '<style>' + (this.options.noPrint ? this.options.noPrint : '.no-print') + '{display:none;} </style>'
    str += '<style>' + '@page' + '{margin-bottom: 1mm; margin-top: 1mm;} </style>'
    return str
  },

  getHtml: function () {
    let inputs = document.querySelectorAll('input')
    let textareas = document.querySelectorAll('textarea')
    let selects = document.querySelectorAll('select')

for (let k in inputs) {
  if (inputs[k].type === 'checkbox' || inputs[k].type === 'radio') {
    if (inputs[k].checked === true) {
      inputs[k].setAttribute('checked', 'checked')
    } else {
      inputs[k].removeAttribute('checked')
    }
  } else if (inputs[k].type === 'text') {
    inputs[k].setAttribute('value', inputs[k].value)
  }
}

for (let k2 in textareas) {
  if (textareas[k2].type === 'textarea') {
    textareas[k2].innerHTML = textareas[k2].value
  }
}

for (let k3 in selects) {
  if (selects[k3].type === 'select-one') {
    let child = selects[k3].children
    for (let i in child) {
      if (child[i].tagName === 'OPTION') {
        if (child[i].selected === true) {
          child[i].setAttribute('selected', 'selected')
        } else {
          child[i].removeAttribute('selected')
        }
      }
    }
  }
}
return this.dom.outerHTML
  },
  writeIframe: function (content) {
    let w
    let doc
    let iframe = document.createElement('iframe')
    let f = document.body.appendChild(iframe)
    iframe.id = 'myIframe'
    iframe.style = 'position:absolute;width:0;height:0;top:-10px;left:-10px;'
    w = f.contentWindow || f.contentDocument
    doc = f.contentDocument || f.contentWindow.document
    doc.open()
    doc.write(content)
    doc.close()
    // TODO
this.toPrint(w, function () {
  document.body.removeChild(iframe)
}) 
  },  
  toPrint: function (w, cb) {
    let _this = this
    w.onload = function () {
      try {
        setTimeout(function () {            
      w.focus()
      typeof _this.options.onStart === 'function' && _this.options.onStart()       
      if (!w.document.execCommand('print', false, null)) {
        w.print()
      }
      typeof _this.options.onEnd === 'function' && _this.options.onEnd()
      w.close()
      cb && cb()
    })
  } catch (err) {
    console.log('err', err)
  }
}

  }
}
const MyPlugin = {}
MyPlugin.install = function (Vue, options) {
  //  添加实例方法
  Vue.prototype.$print = Print
}
export default MyPlugin

3.页面模板(eg)

通过设置ref来控制节点,admissionData为后端返回的数组,类名为pdfDom的节点为一个pdf页面

<div ref="printDom" class="printContainer">
	<div class="pdfDom" v-for="(item,index) in admissionData" :key="index"></div>
</div>

4.样式设置

将页面藏在当前页面底部

.printContainer{
    position: absolute;
    left: 0px;
    top:0px;
    opacity: 1;
    z-index: -1;
  }

5.数据响应并渲染页面

  async onPrint() {
        let ids = ''
        for (var a = 0; a < this.selectedRowKeys.length; a++) {
          ids += this.selectedRowKeys[a] + ','
        }
        await admissionData({ ids }).then(data => {
          this.admissionData = data.result
        })

    this.$print(this.$refs.printDom, {
      noPrint: '.noPrint',
      onStart: () => {
        console.log('打印开始')
      },
      onEnd: () => {
          // 打印结束后将数组置空,页面节点清零
        this.admissionData = []
        console.log('打印完成')
      }
    })
  },
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值