spring boot 生成PDF模板文件

1、主要目录

在这里插入图片描述
2、maven依赖

<!--工具类依赖--><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.7.19</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.76</version></dependency><!--pdf--><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity</artifactId><version>1.7</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>html2pdf</artifactId><version>4.0.3</version></dependency><dependency><groupId>com.itextpdf</groupId><artifactId>font-asian</artifactId><version>7.2.3</version></dependency>

3、新建一个demo.html静态文件,后续导出模板就是按照此文件进行的

<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"/>
</head>
<body>
<div class="contianer"><div class="bg-img-container"></div><h1>模板pdf</h1><div class="flex-div"><p>表1</p></div><table border="1" cellSpacing="1"><tr><th>姓名</th><td colspan="3">$!{name}</td></tr><tr><th #if($!{gender}==1) class="blue" #else class="red" #end>性别</th><td colspan="3">#if($!{gender}==1)男#else女#end</td></tr><tr><th>出生日期</th><td>$!{birthDate}</td><th>联系方式</th><td>$!{phone}</td></tr></table><h1>双重For循环取值</h1><div class="flex-div"><p>表2</p></div><table border="1" cellSpacing="1"><tr><th>学历</th><th>学科</th><td class="gray-bg">分数</td></tr>#foreach($item in $eduList)<tr><th  #set($len= $item.size+1) rowspan="$len">$item.name</th>#foreach($result in $item.itemList)<tr><td>$velocityCount、$result.subject</td><td #if($result.num > 60) class="green" #else class="red" #end>$result.num</td></tr>#end</tr>#end</table></div></body>
<style>.blue {color: #244385;margin-left: 30px;}.green {color: #52c41a;margin-left: 30px;}.red {color: #c1181e;margin-left: 30px;}.flex-div {margin: 30px 0 15px;display: flex;align-items: center;}.line {width: 540px;height: 0px;border: dashed 1px #edf0f5;}table {width: 700px;border-collapse: collapse;/*border-spacing: 0;*/border-left: 1px solid #edf0f5;border-top: 1px solid #edf0f5;}th, td {border-right: 1px solid #edf0f5;border-bottom: 1px solid #edf0f5;padding: 5px 15px;}h1 {text-align: center;font-family: 'Microsoft YaHei';line-height: 60px;letter-spacing: 8px;color: #244385;}p {font-family: 'Microsoft YaHei';font-size: 20px;font-weight: normal;color: #244385;margin: 0 16px;}th {background-color: rgba(0, 0, 0, 0.01);width: 90px;min-width: 90px;max-width: 90px;text-align: left;text-indent: 10px;font-family: 'Microsoft YaHei';font-size: 16px;font-weight: normal;font-stretch: normal;line-height: 48px;letter-spacing: 2px;color: #666666;}td {font-size: 16px;color: #000000;text-align: left;text-indent: 10px;padding-right: 20px;height: 50px;}table,tr, th, td {border: solid 1px #edf0f5;}.gray-bg {background-color: rgba(0, 0, 0, 0.01);}
</style>
</html>

4、新建PdfUtil工具类

import com.itextpdf.html2pdf.ConverterProperties;
import com.itextpdf.html2pdf.HtmlConverter;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.font.FontProvider;
import org.apache.velocity.Template;
import org.apache.velocity.app.Velocity;
import org.apache.velocity.context.Context;
import org.apache.velocity.runtime.RuntimeConstants;
import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;import java.io.OutputStream;
import java.io.StringWriter;
import java.nio.charset.StandardCharsets;/*** PDF工具** @author ppp* @date 2022/8/5*/
public class PdfUtil {static {// Velocity初始化Velocity.setProperty(RuntimeConstants.OUTPUT_ENCODING, StandardCharsets.UTF_8);Velocity.setProperty(RuntimeConstants.INPUT_ENCODING, StandardCharsets.UTF_8);Velocity.setProperty(RuntimeConstants.RESOURCE_LOADER, "classpath");Velocity.setProperty("classpath.resource.loader.class", ClasspathResourceLoader.class.getName());Velocity.init();}/*** 据模板生成pfd格式文件** @param context      上下文对象* @param template     pdf模板* @param outputStream 生成ofd文件输出流*/public static void pdfFile(Context context, String template, OutputStream outputStream) {try (PdfWriter pdfWriter = new PdfWriter(outputStream)) {PdfDocument pdfDocument = new PdfDocument(pdfWriter);pdfDocument.setDefaultPageSize(PageSize.A4);ConverterProperties properties = new ConverterProperties();FontProvider fontProvider = new FontProvider();// 字体设置,解决中文不显示问题PdfFont sysFont = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H");fontProvider.addFont(sysFont.getFontProgram(), "UniGB-UCS2-H");properties.setFontProvider(fontProvider);Template pfdTemplate = Velocity.getTemplate(template, "UTF-8");StringWriter writer = new StringWriter();pfdTemplate.merge(context, writer);HtmlConverter.convertToPdf(writer.toString(), pdfDocument, properties);pdfDocument.close();} catch (Exception e) {throw new RuntimeException("PFD文件生成失败", e);}}}

5、Controller接口测试,也可以根据业务来分层service

package com.example.springboot3.controller;import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.URLUtil;
import com.example.springboot3.utils.PdfUtil;
import jakarta.servlet.ServletOutputStream;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.velocity.VelocityContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.*;@RestController
@RequestMapping("/velocity")
public class PdfController {@GetMapping("/getPdf")public void get(HttpServletResponse response){response.reset();response.setContentType("application/pdf");String filename = System.currentTimeMillis()+".pdf";response.addHeader("Content-Disposition", "inline; filename=" + URLUtil.encode(filename, CharsetUtil.CHARSET_UTF_8));VelocityContext context = new VelocityContext();context.put("name", "彭也行");context.put("gender", 1);context.put("birthDate", DateUtil.formatDateTime(new Date()));context.put("phone", "13666666666");List<Map<String, Object>> eduList = new ArrayList<>();// 小学Map<String, Object> primarySchoolMap = new HashMap<>();primarySchoolMap.put("name", "小学");List<Map<String, Object>> scoreList = new ArrayList<>();// 语文成绩Map<String, Object> chineseScore = new HashMap<>();chineseScore.put("subject", "语文");chineseScore.put("num", 60);// 数学成绩Map<String, Object> mathScore = new HashMap<>();mathScore.put("subject", "数学");mathScore.put("num", 99);scoreList.add(chineseScore);scoreList.add(mathScore);primarySchoolMap.put("itemList", scoreList);primarySchoolMap.put("size", scoreList.size());// 初中Map<String, Object> middleSchoolMap = new HashMap<>();middleSchoolMap.put("name", "初中");List<Map<String, Object>> middleScoreList = new ArrayList<>();// 语文成绩Map<String, Object> middleChineseScore = new HashMap<>();middleChineseScore.put("subject", "语文");middleChineseScore.put("num", 60);// 数学成绩Map<String, Object> middleMathScore = new HashMap<>();middleMathScore.put("subject", "数学");middleMathScore.put("num", 99);// 英语Map<String, Object> middleEnScore = new HashMap<>();middleEnScore.put("subject", "英语");middleEnScore.put("num", 55);middleScoreList.add(middleChineseScore);middleScoreList.add(middleMathScore);middleScoreList.add(middleEnScore);middleScoreList.add(middleEnScore);middleScoreList.add(middleEnScore);middleScoreList.add(middleEnScore);middleScoreList.add(middleEnScore);middleScoreList.add(middleEnScore);middleSchoolMap.put("itemList", middleScoreList);middleSchoolMap.put("size", middleScoreList.size());eduList.add(primarySchoolMap);eduList.add(middleSchoolMap);context.put("eduList", eduList);try(ServletOutputStream outputStream = response.getOutputStream()){PdfUtil.pdfFile(context, "static/demo.html", outputStream);}catch (Exception e){e.printStackTrace();}}}

6、调用接口浏览器预览

在这里插入图片描述

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

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

相关文章

56. 合并区间(力扣LeetCode)

文章目录 56. 合并区间题目描述思路贪心算法方法一&#xff1a;直接在res中修改代码逻辑梳理&#xff1a; 方法二&#xff1a;在原数组中插入一个超出题目范围的数组代码逻辑梳理&#xff1a; 56. 合并区间 题目描述 以数组 intervals 表示若干个区间的集合&#xff0c;其中单…

律甲法务OA平台:信鸥科技引领法律行业新篇章

随着信息技术的飞速发展&#xff0c;法律行业也迎来了数字化转型的重要时刻。在这个信息化、智能化的时代&#xff0c;如何运用科技手段提升法律服务的质量和效率&#xff0c;成为法律行业亟待解决的问题。信鸥科技&#xff0c;作为业界的佼佼者&#xff0c;凭借其深厚的技术积…

Kafka详细教程(一)

总体目录 1、什么是消息队列 消息队列&#xff0c;英文名&#xff1a;Message Queue&#xff0c;经常缩写为MQ。从字面上来理解&#xff0c;消息队列是一种用来存储消息的队列 。来看一下下面的代码 // 1.创建一个保存字符串的队列Queue<String> queue new LinkedList&…

使用patchelf解决vscode远程连接不支持低版本glibc的问题

使用patchelf解决vscode远程连接不支持低版本glibc的问题 目录 使用patchelf解决vscode远程连接不支持低版本glibc的问题1. 动态链接库下载2. 用 patchelf 修改 vscode-server 依赖的 glibc 版本 VScode 1.86 版本的 remote 要求 glibc 2.28 及以上&#xff0c;于是在各种旧版本…

基于RK3588多can口多串口机器人全功能板

RK3588机器人控制器有五大技术优势 1. 内置多种功能强大的嵌入式硬件引擎&#xff0c;支持8K60fps 的 H.265 和 VP9 解码器、8K30fps 的 H.264 解码器和 4K60fps 的 AV1 解码器&#xff1b;支持 8K30fps 的 H.264 和H.265 编码器&#xff0c;高质量的 JPEG 编码器/解码器&…

不显示excel中零值方法

excel中想让数字0不显示的方法如下&#xff1a; √去掉则数字格式0不再显示 。若找不到此项&#xff0c;运行以下代码即可&#xff1a; Sub 去除excel中零值() ActiveWindow.DisplayZeros False 不显示零值 End Sub altf11打开vba idea&#xff0c;插入->模块&#xff…

UniRepLKNet:一种用于音频、视频、点云、时间序列和图像识别的通用感知大核卷积神经网络

论文: https://arxiv.org/abs/2311.15599 模型: https://huggingface.co/DingXiaoH/UniRepLKNet/tree/main 主页&#xff1a;https://invictus717.github.io/UniRepLKNet/ contribution 提出了四条guide line用于设计大核CNN架构模型&#xff0c;用于图像识别&#xff0c;语…

elementui日期时间选择框自定义组件

1.需求场景 业务中需要&#xff0c;日期选择框方便客户对日期的选择&#xff08;比如近5天&#xff0c;本周&#xff0c;本月&#xff0c;本年等等&#xff09;&#xff0c;并按小时展示。 2.组件代码MyDateTimeChange.vue <template><el-date-pickerv-model"…

鸿蒙开发之ArkUI组件常用组件图片和文本

ArkUI即方舟开发框架是HarmonyOS应用的UI开发提供了完整的基础设施&#xff0c;包括简洁的UI语法、丰富的UI功能&#xff08;组件、布局、动画以及交互事件&#xff09;&#xff0c;以及实时界面预览工具等&#xff0c;可以支持开发者进行可视化界面开发。 开发文档地址 &…

国赛大纲解读

1. 第一部分,是针对5G基础知识的掌握,第二部分是人工智能基本算法的掌握,就是人工智能的应用,用5G+人工智能(AI算法)进行网络优化的问题,要有网络优化的基础知识,比如说:某个区域的覆盖问题,覆盖特别差,但有数据,覆盖电频,srp值这些数据给你,根据数据来判断是…

设计模式——行为型——策略模式Strategy

Q&#xff1a;策略模式的特点 A&#xff1a; 具体算法从具体的业务方法中独立出来策略模式是同行为的不同实现 Q&#xff1a;什么时候使用策略模式 A&#xff1a;多个if-else使用策略模式 收费对象类 public class CashContext {private CashStrategy cashStrategy;public…

【C++入门】 初见,单推,与C++的第一次约会

关注小庄 顿顿解馋(ᕑᗢᓫ∗)˒ 引言&#xff1a;本篇博客我们开始与C的第一次约会&#xff0c;C是兼容c的&#xff0c;本篇博客我们将了解到C关键字有哪些&#xff0c;C命名空间&#xff0c;C输入与输出和缺省参数的内容&#xff0c;请放心食用 ~ 文章目录 一 &#x1f3e0; C…

文献阅读工具-->Adobe pdf + 有道词典

Adobe pdf 有道词典 最近一直在考虑用什么文献阅读工具&#xff0c;痛点无非就是想用翻译功能&#xff0c;Adobe pdf的添加注释已经很好用了&#xff0c;使用了zotero&#xff0c;感觉不行&#xff08;不能直接对原文件修改&#xff0c;有副本&#xff0c;麻烦&#xff09;。…

excel匹配替换脱敏身份证等数据

假如excel sheet1中有脱敏的身份证号码和姓名&#xff0c;如&#xff1a; sheet2中有未脱敏的数据数据 做法如下&#xff1a; 1、在sheet2的C列用公式 LEFT(A2,6)&REPT("*",8)&RIGHT(A2,4) 做出脱敏数据&#xff0c;用来与sheet1的脱敏数据匹配 2、在sheet…

AWS基础网络产品及协同架构-Networking

简介 一个完整的AWS网络架构图&#xff0c;包含了如下能力&#xff1a; Users (用户): 表示使用AWS服务的用户或系统。 SaaS (软件即服务): 表示在AWS上运行的软件服务&#xff0c;如企业微信可能作为SaaS提供。 example.com?: 这可能是一个示例域名&#xff0c;用于展示如何…

快速上手Spring Cloud 十:Spring Cloud与微前端

快速上手Spring Cloud 一&#xff1a;Spring Cloud 简介 快速上手Spring Cloud 二&#xff1a;核心组件解析 快速上手Spring Cloud 三&#xff1a;API网关深入探索与实战应用 快速上手Spring Cloud 四&#xff1a;微服务治理与安全 快速上手Spring Cloud 五&#xff1a;Spring …

分享多种mfc100u.dll丢失的解决方法(一键修复DLL丢失的方法)

在使用电脑过程中&#xff0c;我们经常会遇到一些陌生的DLL文件&#xff0c;例如mfc100u.dll。这些DLL文件是动态链接库&#xff08;Dynamic Link Libraries&#xff09;的缩写&#xff0c;它们包含了可以被多个程序共享的代码和数据。今天&#xff0c;我们将深入探讨mfc100u.d…

深度学习:基于PyTorch的模型解释工具Captum

深度学习&#xff1a;基于PyTorch的模型解释工具Captum 引言简介示例安装解释模型的预测解释文本模型情绪分析问答 解释视觉模型特征分析特征消融鲁棒性 解释多模态模型 引言 当我们训练神经网络模型时&#xff0c;我们通常只关注模型的整体性能&#xff0c;例如准确率或损失函…

Pillow教程06:将图片中出现的黄色和红色,改成绿色

---------------Pillow教程集合--------------- Python项目18&#xff1a;使用Pillow模块&#xff0c;随机生成4位数的图片验证码 Python教程93&#xff1a;初识Pillow模块&#xff08;创建Image对象查看属性图片的保存与缩放&#xff09; Pillow教程02&#xff1a;图片的裁…

浅析扩散模型与图像生成【应用篇】(十三)——GLIDE

13. GLIDE: Towards Photorealistic Image Generation and Editing with Text-Guided Diffusion Models 该文提出一种基于文本引导的扩散模型用于图像的生成和编辑&#xff0c;可以根据给定的文字描述来生成或编辑图像。在ADM中我们曾介绍了一种基于分类器引导的图像生成模型&a…