前期准备步骤:

1、准备一份Word版的电子合同模板

2、通过wps输出为PDF

3、安装Adobe Acrobat DC

4、通过Adobe Acrobat DC打开PDF版电子合同并选择“准备表单”

5、设置域,这个域就是PDF模板供Java程序动态改值的地方(注意:域命名最好统一风格,字体、字体大小最好也保持统一。另外,多选框在未勾选的情况,通过程序赋值勾选会有问题(不能打勾),这个问题的解决办法是,先在这一步全部默认勾选上,在程序处理PDF时,将不需要打勾的多选框设置为“OFF”)

6、Ctrl+S 保存,此时PDF合同模板建好了

开始写程序:我这里采用spring boot做。

1、创建一个spring boot项目(具体步骤省略)

2、准备jar包依赖(PDF相关主要依赖)

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.2</version>
</dependency>
<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.13</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.itextpdf/itext7-core -->
<dependency><groupId>com.itextpdf</groupId><artifactId>itext7-core</artifactId><version>7.1.15</version><type>pom</type>
</dependency>
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version><scope>provided</scope>
</dependency>

3、创建 PDF数据类(对应PDF模板上的域名称)

@Data
@Builder
public class PdfData {private String text1;private String text2;private String text3;private String text4;private String text5;private String text6;private String text7;private String text8;private String text9;private String text10;private String text11;private String text12;private String text13;private String text14;private String text15;private String text16;private String text17;private String cb1;
}

4、创建PDF工具类

public class PDFUtil {/*** 简单文本填充** @param is 原始文件字节流形(可以从网络获取模板)* @param src 原始文件文件路径形式(可以读本地模板)* @param out 输出文件路径(可以写本地磁盘)* @param map 填充数据*/public static byte[] fileProcess(InputStream is, String src, String out, Map<String, Object> map) {try(ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {//获取文档PdfReader pdfReader;if (is == null) {pdfReader = new PdfReader(new File(src));} else {pdfReader = new PdfReader(is);}// 创建pdf对象PdfDocument pdfDoc = new PdfDocument(pdfReader, new PdfWriter(outputStream));// 转换为表单PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, false);// 属性填充map.forEach((k,v) -> form.getField(k).setValue(String.valueOf(v)));// 锁定字段form.flattenFields();// pdf文件处理完成pdfDoc.close();byte[] fileBytes = outputStream.toByteArray();if (StringUtils.isNotBlank(out)) {// 写本地磁盘FileOutputStream fos = new FileOutputStream(out);fos.write(fileBytes);fos.flush();outputStream.close();fos.close();}return fileBytes;} catch (Exception e) {e.printStackTrace();}}
}

5、创建网络请求工具类

public class HttpClientUtil {/*** @description: 远程获取文件并对文件进行处理后返回* @param: [fileLink 远程文件链接, outFileUrl 写本地磁盘目录, map 需要对文件进行操作的数据, fileSuffix 文件后缀]**/public static byte[] getHttpsFile(String fileLink, String outFileUrl, Map<String, Object> map, String fileSuffix){HttpURLConnection con = null;InputStream is = null;byte[] bt = null;try{URL url = new URL(fileLink);con = (HttpURLConnection)url.openConnection();con.setRequestMethod("GET");// 设置连接主机服务器的超时时间:15000毫秒con.setConnectTimeout(15000);// 设置读取远程返回的数据时间:60000毫秒con.setReadTimeout(60000);// 发送请求con.connect();// 通过con连接,获取输入流if (con.getResponseCode() == 200) {is = con.getInputStream();if (".pdf".equals(fileSuffix)) {// 获取pdf文件模版并进行pdf处理bt = PDFUtil.fileProcess(is, null, outFileUrl, map);}}} catch (Exception e) {e.printStackTrace();} finally {// 关闭资源assert is != null;try {is.close();} catch (IOException e) {e.printStackTrace();}con.disconnect(); // 关闭远程连接}return bt;}
}

6、创建文件下载类

public class FileDownload {/*** @description: 下载PDF文件(通过请求网络拿模版文件)* @param: [response, fileName, map PDF模版中对应的数据, url https链接或者本地目录地址, isHttp 是否需要网络请求]* @return: void**/public static void pdfDownload(final HttpServletResponse response, String fileName, Map<String, Object> map, String url, Boolean isHttp) throws Exception {// 不写本地磁盘byte[] data;// 通过网络请求获取pdf模板if (isHttp) {data = HttpClientUtil.getHttpsFile(url, null, map, ".pdf");} // 通过本地目录地址获取pdf模板else {data = PDFUtil.fileProcess(null, url, null, map);}download(response, fileName, data);}public static void download(final HttpServletResponse response, String fileName, byte[] data)  throws Exception {response.reset();response.setCharacterEncoding("UTF-8");// Content-Disposition的作用:告知浏览器以何种方式显示响应返回的文件,用浏览器打开还是以附件的形式下载到本地保存// 纯下载response.setHeader("Content-Disposition", "attachment; filename=" + URLEncoder.encode(fileName, "UTF-8"));// 在线打开
//      response.setHeader("Content-Disposition", "inline; filename=" + URLEncoder.encode(fileName, "UTF-8"));response.addHeader("Content-Length", "" + data.length);response.setContentType("application/octet-stream;charset=UTF-8");OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());outputStream.write(data);outputStream.flush();outputStream.close();response.flushBuffer();}}

7、创建controller类

@RestController
public class ContractController {@GetMapping("/download/trial/contract")public void downloadApplyTrialContract(HttpServletResponse response) {// 我这里写死了数据,可以改成从数据库获取数据PdfData data = PdfData.builder()// 甲方.text1("yy公司")// 甲方地址.text2("yy地址")// 甲方联系人.text3("yy")// 甲方联系方式.text4("13yyyyy")// 购买系统套数.text6("1")// 合同单价.text7("2888")// 合同优惠价.text8("0")// 使用年限.text9("1")// 金额.text10("2888")// 备注.text11("")// 合同总金额.text12("2888")// 甲方盖章.text13("yyy")// 甲方代表签字.text14("yyy")// 甲方签字日期.text15("yyyy.MM.dd")// 乙方签字日期.text16("yyyy.MM.dd")// 意向签约书编号.text17("")// 多选框1 不勾选 设置为off// .cb1("off").build();Map<String, Object> map = BeanUtil.beanToMap(data);try {// 模板放在了远程服务器上String fileLink = "https://xxx.com/xxx/xxx_trial_contract.pdf";FileDownload.pdfDownload(response, "xxx软件许可意向签约书.pdf", map, fileLink, true);} catch (Exception e) {e.printStackTrace();}}
}

至此,Java动态处理PDF合同模板并下载的流程完成了。本文章除了适合PDF合同外,还适合发票、小票、保单、告知书、证明等PDF类模板。

Java动态处理PDF合同模板并下载相关推荐

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

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

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

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

  3. Java中使用ItextPdf工具根据PDF合同模板填充pdf

    Java中使用itextPdf工具根据PDF合同模板填充内容 设置PDF合同模板的文本域 导入itextPdf的pom依赖 编写生成填充pdf代码 1:设置PDF合同模板的文本域 ​ 设置PDF文本域 ...

  4. java实现保存合同模板_Java中常用到的文件操作那些事(一)——替换doc文档模板,生成真实合同案例...

    工作中,我们时常会遇到一些操作文件的操作,比如在线生成合同模板,上传/下载/解析Excel,doc文档转为pdf等操作.本文就已工作中遇到的在线生成合同为例,简要地介绍一种文档替换写法. 本文目的:给 ...

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

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

  6. Java实现PDF合同生成

    由于在工作中遇到了合同套打的需求,于是在之前 pdfBox获取关键字坐标 的基础上实现了,根据 pdf 模版来套打合同. PDF合同表单生成 首先,需要确定合同是否可以套打,如果合同格式固定,需要添加 ...

  7. java生成打印合同模板,生成合同模板时,html转pdf

    html转pdf 添加itext依赖: com.itextpdf itextpdf 5.5.11 添加依赖: com.itextpdf.tool xmlworker 5.5.11 先创建html,然后 ...

  8. java生成pdf(word模板转html,html再转pdf)

    场景描述: 公司需要做一个打印功能,采用生成PDF的形式.由于PDF需要动态生成某些行,不能采用制作PDF表单的形式,word文档直接转PDF的形式会导致排版不美观.由于需要部署在linux服务器,采 ...

  9. pdf合同模板创建与生成

    https://blog.csdn.net/w20228396/article/details/68065552

最新文章

  1. 参数化模型(parametric model)和非参数化模型non-parametric model)的区别?哪些模型是参数化模型,哪些模型是非参数化模型?
  2. vim插件自动补齐_Vim7.3.3使用Autocomplpop自动补全插件报错解决办法
  3. 用requests获取网页源代码 python-手把手教你利用爬虫爬网页(Python代码)
  4. 18000 6c java_面向ISO18000-6C协议的无源超高频射频识别标签芯片设计
  5. php对中英文字符串进行截取,利用php怎么对中英文混合的字符串进行截取
  6. OpenGL, GLSL, DirectX, HLSL中的矩阵存储形式
  7. oc基础-OC中对象方法的使用
  8. Objective-C的hook方案(一): Method Swizzling
  9. SpringBoot之idea快捷键
  10. 旁边一位员工天天跟别人聊天,主管都不敢管,那你当什么主管
  11. 【推荐架构day4】微博推荐引擎的基本算法:核心细节
  12. 论文复现_芯片定位和引脚缺陷检测
  13. matlab批量修改指定像素
  14. 名义利率、实际利率、名义贴现率
  15. 算法血拼:Google+百度+Alibaba+字节+Tencent+网易+360+拼夕夕
  16. 腾讯地图定位 代码
  17. python这个语言值得学吗_python和java哪个更值得学
  18. 如何安装Python的PIL库
  19. Linux内核的5个子系统
  20. 给飞机叶片穿戴上3D打印传感器

热门文章

  1. opencv 入门笔记十 图片序列保存为视频
  2. 医用计算机app,大型医用设备题库
  3. LimitState.RING.v3.2.a.20141.Win32_64 2CD
  4. linux rm - rf之后怎么恢复
  5. 如何清理卸下应用的残余文件_怎么清理CorelDRAW卸载残余文件
  6. 乐视在美国为新项目众筹,成功后将生产混合动力滑板车
  7. 华为交换机创建Vlan,批量加入对应端口号
  8. 错误提示「URL file-access is disabled in the server configuration」解决方案
  9. 判断一组不等式是否满足约束并输出最大差
  10. java 数字全排列_Java实现n位数字的全排列