IText创建加盖公章的pdf文件并生成压缩文件

server/2024/11/24 6:26:42/

第一、前言
此前已在文章:Java使用IText根据pdf模板创建pdf文件介绍了Itex的基本使用技巧,本篇以一个案例为基础,主要介绍IText根据pdf模板填充生成pdf文件,并生成压缩文件。

第二、案例
以下面pdf模板为例,生成一个pdf文件,并将其压缩成zip文件。
在这里插入图片描述
在这里插入图片描述
第三、代码实现
1、将pdf模板机公章图片放到resource目录;
在这里插入图片描述
2、为提高效率,在系统启动后将模板加载到redis缓存中,代码如下;

java">import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.Objects;
import javax.annotation.PostConstruct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPoolAbstract;
@Component
public class InitConfig {private static final Logger logger = LoggerFactory.getLogger(InitConfig.class);private final JedisPoolAbstract jedisPool;@Autowiredpublic InitConfig(JedisPoolAbstract jedisPool) {super();this.jedisPool = jedisPool;}@PostConstructpublic void init() {try {Jedis jedis = jedisPool.getResource();final byte[] key="data".getBytes();if (jedis.exists(key)) {jedis.del(key);}InputStream is = this.getClass().getResourceAsStream("/template/data.pdf");jedis.set(key, streamToByteArray(is));final byte[] gongzhangKey="gongzhang".getBytes();if (jedis.exists(gongzhangKey)) {jedis.del(gongzhangKey);}is = this.getClass().getResourceAsStream("/image/gongzhang.png");jedis.set(gongzhangKey, streamToByteArray(is));} catch (Exception e) {logger.error("加载模板异常", e);}}public static byte[] streamToByteArray(InputStream is) throws Exception {ByteArrayOutputStream bos = null;try {bos = new ByteArrayOutputStream();byte[] b = new byte[1024];int len;while ((len = is.read(b)) != -1) {bos.write(b, 0, len);}return bos.toByteArray();} catch (Exception e) {logger.error("初始化模板", e);throw e;} finally {if (Objects.nonNull(bos)) {bos.close();}}}
}

3、操作文件工具类;

java">import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.Map;
import java.util.Objects;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import com.itextpdf.text.Image;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfWriter;public final class CommonFileUtil {private final static org.slf4j.Logger logger = org.slf4j.LoggerFactory.getLogger(CommonFileUtil.class);/*** 根据模板生成文件* @param paramMap* @param deskFile* @param template* @param gongZhang* @throws Exception*/public static void create(Map<String, Object> paramMap, File deskFile, final byte[] template, final byte[] gongZhang) throws Exception {PdfReader reader = null;PdfStamper stamp = null;try {reader = new PdfReader(template);stamp = new PdfStamper(reader, new FileOutputStream(deskFile));stamp.setEncryption(null, "lsy2024".getBytes(), PdfWriter.ALLOW_PRINTING, true);//取出报表模板中的所有字段AcroFields form = stamp.getAcroFields();//设置宋体BaseFont song = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);//设置参数for (Map.Entry<String, Object> entry : paramMap.entrySet()) {String key = entry.getKey();form.setFieldProperty(key, "textfont", song, null);form.setField(key, entry.getValue().toString());}//插入公章CommonFileUtil.insertImage(form, stamp, "gongzhang", gongZhang);//保存修改stamp.setFormFlattening(true);} catch (Throwable e) {logger.error("deskFile:{};文件生成失败!", deskFile, e);throw e;} finally {if (Objects.nonNull(stamp)) {stamp.close();}if (Objects.nonNull(reader)) {reader.close();}}}/*** pdf模板插入图片* @param form* @param stamper* @param filedName* @param gongZhang* @throws Exception*/public static void insertImage(AcroFields form, PdfStamper stamper, String filedName, final byte[] gongZhang) throws Exception {final Rectangle signRect = form.getFieldPositions(filedName).get(0).position;float x = signRect.getLeft();float y = signRect.getBottom();Image image = Image.getInstance(gongZhang);// 获取操作的页面PdfContentByte under = stamper.getOverContent(form.getFieldPositions(filedName).get(0).page);// 根据域的大小缩放图片image.scaleToFit(signRect.getWidth(), signRect.getHeight());// 添加图片image.setAbsolutePosition(x, y);under.addImage(image);}/*** 文件压缩* @param sourcePath* @param zipFilePath* @throws Exception*/public static void encryptNoPassword(String sourcePath, String zipFilePath) throws Exception {final long start = System.currentTimeMillis();byte[] buf = new byte[1024];File zipFile = new File(zipFilePath);//zip文件不存在,则创建文件,用于压缩ZipOutputStream zos = null;try {if (!zipFile.exists()) {zipFile.createNewFile();}zos = new ZipOutputStream(new FileOutputStream(zipFile));File file = new File(sourcePath);for (File sourceFile : file.listFiles()) {if (sourceFile == null || !sourceFile.exists()) {continue;}try (FileInputStream fis = new FileInputStream(sourceFile)) {//直接放到压缩包的根目录zos.putNextEntry(new ZipEntry(sourceFile.getName()));int len;while ((len = fis.read(buf)) > 0) {zos.write(buf, 0, len);}zos.closeEntry();}}} catch (Throwable e) {logger.error("sourcePath:{};zipFilePath:{};压缩文件失败!", sourcePath, zipFilePath, e);throw e;} finally {if (zos != null) {zos.close();}}logger.info("sourcePath:{};zipFilePath:{};压缩文件结束!{}", sourcePath, zipFilePath, System.currentTimeMillis() - start);}/*** 清理文件* @param path*/public static void clean(String path) {File rootPath = new File(path);if (rootPath.exists()) {if (rootPath.isDirectory()) {for (File file : rootPath.listFiles()) {clean(file.getPath());}}if (rootPath.isFile() || rootPath.listFiles().length == 0) {rootPath.delete();}}}
}

4、编写一个测试方法;

java">    public void print() {try {final String name = "张三";final String rootPath = "D:/temp/";File rootFile = new File(rootPath);if (!rootFile.exists()) {rootFile.mkdir();}File destFile = new File(rootPath + name + ".pdf");Map<String, Object> paramMap = new HashMap<String, Object>();paramMap.put("name", name);paramMap.put("birthDate", "2000-01-01");paramMap.put("currentDate", "2024  年  11  月  22  日");CommonFileUtil.create(paramMap, destFile, this.jedisPool.getResource().get("data".getBytes()), this.jedisPool.getResource().get("gongzhang".getBytes()));CommonFileUtil.encryptNoPassword(rootPath, "D:/data.zip");} catch (Exception e) {logger.error("==" + e);}}

5、调用并执行测试方法,将会在D盘创建压缩文件;
在这里插入图片描述
6、解压后如下;
在这里插入图片描述

欢迎大家积极留言交流学习心得!


http://www.ppmy.cn/server/144465.html

相关文章

C++ 编程指南05 - 编译时检查优于运行时检查

一&#xff1a;概述 编译时错误检查是C编程中一条非常重要的原则&#xff0c;它强调了在可能的情况下&#xff0c;应该优先依赖编译时检查&#xff08;静态检查&#xff09;而不是运行时检查。这样做的主要目的是提高程序的性能、安全性和可维护性。 编译时检查&#xff0c;即在…

深入理解 HTTP 请求头与请求体

在Web开发中&#xff0c;每一次HTTP请求都由请求行、请求头和请求体组成。虽然看似简单&#xff0c;但它们在数据传输和接口设计中扮演着至关重要的角色。本文将通过简要分析&#xff0c;帮助你深入理解请求头与请求体的关系和应用。 请求头&#xff1a;请求的元信息 请求头是…

基于物联网设计的人工淡水湖养殖系统(华为云IOT)_253

文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成【4】设计意义【5】国内外研究现状【6】摘要1.2 设计思路1.3 系统功能总结1.4 开发工具的选择【1】设备端开发【2】上位机开发1.5 参考文献1.6 系统框架图1.7 系统原理图1.8 实物图1.9…

学习日记_20241123_聚类方法(MeanShift)

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…

【深入学习大模型之:微调 GPT 使其自动生成测试用例及自动化用例】

深入学习大模型之&#xff1a;微调 GPT 使其自动生成测试用例及自动化用例 1. 自动生成测试用例目标训练过程代码示范 2. 自动写自动化代码目标训练过程代码示范可能的输出 3. 自动生成文本小说目标训练过程代码示范输出示例 4. 总结 1. 自动生成测试用例 目标 训练一个大语言…

什么是C++中的模板特化和偏特化?

C中的模板特化和偏特化是模板编程中的重要概念&#xff0c;它们允许程序员为特定类型或条件提供更具体的实现。 模板特化 模板特化是指为特定类型提供一个明确的实现&#xff0c;从而覆盖普通模板的通用实现。这通常在模板类或函数对某个特定类型的处理方式需要不同于一般类型…

HARCT 2025 新增分论坛6:基于机器人的智能处理控制

会议名称&#xff1a;机电液一体化与先进机器人控制技术国际会议 会议简称&#xff1a;HARCT 2025 大会时间&#xff1a;2025年1月3日-6日 大会地点&#xff1a;中国桂林 主办单位&#xff1a;桂林航天工业学院、广西大学、桂林电子科技大学、桂林理工大学 协办单位&#…

【安卓脚本】Android工程中文硬编码抽取

【安卓脚本】Android工程中文硬编码抽取 Android 原生工程 中文硬编码抽取功能支持流程示意项目地址 Android 原生工程 中文硬编码抽取 安卓在进行国际化多语言功能时经常会遇到一个头疼的问题&#xff0c;就是在以往的项目中往往存在大量的中文硬编码&#xff0c;这块人工处理…