原生JS实现文件自定义位置盖章功能并导出PDF

news/2024/11/7 10:57:12/

原生JS实现文件自定义位置盖章功能并导出PDF

实现原理

在需要签章的文件上面创建一个div,可以通过移动这个div来确定签章位置,然后在通过获取这个位置把章子替换到这,并导出PDF,可以多次盖章!

实现截图

在这里插入图片描述

代码实现

废话不多说,直接上全部代码,不懂的看注释或底下评论。。。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta http-equiv="X-UA-Compatible" content="IE=edge" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body><div class="container"><div class="box"><div class="imageList"><imgclass="table"src="./img/工程表(纵向单页).png"alt=""srcset=""/></div><button class="setSign" style="position: fixed; top: 10px; left: 10px">设置签章点位</button><div style="position: fixed; top: 50px; left: 10px"><!-- <button class="determineSign">确定签章</button> -->选择公章:<select id="select"><option value="./img/signImage/公章1.png">公章1</option><option value="./img/signImage/公章2.png">公章2</option></select></div><button class="getPoint" style="position: fixed; top: 90px; left: 10px">确定盖章</button></div></div></body><script>//图片表格是纵向还是横向let hasPortrait = true; //默认是纵向// 给图片设置宽高(A4纸的宽高)let a4Size = {w: (595.28 * 4) / 3,h: (841.89 * 4) / 3,};//签章的宽高let signSize = {w: 140,h: 140,};//签章确定后的点位let signPoint = {left: "",top: "",};initPdf();//设置点击事件//生成签章document.querySelector(".setSign").addEventListener("click", function () {setSign();});//获取点位document.querySelector(".getPoint").addEventListener("click", function () {let signDom = document.querySelector(".sign");getSignPoint(signDom);console.log(signPoint);determineSign();});//确定盖章function determineSign() {let myselect = document.getElementById("select");let url = myselect.options[myselect.selectedIndex].value;//创建imglet signImg = document.createElement("img");console.log(url);signImg.src = url;let option = {width: signSize.w + "px",height: signSize.h + "px",position: "absolute",top: signPoint.top,left: signPoint.left,zIndex: 999,};for (const key in option) {if (Object.hasOwnProperty.call(option, key)) {const element = option[key];signImg.style[key] = element;}}//删除签章位置样式document.querySelector(".sign").remove();document.querySelector(".imageList").appendChild(signImg);}//生成签章的方法function setSign() {//获取生成签章位置的容器domlet imageListDom = document.querySelector(".imageList");//创建一个签章divlet signDiv = document.createElement("div");//设置样式let option = {backgroundColor: "transparent",width: `${signSize.w}px`,height: `${signSize.h}px`,position: "absolute",color: "red",textAlign: "center",lineHeight: `${signSize.h - 10}px`,border: "3px dashed red",borderRadius: "50%",boxSizing: "border-box",userSelect: "none",zIndex: 999,};for (const key in option) {if (Object.hasOwnProperty.call(option, key)) {const element = option[key];signDiv.style[key] = element;}}signDiv.className = "sign";signDiv.innerHTML = "签章位置";imageListDom.appendChild(signDiv);//设置移动事件addDrag(signDiv);}//给生成的签章设置移动事件方法function addDrag(dom) {//给签章设置鼠标移动样式dom.style.cursor = "move";let initX = null;let initY = null;//获取初始点击的位置dom.addEventListener("mousedown", mouseDownClick);}//签章移动事件function mouseDownClick(e) {let dom = document.querySelector(".sign");//获取该dom距离可视宽度的距离initX = e.pageX - dom.offsetLeft;initY = e.pageY - dom.offsetTop;//鼠标移动事件设置移动位置document.addEventListener("mousemove", moveEle);function moveEle(e) {let x = e.pageX - initX;let y = e.pageY - initY;// 签章边界if (x < 0) x = 0;if (y < 0) y = 0;let maxL = (hasPortrait ? a4Size.w : a4Size.h) - signSize.w;if (x > maxL) x = maxL;let maxT = (hasPortrait ? a4Size.h : a4Size.w) - signSize.h;if (y > maxT) y = maxT;dom.style.top = y + "px";dom.style.left = x + "px";}// 鼠标松开移出方法document.addEventListener("mouseup", function () {document.removeEventListener("mousemove", moveEle);});}//获取签章点位function getSignPoint(dom) {signPoint.left = dom.style.left;signPoint.top = dom.style.top;}//处理图片,是纵向还是横向function initPdf() {//获取表格图片盒子domlet imgBoxDom = document.querySelector(".box");let imgListDom = document.querySelector(".imageList");//获取图片的domlet imgDom = document.querySelector("img");let imgInfo = {width: imgDom.naturalWidth, //图片真实宽度height: imgDom.naturalHeight, //图片真实高度};// 判断是横向还是纵向hasPortrait = imgInfo.width < a4Size.w;imgBoxDom.style.width = (hasPortrait ? a4Size.w : a4Size.h) + "px";imgBoxDom.style.height = (hasPortrait ? a4Size.h : a4Size.w) + "px";imgListDom.style.width = (hasPortrait ? a4Size.w : a4Size.h) + "px";imgListDom.style.height = (hasPortrait ? a4Size.h : a4Size.w) + "px";}</script><style>.box {position: relative;width: 100%;box-shadow: 0 0 4px 0 #ccc;margin: 0 auto;}.box .imageList {background-color: white;position: absolute;top: 0;left: 0;overflow: hidden;}.imageList .table {position: absolute;top: 0;left: 0;right: 0;bottom: 0;margin: auto;}</style>
</html>

文件导出功能

看原来的文章,地址:Vue中将页面导出为PDF


http://www.ppmy.cn/news/356740.html

相关文章

电子签章pdf文件之我见

现在电子签章主要针对pdf文件&#xff0c;所以如果要验签&#xff0c;那么必须要熟悉pdf文件结构。Pdf文件知识点较多&#xff0c;仅pdf标准文档就已经到第7版了&#xff0c;最后一个版本就有800页&#xff0c;学习起来难度相对较大&#xff0c;但如果仅仅是为了验签&#xff0…

vue里面使用pdfjs-dist+fabric实现pdf电子签章!!!

2022.9.6 一、需求 最近领导提了一个新需求&#xff1a;仿照e签宝&#xff0c;实现pdf电子签章&#xff01; 最终实现效果图 这是做出来的效果图&#xff0c;当然还有很多待修改 二、思路 然后我就去看了下人家e签宝的操作界面&#xff0c;左侧是印章&#xff0c;右侧是…

使用Java对PDF进行电子签章

使用Java对PDF进行电子签章 开始之前前期准备开始生成keystore证书来张材料全家福编码项目结构签署工具类 开始之前 公司近期做的项目用到了电子签章&#xff08;给PDF盖章签名&#xff09;&#xff0c;这过程真是曲折。恰逢现在时间比较空闲&#xff08;有时间摸鱼&#xff0…

1024程序员节|历经一个月总结使用java实现pdf文件的电子签字+盖章+防伪二维码+水印+PDF文件加密的全套解决方案

&#x1f345;程序员小王的博客&#xff1a;程序员小王的博客 &#x1f345;CSDN地址&#xff1a;程序员小王java &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 如有编辑错误联系作者&#xff0c;如果有比较好的文章欢迎分享给我&#xff0c…

怎样在PDF文件上添加印章

1、首先将需要添加制公司的印章的文件转换成.pdf文件 2、从Adobe 官网上下载Adobe Acrobat XI Pro 这款软件并安装到我们的电脑上&#xff0c;安装完后打开软件&#xff0c;界面如下&#xff1a; 3、准备好我们要添加水印的pdf文档&#xff0c;用Adobe Acrobat XI打开&#xf…

Word盖章和PDF盖章

一、电子签章的作用 对文档进行数字签名与签署纸质文档的原因大致相同&#xff0c;数字签名通过使用计算机加密来验证 &#xff08;身份验证:验证人员和产品所声明的身份是否属实的过程。例如&#xff0c;通过验证用于签名代码的数字签名来确认软件发行商的代码来源和完整性。…

css移动端

目录 谷歌模拟器 屏幕分辨率 视口 二倍图 适配方案 rem 简介 问题 媒体查询 移动端 设备宽度不同&#xff0c;HTML标签字号设置多少合适 flexible.js rem-移动端适配 less 注释 运算 嵌套 变量 导入 导出 禁止导出 谷歌模拟器 模拟移动设备&#xff0c;方…

诚迈科技智能汽车软件产业峰会落幕,智达诚远峰昇操作系统FusionOS发布!

4月6日&#xff0c;由诚迈科技、智达诚远共同主办&#xff0c;苏州工业园区投资促进委员会协办&#xff0c;苏州工业园区智能网联产业促进会大力支持的中国&#xff08;苏州&#xff09;智能汽车软件产业峰会在苏州盛大举行。本次活动以“创新融合 聚力赋能”为主题&#xff0c…