一.需求

1.业务给了一个PDF文件当模板,要求将客户填写的信息对应在模板固定的位置,并且生成一个新的PDF图片和JPG图片,我们这叫开户书。

如图是临时编辑的模板PDF

二.实现步骤

1.用Adobe Acrobat DC 给填空的地方加上文本域。签名图片直接按坐标写入在固定位置不需要文本域。
2.读取PDF模板,取出文本域的字段,给字段赋值;
3.最后生成一个新的PDF图片写出到本地,生成一个新的JPG图片,以base64编码形式返回。

三.代码演示

1.用Adobe Acrobat DC打开模板文件,给PDF添加文本域

2.代码实现:为实现代码解耦,取出模板中的字段和赋值另外写了两个方法,主方法去调用这两个方法

/**主方法
*/public static void test() throws IOException, DocumentException {//1.pdf模板位置String fileName = "D:/MB.pdf";//2.读模板PDFInputStream input = new FileInputStream(new File(fileName));PdfReader reader = new PdfReader(input);ByteArrayOutputStream bos = new ByteArrayOutputStream();/* 3.图片的输入输出流 */PdfStamper ps = new PdfStamper(reader, bos);/* 4.取出模板中的所有字段并赋值 */AcroFields fields = ps.getAcroFields();//调用填充模板的方法fillData()和填充数据的方法data()fillData(fields, data());//5.字符缓冲区StringBuilder sign_img_base64 = new StringBuilder();//5.1 这里是前面图片的base64编码, 一般是由前端传过来。(也可以在网上在线转换)sign_img_base64.append("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 Z34ghAAAAABJRU5ErkJggg==");String imagePath = sign_img_base64.toString();//6.base64解码BASE64Decoder decoder = new BASE64Decoder();byte[] bytes = decoder.decodeBuffer(imagePath);//7.读图片:添加的固定位置Image image1 = Image.getInstance(bytes);PdfContentByte under = ps.getOverContent(1);image1.scaleToFit(150,60);image1.setAbsolutePosition(160,510);under.addImage(image1);reader.close();/* false-可以编辑,true-不可以编辑 */ps.setFormFlattening(true);ps.close();//8.生成新pdf文件路径OutputStream fos = new FileOutputStream("D:/result.pdf");fos.write(bos.toByteArray());//9.生成开户书PDDocument picDoc = PDDocument.load(bos.toByteArray());PDFRenderer renderer = new PDFRenderer(picDoc);BufferedImage image = renderer.renderImageWithDPI(0, 200f);ByteArrayOutputStream baos = new ByteArrayOutputStream();ImageIO.write(image,"jpg",baos);String base64 = Base64.getEncoder().encodeToString(baos.toByteArray());System.out.println("base64 = " + base64);picDoc.close();baos.close();fos.flush();fos.close();bos.close();}/*** 工具类方法:填充模板:  取出模板中的字段并赋值* */public static void fillData(AcroFields fields, Map<String, String> data) throws IOException, DocumentException {/* 写入文字 */for (String key : data.keySet()) {String value = data.get(key);fields.setField(key, value); // 为字段赋值,注意字段名称是区分大小写的}}/***工具类方法: 填充数据源* 其中data存放的key值与pdf模板中的文本域字段相对应* */public static Map<String, String> data() {HashMap<String, String> data = new HashMap<>();data.put("name", "liwenhao");data.put("performance", "100");data.put("age", "18");return data;}

3.结果:生成base64编码的JPG图片和新的PDF图片

根据客户的PDF模板,写入签名图和文本,生成新的PDF图片和JPG图片。相关推荐

  1. java pdf 报表_关于Java向PDF模板写入数据,以及java制作pdf报表的问题

    1.关于java向PDF模板写入数据 写的特别全一步一步来就行. (1)首先下载一个pdf编辑工具Adobe Acrobat DC (2)准备一个pdf模板文件(你可以把自己创建一个只有表头没有内容的 ...

  2. 根据pdf模板生成新的pdf文件(Java)

    根据pdf模板生成新的pdf文件 一.项目依赖 二.所用工具类 三.其他资料 一.项目依赖 1.maven版本:3.5.x 2.pom文件依赖 <!--itext的依赖jar--> < ...

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

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

  4. python 原理 pdf_利用Python处理PDF——裁剪和生成新的PDF

    安装 在cmd中输入这一句: pip install -U pdfminer3k -i https://pypi.tuna.tsinghua.edu.cn/simple --user 注意:这里安装的 ...

  5. java 实现向pdf模板写入数据。并重新生成一个新文件

    引入maven依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf< ...

  6. 利用Adobe Acrobat DC制作pdf模板后,使用java直接生成pdf至本地指定路径或导出pdf文件

    参考文章来源: springboot+itextpdf按模板生成PDF文件及在线下载PDF文件 JAVA根据模板生成PDF文件并导出 java将字符串按照指定长度分割成字符串数组 感谢上述博主大大,救 ...

  7. fpdf fpdi 操作pdf文件 写入中文汉字

      今天给公司做一个线上合同签约功能,用户签约后 生成pdf版的文件 .网上搜了搜大概都是用fpdf进行操作的  , 通过fpdi 可以进行读取pdf模板. 在通过继承fpdf 操作现有的pdf文档 ...

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

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

  9. Java填充PDF模板数据

    PDF模板数据填充 一.思路 根据业务需求,获取实际业务数据,借助itext库功能,将业务数据填充入提前制作好的PDF模板中 二.操作步骤 制作PDF模板:提前下载好Adobe Acrobat Pro ...

  10. 使用iTextPdf为Pdf模板填充表单项

    说明 日常开发中,通常会有动态填充Pdf表单的需求,程序可根据用户的输入或后台数据库的内容,动态.批量向Pdf模板中填充内容. 这里简单介绍一下Pdf模板的制作,以及通过iTextPdf组件给pdf ...

最新文章

  1. Python实战之网络编程socket学习笔记及简单练习
  2. ​Xamarin iOS教程之自定义视图
  3. 悟透LoadRunner - 什么是性能测试?
  4. 探讨ASP.NET2.0的Web控件改进之概述
  5. 从零入门 Serverless | 一文详解 Serverless 架构模式
  6. 模块开发卷宗(GB8567——88)
  7. 有序链表转换二叉搜索树Python解法
  8. HALCON示例程序crystal.hdev通过局部阈值处理和区域处理提取六角形晶体
  9. mysql 插入加锁_Mysql加锁过程详解(9)-innodb下的记录锁,间隙锁,next-key锁
  10. 蓝桥杯 ALGO-113 算法训练 数的统计
  11. import matplotlib 出现“No module named 'pyparsing'“问题
  12. ORB-SLAM3 代码解读
  13. VMWARE 之 vSphere vCenter 安装基本配置
  14. 〖Python APP 自动化测试实战篇①〗 - 大话闲扯 APP 自动化
  15. ListView的优化
  16. Codeforces Round #807 (Div. 2)
  17. UVA11210 Chinese Mahjong
  18. django完成一个可重用注册登录系统
  19. autocad.net通过支持文件搜索路径查找文件
  20. 使用Bootstrap框架写的一个小实例

热门文章

  1. linux查看程序bss段,[必须掌握].bss段和.data段的区别
  2. linux摄像头内核驱动开发,Linux系统下USB摄像头驱动开发
  3. 可靠性 可用性 可维护性
  4. java每日一练(19_03_23)
  5. 随机地址生成器_Python文章自动生成器火了!没错,它的名字叫“狗屁不通”!...
  6. Easyrecovery激活码生成器分享
  7. 增加虚拟android内存,SD卡变RAM 增加虚拟内存方法
  8. RTSP流媒体播放器实现
  9. 微信开发者工具 the permission value is offline verifying 异常
  10. 【docker】win10系统下docker容器安装及使用(二):docker通过commit及dockerfile进行创建