web pdf 拖拽签章

web pdf 拖拽签章

主要通过火狐的pdfjs 来实现

1. 下载js 并编译

地址 https://mozilla.github.io/pdf.js/

按照官网当下下载并编译就得到了js

2.其实也没有什么好讲的,都是用的js中的方法,官网中都有

按照步骤就能生成一个document元素,然后通过js方法操作元素就好了。

注意web页面显示的元素的大小和元素的大小不一样,要注意比例

3.效果展示

  1. 原图
  2. 签字后
  1. 下载后

4.代码展示

复制代码
<div>
    <div class="container">
        <div class="left" id="canvas"></div>
        <div class="right">
            <ul>
                <li>
                    <img class="sign-img" th:src="@{/sign/img.jpg}" onmousedown="srcImgMoveDown(this);" />
                </li>
            </ul>
            <button type="button" onclick="saveAndDown();">保存并下载</button>
        </div>
    </div>
    <input type="hidden" value="" id="hiddenInput">
</div>

<script>
    var moveFlag = false
    var downFlag = false
    var body
    var scale = 1.5;
    window.onload = function () {
        document.body.ondrop = function(event) {
            event.preventDefault();
            event.stopPropagation();
        }
        getPdf()
        body = document.getElementsByTagName('body')[0]
        body.addEventListener('mousemove',function(eve){
            if(!moveFlag){
                return
            }
            var img = document.getElementById('moveImg')
             img.style.position = 'fixed'
             img.style.top = eve.clientY + 'px'
             img.style.left = eve.clientX + 'px'
        })
        document.getElementById('canvas').addEventListener('click',function (){
            moveFlag = !moveFlag
        })
    }

    function getPdf() {
        var loadingTask = pdfjsLib.getDocument("/index/getPdf")
        loadingTask.promise.then(function (pdf) {
            for (let i = 1; i <= pdf.numPages; i++) {
                pdf.getPage(i).then(function (page) {

                    var viewport = page.getViewport({scale: scale,});
                    var outputScale = window.devicePixelRatio || 1;
                    var canvas = document.createElement('canvas')
                    canvas.setAttribute('name','canvas')
                    canvas.setAttribute('id','canvas'+i)
                    canvas.addEventListener('mouseup',eleClick)
                    var context = canvas.getContext('2d');
                    canvas.width = Math.floor(viewport.width * outputScale);
                    canvas.height = Math.floor(viewport.height * outputScale);
                    canvas.style.width = Math.floor(viewport.width) + "px";
                    canvas.style.height = Math.floor(viewport.height) + "px";
                    var transform = outputScale !== 1
                        ? [outputScale, 0, 0, outputScale, 0, 0]
                        : null;
                    var renderContext = {
                        canvasContext: context,
                        transform: transform,
                        viewport: viewport,
                        background:'beige'
                    };
                    page.render(renderContext);
                    document.getElementById('canvas').appendChild(canvas)
                });
            }
        })
    }

    function eleClick(even){
        let clientX = even.pageX - this.offsetLeft;
        let clientY = even.pageY - this.offsetTop;
        let id = this.getAttribute('id')
        console.log(id,clientX,clientY)
        document.getElementById('hiddenInput').value = clientX + "," +clientY + "," + id + "," + scale
    }
    function srcImgMoveDown(obj){
        var _img = document.getElementById('moveImg')
        console.log(_img)
        if(_img){
            return
        }
        var img = document.createElement('img')
        img.setAttribute('class',obj.getAttribute('class'))
        img.setAttribute('src',obj.getAttribute('src'))
        img.setAttribute('id','moveImg')
        body.appendChild(img)
        moveFlag = true

    }

    function saveAndDown(){
        var val =  document.getElementById('hiddenInput').value
        window.open("/index/saveAndDown?val=" + val)
    }

5.问题和完整代码请在评论区留言

相关推荐
一只小阿乐1 分钟前
java 快速上手开发 2
java·开发语言·前端
redfred10 分钟前
Koodo Reader 使用教程:开源电子书阅读器 epub/pdf/mobi/azw3 全格式 多端同步 AI翻译 笔记高亮
人工智能·pdf·开源
nicole bai13 分钟前
dialog封装
前端·javascript·vue.js
高彬22 分钟前
SAP ECC6.0 对接 C# web Services服务
开发语言·前端·c#·sap
小江的记录本23 分钟前
【CSS】CSS 核心:盒模型、BFC/IFC、Flex/Grid 布局、响应式布局、移动端适配(附《思维导图》)
前端·css·面试·前端框架·tensorflow·html5·xss
Coodor23 分钟前
BS架构下在前端读写超高频UHF标签
前端·超高频·rfid读写器web插件·uhf标签
一晌小贪欢28 分钟前
python-第20天:关键字参数与不定长参数
java·开发语言·前端·python·数据可视化·函数参数·python办公
我命由我1234530 分钟前
JS Mock(Mock 拦截请求的前提、Mock 使用、关闭 Mock)
开发语言·前端·javascript·前端框架·html·html5·js
Metaphor69231 分钟前
如何在 Python 环境中裁剪 PDF 页面
python·pdf
开开心心就好36 分钟前
手机精确倒计时工具悬浮窗口秒数实时显示
android·前端·javascript·jupyter·智能手机·pdf·html