pdf文档Base64编码的预览

最近经常会有针对pdf文档类型进行操作的需求,后端返回的格式都是Base64,需要前端进行预览或者下载等操作。

方案一、利用iframe标签直接显示

原理是利用iframe的src绑定Base64编码可以直接展示,缺点是移动端无法展示,会显示白板,优点是超级简单,下面都是以Vue环境来举例子,不再重复。

//template部分
<template>
<iframe :src="getSrc(item)" frameborder="0"
        style="left: 0;width: 100%;height: 100%;right: 0;top: 0;border: 0;"></iframe>
</template>

//script部分
<script>
data(){
  return {
    item:{
      pdfBase64:'xxxxxxxx';//替换成实际base64字符串
    }
  }
},
computed: {
    getSrc() {
      return function (item) {
        let vSrc = ''
        vSrc =  'data:application/pdf;base64,' + item.pdfBase64
        return vSrc
      }
    },
  },
</script>

方案二、vue-pdf实现

首先如果仅仅是用于纯vue项目,看vue-pdf实现pdf文件在线预览这篇帖子就够了,关键代码如下:

<template>
    <div>
      <pdf  ref="pdf" :src="row"></pdf>
    </div>
</template>

<script>
import pdf from 'vue-pdf'
export default {
  components:{
      pdf
  },
  data(){
      return {
          row:{
            imageBase64:"xxxxxxxx",//替换实际base64编码
          },
      }
  },
  computed: {
    getSrc() {
      return function (row) {
        let vSrc = ''
          vSrc =
            'data:application/pdf;base64,' + row.imageBase64
          vSrc = pdf.createLoadingTask(vSrc);//将base64编码转换成pdf对象
        return vSrc
      }
    },
  },
</script>

但是我按照这篇帖子一通操作后提示如下图报错

error.png

经过一番查询思考后,发现应该不是该插件问题。后来发现可能问题出在我用的是nuxt环境,因为是ssr服务端渲染,在引用插件( NuxtJS项目——插件)这块,需要注意插件到底是在服务端还是客户端使用,所以需要特殊处理一下,参考nuxt 使用 vue-pdf ,解决报错,完美使用
关键代码如下:

//pdf.js文件
import Vue from 'vue'
import pdf from 'vue-pdf'
Vue.component('pdf', pdf)
 
//挂载到全局,用于 createLoadingTask 功能
export default function ({ app, redirect }, inject) {
  inject('pdf', pdf);
}
//nuxt.config.js文件
plugins: [{ src: '~/plugins/pdf.js', ssr: false }]

小插曲 Fix render method missing catch statement on render failure

添加上面的插件部分代码后我信心满满的以为彻底没问题,然而最后关头尽然给我报错了,那一刻我差点就要崩溃了,网上到处查这个报错也没有靠边的帖子(再次吐槽百度真垃圾)。后来经过好心同事提醒,直接去vue-pdf上的issue上看问题才找到这篇帖子338 - Fix render method missing catch statement on render failure,发现是版本问题,于是我将版本降到v4.2.0后成功解决该问题,不容易啊,最后这个问题卡了我好久。

方案二代码汇总

<template>
    <div>
      <pdf  ref="pdf" :src="row"></pdf>
    </div>
</template>

<script>
export default {
  data(){
      return {
          row:{
            imageBase64:"xxxxxxxx",//替换实际base64编码
          },
      }
  },
  computed: {
    getSrc() {
      return function (row) {
        let vSrc = ''
          vSrc =
            'data:application/pdf;base64,' + row.imageBase64
          vSrc = this.$pdf.createLoadingTask(vSrc);//将base64编码转换成pdf对象
        return vSrc
      }
    },
  },
</script>
//pdf.js文件
import Vue from 'vue'
import pdf from 'vue-pdf'
Vue.component('pdf', pdf)
 
//挂载到全局,用于 createLoadingTask 功能
export default function ({ app, redirect }, inject) {
  inject('pdf', pdf);
}
//nuxt.config.js文件
plugins: [{ src: '~/plugins/pdf.js', ssr: false }]
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容