• java生成PDF的Util


    java使用itext生成pdf-CSDN博客

    接上文

    支持绘制表格

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

    支持拼接文本

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

    支持自定义水印

    废话不说先上效果图

    工具类代码

    1. package com.zxw.文件.PDF.util;
    2. import com.itextpdf.text.*;
    3. import com.itextpdf.text.pdf.*;
    4. import com.itextpdf.text.pdf.draw.LineSeparator;
    5. import lombok.SneakyThrows;
    6. import org.springframework.beans.factory.annotation.Value;
    7. import org.springframework.stereotype.Component;
    8. import org.springframework.util.ObjectUtils;
    9. import java.io.IOException;
    10. import java.util.LinkedHashMap;
    11. import java.util.List;
    12. import java.util.Map;
    13. import java.util.stream.Collectors;
    14. /**
    15. * @projectName: ruoyi
    16. * @package: com.zxw.文件.PDF.util
    17. * @className: PDFUtil
    18. * @author: zhangxuewei
    19. * @description: TODO
    20. * @date: 2023/9/18 14:31
    21. * @version: 1.0
    22. */
    23. @Component
    24. public class PDFUtil {
    25. public static String fontAddr;
    26. public static TableCell tableCell = new TableCell();
    27. @Value("${fontAddr}")
    28. public void setFontAddr(String fontAddr) {
    29. PDFUtil.fontAddr = fontAddr;
    30. }
    31. public static BaseFont getNormalBaseFont() throws IOException, DocumentException {
    32. BaseFont bf = BaseFont.createFont(fontAddr, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
    33. return bf;
    34. }
    35. public static Font getNormalFont(BaseFont bf) {
    36. Font font = new Font(bf, 12);
    37. return font;
    38. }
    39. /**
    40. * 获取创建段落的类
    41. *
    42. * @param font
    43. * @param fontSize 字体大小
    44. * @throws DocumentException
    45. */
    46. public static Paragraph getParagraph(Font font, Float fontSize) {
    47. if (!ObjectUtils.isEmpty(fontSize)) {
    48. font.setSize(fontSize);
    49. }
    50. // 添加中文内容
    51. Paragraph paragraph = new Paragraph();
    52. paragraph.setFont(font);
    53. return paragraph;
    54. }
    55. /**
    56. * 获取创建段落的类
    57. *
    58. * @param font
    59. * @param fontSize 字体大小
    60. * @param info 写入信息
    61. * @throws DocumentException
    62. */
    63. public static Paragraph getParagraphAndWrite(Font font, Float fontSize, String info) {
    64. Paragraph paragraph = getParagraph(font, fontSize);
    65. // 添加中文内容
    66. paragraph.add(new Chunk(info));
    67. return paragraph;
    68. }
    69. /**
    70. * 拼接写入带有颜色的文本
    71. *
    72. * @param paragraph 创建段落对象
    73. * @param info 写入的文本
    74. * @param backgroundColor 文本背景颜色
    75. * @return
    76. */
    77. public static Paragraph appendWithBackgroundColor(Paragraph paragraph, String info, BaseColor backgroundColor) {
    78. // 添加中文内容
    79. Chunk chunk = new Chunk(info);
    80. if (!ObjectUtils.isEmpty(backgroundColor)) {
    81. chunk.setBackground(backgroundColor); // 根据索引获取背景颜色
    82. }
    83. paragraph.add(chunk);
    84. return paragraph;
    85. }
    86. /**
    87. * 拼接写入带有颜色的文本结束的方法
    88. *
    89. * @param paragraph 创建段落对象
    90. * @param info 写入的文本
    91. * @param backgroundColor 文本背景颜色
    92. * @param document 文档对象
    93. * @throws DocumentException
    94. */
    95. public static void appendWithBackgroundColorEnd(Paragraph paragraph, String info, BaseColor backgroundColor, Document document) throws DocumentException {
    96. appendWithBackgroundColor(paragraph, info, backgroundColor);
    97. document.add(paragraph);
    98. }
    99. /**
    100. * 正常书写
    101. *
    102. * @param document
    103. * @param font
    104. * @param fontSize 字体大小
    105. * @param info 写入信息
    106. * @throws DocumentException
    107. */
    108. public static void writeParagraph(Document document, Font font, Float fontSize, String info) throws DocumentException {
    109. if (!ObjectUtils.isEmpty(fontSize)) {
    110. font.setSize(fontSize);
    111. }
    112. // 添加中文内容
    113. Paragraph paragraph = new Paragraph(info, font);
    114. document.add(paragraph);
    115. }
    116. /**
    117. * 书写加粗的文字
    118. *
    119. * @param document
    120. * @param bf
    121. * @param fontSize 字体大小
    122. * @param info 写入信息
    123. * @throws DocumentException
    124. */
    125. public static void writeBoldParagraph(Document document, BaseFont bf, Float fontSize, String info) throws DocumentException {
    126. Font font = PDFUtil.getNormalFont(bf);
    127. font.setStyle(Font.BOLD);
    128. // 添加中文内容
    129. writeParagraph(document, font, fontSize, info);
    130. }
    131. /**
    132. * 书写带有颜色的字体
    133. *
    134. * @param document
    135. * @param font
    136. * @param fontSize
    137. * @param fontColor
    138. * @throws DocumentException
    139. */
    140. public static void writeColorParagraph(Document document, Font font, Float fontSize, BaseColor fontColor, String info) throws DocumentException {
    141. if (!ObjectUtils.isEmpty(fontColor))
    142. font.setColor(fontColor);
    143. writeParagraph(document, font, fontSize, info);
    144. }
    145. /**
    146. * 书写带有颜色的加粗字体
    147. *
    148. * @param document
    149. * @param bf
    150. * @param fontSize
    151. * @param fontColor
    152. * @throws DocumentException
    153. */
    154. public static void writeBoldColorParagraph(Document document, BaseFont bf, float fontSize, BaseColor fontColor, String info) throws DocumentException {
    155. Font font = PDFUtil.getNormalFont(bf);
    156. font.setStyle(Font.BOLD);
    157. writeColorParagraph(document, font, fontSize, fontColor, info);
    158. }
    159. /**
    160. * 书写带有颜色背景的字体
    161. *
    162. * @param document
    163. * @param font
    164. * @param fontSize
    165. * @param backgroundColor 背景颜色
    166. * @param info
    167. * @throws DocumentException
    168. */
    169. public static void writeColorBackgroundParagraph(Document document, Font font, float fontSize, BaseColor backgroundColor, String info) throws DocumentException {
    170. if (fontSize > 0) {
    171. font.setSize(fontSize);
    172. }
    173. Chunk chunk = new Chunk(info, font);
    174. chunk.setBackground(backgroundColor);
    175. Paragraph paragraphcb = new Paragraph();
    176. paragraphcb.add(chunk);
    177. document.add(paragraphcb);
    178. }
    179. /**
    180. * 书写带有颜色背景的加粗字体
    181. *
    182. * @param document
    183. * @param font
    184. * @param fontSize
    185. * @param backgroundColor
    186. * @param info
    187. * @throws DocumentException
    188. */
    189. public static void writeBoldColorBackgroundParagraph(Document document, Font font, float fontSize, BaseColor backgroundColor, String info) throws DocumentException {
    190. font.setStyle(Font.BOLD);
    191. writeColorBackgroundParagraph(document, font, fontSize, backgroundColor, info);
    192. }
    193. /**
    194. * 书写带有颜色背景的彩色字体
    195. *
    196. * @param document
    197. * @param font
    198. * @param fontSize
    199. * @param backgroundColor
    200. * @param fontColor
    201. * @param info
    202. * @throws DocumentException
    203. */
    204. public static void writeColorBackgroundColorFontParagraph(Document document, Font font, float fontSize, BaseColor backgroundColor, BaseColor fontColor, String info) throws DocumentException {
    205. if (fontSize > 0) {
    206. font.setSize(fontSize);
    207. }
    208. font.setColor(fontColor);
    209. Chunk chunk = new Chunk(info, font);
    210. chunk.setBackground(backgroundColor);
    211. Paragraph paragraphcb = new Paragraph();
    212. paragraphcb.add(chunk);
    213. document.add(paragraphcb);
    214. }
    215. /**
    216. * 书写带有颜色背景的彩色加粗字体
    217. *
    218. * @param document
    219. * @param font
    220. * @param fontSize
    221. * @param backgroundColor
    222. * @param fontColor
    223. * @param info
    224. * @throws DocumentException
    225. */
    226. public static void writeBoldColorBackgroundColorFontParagraph(Document document, Font font, float fontSize, BaseColor backgroundColor, BaseColor fontColor, String info) throws DocumentException {
    227. font.setStyle(Font.BOLD);
    228. writeColorBackgroundColorFontParagraph(document, font, fontSize, backgroundColor, fontColor, info);
    229. }
    230. /**
    231. * 画线
    232. *
    233. * @param document
    234. * @param percentage 所占页面宽度的百分比
    235. * @param alignment 对齐方式 如:Element.ALIGN_RIGHT
    236. * @throws DocumentException
    237. */
    238. public static void drawLine(Document document, float percentage, int alignment) throws DocumentException {
    239. LineSeparator line = new LineSeparator();
    240. line.setPercentage(percentage);
    241. line.setAlignment(alignment);
    242. line.setLineWidth(1);
    243. document.add(line);
    244. }
    245. /**
    246. * 书写表格
    247. *
    248. * @param document
    249. * @param font
    250. * @param fontSize
    251. * @param numColumns
    252. * @param data
    253. * @throws DocumentException
    254. */
    255. public static void writeTable(Document document, Font font, Float fontSize, int numColumns, BaseColor borderColor, List> data) throws DocumentException {
    256. PdfPTable table = new PdfPTable(numColumns); // 3列的表格
    257. table.setWidthPercentage(100);// 表格将占据整个页面的宽度
    258. table.setSpacingBefore(10f);// 表格与上面的内容之间将有 10 磅的间距
    259. table.setSpacingAfter(10f);// 表格与下面的内容之间将有 10 磅的间距
    260. for (int i = 0; i < data.size(); i++) {
    261. Map sortedMap = data.get(i).entrySet()
    262. .stream()
    263. .sorted(Map.Entry.comparingByKey())
    264. .collect(Collectors.toMap(
    265. Map.Entry::getKey,
    266. Map.Entry::getValue,
    267. (e1, e2) -> e1, // 如果有重复键,保留第一个
    268. LinkedHashMap::new // 保持顺序
    269. ));
    270. sortedMap.forEach((key, item) -> {
    271. PdfPCell cell = new PdfPCell(getParagraphAndWrite(font, fontSize, item));
    272. if (!ObjectUtils.isEmpty(borderColor)) {
    273. cell.setBorderColor(borderColor);
    274. } else {
    275. cell.setBorder(PdfPCell.NO_BORDER);
    276. }
    277. cell.setHorizontalAlignment(Element.ALIGN_CENTER);
    278. cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
    279. cell.setPadding(5);
    280. table.addCell(cell);
    281. });
    282. }
    283. document.add(table);
    284. }
    285. /**
    286. * 书写表格
    287. *
    288. * @param document 文档对象
    289. * @param columnWidths 列宽
    290. * @param bf 字体基础配置
    291. * @param borderColor 表格边框颜色
    292. * @param data
    293. * @throws DocumentException
    294. */
    295. public static void writeTable(Document document, float[] columnWidths, BaseFont bf, BaseColor borderColor, List> data) throws DocumentException {
    296. PdfPTable table = new PdfPTable(columnWidths.length); // 3列的表格
    297. table.setWidthPercentage(100);// 表格将占据整个页面的宽度
    298. table.setSpacingBefore(10f);// 表格与上面的内容之间将有 10 磅的间距
    299. table.setSpacingAfter(10f);// 表格与下面的内容之间将有 10 磅的间距
    300. table.setWidths(columnWidths);
    301. for (int i = 0; i < data.size(); i++) {
    302. Map sortedMap = data.get(i).entrySet()
    303. .stream()
    304. .sorted(Map.Entry.comparingByKey())
    305. .collect(Collectors.toMap(
    306. Map.Entry::getKey,
    307. Map.Entry::getValue,
    308. (e1, e2) -> e1, // 如果有重复键,保留第一个
    309. LinkedHashMap::new // 保持顺序
    310. ));
    311. sortedMap.forEach((key, item) -> {
    312. TableCell tableCell = item;
    313. Font font = PDFUtil.getNormalFont(bf);
    314. if (tableCell.isBold())
    315. font.setStyle(Font.BOLD);
    316. if (!ObjectUtils.isEmpty(tableCell.getFontColor()))
    317. font.setColor(tableCell.getFontColor());
    318. if (!ObjectUtils.isEmpty(tableCell.getFontSize()))
    319. font.setSize(tableCell.getFontSize());
    320. Chunk chunk = new Chunk(tableCell.getCellDataInfo(), font);
    321. if (!ObjectUtils.isEmpty(tableCell.getFontBackgroundColor()))
    322. chunk.setBackground(tableCell.getFontBackgroundColor());
    323. Paragraph paragraph = new Paragraph(chunk);
    324. PdfPCell cell = new PdfPCell(paragraph);
    325. if (!ObjectUtils.isEmpty(borderColor))
    326. cell.setBorderColor(borderColor);
    327. else
    328. cell.setBorder(PdfPCell.NO_BORDER);
    329. if (!ObjectUtils.isEmpty(tableCell.getCellBackgroundColor()))
    330. cell.setBackgroundColor(tableCell.getCellBackgroundColor());
    331. if (!ObjectUtils.isEmpty(tableCell.getCellAlign()))
    332. cell.setHorizontalAlignment(tableCell.getCellAlign());
    333. else
    334. cell.setHorizontalAlignment(Element.ALIGN_CENTER);
    335. cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
    336. cell.setPadding(5);
    337. table.addCell(cell);
    338. });
    339. }
    340. document.add(table);
    341. }
    342. }

    gitee地址:util-cloud: 小工具

    所在controller:

  • 相关阅读:
    docker目录挂载失败:Check if the specified host path exists and is the expected type
    【网络协议】RPC、REST API深入理解及简单demo实现
    Python软件编程等级考试二级——20220618
    计算机基础知识56
    学习编程的第十九天
    【日拱一卒】如何编写测试用例(下)
    Linux基础知识——(2)vim编辑器
    理解依赖注入DI和控制反转IOC和容器
    centos 7.7之后,无法远程ssh执行 java -jar 指令
    Android S从桌面点击图标启动APP流程 (五)
  • 原文地址:https://blog.csdn.net/Mr_ZhangAdd/article/details/133200848