vue3使用pdfjs实现pdf嵌入

原文:https://www.csdn.net/tags/MtTaEgwsMjU4OTktYmxvZwO0O0OO0O0O.html

pdfjs-dist 版本号:2.5.207

此方式已验证成功:

页面截图:

​​​​​​​

 

npm装包: cnpm  i pdfjs-dist@2.5.207

封装p.vue组件:

<template>
  <template v-for="item in pageNum" :key="item">
    <canvas :id="`pdf-canvas-${item}`" />
  </template>
</template>

<script>
import { reactive, toRefs, nextTick, watchEffect } from 'vue'
import * as pdfjs from 'pdfjs-dist'
import pdfjsWorker from 'pdfjs-dist/build/pdf.worker.entry';
import { Toast } from 'vant'

pdfjs.GlobalWorkerOptions.workerSrc = pdfjsWorker

export default {
  name: 'PdfViewer',
  props: {
    url: {type: String, default: ''} // pdf文件路径
  },
  setup (props, { emit }) {
    const state = reactive({
      pageNum: 0,
      pdfCtx: null
    })

    const resolvePdf = (url) => {
      const loadingTask = pdfjs.getDocument(url)
      loadingTask.promise.then(pdf => {
        console.log(pdf,'pdf')
        state.pdfCtx = pdf
        state.pageNum = pdf.numPages
        nextTick(() => {
          renderPdf()
        })
      })
    }

    const renderPdf = (num = 1) => {
      state.pdfCtx.getPage(num).then(page => {
        const canvas = document.getElementById(`pdf-canvas-${num}`)
        const ctx = canvas.getContext('2d')
        const viewport = page.getViewport({ scale: 1 })
        // 画布大小,默认值是width:300px,height:150px
        canvas.height = viewport.height
        canvas.width = viewport.width
        // 画布的dom大小, 设置移动端,宽度设置铺满整个屏幕
        const clientWidth = document.body.clientWidth
        // canvas.style.width = 900 + 'px'
        // 根据pdf每页的宽高比例设置canvas的高度
        // canvas.style.height = clientWidth * (viewport.height / viewport.width) + 'px'
        page.render({
          canvasContext: ctx,
          viewport
        })
        if (num < state.pageNum) {
          renderPdf(num + 1)
        } else {
          emit('onRendered')
		  Toast.clear(); // 取消加载loading
        }
      })
    }

    watchEffect(() => {
      if (props.url) {
      	// 展示加载loading
        Toast.loading({
          message: '加载中...',
          overlay: true,
          forbidClick: true,
          duration: 0,
        });

        resolvePdf(props.url)
      }
    })
    return {
      ...toRefs(state)
    }
  }
}
</script>

在页面中使用:

<div class="pdf">
<PdfViewer url="http://storage.xuetangx.com/public_assets/xuetangx/PDF/PlayerAPI_v1.0.6.pdf"></PdfViewer>
</div>

引入:import PdfViewer from "@/components/p.vue"

 另外分享,数据移入页面的时候,显示滚动条:

 ::-webkit-scrollbar {
    width: 3px;
    background-color: #fff;
  }
  .start-content::-webkit-scrollbar-thumb:vertical {
    width: 3px;
    background-color: #fff;
  }
  .start-content::-webkit-scrollbar-track-piece {
   /*鼠标移动上去再显示滚动条*/
    background-color: #fff;
  }
  .start-content:hover::-webkit-scrollbar-track-piece {
   /*鼠标移动上去再显示滚动条*/
    background-color: #fff;
    /* 滚动条的背景颜色 */
    border-radius: 6px;
    /* 滚动条的圆角宽度 */
  }
  .start-content:hover::-webkit-scrollbar-thumb:vertical {
    background-color: #e2e8ed;
    border-radius: 3px;
    // outline: 2px solid rgb(250, 20, 20);
    // outline-offset: -2px;
    // border: 2px solid #777b80;
}
 

//.start-content 是内容所在的盒子
//.start-content里面需要有:overflow-y: auto

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值