vue实现电子签名、图片合成、及预览功能,电子印章

插件:

signature_pad 签名板  链接: https://www.npmjs.com/package/signature_pad
merge-images  合并图像  链接:  https://www.npmjs.com/package/merge-images
html2canvas   html转cavas   链接:https://www.npmjs.com/package/html2canvas

电子签名的画板
html中创建一个id为signCanvas的canvas元素

<section>
    <div class="sign-box">
      <p><span style="color: #f00;">*</span>{{ $t('本人签名') }}</p>
      <el-button type="default" @click="clear(1)">{{ $t('清空') }}</el-button>
    </div>
    <canvas id="signCanvas" style="width:100%;height:300px;" />
</section>

初始化 SignaturePad

mounted(){
   const canvas = document.getElementById('signCanvas')
   this.signatureExample = new SignaturePad(canvas, { penColor: 'rgb(0, 0, 0)' })  //penColor   笔的颜色   
   this.resizeCanvas()
}
 
resizeCanvas() {
  const canvas = document.getElementById('signCanvas')
  const ratio = Math.max(window.devicePixelRatio || 1, 1) // 清除画布
  canvas.width = canvas.offsetWidth * ratio
  canvas.height = canvas.offsetHeight * ratio
  canvas.getContext('2d').scale(ratio, ratio)
  this.signatureExample.clear()
},

再加一个清除的方法,官方有提供,直接调用即可

this.signatureExample.clear()

canvas 转base64

this.signatureExample.toDataURL('image/png')    //得到了就是base64的   data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAfgAAAL2CAYAAA......

html转cavas
我们需要把html编写的文档转成base64
这个我们用html2canvas 这个插件就可以了

const element = document.querySelector('.html_body') // 需要导出的页面    哪个元素需要转成cavas  就获取它
const htmlCanvas = await html2canvas(element, {
allowTaint: true,
useCORS: true
})
this.imgSrc = htmlCanvas.toDataURL('image/png')    //得到base64

合成图片
接下来我们需要将html文档和电子签名模板,合成一张图片

import mergeImages from 'merge-images'
/* x 、y 是图片在合成图片上的位置(可自行调整)  */
const mergeImagesList = [
    { src: this.imgSrc, x: 0, y: 0 },   //html 转成的base64
    { src: this.signatureExample.toDataURL('image/png'), x: 370, y: 440 }    //  电子签名的 base64   
]
mergeImages(mergeImagesList).then(b64 => {
    this.previewSrc = b64     //返回base64   可直接用于展示
})

vue实现电子印章效果
Vue文件代码

<template>
    <div>
        <canvas id="canvas" width="200" height="200"></canvas>
    </div>
</template>
<script>
import chapter from './config/chapter'
export default {
    mounted(){
        chapter('XXX专用章','XXX科技股份有限公司')
    }
}
</script>

js文件代码

let chapter = (text, companyName) => {
  let canvas = document.getElementById("canvas");
  let context = canvas.getContext("2d");

  //let text = "XXX专用章";
  //let companyName = "XXX科技股份有限公司";

  // 绘制印章边框
  let width = canvas.width / 2;
  let height = canvas.height / 2;
  context.lineWidth = 5;
  context.strokeStyle = "#f00";
  context.beginPath();
  context.arc(width, height, 90, 0, Math.PI * 2); //宽、高、半径
  context.stroke();

  //画五角星
  create5star(context, width, height, 25, "#f00", 0);

  // 绘制印章名称
  context.font = "20px 宋体";
  context.textBaseline = "middle"; //设置文本的垂直对齐方式
  context.textAlign = "center"; //设置文本的水平对对齐方式
  context.lineWidth = 1;
  context.strokeStyle = "#f00";
  context.strokeText(text, width, height + 60);

  // 绘制印章单位
  context.translate(width, height); // 平移到此位置,
  context.font = "23px 宋体";
  let count = companyName.length; // 字数
  let angle = (4 * Math.PI) / (3 * (count - 1)); // 字间角度
  let chars = companyName.split("");
  let c;
  for (let i = 0; i < count; i++) {
    c = chars[i]; // 需要绘制的字符
    if (i == 0) {
      context.rotate((5 * Math.PI) / 6);
    } else {
      context.rotate(angle);
    }

    context.save();
    context.translate(70, 0); // 平移到此位置,此时字和x轴垂直,公司名称和最外圈的距离
    context.rotate(Math.PI / 2); // 旋转90度,让字平行于x轴
    context.strokeText(c, 0, 0); // 此点为字的中心点
    context.restore();
  }

  //绘制五角星
  function create5star(context, sx, sy, radius, color, rotato) {
    context.save();
    context.fillStyle = color;
    context.translate(sx, sy); //移动坐标原点
    context.rotate(Math.PI + rotato); //旋转
    context.beginPath(); //创建路径
    // let x = Math.sin(0);
    // let y = Math.cos(0);
    let dig = (Math.PI / 5) * 4;
    for (let i = 0; i < 5; i++) {
      //画五角星的五条边
      let x = Math.sin(i * dig);
      let y = Math.cos(i * dig);
      context.lineTo(x * radius, y * radius);
    }
    context.closePath();
    context.stroke();
    context.fill();
    context.restore();
  }
};

export default chapter;


vue实现上传pdf文件盖章与签名,盖章文件下载

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值