Vue 使用vue-pdf 显示pdf文件 切换页面 缩放 全屏 自动播放等

news2024/12/23 6:46:54
<template>
    <div id="container">
        <!-- 上一页、下一页-->
        <div class="right-btn">
            <div @click="toFullOrExit" class="turn-btn"><span>{{ isFull == 1 ? "取消全屏" : "全屏" }}</span></div>
            <div @click="changePdfPage('first')" class="turn">
                首页
            </div>
                        <!-- 输入页码 -->
                        <div class="pageNum">
                <input v-model.number="currentPage" type="number" class="inputNumber" @input="inputEvent()"> / {{ pageCount
                }}
            </div>
            <!-- 在按钮不符合条件时禁用 -->
            <div @click="changePdfPage('pre')" class="turn-btn" :style="currentPage === 1 ? 'cursor: not-allowed;' : ''">
                上一页
            </div>
            <div @click="changePdfPage('next')" class="turn-btn"
                :style="currentPage === pageCount ? 'cursor: not-allowed;' : ''">
                下一页
            </div>
            <div @click="changePdfPage('last')" class="turn-btn">
                尾页
            </div>
            <div @click="scaleD" class="turn-btn">
                放大
            </div>
            <div><input type="number" class="inputNumber" @input="ScaleDX" v-model="scale">%</div>
            <div @click="scaleX" class="turn-btn">
                缩小
            </div>
            <div @click="AutoPdfPage()" :class="AutoPage == true ? 'turn-autobtn' : 'turn-btn'">
                自动播放
            </div>
            <div><input type="number" class="inputNumber" v-model="AutoTime">秒</div>
        </div>
        <div class="pdfArea">
            <pdf :src="src" ref="pdf" v-show="loadedRatio === 1" :page="currentPage" @num-pages="pageCount = $event"
                @progress="loadedRatio = $event" @page-loaded="currentPage = $event" @loaded="loadPdfHandler"
                @link-clicked="currentPage = $event" id="pdfID" style="margin: auto;"></pdf>
        </div>
        <!-- 加载未完成时,展示进度条组件并计算进度 -->
        <div class="progress" v-show="loadedRatio !== 1">
            <el-progress type="circle" :width="70" color="#53a7ff"
                :percentage="Math.floor(loadedRatio * 100)"></el-progress>
            <br>
            <!-- 加载提示语 -->
            <span>{{ remindShow }}</span>
        </div>
    </div>
</template>
<script>
import pdf from 'vue-pdf'
export default {
    components: {
        pdf
    },
    computed: {
    },
    created() {
        this.prohibit()
    },
    destroyed() {
        // 在页面销毁时记得清空 setInterval
        clearInterval(this.intervalID)
    },
    mounted() {
        // 更改 loading 文字
        this.intervalID = setInterval(() => {
            this.remindShow === this.remindText.refresh
                ? this.remindShow = this.remindText.loading
                : this.remindShow = this.remindText.refresh
        }, 4000)
        this.ID = this.$route.query.ID;
        this.getDocumentData();
        // // 监听滚动条事件
        // this.listenerFunction()
    },
    data() {
        return {
            // ----- loading -----
            remindText: {
                loading: '加载文件中,文件较大请耐心等待...',
                refresh: '若卡住不动,可刷新页面重新加载...'
            },
            remindShow: '加载文件中,文件较大请耐心等待...',
            intervalID: '',
            // ----- vuepdf -----
            // src静态路径: /static/xxx.pdf /static/1.pdf
            // src服务器路径: 'http://.../xxx.pdf'
            src: "",
            // 当前页数
            currentPage: 0,
            // 总页数
            pageCount: 0,
            // 加载进度
            loadedRatio: 0,
            //是否自动播放
            AutoPage: false,
            timer: null,
            ID: "",
            AutoTime: 5,
            scale: 100,
            isFull: 0,
        }
    },
    methods: {
        async getDocumentData() {
            if (this.ID == null || this.ID == "") {
                this.$message.error("当前页面异常!");
                return;
            }
            let res = await this.http.get('/api/Document/GetDocumentData', {
                id: this.ID
            })
            if (!res.Status && res.Code == -1) {
                this.$message.error(res.Message);
                return;
            }
            if (res.Data && res.Data.Res) {
                this.fileData = res.Data.Res;
                this.src = this.fileData.PreViewPath;
                // this.src = pdf.createLoadingTask(this.src)
                // console.log(this.src);
            }
        },
        // // 监听滚动条事件
        // listenerFunction(e) {
        //     document.getElementById('container').addEventListener('scroll', true)
        // },
        // 页面回到顶部
        toTop() {
            document.getElementById('container').scrollTop = 0
        },
        // 输入页码时校验
        inputEvent() {
            if (this.currentPage > this.pageCount) {
                // 1. 大于max
                this.currentPage = this.pageCount
            } else if (this.currentPage < 1) {
                // 2. 小于min
                this.currentPage = 1
            }
        },
        //放大
        scaleD() {
            this.scale += 5;
            this.$refs.pdf.$el.style.width = parseInt(this.scale) + "%";
        },

        //缩小
        scaleX() {
            if (this.scale == 0) {
                return;
            }
            this.scale += -5;
            this.$refs.pdf.$el.style.width = parseInt(this.scale) + "%";
        },
        ScaleDX() {
            this.$refs.pdf.$el.style.width = parseInt(this.scale) + "%";
        },
        // 切换页数
        changePdfPage(val) {
            if (val === 'pre' && this.currentPage > 1) {
                // 切换后页面回到顶部
                this.currentPage--
                this.toTop()
            } else if (val === 'next' && this.currentPage < this.pageCount) {
                this.currentPage++
                this.toTop()
            } else if (val === 'first') {
                this.currentPage = 1
                this.toTop()
            } else if (val === 'last' && this.currentPage < this.pageCount) {
                this.currentPage = this.pageCount
                this.toTop()
            }
        },
        AutoPdfPage() {
            var AutoTime = this.AutoTime * 1000
            this.AutoPage = this.AutoPage == true ? false : true;
            if (this.AutoPage == true) {
                this.$message({
                    type: "success",
                    message: "自动播放启动 " + this.AutoTime + "S自动翻页",
                });
                this.timer = setInterval(() => {
                    console.log(this.currentPage);
                    if (this.currentPage == this.pageCount) {
                        this.currentPage = 1;
                    }
                    else {
                        this.currentPage++;
                    }
                }, AutoTime)
            }
            else {
                this.$message({
                    type: "success",
                    message: "自动播放停止",
                });
                clearInterval(this.timer);
            }


        },
        // pdf加载时
        loadPdfHandler(e) {
            // 加载的时候先加载第一页
            this.currentPage = 1
        },
        //全屏
        requestFullScreen() {
            let de = document.documentElement
            if (de.requestFullscreen) {
                de.requestFullscreen()
            } else if (de.mozRequestFullScreen) {
                de.mozRequestFullScreen()
            } else if (de.webkitRequestFullScreen) {
                de.webkitRequestFullScreen()
            }
        },
        //退出全屏
        exitFullscreen() {
            let de = document
            if (de.exitFullscreen) {
                de.exitFullscreen()
            } else if (de.mozCancelFullScreen) {
                de.mozCancelFullScreen()
            } else if (de.webkitCancelFullScreen) {
                de.webkitCancelFullScreen()
            }
        },
        //全屏切换
        toFullOrExit() {
            this.isFull = !this.isFull
            if (this.isFull) {
                this.requestFullScreen()
            } else {
                this.exitFullscreen()
            }
        },
        // // 禁用鼠标右击、F12 来禁止打印和打开调试工具
        // prohibit() {
        //     // console.log(document)
        //     document.oncontextmenu = function () {
        //         return false
        //     }
        //     document.onkeydown = function (e) {
        //         if (e.ctrlKey && (e.keyCode === 65 || e.keyCode === 67 || e.keyCode === 73 || e.keyCode === 74 || e.keyCode === 80 || e.keyCode === 83 || e.keyCode === 85 || e.keyCode === 86 || e.keyCode === 117)) {
        //             return false
        //         }
        //         if (e.keyCode === 18 || e.keyCode === 123) {
        //             return false
        //         }
        //     }
        // }
    }
}
</script>
  
<style scoped>
#container {
    overflow: auto;
    height: 100%;
    font-family: PingFang SC;
    width: 100%;
    display: flex;
    /* justify-content: center; */
    position: relative;
}

/* 右侧功能按钮区 */
.right-btn {
    position: fixed;
    right: 5%;
    bottom: 15%;
    width: 120px;
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    z-index: 99;
}

.pdfArea {
    width: 100%;
}

/* ------------------- 输入页码 ------------------- */
.pageNum {
    margin: 10px 0;
    font-size: 18px;
}

/*在谷歌下移除input[number]的上下箭头*/
input::-webkit-outer-spin-button,
input::-webkit-inner-spin-button {
    -webkit-appearance: none !important;
    margin: 0;
}

在firefox下移除input[number]的上下箭头 input[type='number'] {
    -moz-appearance: textfield;
}

.inputNumber {
    border-radius: 8px;
    border: 1px solid #999999;
    height: 35px;
    font-size: 18px;
    width: 60px;
    text-align: center;
}

.inputNumber:focus {
    border: 1px solid #00aeff;
    background-color: rgba(18, 163, 230, 0.096);
    outline: none;
    transition: 0.2s;
}

/* ------------------- 切换页码 ------------------- */
.turn {
    background-color: #24aceb;
    opacity: 0.7;
    color: #ffffff;
    height: 70px;
    width: 70px;
    border-radius: 50%;
    display: flex;
    align-items: center;
    justify-content: center;
    margin: 5px 0;
}

.turn-btn {
    background-color: #24aceb;
    opacity: 0.6;
    color: #ffffff;
    height: 70px;
    width: 70px;
    border-radius: 50%;
    margin: 5px 0;
    display: flex;
    align-items: center;
    justify-content: center;
}

.turn-autobtn {
    background-color: #0467fa;
    opacity: 0.6;
    color: #ffffff;
    height: 70px;
    width: 70px;
    border-radius: 50%;
    margin: 5px 0;
    display: flex;
    align-items: center;
    justify-content: center;
}

.turn-btn:hover,
.turn:hover {
    transition: 0.3s;
    opacity: 0.5;
    cursor: pointer;
}

/* ------------------- 进度条 ------------------- */
.progress {
    position: absolute;
    right: 50%;
    top: 50%;
    text-align: center;
}

.progress>span {
    color: #199edb;
    font-size: 14px;
}
</style>
  
  

中途发现如果PDF在前端文件夹 正常。后端服务器的文件会一直报跨域报错,并且我后台已经设置了跨域还是报。

最终解决是在前端代理里加入

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1019578.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

GLTF-pipeline

gltf-pipeline可用作命令行工具或 Node.js 模块。 开始 安装 Node.js如果还没有&#xff0c;然后&#xff1a; npm install -g gltf-pipeline使用 gltf-pipeline 作为命令行工具&#xff1a; 将 glTF 转换为 glb gltf-pipeline -i model.gltf -o model.glb gltf-pipeline…

python萌新爬虫学习笔记【建议收藏】

文章目录 1. 如何何请求解析url2. 如何获取标签里面的文本3. 如何解析JSON格式4. 如何添加常用的header5. 如何合并两个div6. 如何删除html dom的部分结构7. 如何一次性获取所有div标签里的文本8. python爬虫如何改变响应文本字符集编码9. 如何进行字符集转码11. response.text…

骨髓小游戏

欢迎来到程序小院 骨髓 玩法&#xff1a; 骨髓推塔小游戏&#xff0c;敌方士兵进入到我方高塔会毁坏建筑&#xff0c;我方可派兵前去迎战&#xff0c;我方&#xff1a;骑兵、长枪兵、弓兵、敌法&#xff1a;骷髅骑兵、骷髅长枪兵、 骷髅弓兵,快去消灭敌人吧^^。开始游戏https:…

利用爬虫技术自动化采集汽车之家的车型参数数据

导语 汽车之家是一个专业的汽车网站&#xff0c;提供了丰富的汽车信息&#xff0c;包括车型参数、图片、视频、评测、报价等。如果我们想要获取这些信息&#xff0c;我们可以通过浏览器手动访问网站&#xff0c;或者利用爬虫技术自动化采集数据。本文将介绍如何使用Python编写…

flutter开发实战-长按TextField输入框cut、copy设置为中文复制、粘贴

flutter开发实战-长按TextField输入框cut、copy设置为中文复制、粘贴 在开发过程中&#xff0c;需要长按TextField输入框cut、copy设置为中文“复制、粘贴”&#xff0c;这里记录一下设置的代码。 一、pubspec.yaml设置flutter_localizations 在pubspec.yaml中设置flutter_l…

教你制作简单的洪水淹没模型

制作思路&#xff1a; 利用GIS软件将地形图通过高程垂直夸大&#xff0c;显示出其地形地貌&#xff0c;绘制一个面&#xff0c;使面从下向上移动&#xff0c;因地形高程的不同&#xff0c;面穿过地形图的面积不同&#xff0c;从而视觉上模拟出了水淹没的过程。 前期准备&…

facechain环境部署

环境安装 # 创建虚拟环境facechain conda create -n facechain python3.8 conda activate facechain # 克隆 GIT_LFS_SKIP_SMUDGE1 git clone https://github.com/modelscope/facechain.git --depth 1 # 安装第三方库 cd facechain pip install -r requirements.txt pip insta…

【JavaEE】操作系统内核中的进程

文章目录 &#x1f490;什么叫做进程&#x1f490;进程在系统中是如何进行管理的&#x1f490;PCB中一些比较重要的属性&#x1f490;进程持有的CPU资源——进程调度&#x1f490;内存分配——内存管理 &#x1f490;什么叫做进程 进程概念&#xff1a;一个已经跑起来的程序就…

Scrum和Kanban方法的结合:Scrumban的实施指南

如果没有有效的项目管理&#xff0c;团队成员将不得不处理尽可能多的程序&#xff0c;而这种方法不会导致成功。有几种著名的项目管理方法&#xff0c;例如 Scrum 和看板。但是有一种方法可以结合他们的最佳实践。 Scrum 和看板的优势结合在称为 Scrumban 的混合方法中。它非常…

chales 重写/断点/映射/手机代理/其他主机代理

1 chales 安装和代理配置/手机代理配置/电脑代理配置 chales 安装和代理配置/手机代理配置/电脑代理配置 2 转载:Charles Rewrite重写(详解&#xff01;必懂系列) Charles Rewrite重写(详解&#xff01;必懂系列) 1.打开charles&#xff0c;点击菜单栏的Tools选中Rewrite2.…

企业架构LNMP学习笔记59

目录介绍&#xff1a; bin&#xff1a;存放的是启动和关闭tomcat的脚本文件&#xff1b; conf&#xff1a;存放tomcat服务器的各种全局配置文件&#xff0c;其中最重要的是server.xml和web.xml lib: 存放的是tomcat服务器所需要的各种jar文件。java打包类库。 logs&#xff…

区域图片上色

目录 下图中&#xff0c;记得点击Apply&#xff0c;然后再点击Symbology 实际选择的时候&#xff0c;不选1Categorized&#xff0c;因为其分段不方便。

js中如何判断两个对象是否相等?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 浅相等&#xff08;Shallow Equality&#xff09;⭐ 深相等&#xff08;Deep Equality&#xff09;⭐ 自定义深相等函数⭐ 使用第三方库⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接…

电路原理图字母缩写表示什么?

很多小白问&#xff0c;电路原理图上这些字母缩写都是些啥玩意儿啊&#xff1f; &#xff08;一&#xff09;EN :Enable&#xff0c;使能&#xff0c;使芯片能够工作。要用的时候&#xff0c;就打开 en 脚&#xff0c;不用的时候就关闭。有些芯片是高使能&#xff0c;有些是低…

SQLSERVER 数据库恢复挂起的解决办法

USE master GO ALTER DATABASE KH_Curve SET SINGLE_USER GO ALTER DATABASE KH_Curve SET EMERGENCY GO DBCC CHECKDB(KH_Curve,REPAIR_ALLOW_DATA_LOSS) go ALTER DATABASE KH_Curve SET ONLINE GO ALTER DATABASE KH_Curve SET MULTI_USER GO

.Net IDE智能提示汉化(.Net6、AspNetCore)

先上现成的.net6汉化文件&#xff0c;可以手动下载后参照 如何为 .NET 安装本地化的 IntelliSense 文件 进行安装。或者使用后文的工具进行自动安装。 无对照英文在前中文在前 汉化内容来自 官方在线文档 &#xff0c;某些内容可能存在明显的机翻痕迹。 上一些效果图&#x…

destoon根据目录下的html文件生成地图索引

因为项目需要&#xff0c;destoon根据目录下的html文件生成地图索引&#xff0c;操作方法&#xff0c;代码如下&#xff1a; <?php $new_array array(); function loopDir($dir,&$new_array,$modurl) {$handle opendir($dir);header("Content-Type:text/xml&qu…

elasticsearch15-数据聚合

个人名片&#xff1a; 博主&#xff1a;酒徒ᝰ. 个人简介&#xff1a;沉醉在酒中&#xff0c;借着一股酒劲&#xff0c;去拼搏一个未来。 本篇励志&#xff1a;三人行&#xff0c;必有我师焉。 本项目基于B站黑马程序员Java《SpringCloud微服务技术栈》&#xff0c;SpringCloud…

为什么日本的网站看起来如此不同

首发于公众号 大迁世界&#xff0c;欢迎关注。&#x1f4dd; 每周一篇实用的前端文章 &#x1f6e0;️ 分享值得关注的开发工具 &#x1f61c; 分享个人创业过程中的趣事 该篇文章讨论了日本网站外观与设计的独特之处。作者指出日本网站设计与西方设计存在明显差异。文章首先强…

CSS动效合集之实现气泡发散动画

前言 &#x1f44f;CSS动效合集之实现气泡发散动画&#xff0c;速速来Get吧~ &#x1f947;文末分享源代码。记得点赞关注收藏&#xff01; 1.实现效果 2.实现步骤 定义一个数组bubbles&#xff0c;用来存储气泡列表的基本新&#xff0c;w表示宽高&#xff0c;x表示绝对定位…