实现微信小程序和手机app(基于vue)PDF预览功能 |
您所在的位置:网站首页 › 微信小程序pdf下载到手机 › 实现微信小程序和手机app(基于vue)PDF预览功能 |
引言:最近在做微信小程序和手机端app开发(基于vue),实现一个pdf预览功能。 需求:点击pdf列表,跳转到预览pdf页面,页面上强制阅读10s后,显示一个按钮返回,更新阅读状态;要求:不能调用本地浏览器预览,不能让用户下载pdf,强制阅读10s后才可返回;准备:pdf在线文档:“http://cn.createpdfonline.org/pdffiles/test(20211215094117).pdf” 1.微信小程序端 方式一:webview运行结果: 分析: 上述结果是在ios系统上运行的,pdf可以正常显示;在android系统上,解析失败,一直显示空白界面;原因:ios可以自动解析pdf,安卓系统则解析不了;补充:在webview标签上显示按钮,相信做过微信小程序开发的都了解webview标签会默认占满全屏,覆盖掉其他组件,这个时候如果我们想加一个按钮就可以用cover-view标签来实现,具体实现大家可以自己去探索。总结:使用webview标签在系统上兼容性并不好,不能控制下载状态,而且在阅读状态上只能做到“假控制”。 2.手机app端(vue)1. 使用 iframe、embed、新窗口打开 优点:简单,支持大部分 PC 浏览器(IE 不支持)。跨域资源同样可以(无需 cors) 缺点:不支持移动端浏览器,不支持 IE 等低版本浏览器。样式无法自定义。 2. 使用vue中的组件vue-pdf 安装:打开命令行,直接使用npm或者yarn安装 npm install --save vue-pdf import pdf from 'vue-pdf' export default { name: 'myTestOne', components: { pdf }, data () { return { src: 'http://cn.createpdfonline.org/pdffiles/test(20211215094117).pdf', } }, methods: { } } .pdf_wrap { background: #fff; height: 100vh } .pdf_list { height: 80vh; overflow: scroll; }当你运行这段代码时(在pdf链接没过期的情况下),你会惊奇地发现,会出现跨域问题,并报出以下错误: 解决方案一 你需要联系你的后端小伙伴,因为PDF 文件作为静态资源放在 nginx服务器中。 在 nginx.conf 中设置: add_header Access-Control-Allow-Credentials true; add_header Access-Control-Allow-Origin $http_origin;完整配置如下: server { listen 80; server_name localhost; add_header Access-Control-Allow-Credentials true; add_header Access-Control-Allow-Origin $http_origin; location / { root pdf; index index.html index.htm; } }解决方案二(存在问题,后期研究) 和vue 接口请求解决跨域问题一样,在本地开发时同样通过 webpack的devServer去代理pdf预览的url(请求),其他环境(生成及测试)则让后端去解决。 解决开发环境pdf预览跨域问题就是在devServer中添加一个代理即可: //vue.config.js proxy: { //当pdf和数据接口不在同一个请求地址下时,为pdf预览追加一个代理 "/pdf": { target:"http://cn.createpdfonline.org/pdffiles", changeOrigin: true, pathRewrite: { '^/pdf': '' } } }运行结果如下: 重新保存项目,这个pdf就会显示在你的眼前,但是别高兴得太早,这个pdf只有一页,所以在这个基础上进行以下优化: 显示多页pdf显示pdf总页数实现一页一页翻pdf的功能监控当前页面加载进度代码实现(多页显示): import pdf from 'vue-pdf' export default { name: 'myTestOne', components: { pdf }, data () { return { src: 'http://storage.xuetangx.com/public_assets/xuetangx/PDF/PlayerAPI_v1.0.6.pdf', numPages:1, url:'' } }, mounted: function() { this.getNumPages() }, methods: { getNumPages() { this.url = pdf.createLoadingTask(this.src) this.url.promise.then(pdf => { this.numPages = pdf.numPages // 这里拿到当前pdf总页数 }) }, } } .pdf_wrap { background: #fff; height: 100vh } .pdf_list { height: 100vh; overflow: scroll; }结果展示: 该代码在pdfjsWrapper.js文件的第196行会报错,(偷摸给注释掉了) //pdfRender.cancel().catch(function(err) { //emitEvent('error', err); //});代码实现(单页展示,可翻页): 上一页 下一页 {{pageNum}}/{{pageTotalNum}} 顺时针 逆时针 import pdf from 'vue-pdf' export default { name: 'Home', components: { pdf }, data() { return { url: "http://storage.xuetangx.com/public_assets/xuetangx/PDF/PlayerAPI_v1.0.6.pdf", pageNum: 1, pageTotalNum: 1, pageRotate: 0, // 加载进度 loadedRatio: 0, curPageNum: 0, } }, mounted: function() {}, methods: { // 上一页函数, prePage() { var page = this.pageNum page = page > 1 ? page - 1 : this.pageTotalNum this.pageNum = page }, // 下一页函数 nextPage() { var page = this.pageNum page = page |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |