Java使用lowagie根据模版动态生成PDF(无需额外设置系统字体)

Java使用lowagie根据模版动态生成PDF(无需额外设置系统字体)今天客户给了一个 docx 文档模板 让页面填写以后下载成 pdf 格式的文件 之前的项目里面用过 wkhtmltopdf 动态生成 pdf 但是如果使用这个方式需要先把 word 文件转化成 html 把数据填充到 html 以后 再转成 pdf 这样转起来太复杂了 今天无意中发现使用 lowagie 可以直接编辑 pdf

大家好,我是讯享网,很高兴认识大家。

话不多说,开始操作:

第一步 设置pdf模板

地址:https://pan.baidu.com/s/1NoPc0sNfk3hojJphUoPhyQ?pwd=cir7 密码:cir7 

讯享网

下载解压后执行这个文件:
在这里插入图片描述
讯享网

为PDF准备表单

在这里插入图片描述
表单准备完毕以后,如下图:
在这里插入图片描述
双击一个区域,自定义key:
在这里插入图片描述
设置两个字段试试:
在这里插入图片描述

保存一下,生成一个新的带表单的pdf。

使用maven的项目

导入依赖

讯享网 <dependency> <groupId>com.lowagie</groupId> <artifactId>itext</artifactId> <version>2.1.7</version> </dependency> <dependency> <groupId>cn.lesper</groupId> <artifactId>iTextAsian</artifactId> <version>3.0</version> </dependency> <dependency> <groupId>com.lowagie</groupId> <artifactId>itext-rtf</artifactId> <version>2.1.7</version> </dependency> 

java代码创建PdfUtils类

package pdf.kit.util; 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; / * @ClassName PdfUtils * @Description TODO * @Author lgn * @Date 16:43 2022/8/22 * @Version 1.0 / public class PdfUtils { public static void main(String[] args) throws Exception { export(); System.out.println("生成完成"); } public static void export(){ try { // pdf模板所在路径,就是网站制作好后下载的pdf模板路径 String fileName = "C:\\Users\\lgn\\Desktop\\JS-PAS-2208-001222.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("C:\\Users\\lgn\\Desktop\\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("executor", "钢铁侠"); data.put("reviewed", "小辣椒"); return data; } } 

验证一下:
在这里插入图片描述

小讯
上一篇 2025-01-10 19:53
下一篇 2025-03-12 22:05

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/125147.html