生成带签名图片的合同 (合同文件中加上客户签名图片,需要在签名位置加上书签)

生成带签名图片的合同 (合同文件中加上客户签名图片,需要在签名位置加上书签)

接上篇
aspose word转换pdf文件后将pdf文件转换为图片png
https://www.cnblogs.com/oktokeep/p/18401717

aspose word指定位置插入图片,借助word模板文件中的书签来定位 及Java 获取网络图片
https://www.cnblogs.com/oktokeep/p/18401692

 

1.模板文件中
本人(我单位)姓名:{realname},身份证号:{idNo} 省略文本
内容省略
被保险人签字: 加入了书签:bookmarkName = sign
日期:{year}年{month}月{day}日

插入书签

2.pdf工具类

package com.example.core.mydemo.aspose;

import org.apache.pdfbox.io.MemoryUsageSetting;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;

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

public class PdfToImage {
    public static void main(String[] args) {
        String path = "D:\\pdf\\40255371604299_1_sign.pdf";
        String path2 = "D:\\pdf";
        pdfFileToImages(path,path2);

    }

    public static void pdfFileToImages(String filePath, String cachePath) {
        PDDocument pd = null;
        try {
            pd = PDDocument.load(new File(filePath), MemoryUsageSetting.setupTempFileOnly());
            PDFRenderer pdfRenderer = new PDFRenderer(pd);
            /* dpi越大转换后越清晰,相对转换速度越慢 */
            int pages = pd.getNumberOfPages();
            System.out.println("pdf总共多少页-----" + pages);
            for (int page = 0; page < pages; ++page) {
//                BufferedImage image = pdfRenderer.renderImageWithDPI(page, 96, ImageType.RGB);
//                BufferedImage image = pdfRenderer.renderImageWithDPI(page, 100);
                BufferedImage image = pdfRenderer.renderImageWithDPI(page, 150, ImageType.RGB);
                //将图片数据保存为PNG格式文档
                File file= new File(cachePath + File.separator + ("new"+page) + ".png");
                ImageIO.write(image, "png", file);
                System.out.println(file.getAbsolutePath());
                System.out.println("PDF文档转PNG图片成功!");
            }
        }  catch (Exception e) {
            e.printStackTrace();
        }finally {
            if(pd != null){
                try {
                    pd.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}

3.word工具类

package com.example.core.mydemo.aspose.contract;

import com.alibaba.fastjson.JSON;
import com.aspose.words.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.InputStream;
import java.util.Map;
import java.util.Objects;
import java.util.regex.Pattern;

public class WordUtil {

    public static final String PARAM_MATCH = "\\{[a-zA-Z]+\\}";

    private static final Logger logger = LoggerFactory.getLogger(WordUtil.class);

    /**
     * 替换 ${param}
     * //@param paramMap
     * //@param doc
     */
    public static void replaceText(Map<String,String> paramMap,Document doc) throws Exception {

        FindReplaceOptions opt = new FindReplaceOptions();
        for (Map.Entry<String, String> entry : paramMap.entrySet()) {
            String key = String.format("{%s}", entry.getKey());
            String value = Objects.isNull(entry.getValue()) ? "" : entry.getValue();
            doc.getRange().replace(key,value,opt);
        }

        int replace = doc.getRange().replace(Pattern.compile(PARAM_MATCH), "", opt);
        if(replace>0){
            //大于0 证明有未知的参数,发送邮件
            logger.error("有未知的参数:{}",JSON.toJSONString(paramMap));
//            EmailUtils.sendMail(ApolloConstant.EMAIL_DEVELOP,null,"生成合同异常-有未知参数", JSON.toJSONString(paramMap));
        }

    }

    public static void replaceBookMark(String bookmarkName,String newBookValue,Document doc) throws Exception {

        BookmarkCollection bookmarks = doc.getRange().getBookmarks();
        for (Bookmark bookmark : bookmarks) {
            if(Objects.equals(bookmark.getName(),bookmarkName)){
                bookmark.setText(newBookValue);
                return;
            }
        }
    }

    public static void replaceBookMarkImage(String bookmarkName, InputStream inputStream, Document doc) throws Exception {

        DocumentBuilder db=new DocumentBuilder(doc);
        db.moveToBookmark(bookmarkName);
//        db.insertImage(inputStream,119.4,64);
        db.insertImage(inputStream,60,32);
    }
}

4.测试类

package com.example.core.mydemo.aspose.contract;

import com.aspose.words.Document;
import com.aspose.words.SaveFormat;
import com.example.core.mydemo.aspose.PdfToImage;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

public class PDFTest {
    public static final String PDF = ".pdf";

    public static void main(String[] args) {
        try{
            //1.配置操作 更新参数
            String templatePath = "E:\\contract\\templateContrat.docx";
            String outputPath = "E:\\contract";
            Document document=new Document(new FileInputStream(templatePath));
            Map paramsMap = new HashMap();
            paramsMap.put("realname","刘德华");
            paramsMap.put("idNo","430221198602178899");
            //加上日期时间字段
            paramsMap.put("year","2025");
            paramsMap.put("month","10");
            paramsMap.put("day","14");

            WordUtil.replaceText(paramsMap,document);

            /**
             * 2.网络地址图片,本地图片不可以。
             * 替换签名的图片地址
             */
            String signUrlAddr = "https://at-images.oss-cn-hangzhou.aliyuncs.com/hrocloud/cgh/app/1723623119131_940.png";
            //new一个URL对象
             URL url = new URL(signUrlAddr);
             //打开链接
             HttpURLConnection conn = (HttpURLConnection)url.openConnection();
             //设置请求方式为"GET"
             conn.setRequestMethod("GET");
             //超时响应时间为5秒
             conn.setConnectTimeout(5 * 1000);
             //通过输入流获取图片数据
             InputStream fis = conn.getInputStream();

             WordUtil.replaceBookMarkImage("sign",fis,document);

            String name="aaabbb";
            //指定临时文件的目录
            File tempFile = File.createTempFile(name, PDF,new File(outputPath));

            System.out.println("文件=" + tempFile.getName());
            document.save(new FileOutputStream(tempFile), SaveFormat.PDF);
            System.out.println("finish" + tempFile.getAbsolutePath() + "-" + tempFile.getCanonicalPath());

            /**
             * 3.pdf转图片
             */
            String path = tempFile.getCanonicalPath();
            String path2 = outputPath;
            PdfToImage.pdfFileToImages(path,path2);

            System.out.println("生成pdf图片完成");

        }catch (Exception e){
            e.printStackTrace();
        }
    }
}

5.生成带签名图片的合同的效果样式图片

new0

 

posted on 2025-10-14 16:21  oktokeep  阅读(9)  评论(0)    收藏  举报