文章目录

  • 第一步 制作模板
  • 第二步 引入POM
  • 第三步 根据模板生成PDF
    • 如何填充图片数据
    • 如何让填充的数据进行换行
  • 总结

最近有需求要根据现有的PDF模板生成新的PDF出来,网上资料一大堆,主要总结下自己遇到的问题和代码

第一步 制作模板

1 通过Adobe Acrobat Pro 根据现有的PDF制作一个模板

2 通过https://www.pdfescape.com/open/ 网站,根据现有的PDF制作一个模板

第二步 引入POM

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

第三步 根据模板生成PDF

下面是快捷demo代码,来源于网上资料:JAVA使用itext根据模板生成PDF文档

 package com.pdf;import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;import com.lowagie.text.pdf.AcroFields;
import com.lowagie.text.pdf.BaseFont;
import com.lowagie.text.pdf.PdfReader;
import com.lowagie.text.pdf.PdfStamper;public class Test {public static void main(String[] args) throws Exception {export();System.out.println("生成完成");}public static void export(){try {// pdf模板所在路径,就是网站制作好后下载的pdf模板路径String fileName = "D:/testpdf.pdf";PdfReader reader = new PdfReader(fileName);ByteArrayOutputStream bos = new ByteArrayOutputStream();PdfStamper ps = new PdfStamper(reader, bos);// 使用中文字体BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();fontList.add(bf);AcroFields fields = ps.getAcroFields();fields.setSubstitutionFonts(fontList);fillData(fields, data());//必须要调用这个,否则文档不会生成的ps.setFormFlattening(true);ps.close();//生成pdf路径存放的路径OutputStream fos = new FileOutputStream("D:/result.pdf");fos.write(bos.toByteArray());fos.flush();fos.close();bos.close();}catch (Exception e){e.printStackTrace();}}/*** 填充模板中的数据*/public static void fillData(AcroFields fields, Map<String, String> data) {try {for (String key : data.keySet()) {String value = data.get(key);// 为字段赋值,注意字段名称是区分大小写的fields.setField(key, value);}} catch (Exception e) {e.printStackTrace();}}/*** 填充数据源* 其中data存放的key值与pdf模板中的文本域值相对应*/public static Map<String, String> data() {Map<String, String> data = new HashMap<String, String>();data.put("schoolName", "国际测试测试\r\n测试测试");data.put("userName", "yvioo");data.put("date", "2020/7");return data;}
}

如何填充图片数据

    public static void fillImage(AcroFields fields, Map<String, String> imagesData, PdfStamper ps) throws IOException, DocumentException {for(String key : imagesData.keySet()) {String value = imagesData.get(key);//获取到当前图片字段对应的模板的页面int pageNo = fields.getFieldPositions(key).get(0).page;//获取到当前图片字段对应的模板的位置Rectangle signRect = fields.getFieldPositions(key).get(0).position;float x = signRect.getLeft();float y = signRect.getBottom();//根据路径读取图片Image image = Image.getInstance(value);//获取图片页面PdfContentByte pdfContentByte = ps.getOverContent(pageNo);//图片大小自适应image.scaleToFit(signRect.getWidth(), signRect.getHeight());//添加图片image.setAbsolutePosition(x, y);pdfContentByte.addImage(image);}}

如何让填充的数据进行换行

    public static void fillChunkData(AcroFields fields, Map<String, String> data, PdfStamper ps) throws IOException, DocumentException {// 为字段赋值,注意字段名称是区分大小写的for (String key : data.keySet()) {//获取到当前图片字段对应的模板的页面int page = fields.getFieldPositions(key).get(0).page;//获取到当前图片字段对应的模板的位置Rectangle rectangle = fields.getFieldPositions(key).get(0).position;float left = rectangle.getLeft();float right = rectangle.getRight();float top = rectangle.getTop();float bottom = rectangle.getBottom();//设置中文字体BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", false);//设置字体大小,样式Font font = new Font(baseFont, 10, Font.NORMAL);PdfContentByte pdfContentByte = ps.getOverContent(page);//设置填充字段内容,位置ColumnText columnText = new ColumnText(pdfContentByte);Rectangle r = new Rectangle(left, bottom, right, top);columnText.setSimpleColumn(r);//对数据进行分割String checkInfo = data.get(key);String[] info = checkInfo.split("\\|");if (info.length == 2) {//填充该字段第一行数据Chunk chunk = new Chunk("第一行数据");Paragraph paragraph = new Paragraph(12, chunk);paragraph.setSpacingBefore(8);columnText.addText(paragraph);paragraph.setFont(font);//设置内容靠右//paragraph.setAlignment(Element.ALIGN_RIGHT);columnText.addElement(paragraph);Chunk chunk2 = new Chunk("第二行数据");Paragraph paragraph2 = new Paragraph(12, chunk2);paragraph2.setSpacingBefore(8);columnText.addText(paragraph2);paragraph2.setFont(font);columnText.addElement(paragraph2);}columnText.go();}}

总结

上手还是很容易的,主要是一些特殊操作,例如换行,靠右,字体颜色,大小等等样式相关的问题,毕竟需要生成完毕才能看到效果。
注意事项:
1 中文的支持需要引入itext-asian相关jar包

java根据pdf模板生成新的pdf相关推荐

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

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

  2. Java/web/jsp根据pdf模板生成荣誉证书PDF文件

    Java/web/jsp根据pdf模板生成荣誉证书PDF文件 1.前言 最近博主在开发一个大学生学分管理系统,按照对方用户的要求,他们需要一个生成PDF荣誉证书的功能. 于是Java根据pdf模板生成 ...

  3. java 制作pdf模板,Java-pdf模板制作流程-使用pdf 模板生成pdf文件

    Java 使用pdf 模板生成pdf文件 --制作流程 1.      使用工具 adobe acrobat dc.word 2015 2.      使用 word 繪制一個 3*5 的表格並保存, ...

  4. java pdf工具类_Java PDF工具类(一)| 使用 itextpdf 根据PDF模板生成PDF(文字和图片)...

    Java PDF工具类(一)| 使用 itextpdf 根据设置好的PDF模板填充PDF(文字和图片) 相关文章: Java PDF工具类(二)| 使用 wkhtmltox 实现 HTML转PDF(文 ...

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

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

  6. Java中操作pdf模板生成pdf

    [java] iText使用PDF模板生成输出PDF 项目需求涉及到操作pdf模板,根据生成好的模板向里面填充数据 用到的jar包是iText-5.0.6.jar 和iTextAsian.jar pd ...

  7. java itext根据模板生成pdf

    很久没有更新过了,稍微闲一点,顺势总结下N久之前用到的小技巧. 这里生成pdf主要使用itext.jar.如想生成一个pdf,其实很简单的啦!第一种:全部使用代码生成:第二种:根据pdf模板生成.当前 ...

  8. JAVA 使用Itext模板生成pdf,解决图片插入,文本域超出字体缩放,半自动换行

    1.前言 前一段时间遇到一个制作Pdf的业务,自己下来摸索了一下,基本上解决.将其中遇到的几个问题及解决方法做以记录,仅供大家参考. 首先在这里对于刚接触该类型业务的同学说明下,ItexPdf支持使用 ...

  9. 根据word模板生成word和PDF

    根据word模板生成word和PDF 需求:有一个固定的合同模板,在vue前台填写指定的信息,替换合同模板指定的内容 我们使用的默认模板内容如图: 我们在前端填写的字段就是合同名称.项目名称和项目金额 ...

最新文章

  1. Linux常用命令汇总(二)
  2. 2018湖湘杯web、misc记录
  3. NLPIR智能语义技术从采集到分析一步到位
  4. 【分享】Web前端开发第三方插件大全
  5. Dubbo xml配置 和注解配置 写法
  6. vue-cli4.x 中 配置允许跨域请求
  7. 漫游Kafka设计篇之Producer和Consumer(4)
  8. python中读取文本文件_Python三种读取txt文件方式
  9. 计算机维护测试工作,(人才测评)桌面运维工程师的招聘入职测评方案
  10. 作业帮一面+二面+hr面
  11. 搭建 IPv6 Web服务器
  12. 粘胶活化剂市场现状及未来发展趋势
  13. 常用室内定位技术总结
  14. 拉格朗日插值法 C语言实现
  15. 计算机图形学 第6章 三维变换与投影
  16. 兔子拔萝卜的java游戏_幼儿园中班体育游戏教案详案《小兔拔萝卜》
  17. Linux高级命令进阶(week1_day2)--技术流ken
  18. Star CCM+ 案例 - 旋风分离器 (cyclone separator)-1几何的构建
  19. java zip4j,Java引入zip4j解压缩处理
  20. 阿里开源组件库--ant design of vue的安装和使用

热门文章

  1. str.strip(chars)的理解
  2. linux操作系统属于微内核,科普:微内核操作系统现状
  3. 苹果怎么录屏?手把手教你搞定掌握小技能!
  4. matlab 三个向量数据绘制曲面图
  5. 004-云E办项目搭建环境
  6. KALI 2022.2 msfconsole 无法启动
  7. 贝塞尔函数 matlab程序,bessel 贝塞尔函数的零点 MATLAB MAPLE
  8. 2019生活十三图鉴——回顾2019感动我们的那十三个瞬间
  9. 修改docker默认存储位置
  10. Android studio-人工智能:中国象棋