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.xdnf.cn/news/145390.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Stm32_标准库_5_呼吸灯_按键控制

Stm32按键和输出差不多 PA1为LED供给正电&#xff0c;PB5放置按键&#xff0c;按键一端接PB5,另一端接负极 void Key_Init(void){RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //APB2总线连接着GPIOBGPIO_InitStructur.GPIO_Mode GPIO_Mode_IPU;GPIO_InitStructur.…

Kafka:介绍和内部工作原理

展示Kafka工作方式的简单架构。 什么是Kafka&#xff1f;为什么我们要使用它&#xff1f;它是消息队列吗&#xff1f; •它是一个 分布式流处理平台或分布式 提交日志*。*•Kafka通常用于实时流数据管道&#xff0c;即在系统之间传输数据&#xff0c;构建不断流动的数据转换系统…

什么是GraphQL?它与传统的REST API有什么不同?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 什么是GraphQL&#xff1f;⭐ 与传统的REST API 的不同⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣…

Konva基本处理流程和相关架构设计

前言 canvas是使用JavaScript基于上下文对象进行2D图形的绘制的HTML元素&#xff0c;通常用于动画、游戏画面、数据可视化、图片编辑以及实时视频处理等方面。基于Canvas之上&#xff0c;诞生了例如 PIXI、ZRender、Fabric、Konva等 Canvas渲染引擎&#xff0c;兼顾易用的同时…

DataBinding双向绑定简介

一、简介 在Vue中使用的是MVVM架构。通过ViewModel可以实现M层和V层数据的双向绑定。Model层的数据发生变化后&#xff0c;会自动更新View层UI。UI层数据发生变化&#xff08;用户输入&#xff09;&#xff0c;可以驱动Model层的数据发生变化&#xff0c;借助于Vue框架中的View…

Spring cloud Sentinel介绍和安装

Sentinel介绍和安装 &#x1f308;初识Sentinel&#x1f308;安装Sentinel&#x1f320;docker 安装&#x1f320;下载sentinel镜像&#x1f320;启动sentinel镜像 &#x1f320;windows 安装&#x1f320;下载&#x1f320;运行 &#x1f320;sentinel访问 &#x1f308;微服务…

React 全栈体系(十四)

第七章 redux 六、react-redux 7. 代码 - react-redux 数据共享版 7.1 效果 7.2 App /* src/App.jsx */ import React, { Component } from "react"; import Count from "./containers/Count"; import Person from "./containers/Person";ex…

26947-2011 手动托盘搬运车 学习记录

声明 本文是学习GB-T 26947-2011 手动托盘搬运车. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了手动托盘搬运车(以下简称托盘车)的结构参数、技术要求、试验方法、检验规则、 标志、包装、运输和贮存。 本标准适用于额定载荷…

【数据结构--八大排序】之冒泡排序+选择排序+插入排序

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

2023彩虹全新SUP模板,知识付费模板,卡卡云模板

源码介绍&#xff1a; 2023彩虹全新SUP模板/知识付费模板/卡卡云模板&#xff0c;首页美化&#xff0c;登陆页美化&#xff0c;修复了pc端购物车页面显示不正常的问题。 请自行查毒。感觉彩虹不少源码可能都有不干净的东西 安装教程&#xff1a; 1.将这俩个数据库文件导入数据…

2023.09.30使用golang1.18编译Hel10-Web/Databasetools的windows版

#Go 1.21新增的 log/slog 完美解决了以上问题&#xff0c;并且带来了很多其他很实用的特性。 本次编译不使用log/slog 包 su - echo $GOPATH ;echo $GOROOT; cd /tmp; busybox wget --no-check-certificate https://go.dev/dl/go1.18.linux-amd64.tar.gz;\ which tar&&am…

Java on Azure Tooling 8月更新|以应用程序为中心的视图支持及 Azure 应用服务部署状态改进

作者&#xff1a;Jialuo Gan - Program Manager, Developer Division at Microsoft 排版&#xff1a;Alan Wang 大家好&#xff0c;欢迎阅读 Java on Azure 工具的八月更新。在本次更新中&#xff0c;我们将推出新的以应用程序为中心的视图支持&#xff0c;帮助开发人员在一个项…

Python计算巴氏距离

Python计算巴氏距离 巴氏距离简介 在统计中&#xff0c;巴氏距离&#xff08;Bhattacharyya Distance&#xff09;测量两个离散或连续概率分布的相似性。它与衡量两个统计样品或种群之间的重叠量的巴氏系数密切相关。巴氏距离和巴氏系数以20世纪30年代曾在印度统计研究所工作…

<Xcode> Xcode IOS无开发者账号打包和分发

关于flutter我们前边聊到的初入门、数据解析、适配、安卓打包、ios端的开发和黑苹果环境部署&#xff0c;但是对于苹果的打包和分发&#xff0c;我只是给大家了一个链接&#xff0c;作为一个顶级好男人&#xff0c;我认为这样是对大家的不负责任&#xff0c;那么这篇就主要是针…

解决WIFI网络登录困难的方法

当你遇到手机WIFI网络在连接成功后&#xff0c;总是提示网络受限或者当前网络无法连接互联网&#xff0c;但过一段时间后它又自动恢复正常的的问题&#xff0c;可以尝试用以下方法来解决。 第一步&#xff1a;打开WLAN连接设置界面&#xff0c;选择“更多设置” 第二步&#x…

分类预测 | MATLAB实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测

分类预测 | MATLAB实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测 目录 分类预测 | MATLAB实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.Matlab实现NGO-CNN北方苍鹰算法优化卷积神经网络数据分类预测&…

c语言常用语法,长时间不用容易忘。

关键字 auto 声明自动变量const 定义常量&#xff0c;如果一个变量被 const 修饰&#xff0c;那么它的值就不能再被改变extern 声明变量或函数是在其它文件或本文件的其他位置定义register 声明寄存器变量signed 声明有符号类型变量或函数static 声明静态变量&#xff0c;修饰…

c#中的接口

使用IEnumerable统一迭代变量类型 class Program {static void Main(string[] args){int[] nums1 new int[] { 1, 2, 3, 4, 5 };ArrayList nums2 new ArrayList { 1, 2, 3, 4, 5 };Console.WriteLine(Sum(nums1));Console.WriteLine(Sum(nums2));Console.WriteLine(Avg(nums…

Windows系统利用cpolar内网穿透搭建Zblog博客网站并实现公网访问内网!

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网站制作网页是绕…

华为智能高校出口安全解决方案(3)

本文承接&#xff1a; https://qiuhualin.blog.csdn.net/article/details/133267254?spm1001.2014.3001.5502 重点讲解华为智能高校出口安全解决方案的攻击防御&安全运维&日志审计的部署流程。 华为智能高校出口安全解决方案&#xff08;3&#xff09; 课程地址攻击防…