记录前端菜鸟的日常——Pdf.js与双指缩放

一、需求

这两天一直在研究这个,之前项目用的是vue-pdf,但是pdf打开速度巨慢。我们的需求是从上到下滑动展示,要求打开时间不能过长并且可以实现双指缩放。

1.vue-pdf(快速集成)

(1)**"全量串行",**要把整个pdf全部下载并解析完之后一页一页渲染出来,渲染出来之前的页面就是一直白屏的。

(2)占用浏览器主线程,与Vue组件竞争资源。

2.pdf.js(高性能、全功能)

(1)"流式并行",一边加载一边渲染,而且是视口在哪就优先加载哪页、智能加载相邻页,远离视口的进行销毁或者低分辨率预览。

(2)使用Web Worker在独立线程解析PDF,主线程释放。

二、PDF.js的使用

pdf.js不需要安装依赖,直接去官网下载包,这个包就是个阅读器软件(网页版),2.多版本更稳定。

里面的web文件夹就包含了html、css、js,直接扔进puclic里,一个是因为不会被压缩,而且可以直接在根目录下访问,不用走路由之类的。

这个时候你就可以进行尝试在public下放一个测试的pdf,通过/web进行访问了,以我本地代码为例,访问的是http://localhost:1357/web/viewer.html?file=/test.pdf

file放的是你要访问的pdf链接,我们的项目进入pdf.vue会向后端请求一个链接,在pdf.vue用iframe标签直接展示这个链接即可。pdf.js会自带查找关键字、旋转等功能,但是发现这个方法不能进行双指缩放。(电脑本地可以,小程序不行)

三、双指缩放

然后我就开始排查是pdf.js在手机上会被限制还是小程序的限制或者iframe不允许手势操作。

1.最开始排除的是小程序的限制

因为在微信浏览器打开那个链接也不允许双指缩放,然后开始调整pdf.js的源码,看有没有对移动端做手势限制的代码。

主要找的是viewer.js,修改点(1)webViewerTouchStart放开事件源头

这段阻止了多指触摸

修改点(2)GrabToPan解除拖拽模块的拦截

如果是触摸事件且多点触控,让他直接return 不要进行后面的event.preventDefault();将事件掌控权交给浏览器处理进行缩放。

2.排查小程序oriframe的限制

这样调整完之后发现在web/viewer.html的pdf链接微信浏览器已经可以进行双指缩放了,不过小程序还是不行,本来以为是小程序又做了什么限制,后来无意中在手机上访问/web/viewer.html和#/pdf?type=https、、、、

发现原来是/web在微信浏览器就可以,#/pdf的还是不行,于是将pdf.vue文件进行修改,不再使用iframe进行展示pdf链接,而是直接在拿到pdf链接之后进行跳转到/web/viewer.html文件,发到测试上看,果然可以了

不过需要注意的是现在我们打开的是浏览器的缩放功能,也就是上面的菜单栏会一起跟着放大缩小,不过我们的需求是不要那些菜单栏只要实现双指缩放就可以,我就在css文件将菜单栏隐藏掉了。

网上关于pdf.js在移动端双指缩放的案例比较少,大部分还要会员,阴差阳粗的实现了我们的需求而且速度也比之前快很多了,如果有大佬知道怎么只让pdf放缩菜单栏不动的话欢迎指正!

相关推荐
华玥作者12 小时前
[特殊字符] VitePress 对接 Algolia AI 问答(DocSearch + AI Search)完整实战(下)
前端·人工智能·ai
Mr Xu_12 小时前
告别冗长 switch-case:Vue 项目中基于映射表的优雅路由数据匹配方案
前端·javascript·vue.js
前端摸鱼匠12 小时前
Vue 3 的toRefs保持响应性:讲解toRefs在解构响应式对象时的作用
前端·javascript·vue.js·前端框架·ecmascript
sleeppingfrog12 小时前
zebra通过zpl语言实现中文打印(二)
javascript
lang2015092812 小时前
JSR-340 :高性能Web开发新标准
java·前端·servlet
好家伙VCC13 小时前
### WebRTC技术:实时通信的革新与实现####webRTC(Web Real-TimeComm
java·前端·python·webrtc
未来之窗软件服务14 小时前
未来之窗昭和仙君(六十五)Vue与跨地区多部门开发—东方仙盟练气
前端·javascript·vue.js·仙盟创梦ide·东方仙盟·昭和仙君
baidu_2474386114 小时前
Android ViewModel定时任务
android·开发语言·javascript
嘿起屁儿整14 小时前
面试点(网络层面)
前端·网络
VT.馒头14 小时前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript