当前位置: 首页 > news >正文

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 = falsevar downFlag = falsevar bodyvar 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').valuewindow.open("/index/saveAndDown?val=" + val)}

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

http://www.lryc.cn/news/160195.html

相关文章:

  • SQLAlchemy 库创建数据库引擎和会话工厂附带SQLSERVER驱动版本确认方式
  • 用Python登录账户
  • 梳理下我自已对Reactor与及IO多路复用的select\poll\epoll的理解
  • 4. 广播变量
  • GPT 内部 — I : 了解文本生成
  • 平板触控笔哪款好用?好用的第三方apple pencil
  • Mac 上更新系统PATH环境变量
  • Visual Studio Code 终端配置使用 MySQL
  • 12 | 使用 Spark SQL执行CURL
  • 容器编排学习(七)控制器介绍与使用
  • 一文看懂微信小程序新版隐私协议(附带弹窗组件)
  • Java认识异常(超级详细)
  • 危险边缘:揭示 Python 编程中易被忽视的四个安全陷阱
  • 抖店开通后,新手必须要知道的几个做店技巧,建议认真看完
  • FPGA时序分析与约束(5)——时序路径
  • Flutter:构建跨平台应用的未来选择
  • 08_瑞萨GUI(LVGL)移植实战教程之LVGL对接串口打印
  • 【LeetCode75】第五十题 无限集中的最小数字
  • 关于 Unity 连接 MuMu 模拟器上的 Unity Remote 5 的方法
  • OpenCV 02(色彩空间)
  • 【动手学深度学习】--循环神经网络
  • 快捷支付是什么?怎么申请支付接口?
  • 【MySQL】数据库基础知识
  • 算法训练day36|贪心算法 part05(重叠区间三连击:LeetCode435. 无重叠区间763.划分字母区间56. 合并区间)
  • [Android] AndroidManifest.xml 详解
  • idea远程debug调试
  • 离散化,树状数组,P5459 [BJOI2016] 回转寿司
  • 论文复现--VideoTo3dPoseAndBvh(视频转BVH和3D关键点开源项目)
  • JS 检查某个值是否为某个类的实例
  • 生动理解深度学习精度提升利器——测试时增强(TTA)