vue3 pdf base64转成文件流打开

vue3 pdf base64转成文件流打开

1、先下载依赖

"vue-pdf": "^4.3.0",

"canvas": "^2.11.2",

"pdfh5": "^1.4.0",

"pdfjs-dist": "2.5.207",

2、文件流转换

复制代码
 const getList = async () => {
    const res = await TH36({
      query_type: '2',
      start_date: data.start_date,
      end_date: data.end_date,
    })
    console.log(res)
    if (res.data.head.errorFlag != 0) {
      Toast(res.data.head.errorMsg)
    } else {
      // data.base64Url = 'data:image/png;base64,' + res.data.data.result.pdf
      data.base64Url = 'data:application/pdf;base64,' + res.data.data.result.pdf
      viewPdf(res.data.data.result.pdf)
    }
  }
  // content是base64格式
  const viewPdf = (content) => {
    // console.log('content', content)
    const blob = base64ToBlob(content)
    // if (window.navigator && window.navigator.msSaveOrOpenBlob) {
    //   console.log('1:', blob)
    //   window.navigator.msSaveOrOpenBlob(blob)
    // } else {
    const fileURL = URL.createObjectURL(blob)
    console.log('2:', fileURL)
    // window.location.href = fileURL //打开ppf文件
    router.push({
      path: '/service/equityRecordFormDetail',
      query: {
        url: fileURL,
      },
    })
    // }
  }
  const base64ToBlob = (code) => {
    code = code.replace(/[\n\r]/g, '') // 检查base64字符串是否符合base64编码
    // atob() 方法用于解码使用 base-64 编码的字符串。
    const raw = window.atob(code)
    const rawLength = raw.length
    const uInt8Array = new Uint8Array(rawLength)
    for (let i = 0; i < rawLength; ++i) {
      // 将解码后的逐个字符转换成Unicode序号,放入Unit8Array数组
      uInt8Array[i] = raw.charCodeAt(i)
    }
    // 通过Blob将Uint8Array数组转换成pdf类型的文件对象
    return new Blob([uInt8Array], { type: 'application/pdf' })
  }

3、打开pdf

复制代码
<template>
  <div id="app">
    <div id="demo"></div>
  </div>
</template>

<script setup>
  import { reactive, toRefs, onMounted } from 'vue'
  import { useRoute } from 'vue-router'
  import Pdfh5 from 'pdfh5'
  import 'pdfh5/css/pdfh5.css'
  const route = useRoute()
  const id = route.query.id
  const data = reactive({
    pdfh5: null,
    PDFsrc: route.query.url,
  })
  onMounted(() => {
    //实例化
    data.pdfh5 = new Pdfh5('#demo', {
      pdfurl: data.PDFsrc,
    })
    //监听完成事件
    data.pdfh5.on('complete', function (status, msg, time) {
      console.log(
        '状态:' +
          status +
          ',信息:' +
          msg +
          ',耗时:' +
          time +
          '毫秒,总页数:' +
          data.totalNum
      )
    })
  })
  const { content } = toRefs(data)
</script>

<style lang="scss" scoped>
  * {
    padding: 0;
    margin: 0;
  }
  html,
  body,
  #app {
    width: 100%;
    height: 100%;
  }
  #demo {
    height: 100vh;
    overflow: hidden;
    overflow-y: scroll;
  }
</style>
相关推荐
meilindehuzi_a5 小时前
从零理解并实现 RAG:用 LangChain.js 构建语义检索问答系统
开发语言·javascript·langchain
世界哪有真情6 小时前
拿人类意识卡 AI?等于用 bug 验收正式产品
前端·人工智能·后端
鱼樱前端6 小时前
别再自己拼凑了!这款 Vue 3.5+ 严肃产品级组件库,把 AI 对话、工作流和复杂数据全包了!
javascript·vue.js·github
Listen·Rain7 小时前
Vue3:setup详解
前端·javascript·vue.js
Patrick_Wilson8 小时前
修好 bug 只是开始:一次由监控需求反向重构日志结构的复盘
前端·监控·数据可视化
kyriewen8 小时前
面试官让我优化一个卡死的表格,我打开 Claude 五秒重写,他放下咖啡问我要不要来当组长
前端·javascript·面试
小粉粉hhh8 小时前
React(二)——dom、组件间通信、useEffect
前端·javascript·react.js
Csvn9 小时前
🤖 AI 生成前端代码的 5 个典型翻车现场及修复指南
前端
IT_陈寒10 小时前
SpringBoot自动装配坑了我一天,原来问题出在这
前端·人工智能·后端
索西引擎10 小时前
【React】key 属性:协调算法中的元素标识机制与最佳实践
前端·javascript·react.js