Java中使用itextPdf工具根据PDF合同模板填充内容

  1. 设置PDF合同模板的文本域
  2. 导入itextPdf的pom依赖
  3. 编写生成填充pdf代码

1:设置PDF合同模板的文本域

​ 设置PDF文本域我们需要通过Adobe Acrobat DC 工具来设置 废话不多说上连接

​ 链接:https://pan.baidu.com/s/1lkDlnhhPvs3MMAD6DS9UOA
​ 提取码:6kt8

​ 文本域名自己设置好,后续传值是根据文本域传的

注意:这一步操作是有复选框打勾的设置,同样也需要设置文本域的名字,如何按照下图的操作,样式选择勾形,导出值默认On

下面开始敲代码

2: 导入itextPdf的pom依赖

​ 进入pom.xml文件里面导入下面依赖

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

3:编写生成填充pdf代码

我这边是直接创建了一个PdfUtils工具类,附代码


import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.junit.Test;
import pojo.user;
import java.io.*;
import java.util.*;
public class PdfUtils {/*** @param map 需要填充的字段* @param sourceFile  原文件路径* @param targetFile  目标文件路径* @param imgURLMap    填充图片路径* @throws IOException*/public static void genPdf(Map<String, String> map, String sourceFile, String targetFile) throws IOException {File templateFile = new File(sourceFile);fillParam(map, FileUtils.readFileToByteArray(templateFile), targetFile);}/***使用map中的参数填充pdf,map中的key和pdf表单中的field对应* @param fieldValueMap* @param file* @param contractFileName* @param imgURLMap //这边暂时吧图片给注释了,如需填充图片直接加参数即可*/public static  void fillParam(Map<String, String> fieldValueMap,byte[] file, String contractFileName) {//输出流FileOutputStream fos = null;try {fos = new FileOutputStream(contractFileName);//获取PdfReader对象,获取模板位置PdfReader reader = null;/* 将要生成的目标PDF文件名称 */PdfStamper stamper = null;BaseFont base = null;//取出模板中的所有字段AcroFields acroFields = null;// 获取存在resources目录下的pdf模板位置 URL//URL file = PdfUtils.class.getClassLoader().getResource("CONTRACT.pdf");try {reader = new PdfReader(file);stamper = new PdfStamper(reader, fos);stamper.setFormFlattening(true);//简体中文字体base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);acroFields = stamper.getAcroFields();//如果图片放在resources目录下需要这么写// String imgUrl = new ClassPathResource("static/IMG_5809.JPG").getURL().getPath();//循环添加公章图片//for(String key : imgURLMap.keySet()) {//    String value = imgURLMap.get(key).toString();//    //获取图片域名//    AcroFields.FieldPosition position = acroFields.getFieldPositions(key).get(0);//    //通过域名获取所在页和坐标,左下角为起点//    int pageNo  = position.page;//    Rectangle signRect = position.position;//    float x = signRect.getLeft();//    float y = signRect.getBottom();//    //读图片//    Image image = Image.getInstance(value);//    //获取操作页面//    PdfContentByte under = stamper.getOverContent(pageNo);//    //根据域的大小缩放图片//    image.scaleToFit(signRect.getWidth(),signRect.getHeight());//    //添加图片//    image.setAbsolutePosition(x,y);//    under.addImage(image);//    System.out.println("--"+key+"---"+value);//}for (String key : acroFields.getFields().keySet()) {acroFields.setFieldProperty(key, "textfont", base, null);//字体大小acroFields.setFieldProperty(key, "textsize", new Float(12), null);}if (fieldValueMap != null) {for (String fieldName : fieldValueMap.keySet()) {if (StringUtils.isNotBlank(fieldValueMap.get(fieldName))) {//获取map中key对应的Value是否为On,若是则勾选复选框if (fieldValueMap.get(fieldName).equals("On") || fieldValueMap.get(fieldName) == "On") {acroFields.setField(fieldName, fieldValueMap.get(fieldName),"true");}else{acroFields.setField(fieldName, fieldValueMap.get(fieldName));}}}}} catch (Exception e) {e.printStackTrace();} finally {if (stamper != null) {try {stamper.close();} catch (Exception e) {e.printStackTrace();}}if (reader != null) {reader.close();}}} catch (Exception e) {System.out.println("填充参数异常");e.printStackTrace();} finally {IOUtils.closeQuietly(fos);}}
}
//测试方法
@Test
public  void test() throws IOException {//Map中Key对应PDF表单中的之前你设置的文本域名,Value则是你想填充的值Map<String, String> data = new LinkedHashMap();user user = new user();//      文本域------填充的内容data.put("year",user.getYear());data.put("area", user.getArea());data.put("partyBname",user.getPartyBname());data.put("partyBnum",user.getPartyBnum());data.put("partyB2",user.getPartyB2());data.put("partyC2",user.getPartyC2());//这个是复选框部分,我的复选框传过来的值的id所以这边就直接判断。if(user.getJykt() == "106"){data.put("jyrsq","On");//设置为On表示打勾}//文件模板位置String templatePdfPath = "E:/contract/test.pdf";//填充后的模板位置String destPdfPath = "E:/pdf/test.pdf";//注这个文件是没有设置文本域的//储存图片Map imgURlMap = new LinkedHashMap();//需要图片直接加入参数即可//             公章文本域----------公章图片地址imgURlMap.put("partyAcachet","E:/contract/yz2.jpg");imgURlMap.put("partyBcachet","E:/contract/yz2.jpg");imgURlMap.put("partyCcachet","E:/contract/yz2.jpg");genPdf(data,templatePdfPath,destPdfPath);
}
觉得有用记得点个赞,第一次编写,后续还会有更多。

Java中使用ItextPdf工具根据PDF合同模板填充pdf相关推荐

  1. Acrobat与Itextpdf的搭配使用-根据模板填充PDF

    [一.准备工具] 1.首先安装好acrobat pro,这里提供一个绿色版的 Acrobat Pro 2020绿色版https://pan.baidu.com/s/1zftc5qH0cKd98yio9 ...

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

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

  3. 《Java并发编程的艺术》——Java中的并发工具类、线程池、Execute框架(笔记)

    文章目录 八.Java中的并发工具类 8.1 等待多线程完成的CountDownLatch 8.2 同步屏障CyclicBarrier 8.2.1 CyclicBarrier简介 8.2.2 Cycl ...

  4. 《Java并发编程的艺术》读后笔记-Java中的并发工具类(第八章)

    文章目录 <Java并发编程的艺术>读后笔记-Java中的并发工具类(第八章) 1.等待多线程完成的CountDownLatch 2.同步屏障CyclicBarrier 2.1 Cycli ...

  5. java ftp ftpclient_详解JAVA中使用FTPClient工具类上传下载

    详解JAVA中使用FTPClient工具类上传下载 在Java程序中,经常需要和FTP打交道,比如向FTP服务器上传文件.下载文件.本文简单介绍如何利用jakarta commons中的FTPClie ...

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

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

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

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

  8. 一个做PDF合同模板的工具及用法

    参考地址 https://wenku.baidu.com/view/3cee7b645527a5e9856a561252d380eb629423ac.htmlQ&A | 如何制作规范的电子合同 ...

  9. java中JShell脚本工具、常量优化、集成开发环境IDEA

    JShell脚本工具: jshell:直接在DOS命令行(黑窗口)键入main方法中的代码就可以快速看到运行的结果,无需编译再运行,并且省略了入口方法及定义类的过程,其使用方法: 1.打开黑窗口后键入 ...

最新文章

  1. RPC创建API 模块
  2. [html] 说说video标签中预加载视频用到的属性是什么?
  3. Leetcode--1019. 链表中的下一个更大节点(java)
  4. csdn的blog后台程序的导航菜单的实现
  5. 微软在动态语言支持上超越了Java?
  6. JavaScript实现图片旋转构成3D圆环代码
  7. mysql还原详解_MySQL 备份与还原详解
  8. Hadoop组件启动的三种方式及配置SSH无密码登入
  9. 【数据结构】树状数组效果讲解
  10. Thinkphp聚合支付整合第三方和四方支付系统带代理功能
  11. pandas(综合测试)
  12. 链接h5代码_H5是什么?今天给大家做一个全面的解释
  13. PS怎么调整字体的行间距
  14. 算法面试准备建议|面试官角度
  15. css3炫酷环形背景动画
  16. **xxchat系统之线程池实时监控方案(Jmx远程后台监控、暂停、启用)
  17. python广义极值_广义极值(GEV)极大似然拟合的奇异pdf
  18. 两个有序链表合并成一个有序的单链表
  19. 聚焦场景 共建生态 加速AI落地——2018中国人工智能应用与生态峰会成功举办
  20. android extra_shortcut_icon,Android自动创建shortcut

热门文章

  1. Ubuntu20.04安装配置tensorflow2深度学习环境
  2. 使用校园网,下载知网资料
  3. 小技巧 | 关于问卷星如何粘贴复制
  4. 搜云科技联合金色财经、荣宝斋 举办笔墨丹青2021艺术鉴赏会
  5. 环境部署(物理手工部署):
  6. 电到底是怎么工作的?
  7. 针对WiFi图标消失问题解决方法
  8. 成都c++语言青少年培训,成都小孩学信息学奥赛的好处-成都童程童美少儿编程培训金沙校区...
  9. 今年做什么副业好?2021年做什么副业挣钱?2021年适合做的副业
  10. [总结]高效能人士的七个习惯