java生成PDF的Util

news2024/11/24 14:45:38

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);
                else
                    cell.setBorder(PdfPCell.NO_BORDER);
                if (!ObjectUtils.isEmpty(tableCell.getCellBackgroundColor()))
                    cell.setBackgroundColor(tableCell.getCellBackgroundColor());
                if (!ObjectUtils.isEmpty(tableCell.getCellAlign()))
                    cell.setHorizontalAlignment(tableCell.getCellAlign());
                else
                    cell.setHorizontalAlignment(Element.ALIGN_CENTER);
                cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
                cell.setPadding(5);
                table.addCell(cell);
            });
        }
        document.add(table);
    }


}

gitee地址:util-cloud: 小工具

所在controller:

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

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

相关文章

建立一张表: 表里面有多个字段,每一个字段对应一种数据类

首先mysql -uroot -p 进入MySQL 选择一个数据库并使用 在该数据库内创建表格 create table homework_tb( id int(11) comment 编号, company_name char(6) comment 公司名称, introduce varchar(100) comment 介绍, content1 tinytext comment 内容1, co…

ad18学习笔记十一:显示和隐藏网络、铺铜

如何显示和隐藏网络&#xff1f; Altium Designer--如何快速查看PCB网络布线_ad原理图查看某一网络的走线_辉_0527的博客-CSDN博客 AD19(Altium Designer)如何显示和隐藏网络 如何显示和隐藏铺铜&#xff1f; Altium Designer 20在PCB中显示或隐藏每层铺铜-百度经验 AD打开与…

React【Context_作用、函数组件订阅Context、Fragments 、错误边界_概念 、错误边界_应用、Refs DOM】(四)

目录 Context_作用 函数组件订阅Context Fragments 错误边界_概念 错误边界_应用 Refs & DOM Context_作用 React组件中数据是通过 props 属性自上而下&#xff08;由父及子&#xff09;进行传递的&#xff0c;但是有的时候中间的一些组件可能并不需要props的值。 //A…

深度学习自学笔记一:神经网络和深度学习

神经网络是一种模拟人脑神经元之间相互连接的计算模型&#xff0c;它由多个节点&#xff08;或称为神经元&#xff09;组成&#xff0c;并通过调整节点之间的连接权重来学习和处理数据。深度学习则是指利用深层次的神经网络进行学习和建模的机器学习方法。 假设有一个数据集&a…

电阻的读数

常见电阻的阻值一般有色环电阻和贴片电阻 &#xff0c;下面介绍两种电阻的阻值读法。 1、色标法&#xff1a; 技巧&#xff1a;四环电阻的的精度一般为银色和金色&#xff0c;如果一眼能可看到这两种颜色可以判断为第4环的精度读数 可见棕色为第1环&#xff0c;黑色第2环&…

Three.js后期处理简明教程

后期处理&#xff08;Post Processing&#xff09;通常是指对 2D 图像应用某种效果或滤镜。 在 THREE.js 中我们有一个包含一堆网格物体的场景。 我们将该场景渲染为 2D 图像。 通常&#xff0c;该图像会直接渲染到画布中并显示在浏览器中&#xff0c;但我们可以将其渲染到渲染…

AI写文章软件-怎么选择不同的AI写文章软件

在如今信息爆炸的时代&#xff0c;无论是学生、职场人士&#xff0c;还是创作者和企业家&#xff0c;写文章都是一项常见而又重要的任务。然而&#xff0c;随着科技的不断进步&#xff0c;AI写文章的软件也逐渐走进了人们的视野。 147GPT批量文章生成工具​www.147seo.com/post…

Java 基于微信小程序的学生选课系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 第一章&#xff1a; 简介第二章 技术栈第三章&#xff1a; 功能分析第四章 系统设计第五章 系统功…

Intel酷睿和AMD锐龙

Intel酷睿系列&#xff0c;主要分i3、i5、i7、i9 如&#xff1a;Intel 酷睿i5 10210U i5&#xff1a;品牌修饰符。 10&#xff1a;代次指示符。 210&#xff1a;sku编号。 常见后缀&#xff1a; G1-G7&#xff1a;集显等级。 U&#xff1a;低功耗。 H&#xff1a;标压版…

通俗易懂了解大语言模型LLM发展历程

1.大语言模型研究路程 NLP的发展阶段大致可以分为以下几个阶段&#xff1a; 词向量词嵌入embedding句向量和全文向量理解上下文超大模型与模型统一 1.1词向量 将自然语言的词使用向量表示&#xff0c;一般构造词语字典&#xff0c;然后使用one-hot表示。   例如2个单词&…

GeekRUN-7芯片跑分表

前两个字母是芯片简写&#xff0c;如麒麟&#xff0c;是QL&#xff0c;骁龙是XL&#xff0c;天玑是TJ&#xff0c;第一串数字是最高值&#xff0c;第二串是最低值&#xff0c;省电模式差不多这个水平。QL9K是麒麟9000&#xff0c;QL9S

aix360-gec

目录 分组条件期望&#xff08;GroupedCE&#xff09;解释程序创建虚拟环境导包加载数据集训练模型计算独立条件期望ICEplot_ice_explanation 计算分组条件期望 (GCE)plot_gce_explanation 记录一下学习过程&#xff0c;官方的代码在https://github.com/Trusted-AI/AIX360/tree…

High-Resolution Side Channels for Untrusted Operating Systems【ATC‘17】

目录 摘要引言贡献• 一个不受信任的操作系统的两个新的高分辨率侧通道来攻击受保护的应用程序&#xff1b;• 对 libjpeg 的显着改进攻击和针对 VC3 的新攻击&#xff1b;• 侧通道攻击对不受信任的操作系统的重要性增加。 系统模型背景Intel SGX页面错误通道时间限制空间限制…

微信小程序案例2-3:婚礼邀请函

文章目录 一、运行效果二、知识储备&#xff08;一&#xff09;导航栏设置1、导航栏的相关配置项2、利用导航栏组件2、在页面配置文件中对导航栏进行配置3、在全局配置文件中对导航栏进行配置 三、实现步骤 一、运行效果 “婚礼邀请函”微信小程序由4个页面组成&#xff0c;分别…

Springboot整合分页插件pagehelper

首先需要有一定的springbootmybatis的基础&#xff0c;才能使用顺畅 项目结构如下 引入依赖&#xff0c;springboot版本选的是2.7.16版本&#xff0c;jdk选的17&#xff0c; <!--分页插件--> <dependency><groupId>com.github.pagehelper</groupId><…

基于微信小程序的房屋租赁系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言运行环境说明用户微信小程序端的主要功能有&#xff1a;户主微信小程序端的主要功能有&#xff1a;管理员的主要功能有&#xff1a;具体实现截图详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考论文…

OceanBase 数据文件缩容实践

本文章介绍了OceanBase集群关于数据文件的缩容场景&#xff0c;并提供一种缩容方案予以参考。 作者&#xff1a;关炳文&#xff0c;爱可生 DBA 团队成员&#xff0c;负责数据库相关技术支持&#xff0c;一步两阶梯&#xff0c;兼具勤奋与慵懒。 爱可生开源社区出品&#xff0c;…

浅谈单元测试:测试和自动化中的利用

【软件测试面试突击班】如何逼自己一周刷完软件测试八股文教程&#xff0c;刷完面试就稳了&#xff0c;你也可以当高薪软件测试工程师&#xff08;自动化测试&#xff09; 浅谈单元测试是一件棘手的事情。我很确定测试人员在某个时候会抱怨开发人员没有正确地进行单元测试&…

Idea中使用Service管理微服务

前言 如何在本地一键启动很多个微服务&#xff0c;下面介绍下IDEA开发工具中得Services管理管理功能 一、第一步 1、在IDEA中下栏bar中如果存在Services,请看第二步。 2、如果没有请按照以下步骤打开 View -> Tool Windows -> Services 二、第二步 刚创建好的窗口是空…

论文浅尝 | 基于知识增强的多行为对比推荐

笔记整理&#xff1a;吴飞跃&#xff0c;东南大学硕士&#xff0c;研究方向为推荐系统 链接&#xff1a;https://doi.org/10.1145/3539597.3570386 动机 在实际推荐场景中&#xff0c;用户和物品之间存在多种类型的交互行为&#xff0c;如在线购物平台上的点击、标记为喜欢和购…