需求:pdf较为复杂部分利用模板生成,但是后续还需要补充动态数据表格

模板生成参考

itextpdf 利用模板生成pdf 下载_音乐土豆的博客-CSDN博客

注意

1、读取了模板写入数据之后再用document.add()方法添加代码生成的表格内容无法生效

2、如果先添加表格再写入模板数据的话,模板的form域会丢失无法再写入数据。

3、方案:先读取模板写入数据后生成一个临时pdf,然后再去读取这个pdf并向它添加表格生成最终的pdf。

效果如下

接上篇代码

1、动态表格生成 及模拟数据

private static void appendTableToDocument(Document document){//定义 6列的表格PdfPTable table = new PdfPTable(new float[] { 80, 80, 80, 80, 80, 80});table.setTotalWidth(520);table.setLockedWidth(true);table.setHorizontalAlignment(Element.ALIGN_CENTER);//居中try {//定义数据的字体BaseFont baseFont = BaseFont.createFont("Helvetica","UTF-8",BaseFont.NOT_EMBEDDED);Font textFont = new Font(baseFont, 6, Font.NORMAL);//表头模拟数据for (int i = 0; i < 6; i++) {PdfPCell heardCell = new PdfPCell();heardCell.setVerticalAlignment(Element.ALIGN_MIDDLE);heardCell.setHorizontalAlignment(Element.ALIGN_CENTER);heardCell.setPhrase(new Phrase("value", textFont));table.addCell(heardCell);}//表格数据DecimalFormat df = new DecimalFormat("0.00");for (int i = 0; i < 1000; i++) {PdfPCell value1 = new PdfPCell();value1.setPhrase(new Phrase("2022"+i, textFont));table.addCell(value1);Double value = Math.random()*10;PdfPCell value2 = new PdfPCell();value2.setPhrase(new Phrase(df.format(value), textFont));}document.add(table);} catch (Exception e) {e.printStackTrace();}
}

关键点:获取已经填充内容的pdf ,新建一页,保存表格

@GetMapping("/pdf")
public void downLoadPdf(HttpServletResponse response){try{//模板文件String sourceFile = "D:\\PDF-TEST\\blog.pdf";//下载后pdf名String fileName = "pdf-test";response.setHeader("content-disposition", "attachment;filename=" + fileName + ".pdf");response.setContentType("application/octet-stream");OutputStream out = response.getOutputStream();//输出到本地
//            FileOutputStream out = new FileOutputStream("D:\\test.pdf");ByteArrayOutputStream bos = new ByteArrayOutputStream();//读取模板PdfReader  reader = new PdfReader(sourceFile);//            PdfStamper pdfStamper = new PdfStamper(reader, out);PdfStamper pdfStamper = new PdfStamper(reader, bos);// 后续读取已经填充过的pdf流//设置字体格式BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);ArrayList<BaseFont> fontList = new ArrayList<>();fontList.add(baseFont);//获取模板文件中的表单域AcroFields afs = pdfStamper.getAcroFields();afs.setSubstitutionFonts(fontList);//填充文本dataMap data = mockData().get("data");for (Map.Entry<String, AcroFields.Item> entry : afs.getFields().entrySet()) {if (!CollectionUtils.isEmpty(data) && data.get(entry.getKey()) != null) {//Field , 这个是自己在pdf上定义的变量名称afs.setField(entry.getKey(), data.get(entry.getKey()).toString(), true);}}// 处理图片Map imageMap = mockData().get("image");for (Map.Entry<String, AcroFields.Item> entry : afs.getFields().entrySet()) {if (!CollectionUtils.isEmpty(imageMap) && imageMap.get(entry.getKey()) != null) {String key = entry.getKey();String value = imageMap.get(entry.getKey()).toString();int pageNo = afs.getFieldPositions(key).get(0).page;Rectangle signRect = afs.getFieldPositions(key).get(0).position;float x = signRect.getLeft();float y = signRect.getBottom();//根据路径读取图片Image image = Image.getInstance(value);//获取图片页面PdfContentByte under = pdfStamper.getOverContent(pageNo);//图片大小自适应image.scaleToFit(signRect.getWidth(), signRect.getHeight());//添加图片image.setAbsolutePosition(x, y);under.addImage(image);}}pdfStamper.setFormFlattening(true);pdfStamper.close();/*********************************编辑填充后的pdf start ****************************/reader = new PdfReader(bos.toByteArray());Rectangle pageSize = reader.getPageSize(1);Document document = new Document(pageSize);PdfWriter writer = PdfWriter.getInstance(document, out);document.open();PdfContentByte cbUnder = writer.getDirectContentUnder();PdfImportedPage pageTemplate = writer.getImportedPage(reader, 1);cbUnder.addTemplate(pageTemplate, 0, 0);//新创建一页来存放后面生成的表格document.newPage();//动态拼接表格appendTableToDocument(document);document.close();/**********************************编辑填充后的pdf end******************************/out.close();}catch (Exception e){e.printStackTrace();}
}

itext模板生成pdf 后添加动态表格相关推荐

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

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

  2. iText+freemarker 生成PDF 使用ftl模板

    iText+freemarker 生成PDF 生成样式图片 模板地址 maven PDF生成工具类 PDF生成辅助类 base64编码工具类 service方法调用 总结 生成样式图片 模板地址 ma ...

  3. HTML生成PDF模板(Java iText+FreeMarker生成PDF(HTML转PDF))

    Java iText+FreeMarker生成PDF(HTML转PDF) 1.背景 在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同等.方便用户查看,下载,打 ...

  4. java根据模板生成pdf文件并导出(iText)

    java根据模板生成pdf文件并导出 首先你的制作一个pdf模板: 1.先用word做出模板界面 2.文件另存为pdf格式文件 3.通过Adobe Acrobat pro软件打开刚刚用word转换成的 ...

  5. itext 根据模板 生成pdf 多行数据

    前言:基于 html + ccs + itext + 字符串替换完成的.简单,依赖的 jar 少... 根据 pdf模板 生成 pdf , 1. 不能有循环的数据(可能有,但我并没有找到): 2. t ...

  6. freemarker根据静态模板和动态模板生成PDF与Word

    背景介绍:最近在做老旧项目的二次开发,所以用到了freemarker去生成PDF和Word,涉及到打印静态模板与动态模板.查看了这方面的资料发现大都不全,似是而非.废话不多说,上案例. freemar ...

  7. itext使用模板生成pdf文件

    用pdf模板生成pdf文档很简单,首先需要手动做个pdf模板,上面有很多的类似html里的text域的东西, 给他们起好名字,在程序里填充就可以了.虽然由于不会做模板(实际上由于短时间无法去熟悉使用A ...

  8. Itext生成pdf文件,itext+Freemarker生成pdf,(中文空白解决)

    来源:https://my.oschina.net/lujianing/blog/894365 1.背景 在某些业务场景中,需要提供相关的电子凭证,比如网银/支付宝中转账的电子回单,签约的电子合同等. ...

  9. Java根据模板生成pdf文件并导出

    原文地址:http://blog.csdn.net/TOP__ONE/article/details/65442390 首先你的制作一个pdf模板: 1.先用word做出模板界面 2.文件另存为pdf ...

最新文章

  1. 简易重采样resampler的实现
  2. CSS3 Animation(下)
  3. java session验证码_利用session实现一次性验证码
  4. MATLAB基本操作(一):MATLAB中变量的文件存储
  5. leetcode 242. 有效的字母异位词(Java版)
  6. 08-图9 关键活动 (30 分
  7. python清空列表的方法
  8. python上传文件进度_python实现进度条--主要用在上传下载文件
  9. Confluence 6 升级以后
  10. windows cmd命令行findstr 类似linux中的grep
  11. Unity中Json文件编写注意
  12. 【codeforces 709C】Letters Cyclic Shift
  13. 计算2+4+6...+100的值 python_Python100例核心知识,你知道多少
  14. 【翻译】200行代码讲透RUST FUTURES (7)
  15. 新闻联播 华为鸿蒙,央视为华为鸿蒙OS科普,苹果比安卓流畅的原因华为也可以...
  16. make: *** [Makefile:44:obj/start.o] 错误 127
  17. Shor算法 or量子傅里叶变换?
  18. 如何更新seaborn库_Python 绘图总结(seaborn库的使用) (上)
  19. 电话和互联网使用:首次移动电话数下降
  20. 漫画 | 抱歉,你可能看到了假的通信史!

热门文章

  1. Cubase 12pro新版中文Win/Mac音乐制作软件
  2. Nuendo 5 v5.1.1 WiN 英文精简版音乐制作软件下载
  3. 页面提交后提示“连接被重置”或“载入页面时到服务器的连接被重置”的问题分析
  4. mysql数据库表缩表_不会写复杂的SQL,该怎么学习?
  5. java8流转数组_Java8 教程第八章之Array to Stream
  6. 自我反省,自我批评、解剖,对近期行为的反思
  7. 【can总线】stm32的can控制器
  8. 计算机组成原理的exec是什么,exec...
  9. win10+ubuntu的坑
  10. 使用USBWriter做U盘启动盘后U盘在盘中不显示的解决办法