vue 移动端下载pdf的流文件,很多浏览器不支持,有啥好的方案么?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vue 移动端下载pdf的流文件,很多浏览器不支持,有啥好的方案么?相关的知识,希望对你有一定的参考价值。

vue 移动端下载pdf的流文件,很多浏览器不支持。现在的做法是,生成一个a标签,用new Blob,window.URL.createObjectURL来生成url实现的,pc端没问题。然后移动端很多浏览器都不支持,无法下载。
现在移动端还有什么好的方法么

参考技术A

以前用过一个叫pdf.js的插件,你可以查查。

部分是pdf.js和pdf.worker.js,一个负责API解析,一个负责核心解析

在移动端通过vue-pdf实现预览pdf

应用场景:比赛报表pdf文件需要在线预览跟下载,发现直接使用window.open(url, ‘_blank‘),在pc端是可以实现预览,但是在移动端是直接通过打开浏览器进行下载再预览,经查资料发现可以使用vue-pdf组件实现预览!!!

参考:https://www.cnblogs.com/steamed-twisted-roll/p/9648255.html     GitHub地址:https://github.com/FranckFreiburger/vue-pdf#readme

安装:

npm install --save vue-pdf

template代码:

<template>
<div class="pdf" v-show="fileType === ‘pdf‘">
    <p class="arrow">
    <!-- // 上一页 -->
    <span @click="changePdfPage(0)" class="turn" :class="grey: currentPage==1">Preview</span>
    currentPage / pageCount
    <!-- // 下一页 -->
    <span @click="changePdfPage(1)" class="turn" :class="grey: currentPage==pageCount">Next</span>
    </p>
    <!-- // 自己引入就可以使用,这里我的需求是做了分页功能,如果不需要分页功能,只要src就可以了 -->
    <pdf
      :src="pdfSrc"
      :page="currentPage"
      @num-pages="pageCount=$event"
      @page-loaded="currentPage=$event"
      @loaded="loadPdfHandler" >
    </pdf>
  </div>
</template>

js代码:<script>  // 引入PDF

import pdf from vue-pdf
  export default 
    metaInfo: 
      title: This is the test,
      meta: [
         charset: utf-8 ,
         name: viewport, content: width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=2,user-scalable=yes 
      ]
    ,
        components: pdf,
        // props: [‘pdfSrc‘],
    data () 
      return 
        currentPage: 0, // pdf文件页码
        pageCount: 0, // pdf文件总页数
        fileType: pdf, // 文件类型
     pdfSrc: this.$route.query.url // pdf文件地址
      
    ,
  created() 
   // 有时PDF文件地址会出现跨域的情况,这里最好处理一下
    this.pdfSrc = pdf.createLoadingTask(this.pdfSrc)
    ,
    methods: 
      // 改变PDF页码,val传过来区分上一页下一页的值,0上一页,1下一页
      changePdfPage (val) 
        // console.log(val)
        if (val === 0 && this.currentPage > 1) 
          this.currentPage--
          // console.log(this.currentPage)
        
        if (val === 1 && this.currentPage < this.pageCount) 
          this.currentPage++
          // console.log(this.currentPage)
        
      ,
      // pdf加载时
      loadPdfHandler (e) 
        this.currentPage = 1 // 加载的时候先加载第一页
      
    
  

上面是有实现分页功能的

下面是没有分页功能

template代码:

<template>
  <div class="pdf-box">
    <pdf
      v-for="i in numPages"
      :key="i"
      :src="pdfSrc"
      :page="i">
    </pdf>
  </div>
</template>

js代码

import pdf from vue-pdf
export default 
  metaInfo: 
    meta: [
       name: viewport, content: width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=2,user-scalable=yes 
    ]
  ,
  components: 
    pdf
  ,
  data () 
    return 
    pdfSrc: this.$utils.DecryptUrl(this.$route.query).url, // pdf文件地址
      numPages: undefined,
    
  ,
  mounted() 
    // 有时PDF文件地址会出现跨域的情况,这里最好处理一下
  this.pdfSrc = pdf.createLoadingTask(this.pdfSrc)
    this.pdfSrc.then(pdf => 
      this.numPages = pdf.numPages
    )
  

</script>

css:

<style lang="scss" scoped>
 .pdf-box 
    -webkit-box-sizing: border-box;
    box-sizing: border-box;
    max-width: 1024px;
    width: 100%;
    margin: 0 auto;
    overflow-x: hidden;
    height: 100%;
    overflow-y: auto;
    -webkit-overflow-scrolling: touch;
    font-size: .28rem;
    span 
      width: 100%;
    
  
</style>

最后:我们发现了pdf在手机预览的时候,不可以放大,后面发现是因为入口文件设置了禁止用户缩放放大,我们可以借助vue-meta进行单独为这个组件设置动态meta,具体看下vue-meta使用。

以上是关于vue 移动端下载pdf的流文件,很多浏览器不支持,有啥好的方案么?的主要内容,如果未能解决你的问题,请参考以下文章

在移动端通过vue-pdf实现预览pdf

在移动端通过vue-pdf实现预览pdf

移动端pdf预览

移动端在线预览pdf文件的插件

移动端展示pdf(在线打开pdf)

vue--移动端实现文档的下载(pc端可用)