spring boot 生成PDF模板文件
1、主要目录
2、maven依赖
cn.hutool hutool-all 5.7.19 com.alibaba fastjson 1.2.76 org.apache.velocity velocity 1.7 com.itextpdf html2pdf 4.0.3 com.itextpdf font-asian 7.2.3
3、新建一个demo.html静态文件,后续导出模板就是按照此文件进行的
模板pdf
表1
姓名 | $!{name} | ||
---|---|---|---|
性别 | #if($!{gender}==1) 男 #else 女 #end | ||
出生日期 | $!{birthDate} | 联系方式 | $!{phone} |
双重For循环取值
表2
学历 | 学科 | 分数 |
---|---|---|
$item.name | #foreach($result in $item.itemList)||
$velocityCount、$result.subject | 60) #else #end>$result.num |
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 eduList = new ArrayList(); // 小学 Map primarySchoolMap = new HashMap(); primarySchoolMap.put("name", "小学"); List scoreList = new ArrayList(); // 语文成绩 Map chineseScore = new HashMap(); chineseScore.put("subject", "语文"); chineseScore.put("num", 60); // 数学成绩 Map 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 middleSchoolMap = new HashMap(); middleSchoolMap.put("name", "初中"); List middleScoreList = new ArrayList(); // 语文成绩 Map middleChineseScore = new HashMap(); middleChineseScore.put("subject", "语文"); middleChineseScore.put("num", 60); // 数学成绩 Map middleMathScore = new HashMap(); middleMathScore.put("subject", "数学"); middleMathScore.put("num", 99); // 英语 Map 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、调用接口浏览器预览
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理!
部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!
图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!