我正在寻找一个解决方案来添加签名到一个表格。一个人可以用鼠标或手指在触摸设备上签名。我想知道我是否可以使用像jSignature www.example.com这样的东西https://willowsystems.github.io/jSignature/#/about/来创建一个图像,用php处理表格并创建一个PDF,然后将图像添加到PDF。我研究了一下,还没有找到一个明确的解决方案。基本上我想创建一个简单的自由职业者网站合同,客户将签署在线。
6l7fqoea1#
我已经创建了一个相当简单的原型,它使用<canvas>元素来允许签名绘图,然后将该绘图作为base64 url添加到表单中。代码的简要说明:
<canvas>
mousedown
mousemove
mouseup
canvas.toDataUrl()
var canvas = document.getElementById('signature'); var ctx = canvas.getContext("2d"); var drawing = false; var prevX, prevY; var currX, currY; var signature = document.getElementsByName('signature')[0]; canvas.addEventListener("mousemove", draw); canvas.addEventListener("mouseup", stop); canvas.addEventListener("mousedown", start); function start(e) { drawing = true; } function stop() { drawing = false; prevX = prevY = null; signature.value = canvas.toDataURL(); } function draw(e) { if (!drawing) { return; } // Test for touchmove event, this requires another property. var clientX = e.type === 'touchmove' ? e.touches[0].clientX : e.clientX; var clientY = e.type === 'touchmove' ? e.touches[0].clientY : e.clientY; currX = clientX - canvas.offsetLeft; currY = clientY - canvas.offsetTop; if (!prevX && !prevY) { prevX = currX; prevY = currY; } ctx.beginPath(); ctx.moveTo(prevX, prevY); ctx.lineTo(currX, currY); ctx.strokeStyle = 'black'; ctx.lineWidth = 2; ctx.stroke(); ctx.closePath(); prevX = currX; prevY = currY; } function onSubmit(e) { console.log({ 'name': document.getElementsByName('name')[0].value, 'signature': signature.value, }); return false; }
canvas#signature { border: 2px solid black; } form>* { margin: 10px; }
<form action="submit.php" onsubmit="return onSubmit(this)" method="post"> <div> <input name="name" placeholder="Your name" required /> </div> <div> <canvas id="signature" width="300" height="100"></canvas> </div> <div> <input type="hidden" name="signature" /> </div> <button type="submit">Send</button> <form>
在PHP端,您应该能够解码base64字符串并将其保存到如下文件中:
$img = $_POST['signature']; $data = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $img)); file_put_contents('storage/signature.png', $data);
如果您需要移动/触控功能,只需将事件更改为:
touchmove
touchend
如果同时需要移动和鼠标输入,可以复制3 addEventListener行,以便跟踪所有6个事件。
addEventListener
1条答案
按热度按时间6l7fqoea1#
我已经创建了一个相当简单的原型,它使用
<canvas>
元素来允许签名绘图,然后将该绘图作为base64 url添加到表单中。代码的简要说明:
<canvas>
元素mousedown
(向下铅笔)、mousemove
(继续绘制)和mouseup
(向上铅笔)定义事件canvas.toDataUrl()
将画布内容作为一个图像来获取,然后在表单的一个隐藏输入中设置。在PHP端,您应该能够解码base64字符串并将其保存到如下文件中:
移动触摸事件注解
如果您需要移动/触控功能,只需将事件更改为:
mousemove
:touchmove
mouseup
:touchend
如果同时需要移动和鼠标输入,可以复制3
addEventListener
行,以便跟踪所有6个事件。