Java中使用ItextPdf工具根据PDF合同模板填充pdf
Java中使用itextPdf工具根据PDF合同模板填充内容
- 设置PDF合同模板的文本域
- 导入itextPdf的pom依赖
- 编写生成填充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相关推荐
- Acrobat与Itextpdf的搭配使用-根据模板填充PDF
[一.准备工具] 1.首先安装好acrobat pro,这里提供一个绿色版的 Acrobat Pro 2020绿色版https://pan.baidu.com/s/1zftc5qH0cKd98yio9 ...
- Java动态处理PDF合同模板并下载
前期准备步骤: 1.准备一份Word版的电子合同模板 2.通过wps输出为PDF 3.安装Adobe Acrobat DC 4.通过Adobe Acrobat DC打开PDF版电子合同并选择" ...
- 《Java并发编程的艺术》——Java中的并发工具类、线程池、Execute框架(笔记)
文章目录 八.Java中的并发工具类 8.1 等待多线程完成的CountDownLatch 8.2 同步屏障CyclicBarrier 8.2.1 CyclicBarrier简介 8.2.2 Cycl ...
- 《Java并发编程的艺术》读后笔记-Java中的并发工具类(第八章)
文章目录 <Java并发编程的艺术>读后笔记-Java中的并发工具类(第八章) 1.等待多线程完成的CountDownLatch 2.同步屏障CyclicBarrier 2.1 Cycli ...
- java ftp ftpclient_详解JAVA中使用FTPClient工具类上传下载
详解JAVA中使用FTPClient工具类上传下载 在Java程序中,经常需要和FTP打交道,比如向FTP服务器上传文件.下载文件.本文简单介绍如何利用jakarta commons中的FTPClie ...
- java实现pdf的生成下载打印,java生成pdf电子账单,java生成pdf合同模板
最近公司要做个生成pdf电子账单凭证的功能,由于这个公司没有任何代码可借鉴,这个时候我就必须得自己搞明白具体的每一步应该怎么做,引什么jar包?用什么方式去实现?这篇博客中会给出从头到尾及其详细的代码 ...
- java实现保存合同模板_java实现pdf的生成下载打印,java生成pdf电子账单,java生成pdf合同模板...
最近公司要做个生成pdf电子账单凭证的功能,由于这个公司没有任何代码可借鉴,这个时候我就必须得自己搞明白具体的每一步应该怎么做,引什么jar包?用什么方式去实现?这篇博客中会给出从头到尾及其详细的代码 ...
- 一个做PDF合同模板的工具及用法
参考地址 https://wenku.baidu.com/view/3cee7b645527a5e9856a561252d380eb629423ac.htmlQ&A | 如何制作规范的电子合同 ...
- java中JShell脚本工具、常量优化、集成开发环境IDEA
JShell脚本工具: jshell:直接在DOS命令行(黑窗口)键入main方法中的代码就可以快速看到运行的结果,无需编译再运行,并且省略了入口方法及定义类的过程,其使用方法: 1.打开黑窗口后键入 ...
最新文章
- RPC创建API 模块
- [html] 说说video标签中预加载视频用到的属性是什么?
- Leetcode--1019. 链表中的下一个更大节点(java)
- csdn的blog后台程序的导航菜单的实现
- 微软在动态语言支持上超越了Java?
- JavaScript实现图片旋转构成3D圆环代码
- mysql还原详解_MySQL 备份与还原详解
- Hadoop组件启动的三种方式及配置SSH无密码登入
- 【数据结构】树状数组效果讲解
- Thinkphp聚合支付整合第三方和四方支付系统带代理功能
- pandas(综合测试)
- 链接h5代码_H5是什么?今天给大家做一个全面的解释
- PS怎么调整字体的行间距
- 算法面试准备建议|面试官角度
- css3炫酷环形背景动画
- **xxchat系统之线程池实时监控方案(Jmx远程后台监控、暂停、启用)
- python广义极值_广义极值(GEV)极大似然拟合的奇异pdf
- 两个有序链表合并成一个有序的单链表
- 聚焦场景 共建生态 加速AI落地——2018中国人工智能应用与生态峰会成功举办
- android extra_shortcut_icon,Android自动创建shortcut