java 制作签名版电子合同pdf版本

本文介绍了如何使用Java的iText库和Freemarker模板引擎,将HTML合同模板结合数据渲染成PDF,并在指定位置插入Base64格式的电子签名,实现电子合同的生成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、需求描述
实现合同模板自动生成合同,再添加电子签名。如图:
在这里插入图片描述
在这里插入图片描述
二、实现步骤
使用java开源itext库对pdf进行操作,主要分为:
1 html模板+model数据,通过freemarker进行渲染,生成pdf1。
2 查找指定电子签名的位置,然后再在指定位置插入签名图片,生成最终pdf。
备注:模板使用的是html形式,电子签名格式使用的是Base64格式。

  1. 准备html合同模板
    合同模板,在公众中获取。
  2. 添加java后端依赖
    完整的依赖包,点击蓝字,在公众号中获取。
  3. html模板+model数据,生成pdf的工具类
    注:
    ① FONT是黑体,每个window电脑基本上都有,目录都是一样的。FONT需要使用fontResolver.addFont(FONT…添加进去,不然可能汉字一偏空白。
    ② freeMarkDir是合同模板放置的位置,根据自己情况修改。
    ③ 使用的编码最好是"UTF-8",换一套环境后可能乱码。
public class JavaToPdfHtmlFreeMarker {
   

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

    private static final String FONT = "C:\\Windows\\Fonts\\simhei.ttf";
    private static final String freeMarkDir = "D:\\app\\contractTemplate\\";

    private static Configuration freemarkerCfg = null;

    static {
   
        freemarkerCfg =new Configuration();
        //freemarker的模板目录
        try {
   
            freemarkerCfg.setDirectoryForTemplateLoading(new File(freeMarkDir));
            freemarkerCfg.setEncoding(Locale.CHINA, "UTF-8");
        } catch (IOException e) {
   
            e.printStackTrace();
        }
    }

    public static void createPdf1(String content,String dest) throws IOException, DocumentException, com.lowagie.text.DocumentException {
   
        // String LOGO_PATH = "file:///C:/Users/86132/Desktop/";
        ITextRenderer render = new ITextRenderer();
        ITextFontResolver fontResolver = render.getFontResolver();
        fontResolver.addFont(FONT, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        // 解析html生成pdf
        render.setDocumentFromString(content);
        //解决图片相对路径的问题
        // render.getSharedContext().setBaseURL(LOGO_PATH);

        render.layout();
        render.createPDF(new FileOutputStream(dest));
    }
    
    /**
     * freemarker渲染html
     */
    public static String freeMarkerRender(Map<String, Object> data, String htmlTmp) {
   
        Writer out = new StringWriter();
        try {
   
            // 获取模板,并设置编码方式
            Template template = freemarkerCfg.getTemplate(htmlTmp,"UTF-8");
            template.setEncoding("UTF-8");
//            logger.info("template info --->" + template);
            // 合并数据模型与模板
            template.process(data, out); //将合并后的数据和模板写入到流中,这里使用的字符流
//            logger.info("template info --->" + template);
//            logger.info("out info --->" + out);
            out.flush();
            return out.toString();
        } catch (Exception e) {
   
            e.printStackTrace();
        } finally {
   
            try {
   
                out.close();
            } catch (IOException ex) {
   
                ex.printStackTrace();
            }
        }
        return null;
    }
}
  1. 调用工具类生成pdf

// 模板名称
String HTML = "contract.html";
// 生成的pdf存放路径
String DEST = "D:\\app\\user_contract\\";
// 生成的pdf名称
String fileName = "合同D20210511SDNQB1.pdf"

public static void main(String[] args) throws IOException, DocumentException, InterruptedException {
   
    Map<String,Object> data = new HashMap();
    data.put("合同编号","D20210511SDNQB");
    data.put("甲方姓名","小哈");
    data.put<
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值