前言

现在有一些用户信息合同,要求在合同上添加合同编号,合同编号要求按照一定规则系统生成.看过很多同学的实现方案,也尝试过很多,为了方便以后有同样需求的同学可以节省时间,进行了相关内容的梳理.

实现过程以及原理说明

pdf内容处理可以使用开源项目itextpdf,本文仅适用免费部分.pdf格式文件中动态添加内容是基于表单域进行的.表单域可以这么理解,比如说下面是一份合同,其中有很多需要填写的地方,需要填写姓名、身份证、手机号等信息,每个需要填写的地方可以认为是一个表单域的一部分。

每个长方形的框称为域,每个域中都有一个域名称与之对应.

本文的需求就是将合同编号一栏设置为动态生成。
    关于pdf编辑问题,需要使用pdf编辑器,当时下载过很多的编辑器,但是都是需要进行付费,这里推荐使用Adobe,下载地址(附安装步骤):Adobe Acrobat 9.0

处理过程

  1. pdf表单域设置域名称

使用Adobe Acrobat打开合同文件,选择表单–添加或是编辑域

    选择合同编号所在域,设置合同编号对应的域名称,此处定义为contractNo.

    编辑好之后进行保存即可.

  1. 代码部分

需要导入的依赖:

     <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.11</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency>

为方便使用,直接封装了一个工具类PdfUtils.java

public class PdfUtils {/*** 根据PDF模版生成PDF文件* @param templateFilePath PDF模版文件路径* @param pdfFilePath pdf文件保存路径* @param contractNo 合同编号*/public static void buildPdf(String templateFilePath,String pdfFilePath,String contractNo) throws Exception {// 表单域数据填充HashMap<String,String> data = new HashMap<>();data.put("contractNo",contractNo);createPDF(templateFilePath,data,true,pdfFilePath);}/*** 根据PDF模版生成PDF文件* @param templateFilePath PDF模版文件路径* @param data 表单域数据* @param formFlattening false:生成后的PDF文件表单域仍然可编辑 true:生成后的PDF文件表单域不可编辑* @param pdfFilePath 生成PDF的文件路径*/private static void createPDF(String templateFilePath, HashMap<String,String> data,boolean formFlattening, String pdfFilePath) throws Exception{PdfReader reader = null;ByteArrayOutputStream bos = null;PdfStamper pdfStamper = null;FileOutputStream fos = null;try{// 读取PDF模版文件reader = new PdfReader(templateFilePath);// 输出流bos = new ByteArrayOutputStream();// 构建PDF对象pdfStamper = new PdfStamper(reader, bos);// 获取表单数据AcroFields form = pdfStamper.getAcroFields();// 使用中文字体 使用 AcroFields填充值的不需要在程序中设置字体,在模板文件中设置字体为中文字体 Adobe 宋体 std LBaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);form.addSubstitutionFont(bfChinese);// 表单赋值for(String key : data.keySet()){form.setField(key,data.get(key));// 也可以指定字体form.setFieldProperty(key, "textfont", bfChinese, null);}// 如果为false那么生成的PDF文件还能编辑,一定要设为truepdfStamper.setFormFlattening(formFlattening);pdfStamper.close();// 保存文件fos = new FileOutputStream(pdfFilePath);fos.write(bos.toByteArray());fos.flush();}finally {if(null != fos){try {fos.close(); }catch (Exception e){e.printStackTrace();}}if(null != bos){try {bos.close(); }catch (Exception e){e.printStackTrace();}}if(null != reader){try {reader.close(); }catch (Exception e){e.printStackTrace();}}}}
}

生成之后内容预览:

    系统生成的合同编号已添加,到此功能完成!
    如有帮助,欢迎评论区留言点赞!

java实现pdf电子合同设置合同编号相关推荐

  1. Java 给PDF文档设置背景颜色和背景图片

    如题,这篇文章主要介绍如何在Java应用程序中给PDF文档设置背景颜色和背景图片. 使用组件: Spire.PDF for Java 下载Spire.PDF for JAVA包并解压缩,然后从lib文 ...

  2. java对PDF电子盖章

    说明,将图片"zhang.png"写到"1231.pdf"的指定位置中,生成"result.pdf"文件 public static voi ...

  3. java实现pdf的生成下载打印,java生成pdf电子账单,java生成pdf合同模板

    最近公司要做个生成pdf电子账单凭证的功能,由于这个公司没有任何代码可借鉴,这个时候我就必须得自己搞明白具体的每一步应该怎么做,引什么jar包?用什么方式去实现?这篇博客中会给出从头到尾及其详细的代码 ...

  4. java实现保存合同模板_java实现pdf的生成下载打印,java生成pdf电子账单,java生成pdf合同模板...

    最近公司要做个生成pdf电子账单凭证的功能,由于这个公司没有任何代码可借鉴,这个时候我就必须得自己搞明白具体的每一步应该怎么做,引什么jar包?用什么方式去实现?这篇博客中会给出从头到尾及其详细的代码 ...

  5. Java动态处理PDF合同模板并下载

    前期准备步骤: 1.准备一份Word版的电子合同模板 2.通过wps输出为PDF 3.安装Adobe Acrobat DC 4.通过Adobe Acrobat DC打开PDF版电子合同并选择" ...

  6. 小程序 uniapp 实现pdf 电子合同签名 并导出功能

    小程序 uniapp 实现pdf 电子合同签名 并导出功能 需求流程: 用户只允许上传pdf 后端将上传后的pdf以base64图片的形式返回 用户设置签名的位置 位置设置完成,将电子签名放到设定的位 ...

  7. 如何用 Java 对 PDF 文件进行电子签章

    转自:如何用 Java 对 PDF 文件进行电子签章 - Ferocious - 博客园 一.概述 二.技术选型 三.生成一个图片签章 四.如何按模板生成PDF文件 五.如何生成PKSC12证书 六. ...

  8. java为PDF盖(签)电子签章--位置定位

    1.电子签章简介 电子签章,与我们所使用的数字证书一样,是用来做为身份验证的一种手段,泛指所有以电子形式存在,依附在电子文件并与其逻辑关联,可用以辨识电子文件签署者身份,保证文件的完整性,并表示签署者 ...

  9. 使用Java对PDF进行电子签章

    使用Java对PDF进行电子签章 开始之前 前期准备 开始 生成keystore证书 来张材料全家福 编码 项目结构 签署工具类 开始之前 公司近期做的项目用到了电子签章(给PDF盖章签名),这过程真 ...

最新文章

  1. 总结之:CentOS6.5 LAMP的基本原理以及分主机架构解析
  2. 为什么说项目管理是每个人必备的底层能力?
  3. jsp mysql登录 demo_java jsp+servlet+mysql实现登录网页设计
  4. mysql三高讲解(二):2.4 InnoDB数据表是如何存储的
  5. java读写文件操作
  6. ps怎么撤销参考线_入门板绘怎么练习?怎么提高板绘技巧?(干货)
  7. poj1068Parencodings
  8. Oracle12C用户创建、授权、登录
  9. 上传图片时,使用GDI+中重绘方式将CMYK图片转为RGB图片
  10. 园林计算机制图在计算机上的应用,园林计算机制图
  11. zktime 协议_中控考勤机对接信呼帮助(中控ZKTime5.0系统软件版)
  12. 三轴加速度传感器和六轴惯性传感器_六轴传感器和三轴传感器的区别
  13. 人,终究是要找到自己喜欢的...才行
  14. 现金流量表补充资料的编制公式
  15. 计算机使用hdmi需要设置方法,如何在计算机显示器上切换HDMI
  16. 如何禁止Windows自动更新AMD显卡驱动
  17. 解压缩SIS文件工具
  18. Burp的安装配置与启动
  19. 使用CM快速搭建CDH集群
  20. aliases节点解析

热门文章

  1. 如何将QRcode二维码的定位标做成圆形
  2. matlab logpolar,GitHub - luxinjin/polar-code: matlab simulation for polar code
  3. autojs ui界面漂亮模板2
  4. md文件如何编辑和转换(不依赖插件Markdown Viewer)
  5. 爬虫 使用python+requests模块爬取12306网站的车次信息
  6. C语言头插法尾插法创建单链表
  7. 京东、快手及其他小公司Android面试(2020)
  8. 示波器的使用以及基本原理
  9. DVD-Video 解谜 - VOB文件
  10. 关于飞思卡尔的芯片固件库问题,为什么5.3没有8位芯片固件选择MC9S08DZ60芯片