Vue3实现PDF在线预览功能

news2025/1/5 17:27:03

​🌈个人主页:前端青山
🔥系列专栏: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 = false
    state.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.coloradmin.cn/o/2270373.html

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

相关文章

SpringBootWeb案例-1

文章目录 SpringBootWeb案例1. 准备工作1.1 需求&环境搭建1.1.1 需求说明1.1.2 环境搭建 1.2 开发规范 2. 部门管理2.1 查询部门2.1.1 原型和需求2.1.2 接口文档2.1.3 思路分析2.1.4 功能开发2.1.5 功能测试 2.2 前后端联调2.3 删除部门2.3.1 需求2.3.2 接口文档2.3.3 思路…

css实现垂直文本

效果 知识 writing-mode: <value>; 可选值 horizontal-tb: 默认值。文本从左到右&#xff08;或从右到左&#xff09;排列&#xff0c;然后从上到下。vertical-rl: 文本从上到下排列&#xff0c;然后从右到左。适用于垂直书写的方向&#xff0c;如日语和中文。vertica…

vim里搜索关键字

vim是linux文本编辑器的命令&#xff0c;再vi的基础上做了功能增强 使用方法如下 1. / 关键字, 回车即可, 按n键查找关键字下一个位置 2.? 关键字, 回车即可, 按n键查找关键字下一个位置 3.示例

Qt之QtConcurrent

简介 QtConcurrent是针对qt中多线程相关的高层封装&#xff0c;如QFuture 结构 Qtconcurrent命名空间中的run支持的有 其对应的functor下结构为 类关系 functor对应的类核心关系为 #mermaid-svg-KLxZquz9yRsiYvQL {font-family:"trebuchet ms",verdana,a…

鸿蒙应用开发搬砖经验之-ArkWeb加载页面的超简单示例

前言 系统环境&#xff1a;Mac mini M2 14.5 (23F79) 开发IDE&#xff1a;DevEco Studio 5.0.1 Release 示例 第一步&#xff1a;创建一个Empty Ability工程 第二步&#xff1a;先run一下&#xff0c;确定工程初步化正常&#xff0c;模拟器正常启动应用&#xff08;要先提…

大模型系列17-RAGFlow搭建本地知识库

大模型系列17-RAGFlow搭建本地知识库 安装ollama安装open-wehui安装并运行ragflowRAG&#xff08;检索、增强、生成&#xff09;RAG是什么RAG三过程RAG问答系统构建步骤向量库构建检索模块生成模块 RAG解决LLM的痛点 使用ragflow访问ragflow配置ollama模型添加Embedding模型添加…

SimForge HSF 案例分享|复杂仿真应用定制——UAVSim无人机仿真APP(技术篇)

导读 「神工坊」核心技术——「SimForge HSF高性能数值模拟引擎」支持工程计算应用的快速开发、自动并行&#xff0c;以及多域耦合、AI求解加速&#xff0c;目前已实现航发整机数值模拟等多个系统级高保真数值模拟应用落地&#xff0c;支持10亿阶、100w核心量级的高效求解。其低…

微电网到底是什么?和光伏有什么关系?

在现代能源体系中&#xff0c;微电网作为一种新型的电力系统结构&#xff0c;正逐渐受到广泛关注和应用。那么&#xff0c;微电网到底是什么&#xff1f;它与光伏又有怎样的关系呢&#xff1f;本文将对此进行详细解析。 微电网的基本概念 微电网&#xff08;Micro-Grid&#x…

印象笔记06——再谈谈更新

印象笔记06——再谈谈更新 [!CAUTION] 好吧&#xff0c;我承认在前五期的努力下&#xff0c;我还是用的obsidian多一些。印象笔记很大程度用来弄清单&#xff0c;但是扭头看了看自己的会员时间&#xff0c;不能浪费啊&#xff01;本期再谈谈印象笔记近期的一些更新&#xff0c;…

爱死机第四季(秘密关卡)4KHDR国语字幕

通过网盘分享的文件&#xff1a;love_death_robot 链接: https://pan.baidu.com/s/1bG3Xtdopenil2O_y93hY_g?pwd8kib 提取码: 8kib

Android Studio学习笔记

01-课程前面的话 02-Android 发展历程 03-Android 开发机器配置要求 04-Android Studio与SDK下载安装 05-创建工程与创建模拟器

unity学习3:如何从github下载开源的unity项目

目录 1 网上别人提供的一些github的unity项目 2 如何下载github上的开源项目呢&#xff1f; 2.1.0 下载工具 2.1.1 下载方法1 2.1.2 下载方法2&#xff08;适合内部项目&#xff09; 2.1.3 第1个项目 和第4项目 的比较 第1个项目 第2个项目 第3个项目 2.1.4 下载方法…

自动驾驶新纪元:城区NOA功能如何成为智能驾驶技术的分水岭

目录 一、NOA 的定义 二、NOA 的主要特点 导航集成 场景覆盖 智能决策 高级感知能力 驾驶员参与 三、NOA 的优势 四、NOA的衡量指标 定性评价指标 安全性评价指标定义 可靠性评价指标定义 舒适性评价指标定义 通行效率评价指标 定量评价指标 五、代表厂商的实测…

解决uniapp H5页面限制输入框只能输数字问题

工作记录 最最近在做 uniapp 开发的移动端 H5 页面&#xff0c;有个需求是金额输入框只能输入数字&#xff0c;不能输入小数点和其他字符&#xff0c;经过各种尝试&#xff0c;发现其他字符可以通过正则过滤掉&#xff0c;但是输入小数点的话&#xff0c;因为没有触发 input 和…

JDK8源码分析Jdk动态代理底层原理

本文侧重分析JDK8中jdk动态代理的源码&#xff0c;若是想看JDK17源码分析可以看我的这一篇文章 JDK17源码分析Jdk动态代理底层原理-CSDN博客 两者之间有着略微的差别&#xff0c;JDK17在JDK8上改进了不少 目录 源码分析 过程 生成的代理类大致结构 本文侧重分析JDK8中jdk…

STM32单片机芯片与内部57 SPI 数据手册 寄存器

目录 一、SPI寄存器 1、SPI控制寄存器 1(SPI_CR1)(I2S模式下不使用) 2、SPI控制寄存器 2(SPI_CR2) 3、SPI 状态寄存器(SPI_SR) 4、SPI 数据寄存器(SPI_DR) 5、SPI CRC多项式寄存器(SPI_CRCPR)(I2S模式下不使用&#xff09; 6、SPI Rx CRC寄存器(SPI_RXCRCR)(I2S模式下不…

vue设计与实现-框架设计

权衡的艺术 命令式和声明式 视图层框架通常分为命令式和声明式&#xff0c;各有优缺。jquery是一种命令式框架。命令式框架关注过程&#xff0c;而声明式框架关注结果。对于vue来说&#xff0c;过程被vue封装了&#xff0c;所以vue内部是命令式的&#xff0c;但vue暴露给用户…

CSDN充值、收费、会员

现在在CSDN上查阅资料经常碰到需要充值或变成会员才能继续阅读的情况&#xff0c;一直以为是博客作者为了赚钱而设置的&#xff0c;今天才知道原来是CSDN弄的&#xff0c;因为我在不登录的情况下查看自己的博文也需要充钱&#xff01;我可没有做过任何设置。

ElasticSearch7.10-分词器

文章目录 分词器1.字符过滤器1.介绍2.过滤html标签3.mappings过滤规则&#xff08;屏蔽非文明用语&#xff09;4.正则替换 2.自定义分词器1.代码2.查询 3.中文分词器1.下载ik分词器7.10.0版本&#xff08;跟es对应&#xff09;2.应用ik分词器1.进入插件目录下创建一个ik目录2.将…

Linux之ARM(MX6U)裸机篇----6.BSP工程管理实验

一&#xff0c;BSP工程管理 定义&#xff1a;是为了模块化整理代码&#xff0c;相同属性的文件存放在同一个目录下。 ①先mkdir多个文件夹er ②把共同.h文件转移到指定文件夹下 二&#xff0c;启动文件 .global _start /* 全局标号 *//** 描述&#xff1a; _start函数&am…