前端回传电子签名图片 合成word java

在日常的业务中,我们经常会遇到需要将用户的电子签名图片回传到后端,并将其合成到 Word 文档中的需求。本文将介绍如何使用 Java 合成 Word 文档,并将前端回传的电子签名图片插入到合适的位置。

电子签名图片回传

首先,我们需要在前端实现电子签名的功能。一种常用的实现方式是使用 HTML5 的 Canvas 元素,结合 JavaScript 实现电子签名的绘制和保存。以下是一个简单的示例代码:

<!DOCTYPE html>
<html>
<head>
    <title>电子签名</title>
    <style>
        #signatureCanvas {
            border: 1px solid #000;
        }
    </style>
</head>
<body>
    <canvas id="signatureCanvas" width="400" height="200"></canvas>
    <button onclick="saveSignature()">保存签名</button>
    <script>
        const canvas = document.getElementById('signatureCanvas');
        const ctx = canvas.getContext('2d');
        let isDrawing = false;
        
        canvas.addEventListener('mousedown', (e) => {
            isDrawing = true;
            ctx.moveTo(e.clientX, e.clientY);
        });
        
        canvas.addEventListener('mousemove', (e) => {
            if (isDrawing) {
                ctx.lineTo(e.clientX, e.clientY);
                ctx.stroke();
            }
        });
        
        canvas.addEventListener('mouseup', () => {
            isDrawing = false;
        });
        
        function saveSignature() {
            const imageData = canvas.toDataURL();  // 将 canvas 中的图像数据转换为 base64 编码的字符串
            // 将 imageData 发送到后端保存
        }
    </script>
</body>
</html>

上述代码中,我们创建了一个 Canvas 元素来实现电子签名的绘制,通过监听鼠标事件来获取绘制路径,最后通过 toDataURL 将绘制好的图像转换为 base64 编码的字符串,并发送到后端保存。

合成 Word 文档

在后端使用 Java 合成 Word 文档,我们可以使用 Apache POI 这个开源库来实现。以下是一个示例代码:

import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.*;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.FileOutputStream;
import java.io.IOException;

public class WordSignatureGenerator {

    public static void main(String[] args) {
        try {
            // 创建一个空白的 Word 文档
            XWPFDocument document = new XWPFDocument();
            // 创建一个段落
            XWPFParagraph paragraph = document.createParagraph();
            // 创建一个文本 run
            XWPFRun run = paragraph.createRun();
            // 设置文本内容
            run.setText("电子签名:");
            
            // 读取电子签名图片
            BufferedImage signatureImage = ImageIO.read(WordSignatureGenerator.class.getResourceAsStream("/path/to/signature.png"));
            // 将图片插入到 Word 文档中
            int format = Document.PICTURE_TYPE_PNG;
            byte[] picture = toByteArray(signatureImage, format);
            document.addPictureData(picture, format);
            int width = signatureImage.getWidth();
            int height = signatureImage.getHeight();
            document.createPicture(document.getAllPictures().size() - 1, width, height, paragraph);
            
            // 保存 Word 文档
            FileOutputStream out = new FileOutputStream("output.docx");
            document.write(out);
            out.close();
            document.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    private static byte[] toByteArray(BufferedImage image, int format) throws IOException {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        ImageIO.write(image, format == Document.PICTURE_TYPE_PNG ? "png" : "jpg", baos);
        return baos.toByteArray();
    }
}

在上述代码中,我们使用 Apache POI 创建了一个空白的 Word 文档,并插入了一个段落和一个文本 run。然后,通过 ImageIO.read 方法读取电子签名图片,将其插入到 Word 文档中,并设置图片的宽度和高度,最后保存 Word 文档。

总结

通过以上的代码示例,我们了解到了如何在前端实现电子签名的绘制和保存,并将签名图片回传到后端。同时,我们还学习了如何使用 Java 和 Apache POI 来合成 Word 文档,并将签名图片插入到合适的位置。