news 2026/9/5 15:38:09

【pdf】根据PDF模版填充数据并生成新的PDF

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【pdf】根据PDF模版填充数据并生成新的PDF

准备模版

  1. 使用福昕高级PDF编辑器(本人用的这个,其他的也行,能作模版就行)
  2. 打开PDF文件点击表单选项,点击文本域
  3. 在需要填充数据的位置设计文本域
  4. 设置名称、提示
  5. 名称相当于 属性名,提示就是提示,说明这个是什么

导入依赖

<!--itext--> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.4.2</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.13</version> </dependency>

函数编写

generatePdf

放 ServiceIMpl 里就行,这个是直接浏览器下载生成后的附件

private final HttpServletResponse response; public PdfServiceImpl(HttpServletResponse response) { this.response = response; } public void generatePdf(Map<String, String> params) { // 读取资源文件夹下的模板 ClassPathResource resource = new ClassPathResource("pdf-template/文件.pdf"); InputStream inputStream = resource.getInputStream(); PdfReader reader = null; ByteArrayOutputStream bos = null; try { reader = new PdfReader(inputStream); bos = new ByteArrayOutputStream(); PdfStamper pdfStamper = new PdfStamper(reader, bos); AcroFields acroFields = pdfStamper.getAcroFields(); // 字体设置 BaseFont font = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); for (Map.Entry<String, String> param : params.entrySet()) { // 设置文本域的字体为中文字体 acroFields.setFieldProperty(param.getKey(), "textFont", font, null); // 将 map 中的值写到 pdf 模板对应的文本域中 acroFields.setField(param.getKey(), param.getValue()); } // 如果为false那么生成的PDF文件还能编辑,所以一定要设为true pdfStamper.setFormFlattening(true); pdfStamper.close(); // 返回文件 ServletOutputStream outputStream = response.getOutputStream(); outputStream.write(bos.toByteArray()); ServletUtils.writeAttachment(response, "新文件.pdf", bos.toByteArray()); } catch (IOException | DocumentException e) { e.printStackTrace(); } finally { try { assert bos != null; bos.close(); reader.close(); } catch (IOException e) { e.printStackTrace(); } } }

工具类

ServletUtils

import cn.hutool.core.io.IoUtil; import org.springframework.http.MediaType; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URLEncoder; /** * @Package_Name com.lesliecheung.javacase.util.pdf * @Author Leslie Lee * @TIME * @Version */ public class ServletUtils { /** * 返回附件 * * @param response 响应 * @param filename 文件名 * @param content 附件内容 */ public static void writeAttachment(HttpServletResponse response, String filename, byte[] content) throws IOException { // 设置 header 和 contentType response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8")); response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); // 输出附件 IoUtil.write(response.getOutputStream(), false, content); } }

获取模版inputStream

从url下载文件

// 获取文件地址 String urlPath = "模板资源文件链接-url"; // 下载文件 URL url = new URL(urlPath); URLConnection connection = url.openConnection(); // 设置请求超时时长为 5 秒 connection.setConnectTimeout(5*1000); // 读取数据 InputStream inputStream = connection.getInputStream();

从某路径下直接取

String urlPath = "D:\\文件.pdf"; File file1 = new File(urlPath); InputStream inputStream = new FileInputStream(file1);

新文件写入其他位置,操作bos.toByteArray()就好了

File file = new File("D:/新文件.pdf"); FileOutputStream fos = new FileOutputStream(file); BufferedOutputStream boss = new BufferedOutputStream(fos); boss.write(bos.toByteArray()); fos.close(); boss.close(); System.out.println("成了");

Leslie Lee 随笔

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/5 15:25:53

MAA明日方舟助手一键长草:从零配好日常自动化的完整指南

MAA明日方舟助手一键长草&#xff1a;从零配好日常自动化的完整指南 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手&#xff0c;全日常一键长草&#xff01;| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https://g…

作者头像 李华
网站建设 2026/9/5 15:25:25

PandasAI 零代码数据分析完整教程:用一句话问出数据和图表

PandasAI 零代码数据分析完整教程&#xff1a;用一句话问出数据和图表 【免费下载链接】pandas-ai Chat with your database or your datalake (SQL, CSV, parquet). PandasAI makes data analysis conversational using LLMs and RAG. 项目地址: https://gitcode.com/GitHub…

作者头像 李华
网站建设 2026/9/5 15:21:02

Wand-Enhancer:一键免费解锁Wand专业版

Wand-Enhancer&#xff1a;一键免费解锁Wand专业版 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer Wand 玩到一半弹出订阅页面&#xff0c;想要的 …

作者头像 李华