java生成PDF的Util

java使用itext生成pdf-CSDN博客

接上文

支持绘制表格

支持表格中的文本 字体加粗、字体上色、单元格背景上色,

支持拼接文本

支持单行文本 多种背景颜色、字体上色

支持自定义水印

废话不说先上效果图

工具类代码

package com.zxw.文件.PDF.util;import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import com.itextpdf.text.pdf.draw.LineSeparator;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.util.ObjectUtils;import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;/*** @projectName: ruoyi* @package: com.zxw.文件.PDF.util* @className: PDFUtil* @author: zhangxuewei* @description: TODO* @date: 2023/9/18 14:31* @version: 1.0*/
@Component
public class PDFUtil {public static String fontAddr;public static TableCell tableCell = new TableCell();@Value("${fontAddr}")public void setFontAddr(String fontAddr) {PDFUtil.fontAddr = fontAddr;}public static BaseFont getNormalBaseFont() throws IOException, DocumentException {BaseFont bf = BaseFont.createFont(fontAddr, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);return bf;}public static Font getNormalFont(BaseFont bf) {Font font = new Font(bf, 12);return font;}/*** 获取创建段落的类** @param font* @param fontSize 字体大小* @throws DocumentException*/public static Paragraph getParagraph(Font font, Float fontSize) {if (!ObjectUtils.isEmpty(fontSize)) {font.setSize(fontSize);}// 添加中文内容Paragraph paragraph = new Paragraph();paragraph.setFont(font);return paragraph;}/*** 获取创建段落的类** @param font* @param fontSize 字体大小* @param info     写入信息* @throws DocumentException*/public static Paragraph getParagraphAndWrite(Font font, Float fontSize, String info) {Paragraph paragraph = getParagraph(font, fontSize);// 添加中文内容paragraph.add(new Chunk(info));return paragraph;}/*** 拼接写入带有颜色的文本** @param paragraph       创建段落对象* @param info            写入的文本* @param backgroundColor 文本背景颜色* @return*/public static Paragraph appendWithBackgroundColor(Paragraph paragraph, String info, BaseColor backgroundColor) {// 添加中文内容Chunk chunk = new Chunk(info);if (!ObjectUtils.isEmpty(backgroundColor)) {chunk.setBackground(backgroundColor); // 根据索引获取背景颜色}paragraph.add(chunk);return paragraph;}/*** 拼接写入带有颜色的文本结束的方法** @param paragraph       创建段落对象* @param info            写入的文本* @param backgroundColor 文本背景颜色* @param document        文档对象* @throws DocumentException*/public static void appendWithBackgroundColorEnd(Paragraph paragraph, String info, BaseColor backgroundColor, Document document) throws DocumentException {appendWithBackgroundColor(paragraph, info, backgroundColor);document.add(paragraph);}/*** 正常书写** @param document* @param font* @param fontSize 字体大小* @param info     写入信息* @throws DocumentException*/public static void writeParagraph(Document document, Font font, Float fontSize, String info) throws DocumentException {if (!ObjectUtils.isEmpty(fontSize)) {font.setSize(fontSize);}// 添加中文内容Paragraph paragraph = new Paragraph(info, font);document.add(paragraph);}/*** 书写加粗的文字** @param document* @param bf* @param fontSize 字体大小* @param info     写入信息* @throws DocumentException*/public static void writeBoldParagraph(Document document, BaseFont bf, Float fontSize, String info) throws DocumentException {Font font = PDFUtil.getNormalFont(bf);font.setStyle(Font.BOLD);// 添加中文内容writeParagraph(document, font, fontSize, info);}/*** 书写带有颜色的字体** @param document* @param font* @param fontSize* @param fontColor* @throws DocumentException*/public static void writeColorParagraph(Document document, Font font, Float fontSize, BaseColor fontColor, String info) throws DocumentException {if (!ObjectUtils.isEmpty(fontColor))font.setColor(fontColor);writeParagraph(document, font, fontSize, info);}/*** 书写带有颜色的加粗字体** @param document* @param bf* @param fontSize* @param fontColor* @throws DocumentException*/public static void writeBoldColorParagraph(Document document, BaseFont bf, float fontSize, BaseColor fontColor, String info) throws DocumentException {Font font = PDFUtil.getNormalFont(bf);font.setStyle(Font.BOLD);writeColorParagraph(document, font, fontSize, fontColor, info);}/*** 书写带有颜色背景的字体** @param document* @param font* @param fontSize* @param backgroundColor 背景颜色* @param info* @throws DocumentException*/public static void writeColorBackgroundParagraph(Document document, Font font, float fontSize, BaseColor backgroundColor, String info) throws DocumentException {if (fontSize > 0) {font.setSize(fontSize);}Chunk chunk = new Chunk(info, font);chunk.setBackground(backgroundColor);Paragraph paragraphcb = new Paragraph();paragraphcb.add(chunk);document.add(paragraphcb);}/*** 书写带有颜色背景的加粗字体** @param document* @param font* @param fontSize* @param backgroundColor* @param info* @throws DocumentException*/public static void writeBoldColorBackgroundParagraph(Document document, Font font, float fontSize, BaseColor backgroundColor, String info) throws DocumentException {font.setStyle(Font.BOLD);writeColorBackgroundParagraph(document, font, fontSize, backgroundColor, info);}/*** 书写带有颜色背景的彩色字体** @param document* @param font* @param fontSize* @param backgroundColor* @param fontColor* @param info* @throws DocumentException*/public static void writeColorBackgroundColorFontParagraph(Document document, Font font, float fontSize, BaseColor backgroundColor, BaseColor fontColor, String info) throws DocumentException {if (fontSize > 0) {font.setSize(fontSize);}font.setColor(fontColor);Chunk chunk = new Chunk(info, font);chunk.setBackground(backgroundColor);Paragraph paragraphcb = new Paragraph();paragraphcb.add(chunk);document.add(paragraphcb);}/*** 书写带有颜色背景的彩色加粗字体** @param document* @param font* @param fontSize* @param backgroundColor* @param fontColor* @param info* @throws DocumentException*/public static void writeBoldColorBackgroundColorFontParagraph(Document document, Font font, float fontSize, BaseColor backgroundColor, BaseColor fontColor, String info) throws DocumentException {font.setStyle(Font.BOLD);writeColorBackgroundColorFontParagraph(document, font, fontSize, backgroundColor, fontColor, info);}/*** 画线** @param document* @param percentage 所占页面宽度的百分比* @param alignment  对齐方式  如:Element.ALIGN_RIGHT* @throws DocumentException*/public static void drawLine(Document document, float percentage, int alignment) throws DocumentException {LineSeparator line = new LineSeparator();line.setPercentage(percentage);line.setAlignment(alignment);line.setLineWidth(1);document.add(line);}/*** 书写表格** @param document* @param font* @param fontSize* @param numColumns* @param data* @throws DocumentException*/public static void writeTable(Document document, Font font, Float fontSize, int numColumns, BaseColor borderColor, List<Map<Integer, String>> data) throws DocumentException {PdfPTable table = new PdfPTable(numColumns); // 3列的表格table.setWidthPercentage(100);// 表格将占据整个页面的宽度table.setSpacingBefore(10f);// 表格与上面的内容之间将有 10 磅的间距table.setSpacingAfter(10f);// 表格与下面的内容之间将有 10 磅的间距for (int i = 0; i < data.size(); i++) {Map<Integer, String> sortedMap = data.get(i).entrySet().stream().sorted(Map.Entry.comparingByKey()).collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue,(e1, e2) -> e1, // 如果有重复键,保留第一个LinkedHashMap::new // 保持顺序));sortedMap.forEach((key, item) -> {PdfPCell cell = new PdfPCell(getParagraphAndWrite(font, fontSize, item));if (!ObjectUtils.isEmpty(borderColor)) {cell.setBorderColor(borderColor);} else {cell.setBorder(PdfPCell.NO_BORDER);}cell.setHorizontalAlignment(Element.ALIGN_CENTER);cell.setVerticalAlignment(Element.ALIGN_MIDDLE);cell.setPadding(5);table.addCell(cell);});}document.add(table);}/*** 书写表格** @param document     文档对象* @param columnWidths 列宽* @param bf           字体基础配置* @param borderColor  表格边框颜色* @param data* @throws DocumentException*/public static void writeTable(Document document, float[] columnWidths, BaseFont bf, BaseColor borderColor, List<Map<Integer, TableCell>> data) throws DocumentException {PdfPTable table = new PdfPTable(columnWidths.length); // 3列的表格table.setWidthPercentage(100);// 表格将占据整个页面的宽度table.setSpacingBefore(10f);// 表格与上面的内容之间将有 10 磅的间距table.setSpacingAfter(10f);// 表格与下面的内容之间将有 10 磅的间距table.setWidths(columnWidths);for (int i = 0; i < data.size(); i++) {Map<Integer, TableCell> sortedMap = data.get(i).entrySet().stream().sorted(Map.Entry.comparingByKey()).collect(Collectors.toMap(Map.Entry::getKey,Map.Entry::getValue,(e1, e2) -> e1, // 如果有重复键,保留第一个LinkedHashMap::new // 保持顺序));sortedMap.forEach((key, item) -> {TableCell tableCell = item;Font font = PDFUtil.getNormalFont(bf);if (tableCell.isBold())font.setStyle(Font.BOLD);if (!ObjectUtils.isEmpty(tableCell.getFontColor()))font.setColor(tableCell.getFontColor());if (!ObjectUtils.isEmpty(tableCell.getFontSize()))font.setSize(tableCell.getFontSize());Chunk chunk = new Chunk(tableCell.getCellDataInfo(), font);if (!ObjectUtils.isEmpty(tableCell.getFontBackgroundColor()))chunk.setBackground(tableCell.getFontBackgroundColor());Paragraph paragraph = new Paragraph(chunk);PdfPCell cell = new PdfPCell(paragraph);if (!ObjectUtils.isEmpty(borderColor))cell.setBorderColor(borderColor);elsecell.setBorder(PdfPCell.NO_BORDER);if (!ObjectUtils.isEmpty(tableCell.getCellBackgroundColor()))cell.setBackgroundColor(tableCell.getCellBackgroundColor());if (!ObjectUtils.isEmpty(tableCell.getCellAlign()))cell.setHorizontalAlignment(tableCell.getCellAlign());elsecell.setHorizontalAlignment(Element.ALIGN_CENTER);cell.setVerticalAlignment(Element.ALIGN_MIDDLE);cell.setPadding(5);table.addCell(cell);});}document.add(table);}}

gitee地址:util-cloud: 小工具

所在controller:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/144224.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

本地搭建kafka并用java实现发送消费消息

1、下载kafka的jar包文件 https://www.apache.org/dyn/closer.cgi?path/kafka/3.1.0/kafka_2.12-3.1.0.tgz2、下载完成直接操作命令启动 1、打开新的terminal(终端)窗口&#xff0c;进入kafka的bin目录 启动zk./zookeeper-server-start.sh ../config/zookeeper.properties2、…

LinkedList与链表

目录 一、Arraylist的缺陷 二、链表 2.1 链表的概念和结构 2.2 链表的实现 三、链表面试题 3.1 删除链表中所有值为val的节点 3.2 反转一个单链表 3.3 链表的中间节点 3.4 将有序链表合并 3.5 输出倒数第k个节点 3.6 链表分割 3.7 链表的回文结构 3.8 找两个链表的公共节…

现场直击|亚数TrustAsia精彩亮相IOTE深圳物联网展,CSA联盟展台等你来!

2023年9月20日&#xff0c;IOTE 2023第二十届深圳国际物联网展在深圳国际会展中心&#xff08;宝安&#xff09;顺利开幕。作为物联网领域年度最重要的行业盛会之一&#xff0c;本次展会汇聚全球来自工业、物流、基建、智慧城市、智慧零售等领域的600企业、10万行业人士&#x…

严重影响Windows使用体验的一些建议

1内存不够用&#xff1a;通过观察我发现我的电脑已经评价到了90%的内存使用率 没有内存什么程序运行起来都会卡的&#xff0c;所以一定要把不用的PROGRAME给他删除掉。特别是那些自动启动的软件&#xff0c;如果实在不行&#xff0c;就把杀毒也给他卸载掉。 不良具体表现&…

Java基础面试题精选:深入探讨哈希表、链表和接口等

目录 1.ArrayList和LinkedList有什么区别&#xff1f;&#x1f512; 2.ArrayList和Vector有什么区别&#xff1f;&#x1f512; 3.抽象类和普通类有什么区别&#xff1f;&#x1f512; 4.抽象类和接口有什么区别&#xff1f;&#x1f512; 5.HashMap和Hashtable有什么区别&…

Ubuntu为什么键盘会出现乱字符

今天上午起来只是要简单打一个命令&#xff0c;需要输入一个"双引号&#xff0c;但是总是显示&#xff0c;我一开始以为是中了病毒&#xff0c;把键盘给改了&#xff0c;后来发现虚惊一场&#xff1a;出现这个原因是因为ubuntu的键盘设置有问题。 我把键盘设置为英国英语…

【C++进阶(六)】STL大法--栈和队列深度剖析优先级队列适配器原理

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 栈和队列 1. 前言2. 栈和队列的接口函数熟悉3. …

欧伟杰博士:突破算力边界,YashanDB实现理论与工程双重突围

作者介绍 *全文4767个字&#xff0c;阅读时长约12分钟。 背景 随着数字化进程的加速&#xff0c;数据处理的规模和速度需求持续攀升。传统数据库系统在处理大规模数据时&#xff0c;存在单表记录数不超过500万条的限制&#xff0c;这已成为业务发展的瓶颈。为了解决此问题&…

No146.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

MySQL5.7高级函数:JSON_ARRAYAGG和JSON_OBJECT的使用

前置准备 DROP TABLE IF EXISTS t_user; CREATE TABLE t_user (id bigint(20) NOT NULL,name varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci …

杀掉进程但是fastapi程序还在运行

两个脚本&#xff0c;一个运行fastapi服务&#xff0c;一个重启服务&#xff1a; 启动服务先&#xff1a; 发现问题&#xff0c;杀掉 server.sh 后&#xff0c;依旧有&#xff1a; 不知道为什么会出现这个&#xff0c;直接kill吧&#xff1a; server.sh: #!/bin/bashparpath/…

led灯什么牌子的质量好?Led护眼台灯排行榜

现在我们很多家长对自己孩子的视力十分关心&#xff0c;生怕自己的孩子是近视、远视、弱视等等。对于父母而言&#xff0c;在孩子读书压力大课业重的关键时期&#xff0c;为孩子选择合适的桌椅&#xff0c;保护灯具从而保护孩子的眼睛是非常重要的事情!那么买给孩子读书做功课的…

Matlab绘图函数subplot、tiledlayout、plot和scatter

一、绘图函数subplot subplot(m,n,p)将当前图窗划分为 mn 网格&#xff0c;并在 p 指定的位置创建坐标区。MATLAB按行号对子图位置进行编号。第一个子图是第一行的第一列&#xff0c;第二个子图是第一行的第二列&#xff0c;依此类推。如果指定的位置已存在坐标区&#xff0c;…

基于Java的音乐网站管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&…

前端uniapp防止页面整体滑动页面顶部以上,设置固定想要固定区域宽高

解决&#xff1a;设置固定想要固定区域宽高 目录 未改前图未改样式改后图改后样式 未改前图 未改样式 .main {display: flex;flex-direction: row;// justify-content: space-between;width: 100vw;// 防止全部移动到上面位置&#xff01;&#xff01;&#xff01;&#xff01…

No147.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

【在Ubuntu部署Docker项目】— PROJECT#1

一、说明 让我们深入了解 Docker。用docker构建web服务器。我们正在计划开发JavaScript API&#xff0c;建立MySQL数据库&#xff0c;并创建一个 PHP 网站使用 API 服务。Php Node.js Mysql — DockerSeries — Episode#1 二、系统架构概述 我们要构建的容器&#xff0c;是三…

Qt_C++读写NFC标签Ntag支持windows国产linux操作系统

本示例使用的发卡器&#xff1a;Android Linux RFID读写器NFC发卡器WEB可编程NDEF文本/智能海报/-淘宝网 (taobao.com) ntag2标签存储结构说明 #include "mainwindow.h" #include "./ui_mainwindow.h" #include <QDebug> #include "QLibrary&…

队列的使用以及模拟实现(C++版本)

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;强烈推荐优质专栏: &#x1f354;&#x1f35f;&#x1f32f;C的世界(持续更新中) &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;…

【每日一题】2703. 返回传递的参数的长度

2703. 返回传递的参数的长度 - 力扣&#xff08;LeetCode&#xff09; 请你编写一个函数 argumentsLength&#xff0c;返回传递给该函数的参数数量。 示例 1&#xff1a; 输入&#xff1a;args [5] 输出&#xff1a;1 解释&#xff1a; argumentsLength(5); // 1只传递了一个值…