Vue3实现pdf本地预览功能

一、先直接看看效果吧

放大后

缩小后

也可以分页显示

 二、选用vue-pdf-embed和vue3-pdfjs的原因
 

   选用这两个的插件是因为如果实现pdf预览其实使用iframe标签就可以的,但是使用iframe标签实现的比较臭,vue-pdf-embed是能够自定义样式的,更加灵活,我也是第一次尝试这个,也遇到了一些坑,后面会跟大家分享,反正按照这个来就能实现,源码我也放后面了。

三、注意点及踩坑
 

1、我这里项目搭建是用的Vite也不知道使用vue cli会不会有什么问题

2、vue-pdf-embed我开始是pnpm i vue-pdf-embed  安装了最新的,后面会发现pdf预览不出来,找了原因是版本的问题,我就pnpm i vue-pdf-embed@1.2.1 切换到1.2.1版本就好了

3、vue3-pdfjs在这是用来做监听pdf页数的当然还有别的用处。

4、当预览成果后会发现文字并未出来,f12会报这个

warning: error during font loading: the cmap "baseurl" parameter must be specified, ensure that the "cmapurl" and "cmappacked" api parameters are provided.

原因就是缺少中文包,加上下面这段就行了,这段代码在源码里面

5、还有个问题是scale缩放开始无效,原因大概是因为在使用 vue-pdf-embed 组件的 scale 参数时发现无法实现动态更改,且 width 参数无法设置成百分比的形式,所以采用修改父容器的方案实现。

四、直接上源码了

//父组件

<template><div class="main"><div class="home-box"><pdfView :pdfUrl="jsPdf"/></div></div>
</template>
<script lang="ts" setup>
import { ref } from 'vue'
import pdfView from '@/components/pdfView/index.vue';
import jsPdf from './jsPdf.pdf';
</script>
<style lang="scss" scoped>
.main {width: 100vw;height: 100vh;display: flex;align-items: center;justify-content: center;.home-box{width: 80%;}
}
</style>

子组件
 

<template><div class="pdf-preview"><divclass="pdf-wrap":style="{ transform: `translate(-50%,-50%) scale(${scaleData})` }"><vue-pdf-embed:source="state.source":style="state.scale"class="vue-pdf-embed":page="state.pageNum"/></div><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="zoomIn">放大</div><div class="page-tool-item" @click="zoomOut">缩小</div><div class="page-tool-item" @click="pageRest">重置缩放</div></div></div>
</template>
<script setup lang="ts">
import { reactive, onMounted, computed, ref } from 'vue'
import VuePdfEmbed from 'vue-pdf-embed'
import { createLoadingTask } from 'vue3-pdfjs'
const props = defineProps({pdfUrl: {type: String,required: true}
})
const state = reactive({source: {url: props.pdfUrl,cMapUrl: 'https://cdn.jsdelivr.net/npm/pdfjs-dist@2.9.359/cmaps/',cMapPacked: true}, //预览pdf文件地址pageNum: 1, //当前页面scale: 1, // 缩放比例numPages: 0 // 总页数
})
const scaleData = ref(1.0)
const pageHeight = ref('100%')
//上一页
function lastPage() {if (state.pageNum > 1) {state.pageNum -= 1}
}
//下一页
function nextPage() {if (state.pageNum < state.numPages) {state.pageNum += 1}
}// 放大
function zoomIn() {scaleData.value += 0.1pageHeight.value = parseInt(pageHeight.value) - 5.0 + '%'
}
// 缩小
function zoomOut() {scaleData.value -= 0.1pageHeight.value = parseInt(pageHeight.value) + 5.0 + '%'
}
// 页面 放大/缩小 还原默认值
function pageRest() {scaleData.value = 1.0pageHeight.value = '100%'
}onMounted(() => {// debugger// console.log(props.pdfUrl)// debugger//获取pdf总页数const loadingTask = createLoadingTask(state.source)loadingTask.promise.then((pdf: { numPages: number }) => {// debuggerstate.numPages = pdf.numPages// debugger})
})
</script>
<style lang="scss" scoped>
.pdf-preview {position: relative;height: 100vh;padding: 20px 0;box-sizing: border-box;background-color: e9e9e9;.pdf-wrap {position: absolute;width: 100%;top: 50%;left: 50%;height: 100%;overflow-y: auto;.vue-pdf-embed {height: 100%;text-align: center;width: 80%;border: 1px solid #e5e5e5;margin: 0 auto;box-sizing: border-box;}}.page-tool {position: absolute;bottom: 35px;padding-left: 15px;padding-right: 15px;display: flex;align-items: center;background: rgb(66, 66, 66);color: white;border-radius: 19px;z-index: 100;cursor: pointer;margin-left: 50%;transform: translateX(-50%);.page-tool-item {padding: 8px 15px;padding-left: 10px;cursor: pointer;}}
}
</style>

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

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

相关文章

如何使用hugging face的模型库?

Hugging Face 是一个流行的自然语言处理 (NLP) 模型库和社区&#xff0c;提供了大量预训练模型、工具和资源&#xff0c;使得 NLP 的开发者和研究人员能够快速高效地构建和应用各种文本相关应用。在这里&#xff0c;我将向您介绍如何在 1 天内快速熟悉 Hugging Face 的基本功能…

分析系统性能问题从哪里入手?

本人十年大厂经验&#xff0c;整理技术资料不易&#xff0c; 完整详细文章关注公众号&#xff0c;后续还会有免费学习资料 1. 高性能架构的三个核心优化手段 负载均衡&#xff1a;通过分发用户请求到多个服务器&#xff0c;降低单一服务器的负载压力。 应用层负载均衡&#xf…

Python零基础从小白打怪升级中~~~~~~~TCP网络编程

TCP网络编程 一、什么是TCP协议 TCP( Transmission control protocol )即传输控制协议&#xff0c;是一种面向连接、可靠的数据传输协议&#xff0c;它是为了在不可靠的互联网上提供可靠的端到端字节流而专门设计的一个传输协议。 面向连接 &#xff1a;数据传输之前客户端和…

Stable Diffusion AI绘画宝典:从新手到高手,一图胜千言!

在这个数字化时代的浪潮中&#xff0c;人工智能技术以其惊人的创造力和创新性席卷全球。党的二十大报告把“实施科教兴国战略&#xff0c;强化现代化建设人才支撑”作为战略举措进行系统阐述&#xff0c;彰显我国不断发展新动能、新优势的决心和气魄。 Stable Diffusion是一款…

Vue3 + Element-Plus 使用 Table 预览图片发生元素遮挡

Vue3 Element-Plus 使用 Table 预览图片发生元素遮挡 问题代码问题重现解决方法最终效果 问题代码 <el-table-column label"视频" align"center"><template #default"scope" style"display: flex;"><div style"…

碾压LoRA!Meta CMU | 提出高效大模型微调方法:GaLore,内存可减少63.3%

引言 大模型训练通常会遇到内存资源的限制。目前常用的内存减少方法低秩适应&#xff08;LoRA&#xff09;&#xff0c;通过引入低秩&#xff08;low-rank&#xff09;适配器来更新模型的权重&#xff0c;而不是直接更新整个权重矩阵。然而&#xff0c;这种方法在预训练和微调…

消息队列和分布式消息队列

文章目录 分析系统现状不足中间件消息队列什么是消息队列&#xff1f;应用场景消息队列的模型为什么不直接传输&#xff0c;而要用消息队列&#xff1f;为什么要用消息队列&#xff1f;消息队列的缺点&#xff1f; 分布式消息队列分布式消息队列的优势&#xff1f;消息队列应用…

LeetCode55题:跳跃游戏(原创)

【题目描述】 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&am…

Oracle 19c补丁升级(Windows)

文章目录 一、打补丁前备份检查1、补丁包获取2、备份数据包以及数据库软件3、检查OPatch版本 二、补丁升级1、更新OPatch2、关闭监听以及服务3、补丁升级过程4、启动监听以及服务 三、数据库补丁应用 一、打补丁前备份检查 1、补丁包获取 补丁包&#xff1a; 百度网盘链接&am…

甘特图使用小诀窍,项目把控游刃有余

在项目管理过程中,掌握甘特图的使用技巧可以让你事半功倍,高效规划和监控项目进度。作为一种视觉化的工具,甘特图直观地展示了任务的开始和结束时间、持续时间以及任务之间的依赖关系,有助于预测和优化资源分配。掌握以下几个小诀窍,你就能驾驭甘特图,游刃有余地把控整个项目。…

运营商三要素验证API接口怎么对接

运营商三要素验证API接口又叫手机三要素验证API接口、运营商实名认证接口&#xff0c;这个接口是验证姓名、身份证号、手机号三者是否一致&#xff0c;返回验证结果&#xff0c;如果一致则说明三者信息匹配&#xff0c;可以有效确认当前注册用户的身份信息&#xff0c;那么运营…

山姆·奥特曼是如何成为亿万富豪的?

2017年夏天&#xff0c;Superhuman公司首席执行官拉胡尔沃拉&#xff08;Rahul Vohra&#xff09;开始疯狂向投资者一一发消息&#xff0c;缘由是他的初创公司尝试了谷歌浏览器Chrome的一项即将推出的更新。由于一个看似无害的代码更改&#xff0c;Superhuman的智能电子邮件服务…

【环境】原则

系列文章目录 【引论一】项目管理的意义 【引论二】项目管理的逻辑 【环境】概述 【环境】原则 一、培养项目系统性思维 1.1 系统性思维 1.2 系统性思维的价值 1.3 建模和推演&数字孪生 二、项目的复杂性和如何驾驭复杂性 2.1 复杂性的三个维度 2.2 如何驾驭复杂性 三、…

vs配置opencv找不到opencv_world480d.dll的问题

如下图所示 博主附加依赖项加了&#xff0c;但是运行程序的时候就是跳出来找不到opencv_world480d.dll。 最后是在电脑环境变量中添加了opencv安装后cv15文件夹中的bin目录的路径得以解决。 【此电脑】→【属性】→【高级系统设置】→【环境变量】→【系统变量】→【PATH】…

【C++航海王:追寻罗杰的编程之路】异常——错误处理方式之一

目录 引言 1 -> C语言传统的处理错误的方式 2 -> C异常概念 3 -> 异常的使用 3.1 -> 异常的抛出和捕获 3.2 -> 异常的重新抛出 3.3 -> 异常规范 4 -> 自定义异常体系 5 -> C标准库的异常体系 6 -> 异常的优缺点 引言 在C编程中&#xff…

冯喜运:4.16中东对抗风暴下,黄金原油市场何去何从?

黄金行情走势分析&#xff1a;4小时图布林道开始收口&#xff0c;昨日下探至下轨附近&#xff0c;也是此前的起涨低点2320启稳上升&#xff0c;十字K线配合单阳拉起&#xff0c;重新去摸高上轨。目前4小时图处于摸高当中。周线和日线留意多空转换&#xff0c;摸高之后是强势延续…

Codeforces Round 926 (Div. 2) ---- E. Sasha and the Happy Tree Cutting ----题解

E. Sasha and the Happy Tree Cutting&#xff1a; 题目大意&#xff1a; 思路解析&#xff1a; 现在有一颗树&#xff0c;然后给出了k对路径&#xff0c;然后要求路径上至少有一个结点是被染色了的&#xff0c;如果这k对路径没有共用边&#xff0c;那我们至少需要染色k条边。…

Docker安装及开启远程访问

这几天有人问我docker是怎么开启远程服务的&#xff1f; 正好之前我做过这件事情&#xff0c;并且写了相关的笔记&#xff0c;现在整理为一篇博客发出来。 安装Docker 首先更新一下自己的yum版本 yum update安装一下所需要的软件包 yum install -y yum-utils device-mappe…

MySQL进阶-----limit、count、update优化

目录 前言 一、limit优化 1. 未优化案例 2.优化后案例 二、count优化 count用法 三、update优化 1.锁行情况&#xff08;有索引&#xff09; 2.锁表情况&#xff08;无索引&#xff09; 前言 上一期我们学习了order by优化和group by优化&#xff0c;本期我们就继续学习…

Pytorch-张量形状操作

&#x1f606;&#x1f606;&#x1f606;感谢大家的观看&#x1f606;&#x1f606; &#x1f339; reshape 函数 transpose 和 permute 函数 view 和 contigous 函数 squeeze 和 unsqueeze 函数 在搭建网络模型时&#xff0c;掌握对张量形状的操作是非常重要的&#xff…