Vue3实现PDF在线预览功能

​🌈个人主页:前端青山
🔥系列专栏:Vue篇
🔖人终将被年少不可得之物困其一生

依旧青山,本期给大家带来Vue篇专栏内容:Vue3现PDF在线预览功能

前言

在开发中,PDF预览和交互功能是一个常见的需求。无论是管理系统、在线教育平台,还是企业内部的知识库,能够高效地展示和操作PDF文件都能极大地提升用户体验。本文将详细介绍如何在Vue项目中集成PDF预览功能,并实现基本的交互操作,如翻页、缩放等。

该片段展示了如何使用vue-pdf-embed库在Vue组件中嵌入PDF文件,并通过一系列方法实现页面切换和缩放功能。

代码解析

1. 引入依赖

首先,我们需要引入vue-pdf-embed库来处理PDF文件的加载和渲染。此外,为了确保PDF文件路径正确,我们还需要导入具体的PDF文件。

npm install vue-pdf-embed
import VuePdfEmbed from "vue-pdf-embed";
import testPdf from '@/assets/test.pdf'

这段代码的作用是:

  • testPdf:指定要预览的PDF文件路径。
  • VuePdfEmbed:引入用于嵌入PDF文件的Vue组件。

2. 定义响应式状态

接下来,我们定义一些响应式的变量来管理PDF的状态,包括当前页码、缩放比例和总页数等。

  const pdfLoading = ref<any>(false)const state = reactive({source:testPdf, //预览pdf文件地址pageNum: 1, //当前页面scale: 1, // 缩放比例numPages: 0, // 总页数});

这段代码的作用是:

  • pdfLoading:用于控制PDF加载时的加载动画显示与否。
  • state:一个响应式对象,包含PDF文件的源路径、当前页码、缩放比例和总页数。

3. 处理PDF加载事件

当PDF文件加载完成时,我们需要更新总页数,并关闭加载动画。

const handleDocument = (pdf:any)=>{if(pdf.numPages){pdfLoading.value = falsestate.numPages = pdf.numPages;}
}

这段代码的作用是:

  • 检查PDF文件是否成功加载(通过pdf.numPages判断)。
  • 如果加载成功,则关闭加载动画并将总页数赋值给state.numPages

4. 实现页面切换功能

为了方便用户浏览PDF文件,我们实现了两个方法来切换页面:lastPagenextPage

const lastPage = () => {if (state.pageNum > 1) {state.pageNum -= 1;}
}
const nextPage = () => {if (state.pageNum < state.numPages) {state.pageNum += 1;}
}

这两段代码的作用是:

  • lastPage:如果当前页码大于1,则将页码减1。
  • nextPage:如果当前页码小于总页数,则将页码加1。

5. 实现缩放功能

为了让用户可以调整PDF的显示大小,我们还实现了两个方法来控制缩放比例:pageZoomOutpageZoomIn

const pageZoomOut = () => {if (state.scale < 2) {state.scale += 0.1;}
}
const pageZoomIn = () => {if (state.scale > 1) {state.scale -= 0.1;}
}

这两段代码的作用是:

  • pageZoomOut:如果当前缩放比例小于2,则增加0.1。
  • pageZoomIn:如果当前缩放比例大于1,则减少0.1。

6. 组件模板部分

最后,我们在Vue组件的模板部分添加了PDF预览区域和相关操作按钮。

 <div class="yaxq-bottom-jcxx yawd"  v-if="yjShowIndex == 4 &&yjyaPojo.filePath"><div class="page-tool">
<div class="page-tool-item"  @click="lastPage">上一页</div>
<div class="page-tool-item"  @click="nextPage">下一页</div>
<div class="page-tool-item">{{state.pageNum}}/{{state.numPages}}</div>
<div class="page-tool-item" @click="pageZoomOut">放大</div><div class="page-tool-item" @click="pageZoomIn">缩小</div></div>
<div class="pdf-preview"  v-loading="pdfLoading" element-loading-text="正在加载中..."element-loading-background="rgba(122, 122, 122, 0.0)"><vue-pdf-embed :source="state.source" :style="scale" class="vue-pdf-embed" :page="state.pageNum" @loaded="handleDocument" /></div></div>
  &.yawd{display: flex;justify-content: center;position: relative;// overflow-y: auto;.page-tool {position: absolute;bottom: 0.3vw;left: 0%;padding-left: 0.25vw;padding-right: 0.25vw;display: flex;align-items: center;background: rgb(66, 66, 66);color: white;border-radius: 0.9vw;z-index: 999!important;cursor: pointer;margin-left: 50%;transform: translateX(-50%);}.page-tool-item {font-size: 0.6vw;padding: 0.5vw 0.9vw;padding-left: 0.1vw;cursor: pointer;}.pdf-preview{width: 100%;height: 100%;overflow-y:auto;position: relative;&::-webkit-scrollbar {width: 1px !important;/* Chrome, Safari, Edge */}&::-webkit-scrollbar-track {background: transparent !important;/* 滚动条轨道背景 */}&::-webkit-scrollbar-thumb {background-color: #696969;/* 滚动条滑块颜色 */border-radius: 1px;/* 滚动条滑块圆角 */box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);/* 滚动条滑块阴影 */}.vue-pdf-embed{width: 100%;height: 100%;z-index: 1!important;}}}

这段HTML代码的作用是:

  • v-if:根据条件判断是否显示PDF预览区域。
  • page-tool:包含了一系列操作按钮,用于切换页面和调整缩放比例。
  • pdf-preview:用于显示PDF文件,同时包含加载动画。
  • vue-pdf-embed:嵌入PDF文件的核心组件,绑定sourcestylepage等属性,并监听loaded事件。

功能实现

通过上述代码,我们已经实现了一个简单的PDF预览组件,具备以下功能:

  1. PDF加载:当用户打开PDF预览页面时,自动加载指定的PDF文件,并显示加载动画。
  2. 页面切换:用户可以通过点击“上一页”和“下一页”按钮来浏览PDF的不同页面。
  3. 缩放控制:用户可以通过点击“放大”和“缩小”按钮来调整PDF的显示大小。
  4. 状态显示:实时显示当前页码和总页数,帮助用户了解浏览进度。

这些功能不仅提升了用户体验,还使得PDF文件的查看更加便捷和直观。

结尾

通过本文的介绍,我们详细了解了如何在Vue项目中实现PDF预览和交互功能。从引入依赖到定义响应式状态,再到处理加载事件和实现页面切换、缩放功能,每一步都至关重要。希望本文能为读者提供有价值的参考,帮助大家更好地理解和应用这一技术。

在未来的工作中,我们可以继续探索更多优化方案,不断提升PDF预览组件的性能和用户体验。无论是通过技术创新还是设计改进,我们的目标始终是为用户提供更加优质的服务。

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

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

相关文章

常用的EDA 工具

1&#xff09; 逻辑设计&#xff1a; Cadence 的Verilog XL  模拟电路设计&#xff1a; Mentor 的Viewdraw  电路合成&#xff1a; Synopsys 的Design Compiler  电路仿真&#xff1a; Synopsys 的Hsim 和Hspice  人工布局&#xff1a; Cadence 的Virtuso  自动布局…

基于ESP32的桌面小屏幕实战[5]:PCB下单

1. 焊接调试前准备 PCB下单 点击“PCB下单” 检查一下DRC 确认无错误之后&#xff0c;确认下单 然后就会跳转到下面的网页 基本上保持默认选项即可。可以看到“焊盘喷镀”有3个选项。 在选择表面处理工艺时&#xff0c;应综合考虑产品的具体需求、环保法规以及成本等因素。例…

云原生架构的演变与实践

云原生架构的演变与实践 在现代软件开发的时代背景下&#xff0c;云原生架构日益成为推动业务转型的关键。它以云为中心的应用架构和开发思维&#xff0c;不仅包括了容器化的基本形式&#xff0c;更涉及全方位的应用管理及优化。本文将围绕云原生的特征、迁移步骤以及模式展开…

探索现代 Web 开发中的流行技术:深入学习 Vite 的使用

在前端开发的世界中&#xff0c;构建工具扮演着越来越重要的角色。从 Webpack 到 Parcel&#xff0c;再到 Rollup&#xff0c;每个工具都有自己的独特定位和目标。而今天&#xff0c;我们要讨论的是一款近年来迅速崛起并受到广泛欢迎的构建工具— Vite。 本文将从基本原理到实…

如何通过 6 种方式将照片从 iPhone 传输到戴尔 PC?

“你知道如何将iPhone上的照片转移到电脑上吗&#xff1f;我的iPhone上有很多照片&#xff0c;所以我想将这些照片从iPhone转移到电脑上。请给我一些建议&#xff0c;谢谢&#xff01;” - Nirenling 在戴尔社区中发布 您的iPhone是否被各种精彩的照片和视频占满而存储空间不…

『SQLite』表达式操作

摘要&#xff1a;表达式是一个或多个值、运算符和计算值的 SQL 函数的组合。SQL 表达式与公式类似&#xff0c;都写在查询语言中。 基本语法 SELECT column1, column2, columnN FROM table_name WHERE [CONTION | EXPRESSION];布尔表达式 SQLite 的布尔表达式在匹配单个值的…

升级 Spring Boot 3 配置讲解 —— 支持断点传输的文件上传和下载功能

学会这款 &#x1f525;全新设计的 Java 脚手架 &#xff0c;从此面试不再怕&#xff01; 在现代 Web 应用中&#xff0c;文件上传和下载是非常常见的需求。然而&#xff0c;当文件较大时&#xff0c;传统的上传下载方式可能会遇到网络不稳定或传输中断的问题。为了解决这些问题…

框架Tensorflow2

深度学习框架之Tensorflow2 Tensorflow2版本的介绍 Tensorflow(简称tf)是深度学习框架&#xff0c;大大简化了建模的方法和步骤&#xff0c;把Keras Api当作核心&#xff0c;使用非常简单&#xff0c;跨平台&#xff0c;集成各种现成模型&#xff0c;eager mode使得调试起来不…

SpringBoot3-深入理解自动配置类的原理(尚硅谷SpringBoot3-雷神)

文章目录 目录了解自动配置 一、导入对应场景的Mean依赖&#xff1a;1、引入依赖**找到自动配置类的所有配置都存放在哪里** 二、编写主程序&#xff1a;SpringBootApplication观察源码时所需要知道的几个核心注解&#xff1a;1、观察SpringBootApplication源码都做了什么 三、…

Mongo高可用架构解决方案

Mongo主从复制哪些事(仅适用特定场景) 对数据强一致性要求不高的场景,一般微服务架构中不推荐 master节点可读可写操作,当数据有修改时,会将Oplog(操作日志)同步到所有的slave节点上。那么对于从节点来说仅只读,所有slave节点从master节点同步数据,然而从节点之间互相…

商业领域 - 竞标极简理解

竞标极简理解 竞标是一种投标过程&#xff0c;指参与者&#xff08;通常是企业或个人&#xff09;为了获得某个项目或合同的执行权&#xff0c;向招标人&#xff08;通常是采购方或项目发起方&#xff09;提交报价和方案&#xff0c;并争取获得招标人的认可 竞标是一种常见的招…

C#Halcon跨窗口颜色识别

机器视觉是一门让计算机模拟人类视觉功能的学科。颜色识别在其中扮演着重要的角色&#xff0c;它旨在通过对图像中的颜色信息进行分析&#xff0c;从而识别出图像中的目标物体或者区域。例如&#xff0c;在水果分拣系统中&#xff0c;可以根据水果的颜色&#xff08;如苹果的红…

01:C语言的本质

C语言的本质 1、ARM架构与汇编2、局部变量初始化与空间分配2.1、局部变量的初始化2.1、局部变量数组初始化 3、全局变量/静态变量初始化化与空间分配4、堆空间 1、ARM架构与汇编 ARM简要架构如下&#xff1a;CPU&#xff0c;ARM(能读能写)&#xff0c;Flash&#xff08;能读&a…

Transformer知识梳理

Transformer知识梳理 文章目录 Transformer知识梳理什么是Transformer&#xff1f;语言模型迁移学习 Transformer结构注意力层原始结构 总结 什么是Transformer&#xff1f; 语言模型 Transformer模型本质上都是预训练语言模型&#xff0c;大部分采用自监督学习&#xff08;S…

第29天:PHP应用弱类型脆弱Hash加密Bool类型Array数组函数转换比较

#知识点&#xff1a; 1、安全开发-原生PHP-弱类型脆弱 2、安全开发-原生PHP-函数&数据类型 3、安全开发-原生PHP-代码审计案例 1、 和 两个等号是弱比较&#xff0c;使用进行对比的时候&#xff0c;php解析器就会做隐式类型转换&#xff0c;如果两个值的类型不相等就会把两…

STM32F1学习——编码器接口

一、编码器接口 编码器接口可以接收正交编码器的信号&#xff0c;根据编码器旋转产生的正交信号脉冲&#xff0c;通过硬件自动控制CNT值的自增或自减&#xff0c;从而指出编码器的位置、旋转方向和旋转速度。 每个高级定时器和通用定时器都有一个编码器接口&#xff0c;他们会占…

如何删除 Docker 中的悬虚镜像?

在 Docker 中&#xff0c;悬虚镜像&#xff08;Dangling Images&#xff09;是指那些没有 标签 且没有被任何容器使用的镜像。这些镜像通常是由于构建过程中生成的中间层镜像或未正确清理的镜像残留。删除悬虚镜像可以释放磁盘空间并保持 Docker 环境的整洁。 1. 列出悬虚镜像…

网络安全的学习与实践经验(附资料合集)

学习资源 在线学习平台&#xff1a; Hack This Site&#xff1a;提供从初学者到高级难度的挑战任务&#xff0c;适合练习各种网络安全技术。XCTF_OJ&#xff1a;由XCTF组委会开发的免费在线网络安全网站&#xff0c;提供丰富的培训材料和资源。SecurityTube&#xff1a;提供丰…

ts是什么、tsc是什么、tsx是什么、jsx是什么、scss是什么

一、TS (TypeScript): TypeScript 是一种由微软开发的开源编程语言&#xff0c;它是 JavaScript 的一个超集&#xff0c;增加了类型系统和对ES6及以后版本新特性的支持。TypeScript 旨在解决 JavaScript 开发中的可维护性、可扩展性和大型项目中的复杂性问题。它允许开发者在编…

行业商机信息付费小程序系统开发方案

行业商机信息付费小程序系统&#xff0c;主要是整合优质行业资源&#xff0c;实时更新的商机信息。在当今信息爆炸的时代&#xff0c;精准、高效地获取行业商机信息对于企业和个人创业者而言至关重要。 一、使用场景 日常浏览&#xff1a;用户在工作间隙或闲暇时间&#xff0c…