웹에서 signature_pad.js 사용해서 서명받기 예제



Signature Pad : https://github.com/szimek/signature_pad


Demo 사이트 : http://szimek.github.io/signature_pad/


요기에 가보면 어떤 머리좋고 착한 사람이 웹에서 사인을 할 수 있도록 지원해주는 js 를 맨들어 놓고 설명을 해 주고 있다.


웹에서 사인한 이미지를 php 을 사용해서 png 이미지 파일을 생성하는 예제는 있는데 Java 예제는 없어서 Java 로 하는걸 살짝 맹글어 보았다.


뭐 별건 아니고 BASE64 로 인코딩된 문자열을 다시 디코딩해서 png 파일로 맨드는것만 하면 된다.



보다 쉬운 편의를 위해서 Apache Commons 프로젝트에 있는 라이브러리 몇개(lang, io, codec)를 가져다 썼다.


maven 을 사용하는 사람들은 디펜던시에 요걸 추가해 주면 되고 아니면 그냥 commons.apache.org 에 가서 다운로드 받으면 된다.

        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.10</version>
        </dependency>

        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>
        
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.4</version>
        </dependency>



HTML

<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    <title>::: 사인패드 테스트 :::</title>

    <script src="${pageContext.request.contextPath}/resources/js/jquery-1.11.3.min.js" type="text/javascript">
    </script>
    <script src="${pageContext.request.contextPath}/resources/js/signature_pad.min.js" type="text/javascript">
    </script>
    
    <link rel="stylesheet" href="${pageContext.request.contextPath}/resources/css/css.css">
</head>

<body>
    <div id="signature-pad" class="m-signature-pad">
        <div class="m-signature-pad--body">
            <canvas></canvas>
        </div>
        <div class="m-signature-pad--footer">
            <div class="description">사인해 주세요~</div>
            <button type="button" class="button clear" data-action="clear">지우기</button>
            <button type="button" class="button save" data-action="save">저장</button>
        </div>
    </div>
    
    <script>
        var canvas = $("#signature-pad canvas")[0];
        var sign = new SignaturePad(canvas, {
            minWidth: 5,
            maxWidth: 10,
            penColor: "rgb(66, 133, 244)"
        });
        
        $("[data-action]").on("click", function(){
            if ( $(this).data("action")=="clear" ){
                sign.clear();
            }
            else if ( $(this).data("action")=="save" ){
                if (sign.isEmpty()) {
                    alert("사인해 주세요!!");
                } else {
                    $.ajax({
                        url : "save.jsp",
                        method : "post",
                        dataType : "json",
                        data : {
                            sign : sign.toDataURL()
                        },
                        success : function(r){
                            alert("저장완료 : " + r.filename);
                            sign.clear();
                        },
                        error : function(res){
                            console.log(res);
                        }
                    });
                }
            }
        });
        
        
        function resizeCanvas(){
            var canvas = $("#signature-pad canvas")[0];
    
            var ratio =  Math.max(window.devicePixelRatio || 1, 1);
            canvas.width = canvas.offsetWidth * ratio;
            canvas.height = canvas.offsetHeight * ratio;
            canvas.getContext("2d").scale(ratio, ratio);
        }
        
        $(window).on("resize", function(){
            resizeCanvas();
        });

        resizeCanvas();
    </script>
</body>
</html>


save.jsp


잠깐 테스트로 예제를 작성하는것이기 때문에 Controller 없이 그냥 jsp 로 맨들어 보았다.

<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>

<%@page import="org.apache.commons.codec.binary.Base64"%>
<%@page import="org.apache.commons.io.FileUtils"%>
<%@page import="org.apache.commons.lang3.StringUtils"%>

<%@page import="java.io.File"%>

<%
    String sign = StringUtils.split(request.getParameter("sign"), ",")[1];

    String fileName = "sign"+System.currentTimeMillis()+".png";

    FileUtils.writeByteArrayToFile(new File("d:\\"+fileName), Base64.decodeBase64(sign));
%>

{
    "filename" : "<%= fileName %>"
}



예제 프로젝트 다운로드


JavascriptSignature.zip