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: