需求说明
需要在vue项目中的页面中显示PDF文件,经过一番查找,决定使用这个项目:https://github.com/FranckFreiburger/vue-pdf/
另外还有手指缩放功能,使用的是:https://github.com/drozhzhin-n-e/vue-pinch-zoom
实现
package.json中引入:
"dependencies": { "pdfjs-dist": "2.5.207", "vue-pdf": "4.2.0", "vue-pinch-zoom": "^0.2.5" }
最简单的使用方式如下:
<template> <pdf src="./path/to/static/relativity.pdf"></pdf> </template> <script> import pdf from 'vue-pdf' export default { components: { pdf } }
我的需求是要PDF分页、加载带访问限制的url的PDF地址(例如http请求中head里是带Token的),另外针对PDF页面可能是手机版本,还需要带手指缩放功能,
如下代码(使用的是pdf.createLoadingTask,就可以指定http的headers了;在需要手机缩放的地方,套上PinchZoom):
<template> <div style="text-align: center;"> <!--加载中,我用的是vant的,根据实际情况修改--> <van-loading type="spinner" v-show="loading" /> <PinchZoom style="background: transparent;" ref="myPinch"> <div> <pdf v-for="i in numPages" :key="i" :src="src" :page="i" style=""></pdf> </div> </PinchZoom> </div> </template> <script> //see https://github.com/FranckFreiburger/vue-pdf import pdf from 'vue-pdf'; import PinchZoom from 'vue-pinch-zoom'; export default { name: "PdfViewer", components: { pdf, PinchZoom }, data() { return { loading: true, // 页面中带一个加载中的指示器 page: 1, numPages: 0, errors: [], src: pdf.createLoadingTask({ url: 'https://xxx/xxx.pdf', withCredentials: true, httpHeaders: { 'X-Token': localStorage.getItem("token") } }) } }, created() { if (this.numPages === 0) { this.loading = true; } }, mounted() { if (this.src) { this.src.promise.then(pdf => { this.loading = false; this.numPages = pdf.numPages; // this.$refs["myPinch"].toggleZoom(); }); } else { this.loading = false; } }, watch: {}, methods: {} } </script> <style lang="css" scoped> </style>
文章评论