当前位置: 首页 > news >正文

【vue3+vue-pdf-embed】实现PDF+图片预览

【vue3+vue-pdf-embed】实现PDF+图片预览

    • 项目背景
    • 项目代码
    • 分析代码

项目背景

技术栈:vue3+Ts+elementplus
需要实现PDF和图片预览
图片预览很好解决了,可以用elementplus 自带的组件el-image 可实现
PDF预览可以用搜了一圈,有两个方案,一个是vue-office-pdf,另一个是vue-pdf-embed
由于项目需求,只需要做预览,且只支持 PDF,也不需要什么高级文档操作功能,所以我就采用了vue-pdf-embed

项目代码

html 代码

<my-dialog ref="myDialogRef" width="60%" max-height="70vh"><div v-loading="dialogLoading" class="reviewDiv"><el-image v-if="imageDialogVisible" :src="imageSrc" style="max-width: 100%;" fit="contain" /><vue-pdf-embed v-else ref="pdfRef" :source="imageSrc" :page="pdfPage" @password-requested="handlePasswordRequest" @rendered="handleDocumentRender" /><div v-show="!imageDialogVisible && pageCount" class="text-center"><el-button :disabled="pdfPage <= 1" @click="pdfPage--"></el-button><span class="mx-4">{{ pdfPage }} / {{ pageCount }}</span><el-button :disabled="pdfPage >= pageCount" @click="pdfPage++"></el-button></div></div>
</my-dialog>

js 代码

const imageSrc = ref('')
const myDialogRef = ref()
const imageDialogVisible = ref<boolean>(false)
const dialogLoading = ref<boolean>(false)
const openFileDialog = (file: any) => {dialogLoading.value = true// 释放之前创建的对象URLif (imageSrc.value) {URL?.revokeObjectURL(imageSrc.value)}// 创建新的对象URLif (file.raw) {// 本地预览imageSrc.value = URL?.createObjectURL(file.raw)dialogLoading.value = false} else {// 编辑远程预览const targetFile = getTargetFile.value(file)apiDownloadFile(targetFile[0].fileDocumentId).then((response: any) => {imageSrc.value = response.request.responseURLsetTimeout(() => {dialogLoading.value = false}, 1000)})}const isImage = judgeIcon(file) === 'image'myDialogRef.value?.openDialog(isImage ? '图片预览' : 'PDF预览')if (isImage) {imageDialogVisible.value = true} else {imageDialogVisible.value = false}
}const pdfPage = ref<number>(1)
const pageCount = ref<number>(0)
const pdfRef = ref()
function handleDocumentRender () {pageCount.value = pdfRef.value?.doc?.numPages // 这里是重点
}function handlePasswordRequest (callback: any, retry: boolean) {callback(prompt(retry ? 'Enter password again' : 'Enter password'))
}

分析代码

首先预览有本地预览和远程预览

  1. 本地预览顾名思义:就是在本地上传还没有调接口的PDF或图片进行预览,这时候通过URL 接口里面的静态方法并往里面传file.raw 便可得到 本地PDF/图片链接了
    具体请看这里URL:createObjectURL() 静态方法
  2. 远程预览:即从后端接口返回回来的PDF/图片 进行预览,这时候需要先调用下载接口 ,接口会返回 对应的链接
    通过以上两步:可以把 需要传递的 source 的值搞定

需要PDF很大,有很多页,这时候预览需要分页,但是分页的时候有一个问题,就是一直找不到对应的总页码即pageCount ,有看很多文章,要么通过rendered方法传参,但文档根据不支持传参,在这里插入图片描述
vue-pdf-embed
后面自己试了一下,居然 使用 ref 的方式 pdfRef.value?.doc?.numPages ,拿到了总页码,至此,后面就很容易解决了

http://www.xdnf.cn/news/1187389.html

相关文章:

  • 文件被删除了怎么恢复?恢复方法总结与重点注意事项
  • Mysql 日志 binlog redolog
  • deepseek本地部署,轻松实现编程自由
  • 在线事务型的业务、实时分析类业务、离线处理类型的业务
  • 数据赋能(332)——安全与合规——保密管理
  • MJ11032G和MJ11033G是对管由onsemi/安森美公司研发的一款高性能、低功耗的达林顿晶体管
  • Node.js(三)之Express
  • Zero-Shot TrackingT0:对象分割+运动感知记——当“切万物”武士学会运动记忆,目标跟踪稳如老狗
  • ESP32学习笔记_Components(1)——使用LED Strip组件点亮LED灯带
  • 图论水题日记
  • MC_GearInPos电子齿轮
  • ISIS高级特性LSP的分片扩展
  • Cacti 前台命令注入漏洞(CVE-2022-46169)
  • 深入解析Linux匿名管道机制与应用
  • 浅析PCIe 6.0 ATS地址转换功能
  • python基础:request模块简介与安装、基本使用,如何发送get请求响应数据,response属性与请求头
  • SpringBoot学习路径--SpringBoot的简单介绍和项目搭建
  • JDK8保姆级安装教程
  • 协作机器人掀起工厂革命:码垛场景如何用数据重塑制造业命脉?
  • day33:零基础学嵌入式之网络——TCP并发服务器
  • 渗透高级-----测试复现(第三次作业)
  • NodeJS搭建SSE接口服务
  • 2025.7.25 测试 总结
  • python学习DAY22打卡
  • 认识编程(3)-语法背后的认知战争:类型声明的前世今生
  • RCE真实漏洞初体验
  • 第三篇:VAE架构详解与PyTorch实现:从零构建AI的“视觉压缩引擎”
  • 练习实践-基础设施-文件共享-windows和linux之间的文件共享-smb服务搭建
  • 【应急响应】进程隐藏技术与检测方式(二)
  • 量子涨落驱动的全局寻优:单光子CIM的理论与实证