JAVA操作Itext向pdf模板中填充数据,图片,复选框!

第一步模板制作:

  • 在word中先把模板画好,另存为pdf,具体步骤为:wps—》工具------》开发工具。如图所示

    图片也是设置为文本域,千万不要设置为图片域,否则图片会被覆盖!

    图片也是设置为文本域,千万不要设置为图片域,否则图片会被覆盖!

    图片也是设置为文本域,千万不要设置为图片域,否则图片会被覆盖!
    在这里插入图片描述

准备好模板后下载adobe2024

获取破解安装包v: yzb328899或v众号 T96虚拟资料吧 发送adobe获取,也可自行下载。
  • 安装好adobe后打开刚刚保存的模板,在adobe中打开准备表单。如下图所示:
    在这里插入图片描述
  • 定义模板中的每一个字段名称,包括样式字段的字体大小颜色和其他的属性如下图所示

    JAVA中的map或者实体对象命名时字段名必须与这里保持一致!

    JAVA中的map或者实体对象命名时字段名必须与这里保持一致!

    JAVA中的map或者实体对象命名时字段名必须与这里保持一致!
    在这里插入图片描述

操作复选框

定义属性,定义选中时的形状

在这里插入图片描述

如何选中复选框?当参数传递“导出值”时即为选中,如下图所示

在这里插入图片描述

JAVA中设置选中,这里要设置为true,否则是相反的,选中为x,只有设置为true时选中才是√。

 form.setField("toggle1", "Y",true);form.setField("toggle2", "Yes",true);form.setField("toggle3", "On",true);

结果如图所示:

在这里插入图片描述

接下来开始代码实现,直奔主题!!!

  • 添加maven依赖
  <!-- itextpdf的亚洲字体支持 --><dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version></dependency><!--itextpdf--><dependency><groupId>com.itextpdf</groupId><artifactId>itextpdf</artifactId><version>5.5.13.3</version></dependency><!--生成二维码--><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.4.1</version> </dependency><dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>3.4.1</version> </dependency>
  • 将准备好的pdf模板放入项目中的resource----》static-------》template目录。
    若没有此目录则自己创建如图所示:
    在这里插入图片描述
  • 表单内容实体类Entity Or Domain

import lombok.Data;@Data
public class PaymentOrder {/*** 年*/private String year;/***月*/private String month;/***日*/private String day;/***付款*/private String toggle1;/***支票*/private String toggle2;/***转账*/private String toggle3;/***收款账号*/private String acount;/***人民币大写*/private String CNY;/***人民币数值*/private String cnyNum;/*** 二维码*/private String QRCode;/*** 图片*/private String photo;/***备注*/private String remark;
}
  • Controller层代码实现:
    @GetMapping("/test")public void generateForm(HttpServletResponse response,PaymentOrder paymentOrder ){//此处模拟前端传来的数据,或查询数据库获得的数据paymentOrder.setAcount("1111");paymentOrder.setCNY("壹佰万");paymentOrder.setYear("2024");paymentOrder.setMonth("07");paymentOrder.setDay("22");//图片绝对路径paymentOrder.setPhoto("C:\\Users\\Administrator\\Desktop\\goods\\ruoyi-system\\src\\main\\resources\\static\\img.png");paymentOrder.setRemark("测试一下");paymentOrder.setCnyNum("1000000");paymentOrder.setToggle1("Y");paymentOrder.setToggle3("Y");//二维码内容paymentOrder.setQRCode("https://blog.csdn.net/m0_46523467?spm=1000.2115.3001.5343");//pdf模板存放路径String templatePath="C:\\Users\\Administrator\\Desktop\\goods\\ruoyi-system\\src\\main\\resources\\static\\template\\payment_order_template.pdf";//生成后的文件存放路径String outPutPath="C:\\Users\\Administrator\\Desktop\\goods\\ruoyi-system\\src\\main\\resources\\static\\payment_order.pdf";logisticsService.generateForm(response,paymentOrder,templatePath,outPutPath);}
  • service 层
  /*** 报表生成* @param response* @param paymentOrder* @param templatePath* @param outputPath*/void generateForm(HttpServletResponse response, PaymentOrder paymentOrder,String templatePath,String outputPath);
}
  • serviceImpl
    /*** 报表生成* @param response* @param paymentOrder*/@Overridepublic void generateForm(HttpServletResponse response, PaymentOrder paymentOrder,  String template_path, String output_path) {//表单中的文本数据mapMap<String,String> form=new HashMap<>();//表单中图片mapMap<String,String> image=new HashMap<>();//表单中二维码图片生成内筒mapMap<String,String> qrcode=new HashMap<>();//表单内容form.put("year",paymentOrder.getYear());form.put("month",paymentOrder.getMonth());form.put("day",paymentOrder.getDay());form.put("acount",paymentOrder.getAcount());form.put("CNY",paymentOrder.getCNY());form.put("toggle1",paymentOrder.getToggle1());form.put("toggle2",paymentOrder.getToggle2());form.put("toggle3",paymentOrder.getToggle3());form.put("cnyNum",paymentOrder.getCnyNum());form.put("remark",paymentOrder.getRemark());//图片image.put("photo", paymentOrder.getPhoto());//二维码的内容qrcode.put("QRCode",paymentOrder.getQRCode());/**填充表单内容,width为二维码的宽,height为二维码的高,如没有二维二维码和图片则传null,宽和高传0。*fillPdfTemplate(String templateUrl, String outputFileUrl, Map<String, String> fieldMap,*Map<String, String> imageMap, Map<String, String> QRCodeMap,int width,int height)*/PDFUtils.fillPdfTemplate(template_path,output_path,form,image,qrcode,300,300);
  • 自定义PDF工具类
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.*;
import lombok.extern.slf4j.Slf4j;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.nio.file.Files;
import java.util.HashMap;
import java.util.Map;@Slf4j
public final class PDFUtils {public static boolean fillPdfTemplate(String templateUrl, String outputFileUrl, Map<String, String> fieldMap, Map<String, String> imageMap, Map<String, String> QRCodeMap,int width,int height) {boolean success = true;OutputStream os = null;PdfStamper ps = null;PdfReader reader = null;AcroFields form = null;try {os = Files.newOutputStream(new File(outputFileUrl).toPath());reader = new PdfReader(templateUrl);ps = new PdfStamper(reader, os);form = ps.getAcroFields();// 添加中文字体支持(可选)BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);form.addSubstitutionFont(bf);// 填充表单字段for (Map.Entry<String, String> entry : fieldMap.entrySet()) {if(entry.getValue()!=null){form.setField(entry.getKey(), entry.getValue(),true);}}// 插入图片for (Map.Entry<String, String> entry : imageMap.entrySet()) {if (entry.getValue()!=null){insertImage(form, ps, entry.getKey(), entry.getValue());}}// 插入二维码for (Map.Entry<String, String> entry : QRCodeMap.entrySet()) {if(width!=0&&height!=0){insertQRCodeImage(form, ps,entry.getKey(), entry.getValue(), width,height);}}} catch (Exception e) {success = false;e.printStackTrace();  // 可以根据实际情况处理异常} finally {try {if (ps != null) ps.close();if (reader != null) reader.close();if (os != null) os.close();} catch (IOException | DocumentException e) {throw new RuntimeException(e);} finally {System.out.println("文件导出完成!");}}return success;}//插入图片的函数,fieldName为字段名,imageUrl为图片路径private static void insertImage(AcroFields form, PdfStamper ps, String fieldName,String imageUrl) throws IOException, DocumentException {if(imageUrl!=null){//获取fieldName所在的页码int pageNo = form.getFieldPositions(fieldName).get(0).page;Rectangle signRect = form.getFieldPositions(fieldName).get(0).position;float x = signRect.getLeft();float y = signRect.getBottom();Image image = Image.getInstance(imageUrl);// 获取操作的页面PdfContentByte overContent = ps.getOverContent(pageNo);// 根据域的大小缩放图片image.scaleToFit(signRect.getWidth(), signRect.getHeight());// 添加图片image.setAbsolutePosition(x, y);overContent.addImage(image);ps.setFormFlattening(true);}} //生成二维码图片并插入图片的函数private static void insertQRCodeImage(AcroFields form, PdfStamper ps, String fieldName, String qrCodeUrl,int width,int height) throws IOException, DocumentException {if(qrCodeUrl!=null&&!qrCodeUrl.equals("")){int pageNo = form.getFieldPositions(fieldName).get(0).page;Rectangle signRect = form.getFieldPositions(fieldName).get(0).position;float x = signRect.getLeft();float y = signRect.getBottom();// 生成二维码BarcodeQRCode barcodeQRCode=new BarcodeQRCode(qrCodeUrl,width,height,null);Image image = barcodeQRCode.getImage();// 获取操作的页面PdfContentByte overContent = ps.getOverContent(pageNo);// 根据域的大小缩放图片image.scaleToFit(signRect.getWidth(), signRect.getHeight());// 添加二维码图片到pdf中image.setAbsolutePosition(x, y);overContent.addImage(image);ps.setFormFlattening(true);}}
}

实现结果:

在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/143438.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

攻防世界---->流浪者

做题笔记。 下载 查壳。 32ida打开。 程序运行状态&#xff1a; 一开始以为&#xff0c;&#xff0c;&#xff0c;base62 去解密 不对。。哈哈哈。 跟进看看。 动调一下发现&#xff0c;input不在这个函数里面。 对函数进行跟踪。 逆推就好。 先通过密文&#xff0c;逆推密文…

动手学习RAG: 大模型向量模型微调 intfloat/e5-mistral-7b-instruct

动手学习RAG: 向量模型动手学习RAG: moka-ai/m3e 模型微调deepspeed与对比学习动手学习RAG&#xff1a;rerank模型微调实践 bge-reranker-v2-m3动手学习RAG&#xff1a;迟交互模型colbert微调实践 bge-m3动手学习RAG: 大模型向量模型微调 intfloat/e5-mistral-7b-instruct动手学…

5.内容创作的未来:ChatGPT如何辅助写作(5/10)

引言 在信息爆炸的时代&#xff0c;内容创作已成为连接品牌与受众、传递信息与知识、以及塑造文化与观念的重要手段。随着数字媒体的兴起&#xff0c;内容创作的需求日益增长&#xff0c;对创作者的写作速度和质量提出了更高的要求。人工智能&#xff08;AI&#xff09;技术的…

国家标准参编周期一般是多久?参编的流程有哪些?

在当今快速发展的时代&#xff0c;标准的重要性日益凸显。国家标准作为规范行业发展、保障产品质量、促进技术进步的重要依据&#xff0c;吸引着众多企业积极参与其中。而国家标准参编&#xff0c;为企业提供了一个提升自身竞争力、展示技术实力的良好平台。那么&#xff0c;国…

SLAM面经1(百度)

百度面经 百度共三面,如果面试效果俱佳,会增加一个hr面。前二面主要是技术面,分为在线coding+代码知识+专业知识+工程能力。第三面是主管面,偏向于管理方面,和hr面相似。 一面 1)在线coding 在线coding的考试内容为下面力扣的变种。 2)专业面 (1)VINS-FUSION与ORB…

佰朔资本:本周2只新股发行!水性印花胶浆细分龙头将登陆A股

到发稿&#xff0c;本周网上发行2只新股披露发行价。北交所新股铜冠矿建发行价为4.33元&#xff0c;发行市盈率15.48倍&#xff0c;工作最近一个月平均动态市盈率5.89倍。创业板新股长联科技发行价为21.12元&#xff0c;发行市盈率17倍&#xff0c;工作最近一个月平均动态市盈率…

合宙Air201模组LuatOS扩展功能:温湿度传感器篇!

通过前面几期的学习&#xff0c;同学们的学习热情越来越高。 合宙Air201模组除了支持3种定位方式外&#xff0c;还具有丰富的扩展功能&#xff0c;比如&#xff1a;通过外扩BTB链接方案&#xff0c;最多可支持21个IO接口&#xff1a;SPI、I2C、UART等多种接口全部支持。 本期…

我的AI工具箱Tauri版-VideoReapeat视频解说复述克隆

本教程基于自研的AI工具箱Tauri版进行VideoReapeat视频解说复述克隆。 视频解说复述克隆样片 《我的AI工具箱Tauri版-VideoReapeat视频解说复述克隆》样片 进入软件后可以直接搜索 VideoReapeat 或者依次点击 Python音频技术/视频tools 进入该模块。 该模块会消耗TTS文本转语…

P1079 [NOIP2012 提高组] Vigenère 密码------------------------------P1703 那个什么密码2

P1079 [NOIP2012 提高组] Vigenre 密码 题目描述 16 世纪法国外交家 Blaise de Vigenre 设计了一种多表密码加密算法 Vigenre 密码。Vigenre 密码的加密解密算法简单易用&#xff0c;且破译难度比较高&#xff0c;曾在美国南北战争中为南军所广泛使用。 在密码学中&#xff…

人工智能(AI)的影响下人类的生活样子

讨论在人工智能(AI)的影响下人类的生活是什么样子 在21世纪的今天&#xff0c;人工智能&#xff08;AI&#xff09;已经不再是遥不可及的未来科技&#xff0c;而是悄然渗透到我们日常生活的每一个角落&#xff0c;以一种前所未有的方式改变着我们的生活方式、工作模式乃至社会…

在表格的函数参数中使用通配符

条件&#xff1a;条件的形式为数字、表达式、单元格引用或文本&#xff0c;它定义了要计数的单元格范围。 例如&#xff0c;条件可以表示为32、">32"、B4、"apples"或"32"。 可以在条件中使用通配符&#xff0c;即问号(?)和星号(*)。问号匹…

Python编码系列—Python组合模式:构建灵活的对象组合

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

7 种有助于压缩图像的最佳图像压缩工具

您的网站是否由于图像文件过大而表现不佳&#xff1f;现在是时候探索最适合您网站的图像压缩工具了。 影响页面加载速度的因素之一是需要更多资源来加载的庞大视觉对象&#xff0c;例如叠加图像。在这种情况下&#xff0c;您应该先压缩视觉对象&#xff0c;然后再将其上传到您…

什么护眼台灯性价比高又亮?五款性能好的护眼台灯推荐

现在不止是小孩子需要保护眼睛&#xff0c;而我们的成年人也是需要保护眼睛。因为现在上班压力大&#xff0c;下班回家加班也成了日常操作&#xff0c;每天用眼&#xff0c;对着电子产品的时间也会很久&#xff0c;眼睛会感到不舒服。回到家中&#xff0c;我们就需要一款好的护…

【2024华为杯研究生数学建模竞赛】比赛思路、代码、论文更新中.....

目录 赛中助攻华为杯常用建模算法&#x1f5d2;️&#x1f5d2;️历年优秀论文⭐⭐论文模板1&#xff09;论文模板2&#xff09;基础画图能力 绘图与数据分析软件SPSSPRO 2024研究生数学建模竞赛时间为9月21日&#xff08;周六&#xff09;8:00至9月25日&#xff08;周三&#…

HTML5精粹练习第1章博客

第1章博客 用最新的HTML5标签来联系博客 HTML文件&#xff1a;第1章博客.html <!DOCTYPE html> <html><head><meta charset"utf-8"><meta name"description" content"这是一个HTML5案例" /><meta name"…

香港科技大学工学院2025/2026年度硕士研究生(MSc)项目招生宣讲会——华南师范大学佛山校区

&#x1f514;香港科技大学工学院2025/2026年度硕士研究生&#xff08;MSc&#xff09;项目招生宣讲会 &#x1f559;时间&#xff1a;2024年9月26日&#xff08;星期四&#xff09;19:00 &#x1f3e0;地点&#xff1a;华南师范大学佛山校区图书馆电影院 &#x1f386;2024T…

【楚怡杯】职业院校技能大赛 “云计算应用” 赛项样题七

某企业根据自身业务需求&#xff0c;实施数字化转型&#xff0c;规划和建设数字化平台&#xff0c;平台聚焦“DevOps开发运维一体化”和“数据驱动产品开发”&#xff0c;拟采用开源OpenStack搭建企业内部私有云平台&#xff0c;开源Kubernetes搭建云原生服务平台&#xff0c;选…

ClickHouse 与 Quickwit 集成实现高效查询

1. 概述 在当今大数据分析领域&#xff0c;ClickHouse 作为一款高性能的列式数据库&#xff0c;以其出色的查询速度和对大规模数据的处理能力&#xff0c;广泛应用于在线分析处理 (OLAP) 场景。ClickHouse 的列式存储和并行计算能力使得它在处理结构化数据查询时极具优势&…

[atcoder agc 004 c] AND Grid

题目链接 题目简述 给定一个 H W H \times W HW 的网格图&#xff0c;有些位置已经被涂色。要求构造两个相同大小的网格图&#xff0c;并且在上面涂色&#xff0c;需要保证颜色四联通。满足这两个网格的涂色部分的重合位置恰好是给定的网格图的涂色位置。 题目保证边界上不…