导出pdf 加密、加水印、加页脚
1.依赖
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.10</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.65</version>
</dependency>
2.工具类
import com.itextpdf.text.*; import com.itextpdf.text.pdf.*; import lombok.SneakyThrows;import java.io.IOException;public class PdfPageSongTiUtil extends PdfPageEventHelper {/*** 文档字体大小,页脚页眉最好和文本大小一致*/public int presentFontSize = 10;/*** 文档页面大小,最好前面传入,否则默认为A4纸张*/public Rectangle pageSize = PageSize.A4;// 模板public PdfTemplate total;// 基础字体对象public BaseFont bf = null;// 利用基础字体生成的字体对象,一般用于生成中文文字public Font fontDetail = null;/**** 无参构造方法.**/public PdfPageSongTiUtil() {}public PdfPageSongTiUtil(int presentFontSize, Rectangle pageSize) {this.presentFontSize = presentFontSize;this.pageSize = pageSize;}public void setPresentFontSize(int presentFontSize) {this.presentFontSize = presentFontSize;}/**** 文档打开时创建模板*/@Overridepublic void onOpenDocument(PdfWriter writer, Document document) {// 共 页 的矩形的长宽高total = writer.getDirectContent().createTemplate(50, 50);}/****关闭每页的时候,写入页眉*/@SneakyThrows@Overridepublic void onEndPage(PdfWriter writer, Document document) {this.addPage(writer, document);}//加分页public void addPage(PdfWriter writer, Document document) throws IOException, DocumentException {//设置分页页眉页脚字体try {if (bf == null) {bf = BaseFont.createFont("template/GB2312.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);}if (fontDetail == null) {fontDetail = new Font(bf, presentFontSize, Font.NORMAL);// 数据体字体}} catch (DocumentException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}// 1.写入页眉 // ColumnText.showTextAligned(writer.getDirectContent(), // Element.ALIGN_LEFT, new Phrase(header, fontDetail), // document.left(), document.top() + 20, 0);// 2.写入前半部分的 第 X页/共Phrase footer = new Phrase("来源:中学生统一服务平台", fontDetail);// 4.拿到当前的PdfContentBytePdfContentByte cb = writer.getDirectContent();// 5.写入页脚1,x轴就是(右margin+左margin + right() -left()- len)/2.0FColumnText.showTextAligned(cb,Element.ALIGN_CENTER,footer,document.right()-document.rightMargin()-5 ,document.bottom() - 10, 0);// 调节模版显示的位置//加水印addWatermark(writer);}/**** 关闭文档时,替换模板,完成整个页眉页脚组件*/@Overridepublic void onCloseDocument(PdfWriter writer, Document document) {// 关闭文档的时候,将模板替换成实际的 Y 值total.beginText();// 生成的模版的字体、颜色total.setFontAndSize(bf, presentFontSize);//页脚内容拼接 如 第1页/共2页//String foot2 = " " + (writer.getPageNumber()) + " 页";//页脚内容拼接 如 第1页/共2页String foot2 = String.valueOf(writer.getPageNumber());// 模版显示的内容total.showText(foot2);total.endText();total.closePath();}// 加水印public void addWatermark(PdfWriter writer) throws IOException, DocumentException {PdfContentByte waterMar = writer.getDirectContentUnder();String text="全国中学生会议";waterMar.beginText();PdfGState gs=new PdfGState();//透明度gs.setFillOpacity(0.2F);waterMar.setFontAndSize(BaseFont.createFont("template/GB2312.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED),12);waterMar.setGState(gs);for (int x = 0; x <=800; x+=200) {for (int y = 0; y < 800; y+=100) {//水印对齐方式 水印内容 x坐标 y坐标 旋转角度waterMar.showTextAligned(Element.ALIGN_RIGHT,text,x,y,35);}}waterMar.setColorFill(BaseColor.GRAY);waterMar.endText();waterMar.stroke();}}
3.实体类
@Data
public class PersonnelInfo {private String name;private String phoneNumber;private String sex;private String schoolName;private String workerPosition;private String workerDate;private String certificate;private String OtherCertificate;}
4. 例子
@GetMapping(value = "/createFilePdf", produces = MediaType.APPLICATION_JSON_VALUE)public void createFilePdf(HttpServletRequest request, HttpServletResponse response) throws IOException, DocumentException {request.getSession();response.setContentType("application/pdf;charset=UTF-8");response.setCharacterEncoding("utf-8");String fileName =URLEncoder.encode( "导出pdf人员登记表","UTF-8");response.setHeader("Content-Disposition", "attachment;filename*=utf-8''" + fileName+".pdf");List<PersonnelInfo> list=new ArrayList<>();PersonnelInfo personnel=new PersonnelInfo();personnel.setName("张三");personnel.setSex("男");personnel.setPhoneNumber("1101001001");personnel.setSchoolName("清华附中");personnel.setWorkerPosition("北京");personnel.setWorkerDate("1999-12-12");personnel.setCertificate("特级数学老师");personnel.setOtherCertificate("二级心理咨询");list.add(personnel);// 定义全局的字体静态变量Font content = null;Font fontHead = null;try {// 不同字体(这里定义同一种字体:包含不同字号、不同style)BaseFont bfChinese = BaseFont.createFont("template/GB2312.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);content = new Font(bfChinese, 11, Font.NORMAL);//使用字体并给出颜色fontHead = new Font(bfChinese,20,Font.BOLD,BaseColor.BLACK);} catch (Exception e) {e.printStackTrace();}Document document=new Document(new RectangleReadOnly(850F,590F));document.setMargins(50,50,45,45);PdfWriter writer = PdfWriter.getInstance(document, response.getOutputStream());//用户密码 保证不能修改 设置所有者密码即可String pwdUser="";//所有者密码String pwdOwn="18956723.";writer.setEncryption("".getBytes(),pwdOwn.getBytes(),PdfWriter.ALLOW_PRINTING,PdfWriter.ENCRYPTION_AES_128);//添加页脚、水印等PdfPageSongTiUtil myHeadFooter=new PdfPageSongTiUtil();writer.setPageEvent(myHeadFooter);//opendocument.open();Paragraph paragraphHead1=new Paragraph("人员信息列表",fontHead);paragraphHead1.setAlignment(Element.ALIGN_CENTER);document.add(paragraphHead1);document.add(new Paragraph("\n"));PdfPCell cellBg[]=new PdfPCell[2];float[] width={35f,30f};//创建表格PdfPTable table=new PdfPTable(width);table.setWidthPercentage(100.0f);//表格顶端文本PdfPCell celltTableTop[]=new PdfPCell[2];float[] widthTop={55f,15f};PdfPTable tableTop=new PdfPTable(widthTop);tableTop.setWidthPercentage(100.0f);celltTableTop[0]=new PdfPCell(new Paragraph("会议开班负责人(签字):",content));celltTableTop[0].setBorder(0);tableTop.addCell(celltTableTop[0]);celltTableTop[1]=new PdfPCell(new Paragraph("日期:",content));celltTableTop[1].setBorder(0);tableTop.addCell(celltTableTop[1]);document.add(tableTop);//数据列PdfPCell cell=null;//11列 人员表头float[] width2={10f,15f,10f,20f,25f,25f,25f,25f,25f};PdfPTable tabl2=new PdfPTable(width2);PdfPTableHeader pdfPTableHeader=new PdfPTableHeader();tabl2.setSpacingBefore(5f);tabl2.setWidthPercentage(100.0f);//表头 换页显示tabl2.setHeaderRows(1);tabl2.getDefaultCell().setHorizontalAlignment(1);List<String> listTitle=Arrays.asList("序号","姓名","性别","联系方式","工作地点","工作岗位","入职日期","教学相关资格证书","其他相关资质证书");for (String title : listTitle) {tabl2.addCell(createCell(title,content));}int index=0;for (PersonnelInfo personnelInfo : list) {index++;PdfPCell cel1=new PdfPCell(new Paragraph(String.valueOf(index),content));PdfPCell cel2=new PdfPCell(new Paragraph(personnelInfo.getName(),content));PdfPCell cel3=new PdfPCell(new Paragraph(personnelInfo.getSex(),content));PdfPCell cel4=new PdfPCell(new Paragraph(personnelInfo.getPhoneNumber(),content));PdfPCell cel5=new PdfPCell(new Paragraph(personnelInfo.getSchoolName(),content));PdfPCell cel6=new PdfPCell(new Paragraph(personnelInfo.getWorkerPosition(),content));PdfPCell cel7=new PdfPCell(new Paragraph(personnelInfo.getWorkerDate(),content));PdfPCell cel8=new PdfPCell(new Paragraph(personnelInfo.getCertificate(),content));PdfPCell cel9=new PdfPCell(new Paragraph(personnelInfo.getOtherCertificate(),content));cel1.setVerticalAlignment(Element.ALIGN_MIDDLE);cel1.setHorizontalAlignment(Element.ALIGN_CENTER);cel2.setVerticalAlignment(Element.ALIGN_MIDDLE);cel2.setHorizontalAlignment(Element.ALIGN_CENTER);cel3.setVerticalAlignment(Element.ALIGN_MIDDLE);cel3.setHorizontalAlignment(Element.ALIGN_CENTER);cel4.setVerticalAlignment(Element.ALIGN_MIDDLE);cel4.setHorizontalAlignment(Element.ALIGN_CENTER);cel5.setVerticalAlignment(Element.ALIGN_MIDDLE);cel5.setHorizontalAlignment(Element.ALIGN_CENTER);cel6.setVerticalAlignment(Element.ALIGN_MIDDLE);cel6.setHorizontalAlignment(Element.ALIGN_CENTER);cel7.setVerticalAlignment(Element.ALIGN_MIDDLE);cel7.setHorizontalAlignment(Element.ALIGN_CENTER);cel8.setVerticalAlignment(Element.ALIGN_MIDDLE);cel8.setHorizontalAlignment(Element.ALIGN_CENTER);cel9.setVerticalAlignment(Element.ALIGN_MIDDLE);cel9.setHorizontalAlignment(Element.ALIGN_CENTER);tabl2.addCell(cel1);tabl2.addCell(cel2);tabl2.addCell(cel3);tabl2.addCell(cel4);tabl2.addCell(cel5);tabl2.addCell(cel6);tabl2.addCell(cel7);tabl2.addCell(cel8);tabl2.addCell(cel9);}document.add(tabl2);Paragraph paragraphEnd1=new Paragraph("会议结束负责人签字:",content);paragraphEnd1.setIndentationLeft(460);paragraphEnd1.setSpacingBefore(10f);document.add(paragraphEnd1);//closedocument.close();}/**** @param cont 表头* @param font 字体* @return*/static PdfPCell createCell(String cont,Font font){PdfPCell cell=new PdfPCell(new Paragraph(cont,font));cell.setVerticalAlignment(Element.ALIGN_MIDDLE);cell.setHorizontalAlignment(Element.ALIGN_CENTER);cell.setFixedHeight(30);cell.setBackgroundColor(new BaseColor(153,203,255));return cell;}
相关文章:

导出pdf 加密、加水印、加页脚
1.依赖 <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.10</version> </dependency> <dependency> …...

Flutter 仿抖音 TikTok 上下滑动 播放视频
Flutter 仿抖音 TikTok 上下滑动 播放视频UI框架,视频播放使用 video_player github:GitHub - PangHaHa12138/TiktokVideo: Flutter 仿抖音 TikTok 上下滑动 播放视频UI框架 实现功能: 1.上下滑动自动播放切换视频,loading 封面…...

计算机网络——网络层(2)
计算机网络——网络层(2) 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU)前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家, [跳转到网站](https://www.captainbed.…...
01-16Maven-SpringBoot入门
Maven继承Maven高级SpringSpringBoot入门 Maven 一、概念及功能 概念:Maven是Apache软件基金会组织维护的一款专门为Java项目提供项目构建和依赖管理的工具 1.1作用: 项目构建 构建:是一个将代码从开发阶段到生产阶段的一个过程…...

微信小程序(二十七)列表渲染改变量名
注释很详细,直接上代码 上一篇 新增内容: 1.改变默认循环单元item变量名 2.改变默认循环下标index变量名 基础模板有问题可以先看上一篇 源码: index.wxml <view class"students"><view class"item"><te…...

k8s之安装部署及kuboard发布应用
目录 环境准备 系统规划 配置免密 将桥接的IPv4流量传递到iptables的链 系统基础配置 安装docker 安装docker及基础依赖 配置docker的仓库下载地址 部署k8s 添加阿里云的k8s源 安装kubeadm,kubelet和kubectl 初始化masteer节点 部署node节点 部署flanne…...

JProfiler for Mac:提升性能和诊断问题的终极工具
在当今的高性能计算和多线程应用中,性能优化和问题诊断是至关重要的。JProfiler for Mac 是一个强大的性能分析工具,旨在帮助开发者更好地理解其应用程序的运行情况,提升性能并快速诊断问题。 JProfiler for Mac 的主要特点包括:…...
力扣202-快乐数
快乐数 题目链接 解题思路: 两个指针,一快一慢,如果相遇,就会生成环如果环内元素为1,那么就可以返回 class Solution { public:int get(int n){int res 0;while(n){res (n%10) * (n%10);n / 10;}return res;}bool isHappy(int …...

牛客寒假训练营H题
思路:找出所有m的子集,加到价值中,找出最大价值即可。 代码: void solve(){int n, m;cin >> n >> m;vector<pii>a(n 1);for(int i 1;i < n;i )cin >> a[i].first >> a[i].second;int ans 0…...
ubuntu22.04@laptop 常用基础环境安装
ubuntu22.04laptop 常用基础环境安装 1. 源由2. 步骤2.1 安装ubuntu22.04 LTS系统2.2 必备软件安装2.3 基本远程环境2.3.1 远程ssh登录2.3.2 samba局域网2.3.3 VNC远程登录 2.4 开发环境安装 3. 总结 1. 源由 应朋友要求,整理下一个个人常用的工作笔记本常用开发环…...

Linux第41步_移植ST公司uboot的第2步_修改网络驱动_USB OTG设备树_LCD驱动_以及编译和烧写测试
移植ST公司uboot的第1步,创建配置文件、设备树、修改电源管理和sdmmc节点后,还需要进一部修改,如:网络驱动、USB OTG设备树、LCD驱动,以及编译和烧写测试。 一、在虚拟机中,使用VSCode打开my_uboot工作区 …...
瑞芯微1808模型转换(onnx到rknn)环境配置过程
瑞芯微1808模型转换(onnx → \to →rknn)环境配置 阅读本解决方案前,请读者确保已经根据官方的相关教程【rknn_model_zoo/common/rknn_converter at v1.5.0 airockchip/rknn_model_zoo (github.com)】完成其他配置文件的修改,以…...

测试ASP.NET Core项目调用EasyCaching的基本用法(InMemory)
EasyCaching属于开源缓存库,支持基本缓存方式及高级缓存用法,提高用户操作缓存的效率。EasyCaching支持的缓存方式包括以下类型,本文学习最基础的InMemory方式的基本用法。 EasyCaching.InMemory包属于基于内存的缓存库,使用的…...

机器学习系列-2 线性回归训练损失
机器学习系列-2 线性回归&训练损失 学习内容来自:谷歌ai学习 https://developers.google.cn/machine-learning/crash-course/framing/check-your-understanding?hlzh-cn 本文作为学习记录1 线性回归: 举例:蝉(昆虫物种&…...
spring-boot-actuator 服务监控
1 概述 服务启动时,通过spring-boot-actuator 监控es等服务是否连接成功等 2 依赖 <!-- 服务监控 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId><…...

窥探向量乘矩阵的存内计算原理—基于向量乘矩阵的存内计算
在当今计算领域中,存内计算技术凭借其出色的向量乘矩阵操作效能引起了广泛关注。本文将深入研究基于向量乘矩阵的存内计算原理,并探讨几个引人注目的代表性工作,如DPE、ISAAC、PRIME等,它们在神经网络和图计算应用中表现出色&…...

Python flask 表单详解
文章目录 1 概述1.1 request 对象 2 示例2.1 目录结构2.2 student.html2.3 result.html2.4 app.py 1 概述 1.1 request 对象 作用:来自客户端网页的数据作为全局请求对象发送到服务器request 对象的重要属性如下: 属性解释form字典对象,包…...

【Tomcat与网络3】Tomcat的整体架构
目录 1.演进1:将连接和处理服务分开 2演进2:Container的演进 3 再论Tomcat的容器结构 4 Tomcat处理请求的过程 5 请求的处理过程与Pipeline-Valve管道 在前面我们介绍了Servlet的基本原理,本文我们结合Tomcat来分析一下如何设计一个大型…...

k8s中cert-manager管理https证书
前言 目前https是刚需,但证书又很贵,虽然阿里云有免费的,但没有泛域名证书,每有一个子域名就要申请一个证书,有效期1年,1年一到全都的更换,太麻烦了。经过搜索,发现了自动更新证书神器cert-manager;当然cert-manager是基于k8s的。 安装采用Helm方式 Chart地址: ht…...

如何搭建私有云盘SeaFile并实现远程访问本地文件资料
🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-hsDnDEybLME85dTx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…...
6板块公共数据典型应用场景【政务服务|公共安全|公共卫生|环境保护|金融风控|教育科研]
1. 政务服务 1.1 城市规划与管理 公共数据在城市规划与管理中可发挥关键作用。通过汇聚自然资源、建筑物、人口分布等基础数据,构建数字孪生城市模型,辅助城市总体规划编制、决策仿真模拟。在城市基础设施建设、安全运营、应急管理等方面,公共数据也是不可或缺的基础支撑。例…...

windows10下搭建nfs服务器
windows10下搭建nfs服务器 有参考这篇博客 Windows10搭建NFS服务 - fuzidage - 博客园 下载 NFS Server这个app 通过网盘分享的文件:nfs1268 (1).exe 链接: https://pan.baidu.com/s/1rE4h710Uh-13kWGXvjkZzw 提取码: mwa4 --来自百度网盘超级会员v5的分享 下载后…...
CSS中justify-content: space-between首尾贴边中间等距(两端元素紧贴左右边缘,中间元素等距均匀分布)
justify-content: space-between; 是 CSS Flexbox 布局中的一个属性值,主要作用是在弹性容器的主轴方向上均匀分布子元素,具有以下核心特性: 作用效果: 首尾贴边 第一个子元素紧贴容器起始端 最后一个子元素紧贴容器结束端 中…...

【P2P】直播网络拓扑及编码模式
以下从 P2P 直播的常见拓扑模式出发,分析各种方案的特点与适用场景,并给出推荐。 一、P2P 直播的核心挑战 实时性要求高 直播场景下,延迟必须控制在可接受范围(通常 <2 秒),同时要保证画面连贯、不卡顿。带宽分布不均 每个节点(观众)上传带宽与下载带宽差异较大,且…...
【HarmonyOS 5】 社交行业详解以及 开发案例
HarmonyOS 5通过分布式能力、响应式框架及AI技术,重构社交应用的交互范式,以下是分领域解析: 🧏 一、无障碍社交创新 听障人士实时通讯辅助 语音文字双向转译功能:对方语音实时转为文字显示,用户…...

linux下gpio控制
linux下gpio控制 文章目录 linux下gpio控制1.中断命令控制/sys/class/gpio/export终端命令控制led 2.应用程序控制 3.驱动代码控制 1.中断命令控制 通用GPIO主要用于产生输出信号和捕捉输入信号。每组GPIO均可以配置为输出输入以及特定的复用功能。 当作为输入时,内…...
JavaWeb预习(jdbc)
基础 1.驱动程序接口Driver 每种数据库都提供了数据库驱动程序,并且都提供了一个实现java.sql.Driver接口的类,称为Driver 对于MySql,其Driver类为com.mysql.jdbc.Driver,加载该类的语句为: Class.forName("c…...
LeetCode刷题 -- 542. 01矩阵 基于 DFS 更新优化的多源最短路径实现
LeetCode刷题 – 542. 01矩阵 基于 DFS 更新优化的多源最短路径实现 题目描述简述 给定一个 m x n 的二进制矩阵 mat,其中: 每个元素为 0 或 1返回一个同样大小的矩阵 ans,其中 ans[i][j] 表示 mat[i][j] 到最近 0 的最短曼哈顿距离 算法思…...
stm32——UART和USART
串口通信协议UART和USART 1. UART与USART协议详解 特性UART (Universal Asynchronous Receiver/Transmitter)USART (Universal Synchronous Asynchronous Receiver/Transmitter)全称通用异步收发器通用同步/异步收发器同步/异步异步:不共享时钟,数据通过…...
CSS3 的特性
目录 CSS3 的特性CSS3 的三大特性1. 层叠性2. 继承性3. 优先级 CSS3 新增特性1. 选择器2. 盒模型3. 背景4. 渐变5. 过渡6. 动画7. 2D/3D 变换8. 弹性布局9. 网格布局10. 媒体查询11. 多列布局12. 文字阴影和盒子阴影 CSS3 的特性 CSS3 的三大特性 1. 层叠性 定义:…...