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.问题和完整代码请在评论区留言

### BIND 安装失败的原因与解决方案 BIND (Berkeley Internet Name Domain) 是互联网上广泛使用的域名系统(DNS)服务器软件。当遇到BIND安装失败的情况时,通常可以从以下几个方面排查问题: #### 1. 权限不足 如果在执行 `named-checkconf` 或者启动 BIND 服务时收到权限错误的信息,则可能是由于当前用户缺乏足够的权限来读取配置文件或写入日志文件。建议使用超级用户权限尝试重新运行命令[^2]。 #### 2. 配置文件语法错误 BIND 对其配置文件 `/etc/named.conf` 及区域数据文件有严格的格式要求。任何细微的拼写失误都可能导致解析失败。可以利用工具如 `named-checkconf` 和 `named-checkzone` 来验证配置的有效性[^1]。 ```bash $ named-checkconf /etc/named.conf $ named-checkzone example.com /var/named/example.db ``` #### 3. 文件路径不正确 指定给 BIND 的某些重要文件(比如根提示文件、密钥文件等)可能不存在于预期位置,或是相对路径被误解成绝对路径。确认所有提到的具体文件确实存在于所指明的位置,并且 BIND 进程能够访问这些资源。 #### 4. 端口冲突 DNS 协议默认监听 UDP/TCP 上的端口号 53 。如果有其他程序占用了这个端口,那么即使 BIND 成功加载也会因为无法绑定到所需端口而崩溃退出。通过 netstat 命令检查是否有进程正在占用端口。 ```bash $ sudo netstat -tulnp | grep :53 ``` #### 5. SELinux/AppArmor 设置不当 安全增强型 Linux(Security-Enhanced Linux, SELinux) 或 AppArmor 类似的安全模块可能会阻止 BIND 正常工作。对于启用了此类功能的操作系统来说,应该适当调整策略规则以允许必要的网络通信和服务操作。 #### 6. 资源限制过高 有时操作系统级别的设置会施加过严苛的资源配额控制,例如最大打开文件数(`nofile`)、内存锁定大小(`memlock`)等,这会影响 BIND 启动过程中的性能表现甚至导致失败。查看并修改相应的 sysctl 参数可以帮助解决问题。 ```bash # 修改临时生效的方法 $ ulimit -n 65535 # 提高可打开的最大文件数量 $ sysctl -w fs.file-max=2097152 # 设定全局最大的文件句柄数目 # 若要永久更改,请编辑/etc/security/limits.conf以及/etc/sysctl.conf文件 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值