装置插件

npm install vue-pdfyarn add vue-pdf

文档链接:https://github.com/FranckFrei...

间接应用插件的打印,会呈现乱码,须要批改 node_modules 源码
具体代码的批改参照下方文档链接
文档链接:https://github.com/FranckFrei...

一、申请后端,后端返回文档流的模式:

预览

预览款式(以多页为例)

html

// 其余代码省略...<div class="max-height">  // 多页(蕴含只有一页的状况)  <pdf v-for="i in numPages" :key="i" :src="pdfSrc" :page="i" style="width: 100%" ref="waybillRef"></pdf>  // 单页(打乱原有布局,组件放在这里是为了演示不便)  <pdf :src="codeSrc" ref="codeRef"></pdf></div>

script

import pdf from 'vue-pdf';import { getPDF } from '@/assets/scripts/utils'; // 须要申请的后盾PDF文档流接口/** * getPDF阐明: * 后端有多个不同的pdf接口,前端依据url管制,将后端文档流和文件名称,用Promise的形式返回 * 其余代码略... * axios    .get(url, { responseType: 'blob' })    .then((response) => {      let fileName = decodeURIComponent(        response.headers['content-disposition'].replace(          /.+filename=(.+)/g,          '$1'        )      )      resolve({ data: response.data, name: fileName })    })    .catch((error) => {      reject(error)    }) ***/export default {  components: { pdf },  data() {    return {      pdfSrc: '',      codeSrc: '',      numPages: null,    }  },  methods: {    // 进入页面就申请后端接口用于预览    getPageData() {      // 其余代码省略...      getPDF(url).then(res => {        let blob = window.URL.createObjectURL(          new Blob([res.data], {            type: 'application/pdf;charset=UTF-8',          })        );        this.pdfSrc = pdf.createLoadingTask(blob);        this.pdfSrc.promise.then(pdf => {          this.numPages = pdf.numPages        })      })    }  }}

打印

print(ref) {  if (ref==='waybillRef') {    // 多页是循环来的,ref是数组,须要加上下标    this.$refs[ref][0].print();  } else {    this.$refs[ref].print();  }},

多页的写法--打印多页的款式(临时bug未解决,见下图)

多页的写法--打印单页的款式

单页的写法--打印单页的款式

下载

script

import { downloadPDF } from '@/assets/scripts/utils';/** * downloadPDF阐明: * 下载PDF文件流-->通过url先调用前文的getPDF-->前端做下载 * 其余代码略... * getPDF(url).then(res => {     let url = window.URL.createObjectURL(        new Blob([res.data], {          type: 'application/pdf;charset=UTF-8',        })      );      let link = document.createElement('a');      link.style.display = 'none';      link.href = url;      link.download = res.name;      document.body.appendChild(link);      link.click();      document.body.removeChild(link);      window.URL.revokeObjectURL(url);  })***/method: {  download() {    downloadPDF(url);  },}

下载后的后果

二、申请OSS, 返回url的模式:

【页面阐明】(其中下载就是前述【下载后的后果】局部)

预览

性能:点击PDF文件的放大icon,弹出预览弹窗

html

// 其余代码省略...<div class="max-height">  // 因为这里的页面的pdf页数不确定,故应用多页  <pdf v-for="i in numPages" :key="i" :src="pdfSrc" :page="i" style="width: 100%></pdf></div>

script

// 其余代码省略...import pdf from 'vue-pdf';export default {  components: { pdf },  data() {    return {      dialogImageUrl: '',      dialogVisible: false,      numPages: null,    }  },  methods: {     // 点击放大    handlePreview(file) {      this.dialogImageUrl = pdf.createLoadingTask(file.url);      this.dialogImageUrl.promise.then(pdf => {        this.numPages = pdf.numPages // 这里拿到以后pdf总页数      })      this.dialogVisible = true;    }  }}

预览款式(以多页为例)