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

原生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">
          <img
            class="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;
      //创建img
      let 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() {
      //获取生成签章位置的容器dom
      let imageListDom = document.querySelector(".imageList");
      //创建一个签章div
      let 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() {
      //获取表格图片盒子dom
      let imgBoxDom = document.querySelector(".box");
      let imgListDom = document.querySelector(".imageList");
      //获取图片的dom
      let 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

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
可以使用原生 JavaScript 实现文件上传,以下是一个基本的示例: HTML 代码: ```html <input type="file" id="file-upload" /> <button onclick="uploadFile()">上传文件</button> ``` JavaScript 代码: ```javascript function uploadFile() { var input = document.getElementById('file-upload'); var file = input.files[0]; var formData = new FormData(); formData.append('file', file); var request = new XMLHttpRequest(); request.open('POST', 'your-upload-url', true); request.onreadystatechange = function() { if (request.readyState === XMLHttpRequest.DONE && request.status === 200) { // 文件上传成功的处理逻辑 console.log(request.responseText); } }; request.send(formData); } ``` 上述代码中,我们首先获取了文件上传表单元素和文件对象。然后,创建一个 FormData 对象,并将文件对象添加到其中。接下来,创建一个 XMLHttpRequest 对象,并使用 `open` 方法指定上传的 URL、请求方式等参数。 在 `onreadystatechange` 事件中,我们检查请求的状态是否为完成状态(`XMLHttpRequest.DONE`)且响应状态码是否为 200(表示成功)。如果满足条件,表示文件上传成功,可以在这里处理成功的逻辑。 最后,通过调用 `send` 方法发送请求,将文件上传到指定的 URL。请将 `'your-upload-url'` 替换为实际的上传地址。 注意:由于涉及到跨域请求,请确保上传地址的配置允许跨域请求。另外,此代码示例基于原生 JavaScript 实现,没有使用任何框架或库。如果你使用的是某个特定的框架或库,可能会有相应的上传方法或插件可用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龟中的程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值