关于盖章的代码完善

今天把进行了实战;再vue中;写完整了这个功能;

  • 拖动盖章;
  • pdf预览;
  • 生成x,y轴坐标;
    最初位置如下:


    image.png

    image.png
<style lang="scss">
    .helpCenter{
        background-color:#fff; 
        .center {
            position: relative;
            text-align: center;
            padding-top: 20px;
            background: #fff;
        }
        .sign-wrap{
            position: absolute;
            .sign-img{
             position: relative;
            }
        }
    }
    .helpCenter .pdfBtn{
        width: 1200px;
        margin: 0 auto;
        background-color: #fff;
        text-align: center;
        margin-bottom:10px; 
        button{
            cursor: pointer;
            width: 100px;
            height: 30px;
        }
    }
    .main{
       display: flex;
       justify-content: center;
    }
    .side-bar{
       .side-barinfo{
           width:300px;
           height: 100vh;
           border: 1px solid #fa0;
       } 
       .signbutton{
        cursor: pointer;
       }
       
    }
    .sign-img{
           z-index: 18;
       }
       .sign-imginner{
           width: 200px;
           height: 200px;
           background: url('../../static/icon_pxi.png') center center;
           background-size: 200px 200px;
           z-index: 18;
        //    display: none;
       }
</style>
<template>
<div class="helpCenter" v-loading="!isready">
    <div class="main" v-show="isready">
        <div class="side-bar">
            <h2>推拽章的信息</h2>
            <div class="side-barinfo">
                <div class="signbutton">推动盖章</div>
                <div class="sign-img" @mousedown='signPic' @mouseup='removeSignPic'>
                    <div class="sign-imginner">
                     <h2 style="color:#fff;text-align:center;">章托放</h2>
                    </div>
                    <!-- <img src="" style="width:200px;height:200px;" alt=""> -->
                </div>
            </div>
            
        </div>
         <div class="center">
             <div class="sign-wrap" @mousedown='signPic' @mouseup='removeSignPic'></div>
            <canvas style="border:1px solid #f00" ref='canvasDOM' class="canvasstyle" id="the-canvas"></canvas>
        </div>
    </div>
     <div class="pdfBtn">
            <button type="primary" @click="prev"><i class="el-icon-arrow-left el-icon--left"></i>上一页</button>
            <span>Page: <span v-text="page_num"></span> / <span v-text="page_count"></span></span>
            <button type="primary" @click="next">下一页<i class="el-icon-arrow-right el-icon--right"></i></button>
            <input type="text" v-model='gotopage_num' style="width:100px;height:29px;" placeholder="请输入页数">
            <button @click="goTopage">确定</button>
            <button @click="downpdf">下载</button>
        </div>
</div>
</template>
<script>
import PDFJS from '../../static/pdf/pdf.js';
export default {
    name: "helpCenter",
    data() {
        return {
            pdfurl:'https://yunlian-ku-res-cloudwarehouse-prod.oss-cn-beijing.aliyuncs.com/cloudwarehouse/oss/contract/chb-help-20180920.pdf?OSSAccessKeyId=LTAIgsIfRCwojpcm&Expires=1570500208&Signature=CBpZntWfITvsm6zCGGl765Z1am8%3D&time='+Date.now(),//pdf链接地址
            pdfDoc: null, //pdfjs 生成的对象
            pageNum: 1, //
            pageRendering: false,
            pageNumPending: null,
            compuscale:1, //放大倍数
            scale:1.6,//放大倍数
            page_num: 0, //当前页数
            page_count: 0, //总页数
            gotopage_num:'',//跳转到指定的页面
            // maxscale: 2, //最大放大倍数
            // minscale: 0.8, //最小放大倍数
            isready: false
        };
    },
    created() {
        var root = "$Urlhttp";
        if (root != "/ssocorp") {
            this.ajaxUrl = "";
        }
        var root2 = "$webRoot";
        if (root2 == "/api") {
            this.ajaxUrl2 = "/api";
        } else if (root2 != "/testca") {
            this.ajaxUrl2 = "";
        };
    },
     methods: {
            signPic(e){
                document.addEventListener("mousemove",this.signmouseMve,false);
            },
            removeSignPic(e){
                let signPicdom=document.querySelector(".sign-img");
                let scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;
                console.log(e);
                console.dir(signPicdom);
                console.log('scrollTop:',scrollTop)
                console.dir(this.$refs.canvasDOM);
                let perX=(this.getOffsetLeft(signPicdom)-this.getOffsetLeft(this.$refs.canvasDOM))/this.$refs.canvasDOM.clientWidth;
                let perY=(this.getOffsetTop(signPicdom)-this.getOffsetTop(this.$refs.canvasDOM)+scrollTop+21)/this.$refs.canvasDOM.clientHeight;
                let signWraphtml=document.querySelector('.sign-wrap');
                signWraphtml.style.top=this.$refs.canvasDOM.clientHeight*perY+'px';
                signWraphtml.style.left=this.$refs.canvasDOM.clientWidth*perX+'px';
                signWraphtml.appendChild(signPicdom.firstChild);
                document.removeEventListener('mousemove',this.signmouseMve,false);
                console.log({perX:parseInt(perX*100)+'%',perY:parseInt(perY*100)+'%'});
                return {perX:perX,perY:perY};//获取到最后的位置;反出来;
            },
            signmouseMve(e){
                var signPicdom=document.querySelector(".sign-img");
                if(!(document.querySelector('.sign-wrap').firstChild===null)){
                 signPicdom.appendChild(document.querySelector('.sign-wrap').firstChild);
                }
                var ev=e||event;
                signPicdom.style.position='fixed';
                signPicdom.style.top=(this.getPos(ev).y-signPicdom.clientHeight/2)+'px';
                signPicdom.style.left=(this.getPos(ev).x-signPicdom.clientWidth/2)+'px';
            },
            getPos(ev){
                let scrollTop=document.documentElement.scrollTop||document.body.scrollTop;
                let scrollLeft=document.documentElement.scrollLeft||document.body.scrollLeft;
                return {x: ev.clientX, y: ev.clientY};
            },
            getOffsetLeft(obj){
              var tmp = obj.offsetLeft;
              var val = obj.offsetParent;
              while(val != null){
              tmp += val.offsetLeft;
                val = val.offsetParent;
               }
             return tmp;
            },
            getOffsetTop(obj){
               var tmp = obj.offsetTop;
               var val = obj.offsetParent;
             while(val != null){
                tmp += val.offsetTop;
               val = val.offsetParent;
               }
                return tmp;
             },
            downpdf(){//下载pdf
                window.open(this.pdfurl);
            },
            renderPage(num) { //渲染pdf
                let vm = this
                this.pageRendering = true;
                let canvas = document.getElementById('the-canvas')
                    // Using promise to fetch the page
                this.pdfDoc.getPage(num).then(function(page) {
                    var viewport = page.getViewport(vm.compuscale);
                    //alert(vm.canvas.height)
                    canvas.height = viewport.height;
                    canvas.width = viewport.width;

                    // Render PDF page into canvas context
                    vm.isready = true
                    var renderContext = {
                        canvasContext: vm.ctx,
                        viewport: viewport
                    };
                    var renderTask = page.render(renderContext);

                    // Wait for rendering to finish
                    renderTask.promise.then(function() {
                        vm.pageRendering = false;
                        if (vm.pageNumPending !== null) {
                            // New page rendering is pending
                            vm.renderPage(vm.pageNumPending);
                            vm.pageNumPending = null;
                        }
                    });
                });
                vm.page_num = vm.pageNum;

            },
            addscale() { //放大
                if (this.compuscale >= this.maxscale) {
                    return
                }
                this.compuscale += 0.1;
                this.queueRenderPage(this.pageNum)
            },
            minus() { //缩小
                if (this.compuscale <= this.minscale) {
                    return
                }
                this.compuscale -= 0.1;
                this.queueRenderPage(this.pageNum)
            },
            prev() { //上一页
                let vm = this
                if (vm.pageNum <= 1) {
                    return;
                }
                vm.pageNum--;
                vm.queueRenderPage(vm.pageNum);
            },
            next() { //下一页
                let vm = this
                if (vm.pageNum >= vm.page_count) {
                    return;
                }
                vm.pageNum++;
                vm.queueRenderPage(vm.pageNum);
            },
            //跳转到指定的页
            goTopage(){
                var that=this;
                if(Number.isNaN(that.gotopage_num/1)){
                    this.$message.error("请输入数字");
                    this.gotopage_num='';
                    return;
                }
                if(this.gotopage_num<1||this.gotopage_num>this.page_count){
                    this.gotopage_num='';
                    this.$message.error("请输入范围内的页码");
                    return;
                };
                this.pageNum=this.gotopage_num;
                this.queueRenderPage(that.gotopage_num);
            },
            closepdf() { //关闭PDF
                this.pageNum = 1;
                this.pdfDoc = null;
                this.isready = false
                this.compuscale = this.scale
                this.$emit('closepdf')
            },
            throwerr(err) {
                this.$emit('pdferr', err);
            },
            queueRenderPage(num) {
                var a=parseInt(num)
                console.log(a);
                if (this.pageRendering) {
                    this.pageNumPending = a;
                } else {
                    this.renderPage(a);
                }
            }
        },
        computed: {
            ctx() {
                let id = document.getElementById('the-canvas')
                return id.getContext('2d');
            },
            isshowpdf() {
                if (this.value == undefined) return false
                return this.value;
            }
        },
        mounted() {
            this.compuscale = this.scale;
            let vm = this
            var val = vm.pdfurl
            if (val == '' || val == undefined) return
            PDFJS.getDocument(val).then(function(pdfDoc_) { //初始化pdf
                vm.pdfDoc = pdfDoc_;
                vm.page_count = vm.pdfDoc.numPages
                vm.renderPage(vm.pageNum);
            }).catch(function(err) {
                if (err) {
                    console.log(err)
                    vm.throwerr(vm.pdfurl)
                }
            })
        },
};
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->

下面的都是在凑字数。简书要求要超过100个字。前端工程师需要学的的东西太多了。多个框架。反正万变不理其中吧。最好还是坚持基础最好。真正理解原型。原型链和继承。还有学了一定要用。不让学了也没用。还是忘。学习根本原理。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,265评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,078评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,852评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,408评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,445评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,772评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,921评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,688评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,130评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,467评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,617评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,276评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,882评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,740评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,967评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,315评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,486评论 2 348

推荐阅读更多精彩内容

  • 概率论与数理统计 无穷小阶数 无穷小量表述:线性逼近 相当于利用切线和斜率来理解误差和逼近。 泰勒级数:线性逼近 ...
    Babus阅读 808评论 0 1
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,059评论 4 62
  • --绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益...
    韩七夏阅读 2,715评论 2 10
  • 1 解压BSP包,并进入根目录 2 在该目录下打开终端,sourec sdp安装目录下的qnxsdp-env.sh...
    tianming1992阅读 1,592评论 0 0
  • 最近处于一种时光匆匆,我却毫无建树的恐慌中。总想表达什么,却不知如何下笔。回看以前刻意练习一天一写后的练笔文章,有...
    Luckymay阅读 149评论 0 0