vue-pdf的使用与遇到的坑

文章讲述了在不允许用户直接下载PDF的情况下,如何使用vue-pdf组件在Vue应用中展示PDF内容。过程中遇到了与Vuecli新版本的兼容问题,选择了降级Vuecli版本以继续使用vue-pdf,并详细展示了如何对vue-pdf进行封装,包括加载PDF、防止中文异常、处理页面翻页等功能。
摘要由CSDN通过智能技术生成

项目需求使用在页面中为用户呈现pdf文件内容,但不能让用户随意下载。到此为止心已经凉了一大截了,如此便捷的window.open不用想了。所以最后找到了vue-pdf。

报错

刚开始使用就当头一个报错

MainTemplate.hooks.hotBootstrap has been removed (use your own RuntimeModule instead)

与Vue cli version 5.x不兼容

到此为止两个选项,

1、降版本

2、换组件

还好当前项目的Vue cli版本不是那么新,可以继续用

将vue-pdf进行简易封装以便使用

<template>
    <div class="pdf" id="container">
        <vue-pdf ref="pdf" :src="pdfInfo.src" :page="pdfInfo.currentPage" 
        @num-pages="pdfInfo.pageCount=$event"
        @page-load="pdfInfo.currentPage=$event"
        @link-clicked="pageInfo.currentPage=$event"></vue-pdf>
    </div>
</template>

<script>
import vuePdf from "vue-pdf"
// 用于防止中文显示异常
import CMapReaderFactory from "vue-pdf/src/CMapReaderFactory.js"
export default {
    name: "Pdf",
    components: {
        vuePdf
    },
    data(){
        return{
            pdfInfo: {
                src: '',
                currentPage: 0,
                pageCount: 0
            }
        }
    },
    mounted(){
        this.showPdf()
    },
    methods: {
        /**
         * 父子组件获取到pdf地址后调用
         * @param {String} file pdf地址
         */
        showPdf(file){
            this.pdfInfo = {
                // 加载pdf
                src: pdf.creatLoadingTask({url: file, CMapReaderFactory}),
                currentPage: 1,
                pageCount: 0
            }
            // 获取pdf最大页数
            this.pdfInfo.src.promise.then(pdf => {
                // 设置最大页数
                this.pdfInfo.pageCount = pdf.numPages
                // 将pdf信息回传给父组件并赋值
                this.$parent.setPDFPage(this.pdfInfo.currentPage, this.pdfInfo.pageCount)
            })
        },
        /**
         * 返回顶部
         */
        toTop(){
            document.getElementById('container').scrollTop = 0
        },
        /**
         * 父组件中输入页面,进行翻页
         * @param {Number} pageNumber 页码
         */
        changeNumber(pageNumber){
            const reg = /[\D]$/
            pageNumber = pageNumber.toString()
            let number = ''
            // 如果传入的不是一个数字,对传入的信息进行处理
            for(let i = 0; i < pageNumber.length; i++){
                number += pageNumber[i].replace(reg, '')
            }
            pageNumber = number === '' ? 1 : number
            // 判断传入的页数是否超出组大页码
            if(pageNumber > this.pdfInfo.pageCount){
                pageNumber = this.pdfInfo.pageCount
            }else if(pageNumber < 1){
                pageNumber = 1
            }
            this.pdfInfo.currentPage = pageNumber
        },
        /**
         * 父组件中点击上一页下一页进行翻页
         * @param {Number} page 页码
         */
        changePDFPage(page){
            // 上一页
            if(page === 'prev' && this.pdfInfo.currentPage > 1){
                this.pdfInfo.currentPage--
                this.toTop()
            // 下一页
            }else if(page === 'next' && this.pdfInfo.currentPage < this.pdfInfo.pageCount){
                this.pdfInfo.currentPage++
                this.toTop()
            }
        },
        /**
         * 首次进入页面pdf加载
         */
        loadPDFHndler(){
            this.pdfInfo.currentPage = 1
        }
    }
}
</script>

<style lang="scss">
.pdf{

}
</style>

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值