赞
踩
vue h5项目预览pdf文件+电子签名
1、vue安装pdfh5
npm install pdfh5
2、示例代码
pdf文件预览页面
<template> <div class="pdf-container> <div id="pdfView"></div> <div v-if="SignPanelShow=='0'" class="pdfbtn" @click="openSignPanel">签名</div> <!-- 手签版弹出层--> <van-popup class="popup" v-model="signPopup" position="bottom" :style="{ height: '50%' }" closeable> <div class="popup-title">请手签您的姓名全称</div> <div class="popup-content"> <canvas isee_sign ref="signCanvas"></canvas> </div> <div class="popup-panel"> <van-cell> <van-button type="default" style="width: 49%;" @click="clear">清除</van-button> <van-button type="info" style="width: 49%;" @click="saveImageInfo">确认</van-button> </van-cell> </div> </van-popup> </div> </template>
js部分
<script> import Pdfh5 from "pdfh5"; import { initCanvas, clearArea } from '../assets/js/canvas.js'; export default { name: 'App', data() { return { pdfh5: null, SignPanelShow:'', // 签字状态 signPopup: false, /** 手签版校验 */ drawed: false, uuid: '', }; }, components: { pdf, }, mounted() { let o = this.getParam(); this.uuid = o.uuid; // 获取pdf文件 this.querypdf() // 获取签字状态 this.getsignpanetype() }, methods:{ // 获取地址栏参数 getParam() { var urlStr = location.href; if (typeof urlStr == "undefined") { var url = decodeURI(location.search); //获取url中"?"符后的字符串 } else { var url = "?" + urlStr.split("?")[1]; } var theRequest = new Object(); if (url.indexOf("?") != -1) { var str = url.substr(1); var strs = str.split("&"); for (var i = 0; i < strs.length; i++) { theRequest[strs[i].split("=")[0]] = decodeURI(strs[i].split("=")[1]); } } return theRequest; }, querypdf(){ this.$axios({ url:"api/propertyServer/view/"+ this.uuid, method:"get",//get请求方式 params:'', //传给后台的参数 responseType: 'blob' }).then(res=>{ console.log('pdf',res) if(res.status ==200){ this.pdfh5 = new Pdfh5("#pdfView", { pdfurl: window.URL.createObjectURL(new Blob([res.data])), zoomEnable:false, // 是否允许pdf手势缩放 }); } }).catch(error=>{}); }, getsignpanetype(){ this.$axios({ url:'api/propertyServer/Status/' + this.uuid, method:"get",//get请求方式 }).then(res=>{ if(res.status ==200){ this.SignPanelShow = res.data } console.log('签字状态',res,res.data) }).catch(error=>{}); }, // 打开签字板 openSignPanel: function () { this.signPopup = true this.$nextTick(() => { initCanvas(this) }) }, // 清空签字 clear: function () { clearArea(this) this.drawed = false }, // 签字确认 saveImageInfo(){ if (!this.drawed) { this.$toast.fail('请签字') return } this.$toast.loading({duration: 0, forbidClick: true, message: '正在加载', overlay: true}) this.signPopup = false this.$axios({ url:"api/propertyServer/sign/"+ this.uuid, method:"post", data:{ image:this.canvas.toDataURL() }, }).then(res=>{ if(res.status ==200){ // 更新签字状态 this.getsignpanetype() this.$toast.clear() } }).catch(error=>{}); } } } </script>
css部分
<style > @import "pdfh5/css/pdfh5.css"; *{ padding: 0; margin: 0; } html,body,#app { width: 100%; height: 100%; padding-bottom: 7px; box-sizing: border-box; } </style> <style scoped> .pdf-container{ width: 100%; height: 100vh; } /* 签字按钮 */ .pdfbtn{ width: 100%; height: 45px; position: fixed; left: 0; bottom: 0; font-size: 18px; color: #fff; background-color: rgb(69, 135, 246); text-align: center; line-height: 45px; } /* 客户签字版 弹出层 */ .popup { display: flex; flex-direction: column; overflow-y: auto; } .popup-title { font-size: 20px; font-weight: 600; text-align: center; margin-top: 20px; } .popup-content { overflow-y: hidden; height: 70%; } </style>
签字板canvas.js
/** 初始化canvas画布 */ export const initCanvas = that => { /** canvas初始化 */ let canvas = that.$refs.signCanvas that.canvas = canvas that.ctx = canvas.getContext('2d') let winW = window.innerWidth let winH = window.innerHeight / 3 canvas.width = winW canvas.height = winH /** 按下屏幕事件 */ that.canvas.addEventListener( 'touchstart', (event) => { if (event.targetTouches.length === 1) { const offset = (window.innerHeight / 2) // 起始偏移量由canvas画布在屏幕中的位置决定 这里是50% event.preventDefault() // 阻止浏览器默认事件,重要 var touch = event.targetTouches[0] that.touchPressed = true draw(touch.pageX - that.canvas.offsetLeft, touch.pageY - that.canvas.offsetTop - offset, false, that) } }, false) /** 拖动屏幕事件 */ that.canvas.addEventListener( 'touchmove', (event) => { if (event.targetTouches.length === 1) { const offset = (window.innerHeight / 2) // 起始偏移量由canvas画布在屏幕中的位置决定 这里是50% event.preventDefault() // 阻止浏览器默认事件,重要 var touch = event.targetTouches[0] if (that.touchPressed) { draw(touch.pageX - that.canvas.offsetLeft, touch.pageY - that.canvas.offsetTop - offset, true, that) } } }, false) /** 结束拖动屏幕事件 */ that.canvas.addEventListener( 'touchend', (event) => { if (event.targetTouches.length === 1) { event.preventDefault() // 阻止浏览器默认事件,防止手写的时候拖动屏幕,重要 that.touchPressed = false } that.drawed = true }, false) } /** 根据坐标与偏移量绘制图案 */ function draw (x, y, isDown, that) { let ctx = that.ctx if (isDown) { ctx.beginPath() ctx.strokeStyle = that.strokeStyle ctx.lineWidth = that.lineWidth ctx.lineJoin = 'round' ctx.moveTo(that.lastX, that.lastY) ctx.lineTo(x, y) ctx.closePath() ctx.stroke() } that.lastX = x that.lastY = y } /** 清空画板 */ export const clearArea = that => { that.ctx.setTransform(1, 0, 0, 1, 0, 0) that.ctx.clearRect(0, 0, that.ctx.canvas.width, that.ctx.canvas.height) }
参考文章链接 https://pdfh5.gjtool.cn/#/pages/index/detail?id=646781ec0c801ca87845c820
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。