1、引入jar包

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

2、新建word文档,创建模板,将文件另存为pdf,并用Adobe Acrobat DC打开

3、在需要插入数据的空白处,右击,点击【文本域】,将文本域拖放到你想要的位置,更改域名称为你传入的变量名。

4、模板(编辑好后的模板)

5、保存模板,将模板放到项目中

pdf生成,代码如下

public static void creatPdf(Map<String, Object> map, String filePath) {try {BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);FileOutputStream out = new FileOutputStream(filePath);// 输出流// 读取pdf模板
//            PdfReader reader = new PdfReader(TemplateToWord.class.getResource("/com/cn/business/templates/report.pdf"));PdfReader reader = new PdfReader(String.valueOf(map.get("tempPath")));ByteArrayOutputStream bos = new ByteArrayOutputStream();PdfStamper stamper = new PdfStamper(reader, bos);stamper.setFormFlattening(true);AcroFields form = stamper.getAcroFields();// 文字类的内容处理Map<String, String> datemap = (Map<String, String>) map.get("dataMap");form.addSubstitutionFont(bf);for (String key : datemap.keySet()) {String value = datemap.get(key);form.setField(key, value);}// 图片类的内容处理Map<String, String> imgmap = (Map<String, String>) map.get("imgMap");for (String key : imgmap.keySet()) {String value = imgmap.get(key);String imgpath = value;int pageNo = form.getFieldPositions(key).get(0).page;Rectangle signRect = form.getFieldPositions(key).get(0).position;float x = signRect.getLeft();float y = signRect.getBottom();// 根据路径读取图片Image image = Image.getInstance(imgpath);// 获取图片页面PdfContentByte under = stamper.getOverContent(pageNo);// 图片大小自适应image.scaleToFit(signRect.getWidth(), signRect.getHeight());// 添加图片image.setAbsolutePosition(x, y);under.addImage(image);}// 表格类Map<String, List<List<String>>> listMap = (Map<String, List<List<String>>>) map.get("tableList");for (String key : listMap.keySet()) {List<List<String>> lists = listMap.get(key);int pageNo = form.getFieldPositions(key).get(0).page;PdfContentByte pcb = stamper.getOverContent(pageNo);Rectangle signRect = form.getFieldPositions(key).get(0).position;//表格位置int column = lists.get(0).size();int row = lists.size();PdfPTable table = new PdfPTable(column);float tatalWidth = signRect.getRight() - signRect.getLeft() - 1;int size = lists.get(0).size();float width[] = new float[size];for (int i = 0; i < size; i++) {if (i == 0) {width[i] = 60f;} else {width[i] = (tatalWidth - 60) / (size - 1);}}table.setTotalWidth(width);table.setLockedWidth(true);table.setKeepTogether(true);table.setSplitLate(false);table.setSplitRows(true);Font FontProve = new Font(bf, 10, 0);//表格数据填写for (int i = 0; i < row; i++) {List<String> list = lists.get(i);for (int j = 0; j < column; j++) {Paragraph paragraph = new Paragraph(String.valueOf(list.get(j)), FontProve);PdfPCell cell = new PdfPCell(paragraph);cell.setBorderWidth(1);cell.setVerticalAlignment(Element.ALIGN_CENTER);cell.setHorizontalAlignment(Element.ALIGN_CENTER);cell.setLeading(0, (float) 1.4);table.addCell(cell);}}table.writeSelectedRows(0, -1, signRect.getLeft(), signRect.getTop(), pcb);}stamper.setFormFlattening(true);        // 如果为false,生成的PDF文件可以编辑,如果为true,生成的PDF文件不可以编辑stamper.close();Document doc = new Document();PdfCopy copy = new PdfCopy(doc, out);doc.open();int pageNum = reader.getNumberOfPages();for (int i = 1; i <= pageNum; i++) {PdfImportedPage importPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), i);copy.addPage(importPage);}doc.close();} catch (IOException e) {System.out.println(e);} catch (DocumentException e) {System.out.println(e);}}

6、测试方法

public static void main(String[] args) {// 模板路径String tempPath = "D:\\admin\\test.pdf";//文字类Map<String, String> dataMap = new HashMap<String, String>();DateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");String title = "测试文字内容" + "(" + format.format(new Date()) + ")";dataMap.put("title", title);     // dataMap中的key要和模板中的域名对应//图片String imgPath = "C:\\Users\\Admin\\Pictures\\豚鼠图片.jpg";Map<String, String> imgMap = new HashMap<String, String>();imgMap.put("picture", imgPath);     // imgMap中的key要和模板中的域名对应//表格 一行数据是一个listList<String> list = new ArrayList<String>();list.add("日期");list.add("金额");List<String> list2 = new ArrayList<String>();list2.add("2021-08-27");list2.add("100000");List<List<String>> List = new ArrayList<List<String>>();List.add(list);List.add(list2);Map<String, List<List<String>>> listMap = new HashMap<String, List<List<String>>>();listMap.put("table", List);      // 这里的listMap中key要和模板中的域名对应Map<String, Object> o = new HashMap<String, Object>();o.put("tempPath", tempPath);o.put("dataMap", dataMap);o.put("imgMap", imgMap);o.put("tableList", listMap);String outPutPath = "D:\\admin\\test1.pdf";creatPdf(o, outPutPath);}

7、效果图

8、结语

itext的功能不单单只有这些,当然,这些也是比较常用的,另外还有合并PDF文件,以及生成带水印或背景的PDF,如果有需要,我也可以贴出来

原创不易,如果对你有帮助,一键三连吧

IText_根据模板导出PDF(文字、表格、图片)相关推荐

  1. C#通过模板导出Word(文字,表格,图片)

    C#导出Word,Excel的方法有很多,这次因为公司的业务需求,需要导出内容丰富(文字,表格,图片)的报告,以前的方法不好使,所以寻找新的导出方法,在网上找到了通过模板文件导出Word的方法,记录一 ...

  2. Java 根据模板导出PDF

    文章目录 前言 思路一:直接导出pdf 使用itext模板导出pdf 思路二:先导出word再转成pdf 1)导出word 2)word转pdf 最终方案 ~~docx4j~~ spire.doc.f ...

  3. python 生成pdf 文字和图片_Python系列—PDF文本与图片抽取

    PDF是人们日常使用最多的跨平台文档.其是一种用独立于应用程序.硬件.操作系统的方式呈现文档的文件格式.每个PDF文件包含固定布局的平面文档的完整描述,包括文本.字形.图形及其他需要显示的信息.具有良 ...

  4. PDF如何编辑修改,怎么编辑PDF文字与图片

    很多的小伙伴会私信小编询问小编关于PDF文件的修改技巧,在使用PDF文件的时候,往往是需要用到PDF编辑器的,编辑文件时,想要修改文件的内容包括文字内容以及图片内容,应该怎么去编辑呢,其实,还是很简单 ...

  5. 【根据模板导出多sheet表格数据】

    文章目录 1. 根据模板导出多sheet表格数据 1. 先上代码 2. 模板展示 3. 数据构造 1.实体类创建 2. sql数据构造(主要是需要把结果集别名映射到对应的实体类上) 2. 无模板多sh ...

  6. echarts 图表导出PDF(带滚动条)/图片导出PDF

    echarts 图表导出PDF[带滚动条]/图片导出PDF 效果展示 提出问题 思考问题 解决问题 导出PDF 里面的页头中文乱码问题 参数说明 效果展示 提出问题 在开发过程中,有需求是将展示出来的 ...

  7. java按照模板导出pdf或者word

    一.java按照模板导出pdf (一)制作模板 1.在word里制作模板 因为PDF常用的软件不支持编辑,所以先用Word工具,如WPS或者Office新建一个空白Word文档,里面制作出自己想要的样 ...

  8. Java替换Word模板中的文字、图片、表格、水印

    前言 由于业务需求,要求开发一个工具类,需要对Word模板中的内容进行替换,并且支持插入图片.根据业务生成自定义表格,以及对处理后的文件增加水印,处理完的文件支持保存doc.docx.pdf格式 1. ...

  9. java根据模板导出pdf,java开发面试笔试题

    我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家. 扫描二维码或搜索下图红色VX号,加VX好友,拉你进[程序员面试学习交流群]免费领取.也欢迎各位一起 ...

最新文章

  1. gcc 5.2.0 编译安装笔记-20151110
  2. python硬盘api-使用python获取电脑的磁盘信息方法
  3. 在centOS7.2里安装virtualenv和flask
  4. 介绍ML.NET——面向.NET开发人员的机器学习库
  5. 【DP】【Uva437】UVA437 The Tower of Babylon
  6. selenium三个等待时间
  7. java jsessionid 会话_jsessionid 对JAVA WEB jsessionid的剖析
  8. 0 AD13安装破解与汉化
  9. Fedora35安装ibus-rime并配置五笔86方案
  10. 寂寞情来情去——忆纳兰词
  11. 菜鸟最初级网络安全常识
  12. FPGA实验---数码管秒表显示实验
  13. DDR4原理及硬件设计
  14. python古典问题兔子问题_古典兔子问题
  15. 每天一个shell小知识(shell变量)
  16. C++ AVL树(补充)
  17. Java语言程序设计基础篇(第十版)课后习题答案 - 第一章
  18. Vue+springboot集成PageOffice实现在线编辑Word、excel文档
  19. 马上消费成长内幕:一次金融底色、技术信仰的征程
  20. 2021年下半年软件设计师考试评估解析

热门文章

  1. HDU 5755 Gambler Bo(数论)
  2. AVD安装XPOSED环境
  3. 如何制作校园平面图及路线导图
  4. 浅墨博客《Real Time Rendering 3rd》提炼总结 截取(一)
  5. 上海庆科EMW3162 AT指令固件 实现串口透传
  6. 亚马逊云服务AWS Marketplace “重塑”企业软件SaaS之旅
  7. Vue FSC在线编译代码实时预览@vue/repl
  8. 按“window+E”键出现【找不到应用程序】或【explore.exe找不到】的解决方法
  9. 转载-css 属性clip-path之多边形polygon小窥
  10. java 拼音_GitHub - promeG/TinyPinyin: 适用于Java和Android的快速、低内存占用的汉字转拼音库。...