当前位置: 首页 > news >正文

导出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框架&#xff0c;视频播放使用 video_player github&#xff1a;GitHub - PangHaHa12138/TiktokVideo: Flutter 仿抖音 TikTok 上下滑动 播放视频UI框架 实现功能&#xff1a; 1.上下滑动自动播放切换视频&#xff0c;loading 封面…...

计算机网络——网络层(2)

计算机网络——网络层&#xff08;2&#xff09; 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU)前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家&#xff0c; [跳转到网站](https://www.captainbed.…...

01-16Maven-SpringBoot入门

Maven继承Maven高级SpringSpringBoot入门 Maven 一、概念及功能 概念&#xff1a;Maven是Apache软件基金会组织维护的一款专门为Java项目提供项目构建和依赖管理的工具 1.1作用&#xff1a; 项目构建 构建&#xff1a;是一个将代码从开发阶段到生产阶段的一个过程&#xf…...

微信小程序(二十七)列表渲染改变量名

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.改变默认循环单元item变量名 2.改变默认循环下标index变量名 基础模板有问题可以先看上一篇 源码&#xff1a; index.wxml <view class"students"><view class"item"><te…...

k8s之安装部署及kuboard发布应用

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

JProfiler for Mac:提升性能和诊断问题的终极工具

在当今的高性能计算和多线程应用中&#xff0c;性能优化和问题诊断是至关重要的。JProfiler for Mac 是一个强大的性能分析工具&#xff0c;旨在帮助开发者更好地理解其应用程序的运行情况&#xff0c;提升性能并快速诊断问题。 JProfiler for Mac 的主要特点包括&#xff1a;…...

力扣202-快乐数

快乐数 题目链接 解题思路&#xff1a; 两个指针&#xff0c;一快一慢&#xff0c;如果相遇&#xff0c;就会生成环如果环内元素为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题

思路&#xff1a;找出所有m的子集&#xff0c;加到价值中&#xff0c;找出最大价值即可。 代码&#xff1a; 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. 源由 应朋友要求&#xff0c;整理下一个个人常用的工作笔记本常用开发环…...

Linux第41步_移植ST公司uboot的第2步_修改网络驱动_USB OTG设备树_LCD驱动_以及编译和烧写测试

移植ST公司uboot的第1步&#xff0c;创建配置文件、设备树、修改电源管理和sdmmc节点后&#xff0c;还需要进一部修改&#xff0c;如&#xff1a;网络驱动、USB OTG设备树、LCD驱动&#xff0c;以及编译和烧写测试。 一、在虚拟机中&#xff0c;使用VSCode打开my_uboot工作区 …...

瑞芯微1808模型转换(onnx到rknn)环境配置过程

瑞芯微1808模型转换&#xff08;onnx → \to →rknn&#xff09;环境配置 阅读本解决方案前&#xff0c;请读者确保已经根据官方的相关教程【rknn_model_zoo/common/rknn_converter at v1.5.0 airockchip/rknn_model_zoo (github.com)】完成其他配置文件的修改&#xff0c;以…...

测试ASP.NET Core项目调用EasyCaching的基本用法(InMemory)

EasyCaching属于开源缓存库&#xff0c;支持基本缓存方式及高级缓存用法&#xff0c;提高用户操作缓存的效率。EasyCaching支持的缓存方式包括以下类型&#xff0c;本文学习最基础的InMemory方式的基本用法。   EasyCaching.InMemory包属于基于内存的缓存库&#xff0c;使用的…...

机器学习系列-2 线性回归训练损失

机器学习系列-2 线性回归&训练损失 学习内容来自&#xff1a;谷歌ai学习 https://developers.google.cn/machine-learning/crash-course/framing/check-your-understanding?hlzh-cn 本文作为学习记录1 线性回归&#xff1a; 举例&#xff1a;蝉&#xff08;昆虫物种&…...

spring-boot-actuator 服务监控

1 概述 服务启动时&#xff0c;通过spring-boot-actuator 监控es等服务是否连接成功等 2 依赖 <!-- 服务监控 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId><…...

窥探向量乘矩阵的存内计算原理—基于向量乘矩阵的存内计算

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

Python flask 表单详解

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

【Tomcat与网络3】Tomcat的整体架构

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

k8s中cert-manager管理https证书

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

如何搭建私有云盘SeaFile并实现远程访问本地文件资料

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #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 通过网盘分享的文件&#xff1a;nfs1268 (1).exe 链接: https://pan.baidu.com/s/1rE4h710Uh-13kWGXvjkZzw 提取码: mwa4 --来自百度网盘超级会员v5的分享 下载后…...

CSS中justify-content: space-between首尾贴边中间等距(两端元素紧贴左右边缘,中间元素等距均匀分布)

justify-content: space-between; 是 CSS Flexbox 布局中的一个属性值&#xff0c;主要作用是在弹性容器的主轴方向上均匀分布子元素&#xff0c;具有以下核心特性&#xff1a; 作用效果&#xff1a; 首尾贴边 第一个子元素紧贴容器起始端 最后一个子元素紧贴容器结束端 中…...

【P2P】直播网络拓扑及编码模式

以下从 P2P 直播的常见拓扑模式出发,分析各种方案的特点与适用场景,并给出推荐。 一、P2P 直播的核心挑战 实时性要求高 直播场景下,延迟必须控制在可接受范围(通常 <2 秒),同时要保证画面连贯、不卡顿。带宽分布不均 每个节点(观众)上传带宽与下载带宽差异较大,且…...

【HarmonyOS 5】 社交行业详解以及 开发案例

HarmonyOS 5通过分布式能力、响应式框架及AI技术&#xff0c;重构社交应用的交互范式&#xff0c;以下是分领域解析&#xff1a; &#x1f9cf; ‌一、无障碍社交创新‌ ‌听障人士实时通讯辅助‌ 语音文字双向转译功能&#xff1a;对方语音实时转为文字显示&#xff0c;用户…...

linux下gpio控制

linux下gpio控制 文章目录 linux下gpio控制1.中断命令控制/sys/class/gpio/export终端命令控制led 2.应用程序控制 3.驱动代码控制 1.中断命令控制 通用GPIO主要用于产生输出信号和捕捉输入信号。每组GPIO均可以配置为输出输入以及特定的复用功能。 当作为输入时&#xff0c;内…...

JavaWeb预习(jdbc)

基础 1.驱动程序接口Driver 每种数据库都提供了数据库驱动程序&#xff0c;并且都提供了一个实现java.sql.Driver接口的类&#xff0c;称为Driver 对于MySql&#xff0c;其Driver类为com.mysql.jdbc.Driver&#xff0c;加载该类的语句为&#xff1a; Class.forName("c…...

LeetCode刷题 -- 542. 01矩阵 基于 DFS 更新优化的多源最短路径实现

LeetCode刷题 – 542. 01矩阵 基于 DFS 更新优化的多源最短路径实现 题目描述简述 给定一个 m x n 的二进制矩阵 mat&#xff0c;其中&#xff1a; 每个元素为 0 或 1返回一个同样大小的矩阵 ans&#xff0c;其中 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)全称通用异步收发器通用同步/异步收发器同步/异步异步&#xff1a;不共享时钟&#xff0c;数据通过…...

CSS3 的特性

目录 CSS3 的特性CSS3 的三大特性1. 层叠性2. 继承性3. 优先级 CSS3 新增特性1. 选择器2. 盒模型3. 背景4. 渐变5. 过渡6. 动画7. 2D/3D 变换8. 弹性布局9. 网格布局10. 媒体查询11. 多列布局12. 文字阴影和盒子阴影 CSS3 的特性 CSS3 的三大特性 1. 层叠性 定义&#xff1a…...