由于在工作中遇到了合同套打的需求,于是在之前 pdfBox获取关键字坐标 的基础上实现了,根据 pdf 模版来套打合同。

PDF合同表单生成

首先,需要确定合同是否可以套打,如果合同格式固定,需要添加数据内容一般不发生变化,则可以通过 生成表单域 来创建合同模板。

如何生成表单域

  1. 使用 pdf 工具打开 合同模板.pdf,此处使用的是 Adobe Acrobat,当然也可以使用其他pdf阅读器。
  2. 点击菜单 准备表单 ,然后如下图所示,会自动将下划线变为 文本域,如果没有也可以手动添加。
  3. 同时也会有其他如 单选按钮、复选框等表单控件。

生成模版

具体实现的代码如下所示:

工具方法

 /*** 填充pdf模板的表单域生成新的pdf文件** @param template* @param font* @param data* @param target* @param formFlattening* @return* @throws IOException* @throws DocumentException*/public static File generatePDF(String template, String font, JSONObject data, File target, boolean formFlattening)throws IOException, DocumentException {PdfReader reader = new PdfReader(template);ByteArrayOutputStream bos = new ByteArrayOutputStream();BaseFont bf = BaseFont.createFont(font, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);PdfStamper ps = new PdfStamper(reader, bos);AcroFields fields = ps.getAcroFields();ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();fontList.add(bf);fields.setSubstitutionFonts(fontList);for (String key : data.keySet()) {String value = data.getString(key);// 设置复选框以及单选框if (AcroFields.FIELD_TYPE_CHECKBOX == fields.getFieldType(key)|| AcroFields.FIELD_TYPE_RADIOBUTTON == fields.getFieldType(key)) {// 为单选框赋值,需要设置if("On".equals(value))fields.setField(key, value, true);elsefields.setField(key, value, false);} else {// 为字段赋值,注意字段名称是区分大小写的fields.setField(key, value);}}// 表单域是否能再次赋值ps.setFormFlattening(formFlattening);ps.close();reader.close();FileUtils.writeByteArrayToFile(target, bos.toByteArray());return target;}
// 为单选框赋值,需要设置
if("On".equals(value))fields.setField(key, value, true);
elsefields.setField(key, value, false);

此处设置在模板中 如下图所示:

水印实现

有些时候,需要为生成的pdf文件增加水印,具体的方法如下:

/*
* 水印生成
* @return
* @throws
* @author TomatoYan
*/
public void waterMark(PdfReader pdfReader, PdfStamper stamper, String waterMark) throws IOException, DocumentException {int interval = 50;BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);Rectangle pageRect = null;PdfGState gs = new PdfGState();//设置透明度gs.setFillOpacity(0.3f);gs.setStrokeOpacity(0.4f);int total = pdfReader.getNumberOfPages() + 1;JLabel label = new JLabel();FontMetrics metrics;int textH = 0;int textW = 0;label.setText(waterMark);metrics = label.getFontMetrics(label.getFont());textH = metrics.getHeight();textW = metrics.stringWidth(label.getText());PdfContentByte under;for (int i = 1; i < total; i++) {pageRect = pdfReader.getPageSizeWithRotation(i);under = stamper.getOverContent(i);under.saveState();under.setGState(gs);under.beginText();under.setFontAndSize(base, 20);//设置水印颜色under.setColorFill(BaseColor.BLACK);// 水印文字成45度角倾斜for (int height = interval + textH; height < pageRect.getHeight(); height = height + textH * 3) {for (int width = interval + textW; width < pageRect.getWidth() + textW; width = width + textW * 2) {under.showTextAligned(Element.ALIGN_LEFT, waterMark, width - textW, height - textH, 45);break;}break;}// 添加水印文字under.endText();}
}

水印生成可以放在工具方法中。

主函数

    /**参数:模板路径:templateDir模版文件名称:合同模板.pdf字体文件名称:simkai.ttf生产文件路径:outDir模版填充数据(表单域内容):键值对 data()*/public static void main(String[] args) throws IOException, DocumentException {String templateDir = "D:/testpdf/";String outDir = "D:/testpdf/";generatePDF(templateDir + "合同模板.pdf", templateDir + "simkai.ttf", data(),new File(outDir + "result_" + System.currentTimeMillis() + ".pdf"), true);}

表单域内容

    public static JSONObject data() {JSONObject data = new JSONObject();data.put("name", "张三");data.put("bank_name", "番茄银行");data.put("amt", "1000.00");return data;}

表单域的填充内容为 Json格式的键值对,键值代表的是在模板PDF中表单的名称。

至此pdf的合同模板就完成了。可以结合之前的 pdfBox获取关键字坐标 文章为pdf合同增加电子签章。

Java实现PDF合同生成相关推荐

  1. java根据pdf模板生成指定格式的pdf文件

    java根据pdf模板生成指定格式的pdf文件 一.工具准备 事先得准备好Adobe Acrobat DC,这是一款专门编辑pdf的工具,小编已经给大家准备好了. 链接:https://pan.bai ...

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

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

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

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

  4. java 根据PDF模板生成PDF文件并导出

    1.准备操作的maven包 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpd ...

  5. java根据pdf模板生成新的pdf

    文章目录 第一步 制作模板 第二步 引入POM 第三步 根据模板生成PDF 如何填充图片数据 如何让填充的数据进行换行 总结 最近有需求要根据现有的PDF模板生成新的PDF出来,网上资料一大堆,主要总 ...

  6. Java给PDF文件生成骑缝章

    什么是缝骑章? 骑缝章(Paging seal.)是海关常用词汇.为了保证海关监管货物留存单据的完整齐全以及核对有关单证,在单据交接处所加盖的印章. 在两张纸交接处的印章.这种印章多盖在条据.证书或其 ...

  7. PDF合同生成下载预览

    调用freemaker配置类     @Autowired     private FreeMarkerConfigurer freeMarkerConfigurer; 生成合同同时提交 @Reque ...

  8. java根据pdf模板生成pdf_Java 复制、压缩PDF文档

    在日常办公中,掌握操作PDF文档的能力尤为重要.在前文中我使用Java程序来演示过如何合并和拆分PDF文档.本文将介绍如何复制和压缩文档.通常复制文档有两种形式,一种是跨文档复制,即将一个文档复制到另 ...

  9. java根据pdf模板生成pdf_PDF文件如何生成链接

    本文介绍如何将PDF文件在线分享. 首先我们打开maipdf的网站,因为市场上做pdf安全分享的网站非常少,所以建议使用maipdf 打开网站之后,选择您需要分享的pdf文件进行上传 生成后的链接您可 ...

最新文章

  1. 虚拟化文件服务器,VMware虚拟化效率之文件服务器性能测试(上)
  2. 运放的主要参数详细介绍
  3. Vue系列vue-router的配置使用(一)
  4. sas java 虚拟机异常_深入理解JAVA虚拟机之异常诊断
  5. form表单的提交地址一定要是完整的绝对地址
  6. html获取url后面的参数_Golang Gin 实战(四)| URL查询参数的获取和原理分析
  7. VMware vsphere中虚拟机的基本操作方法
  8. Android-动画简介
  9. Android开发笔记(一百七十)给App的应用页面注册快捷方式
  10. win7电脑误删鼠标键盘驱动_电脑usb驱动误删鼠标键盘怎么解决?
  11. 台式计算机m4350,高配商用台式 联想启天M4350跌破五千
  12. XTU OJ 1396
  13. 多声道在系统和软件里的设置与应用(普通声卡和dante声卡)
  14. Java开发OCR文字识别系统
  15. 怎么可以优化网站的打开速度?
  16. html基本标签斜体,请选择产生斜体字的HTML标签:
  17. 为什么快手不能左右滑了_快手上滑切换下一个视频怎么设置
  18. Matlab img格式图片转为dicom格式
  19. telegram群组管理机器人
  20. 打印机管理系统解决方案

热门文章

  1. Pandas教程(非常详细)
  2. 新华三 VDI java,鱼和熊掌兼得:新华三vGPU云桌面方案革新VDI性能体验
  3. MapReduce:Map端Join算法实现
  4. echart饼状图、柱状图上显示百分比、数据值
  5. php动漫随机图源码,随机图片API源码
  6. Linux-运维自动化之系统安装
  7. Power BI 中 函数 PERCENTILE.EXC 和 PERCENTILX.EXC 用法区别
  8. vue.js项目打包时出错找不到main.js
  9. 【虹科分享】在容器上使用 ntop 工具的最佳实践
  10. Python小屋刷题神器题目分类速查表