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

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:

相关文章:

java生成PDF的Util

java使用itext生成pdf-CSDN博客 接上文 支持绘制表格 支持表格中的文本 字体加粗、字体上色、单元格背景上色&#xff0c; 支持拼接文本 支持单行文本 多种背景颜色、字体上色 支持自定义水印 废话不说先上效果图 工具类代码 package com.zxw.文件.PDF.util;import com.…...

【openwrt学习笔记】新patch的制作和旧patch的修改

目录 一、参考资料二、使用QUILT工具添加补丁2.1 添加一个新的补丁2.2 编辑一个已存在的补丁2.3 补丁命名规范2.4 添加或修改内核补丁文件 三、使用diff 打补丁四、相关问题及解决方法4.1 make package/package-name/update Vs失败 一、参考资料 Working with patches 二、使…...

【GIT】Git clone https://xxx.git 报错仓库找不到,ssh却可以。

环境 MacBook Pro&#xff1a;13.0 (22A380)&#xff0c;Intel。 Python&#xff1a;3.10.9 序言 最近在Mac电脑中按照stable diffusion webUI 时&#xff0c;总是报&#xff1a; MacBook-Pro:openai yutao$ git clone https://github.com/AUTOMATIC1111/stable-diffusion-…...

Vue系列(三)之 基础语法下篇【事件处理,表单综合案例,组件通信】

一. 事件处理 在 Vue.js 中&#xff0c;v-on 指令被用于监听 DOM 事件&#xff0c;并在事件触发时执行相应的方法&#xff0c;这些方法就是事件处理器。v-on 指令有简写形式 &#xff0c;例如 click"handleClick" 会监听点击事件并执行 handleClick 方法。 事件处理…...

AI 编码助手 Codewhisperer 安装步骤和使用初体验

文章作者&#xff1a;为了自己加油 最近亚⻢逊云科技推出了一款基于机器学习的AI编程助手 Amazon Code Whisperer&#xff0c;可以实时提供代码建议。在编写代码时&#xff0c;它会自动根据现有的代码和注释给出建议。Amazon Code Whisperer与 GitHub Copilot 类似&#xff0c;…...

Python操作Elasticsearch

一、Python操作ES之基本使用 安装:pip3 install elasticsearch from elasticsearch import Elasticsearchobj = Elasticsearch() # 创建索引(Index) # result = obj.indices.create(index=user,ignore=400) # # print(result)# print(result) # 删除索引 # result = obj.i…...

面试打底稿② 专业技能的第二部分

简历原文 抽查部分 比较熟悉Nacos、Feign、SpringCloud Gateway等微服务的使用&#xff0c;有实际上手项目使用的经验&#xff1b;基本掌握Linux常用命令&#xff0c;了解Linux系统管理、网络管理、生产环境等必用服务&#xff0c;了解Docker的使用&#xff0c;在博客中多有关…...

java 对mybatis拦截Interceptor进行权限控制(条件修改),入参修改,返回修改

使用jsqlparser对sql解析拼装 基础准备 <dependency><groupId>com.github.jsqlparser</groupId><artifactId>jsqlparser</artifactId><version>4.5</version><scope>compile</scope> </dependency> <depende…...

鲲鹏+麒麟v10 sp1 打包tomcat

一、安装打包软件 yum install rpm-build yum install rpmdevtools 二、复制tar包 注意&#xff1a;如果要修改配置文件需要把tar包解压&#xff0c;修改tomcat配置文件 cp apache-tomcat-8.5.93.tar.gz /root/rpm-build/SOURCES 三、编辑/root/rpm-build/SOURCES/tomcat.…...

大屏大概是怎么个开发法(前端)

写在前面&#xff0c;博主是个在北京打拼的码农&#xff0c;从事前端工作5年了&#xff0c;做过十多个大大小小不同类型的项目&#xff0c;最近心血来潮在这儿写点东西&#xff0c;欢迎大家多多指教。 对于文章中出现的任何错误请大家批评指出&#xff0c;一定及时修改。有任何…...

什么是Selenium?使用Selenium进行自动化测试!

你知道什么是 Selenium 吗&#xff1f;你知道为什么要使用它吗&#xff1f;答案就在本文中&#xff0c;很高兴能够与你共飧。 自动化测试正席卷全球&#xff0c;Selenium 认证是业界最抢手的技能之一。 什么是 Selenium&#xff1f; Selenium 是一种开源工具&#xff0c;用于…...

第一章:最新版零基础学习 PYTHON 教程(第十七节 - Python 表达式语句–Python返回语句)

return 语句用于结束函数调用的执行,并将结果(return 关键字后面的表达式的值)“返回”给调用者。return 语句之后的语句不被执行。如果return语句没有任何表达式,则返回特殊值None。return 语句总体上用于调用函数,以便可以执行传递的语句。 注意: Return 语句不能在函数…...

前端碎知识点

1 统计字符串中每个字符出现的频率 const str fgasdfadfdasd;const result str.split().reduce((a, b) > {if (a[b]) {a[b];} else {a[b] 1;}return a; }, {});const resultNew str.split().reduce((a, b) > {// undefined&#xff0c;就是NaNa[b] || (a[b] 1);ret…...

【Leetcode Sheet】Weekly Practice 7

Leetcode Test 1462 课程表Ⅳ(9.12) 你总共需要上 numCourses 门课&#xff0c;课程编号依次为 0 到 numCourses-1 。你会得到一个数组 prerequisite &#xff0c;其中 prerequisites[i] [ai, bi] 表示如果你想选 bi 课程&#xff0c;你 必须 先选 ai 课程。 有的课会有直接…...

leetcode Top100(23)回文链表

给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true采用动态数组&#xff0c;判断数组对称就可以了&#xff08;这解法空间…...

WebGL绘制圆形的点

目录 前言 如何实现圆形的点&#xff1f; 片元着色器内置变量&#xff08;gl_FragCoord、gl_PointCoord&#xff09; gl_PointCoord的含义 示例程序&#xff08;RoundedPoint.js&#xff09; 代码详解 前言 本文将讨论示例程序RoundedPoint&#xff0c;该程序绘制了圆…...

《The Rise and Potential of Large Language Model Based Agents: A Survey》全文翻译

The Rise and Potential of Large Language Model Based Agents: A Surve - 基于 LLMs 的代理的兴起和潜力&#xff1a;一项调查 论文信息摘要1. 介绍2. 背景2.1 AI 代理的起源2.2 代理研究的技术趋势2.3 为什么大语言模型适合作为代理大脑的主要组件 论文信息 题目&#xff1…...

在线地图获取城市路网数据

在线地图获取城市路网数据 近期科研项目中&#xff0c;需要获取城市路网数据&#xff0c;于是详细阅读各大在线地图api接口&#xff0c;总结出来这么一条可行的思路&#xff1a; 首先获取城市轮廓根据城市轮廓把城市分割成若干个小块在每个小块中根据在线地图的POI检索接口&a…...

8.2 Jmeter if控制器使用

前提&#xff1a;jmeter脚本需要用到if控制器&#xff0c;if判断如果查询不到&#xff0c;则去新增。 1、添加if控制器 线程组-->逻辑控制器-->如果(if)控制器 1&#xff09;、Expression (must evaluate to true or false) &#xff1a;表达式&#xff08;值必须是tru…...

科技云报道:青云科技打出“AI算力牌”,抢跑“云+AI”新增市场

科技云报道原创。 近三年&#xff0c;中国云计算市场在多个维度同时发生着剧烈变化——疫情极大加速了全社会对于数字化的认知和接受程度&#xff1b;一系列云原生技术依托着开源和蓬勃的市场而迅速发展演变&#xff0c;更多产品和技术名词同时涌向市场&#xff1b;国际关系复…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

掌握 HTTP 请求:理解 cURL GET 语法

cURL 是一个强大的命令行工具&#xff0c;用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中&#xff0c;cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…...