您当前的位置:首页 > 电脑百科 > 程序开发 > 框架

Spring Boot——Thymeleaf生成PDF实战教程

时间:2022-09-25 11:59:11  来源:今日头条  作者:Java热点

目录

 

  • 1.Thymeleaf,生成PDF相关依赖
  • 二、Application.yml配置
  • 1.PDF配置代码(如下):
  • 1.请求接口报错解决方式:
  • 五、生成PDF文件响应效果

 

温馨提示:本博客使用Thymeleaf模板引擎实现PDF打印仅供参考:

在阅读该博客之前,先要了解一下Thymeleaf模板引擎,因为是使用Thymeleaf模板引擎实现的Pdf打印的,

Thymeleaf是一个现代的服务器端 JAVA 模板引擎,适用于 Web 和独立环境。

Thymeleaf 的主要目标是为您的开发工作流程带来优雅的自然模板——html可以在浏览器中正确显示,也可以用作静态原型,从而在开发团队中实现更强大的协作。

借助 Spring Framework 的模块、与您最喜欢的工具的大量集成以及插入您自己的功能的能力,Thymeleaf 是现代 HTML5 JVM Web 开发的理想选择——尽管它可以做的更多。

不了解小伙伴可以去 Thymeleaf官网 查看,有更详细的讲解。

接下来就不一一介绍了,直接上代码。

一、引入依赖1.Thymeleaf,生成PDF相关依赖

1.1,以下依赖为必要依赖,一个都不能少,依赖version可以根基实际情况使用相关的依赖版本。


 

二、application.yml配置1.yml配置文件

yml配置文件使用配置thymeleaf模板路径(示例):


 

以上相关为基础且必须配置的内容,接下来继续讲解thymeleaf引擎需要生成PDF的相关配置。

三、PDF相关配置1.PDF配置代码(如下):package com.cy.xgsm.configuration;import java.io.IOException;import java.io.InputStream;import java.NET.URISyntaxException;import org.Apache.commons.io.IOUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import com.itextpdf.html2pdf.ConverterProperties;import com.itextpdf.html2pdf.resolver.font.DefaultFontProvider;import com.itextpdf.io.font.PdfEncodings;import com.itextpdf.kernel.font.PdfFont;import com.itextpdf.kernel.Font.PdfFontFactory;import com.itextpdf.layout.font.FontProvider;import com.cy.xgsm.controller.PrintPdfController;* @author Dylan* PDF相关配置@Configurationpublic class PdfConfiguration {private static final Logger log = LoggerFactory.getLogger(PdfConfiguration.class);@Beanpublic FontProvider getFontProvider() throws URISyntaxException, IOException {FontProvider provider = new DefaultFontProvider(true, true, false);byte[] bs = null;//SIMSUN.TTC为字体try (InputStream in = PrintPdfController.class.getClassLoader().getResourceAsStream("font/SIMSUN.TTC")) {bs = IOUtils.toByteArray(in);PdfFont pdfFont = PdfFontFactory.createTtcFont(bs, 1, PdfEncodings.IDENTITY_H, false, true);provider.addFont(pdfFont.getFontProgram());return provider;@Beanpublic ConverterProperties converterProperties(FontProvider fontProvider, Configuration config) {ConverterProperties cp = new ConverterProperties();cp.setBaseUri(config.getPdfUrl());try {cp.setFontProvider(fontProvider);} catch (Exception e) {log.error("打印PDF时未能添加字体", e);return cp;

一,注意PDF配置需要添加打印PDF字体,SIMSUN.TTC为打印需要的字体,但是也可以是其他的

四、Controller

1.以上所有的相关配置信息都配置完了,接下来就可以写Api接口了

package com.cy.xgsm.controller;import java.io.IOException;import java.io.OutputStream;import java.net.URLEncoder;import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestMapping;import org.thymeleaf.TemplateEngine;import org.thymeleaf.context.Context;import com.itextpdf.html2pdf.ConverterProperties;import com.itextpdf.html2pdf.HtmlConverter;import com.itextpdf.kernel.geom.PageSize;import com.itextpdf.kernel.pdf.PdfDocument;import com.itextpdf.kernel.pdf.PdfWriter;import com.cy.xgsm.common.Result;import com.cy.xgsm.model.OrderInfo;import com.cy.xgsm.service.OrderInfoService;* 打印PDF 控制接入层* @author Dylan@Controller@RequestMapping("print")public class PrintPdfController {private static final Logger log = LoggerFactory.getLogger(PrintPdfController.class);@Autowiredprivate OrderInfoService service;//thymeleaf模板引擎@AutowiredTemplateEngine templateEngine;//html转换成pdf需要使用ConverterProperties@AutowiredConverterProperties converterProperties;@GetMapping("order/{orderId}.pdf")public void orderPdf(@PathVariable Long orderId, HttpServletResponse resp) throws IOException {Result result = service.selectByPrimaryKey(orderId);if (!result.isComplete()) {resp.sendError(404, "订单ID不存在");Context context = new Context();context.setVariable("order", result.getData());///html/pdf/order-template为打印模板纸张路径processPdf(context, "/html/pdf/order-template", result.getData().getKddh(), resp);* 调用生成PDF* @param context 上下文* @param template 模板文件* @param filename 文件名* @param respprivate void processPdf(Context context, String template, String filename, HttpServletResponse resp) throws IOException {log.info("生成PDF:" + filename);String html = templateEngine.process(template, context);String filenameEncoded = URLEncoder.encode(filename, "utf-8");resp.setContentType("application/pdf");resp.setHeader("Content-Disposition", "filename=" + filenameEncoded + ".pdf");try (OutputStream out = resp.getOutputStream()) {PdfDocument doc = new PdfDocument(new PdfWriter(out));//打印使用什么什么纸张可根据实际情况,我这里默认使用A4doc.setDefaultPageSize(PageSize.A4.rotate());HtmlConverter.convertToPdf(html, doc, converterProperties);1.请求接口报错解决方式:

如果在请求接口的时候发生以下错误信息是打印模板的路径错误了。


 

解决该错误需在你的yml配置thymeleaf路径即可,不懂怎么配置请往上看第二点application.yml配置,可按照application.yml复制上去即可解决。

五、生成PDF文件响应效果


 

点击Save to a file保存,响应结果数据均为测试数据,仅供参考。



Tags:Spring   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Spring Security:保障应用安全的利器
SpringSecurity作为一个功能强大的安全框架,为Java应用程序提供了全面的安全保障,包括认证、授权、防护和集成等方面。本文将介绍SpringSecurity在这些方面的特性和优势,以及它...【详细内容】
2024-02-27  Search: Spring  点击:(55)  评论:(0)  加入收藏
Spring Security权限控制框架使用指南
在常用的后台管理系统中,通常都会有访问权限控制的需求,用于限制不同人员对于接口的访问能力,如果用户不具备指定的权限,则不能访问某些接口。本文将用 waynboot-mall 项目举例...【详细内容】
2024-02-19  Search: Spring  点击:(39)  评论:(0)  加入收藏
Spring Boot2.0深度实践 核心原理拆解+源码分析
Spring Boot2.0深度实践:核心原理拆解与源码分析一、引言Spring Boot是一个基于Java的轻量级框架,它简化了Spring应用程序的创建过程,使得开发者能够快速搭建一个可运行的应用...【详细内容】
2024-01-15  Search: Spring  点击:(96)  评论:(0)  加入收藏
Spring Boot 3.0是什么?
Spring Boot 3.0是一款基于Java的开源框架,用于简化Spring应用程序的构建和开发过程。与之前的版本相比,Spring Boot 3.0在多个方面进行了改进和增强,使其更加易用、高效和灵活...【详细内容】
2024-01-11  Search: Spring  点击:(133)  评论:(0)  加入收藏
GraalVM与Spring Boot 3.0:加速应用性能的完美融合
在2023年,SpringBoot3.0的发布标志着Spring框架对GraalVM的全面支持,这一支持是对Spring技术栈的重要补充。GraalVM是一个高性能的多语言虚拟机,它提供了Ahead-of-Time(AOT)编...【详细内容】
2024-01-11  Search: Spring  点击:(124)  评论:(0)  加入收藏
Spring Boot虚拟线程的性能还不如Webflux?
早上看到一篇关于Spring Boot虚拟线程和Webflux性能对比的文章,觉得还不错。内容较长,抓重点给大家介绍一下这篇文章的核心内容,方便大家快速阅读。测试场景作者采用了一个尽可...【详细内容】
2024-01-10  Search: Spring  点击:(118)  评论:(0)  加入收藏
深入分析-Spring BeanDefinition构造元信息
Spring BeanDefinition元信息定义方式Bean Definition是一个包含Bean元数据的对象。它描述了如何创建Bean实例、Bean属性的值以及Bean之间的依赖关系。可以使用多种方式来定...【详细内容】
2024-01-08  Search: Spring  点击:(73)  评论:(0)  加入收藏
Spring Boot Starter的原理
Spring Boot Starter 是 Spring Boot 框架的特性之一,用于简化应用程序的依赖管理和配置。1. 概述: - Spring Boot Starter 是一种包含了一组特定功能和依赖关系的依赖项,旨在...【详细内容】
2024-01-05  Search: Spring  点击:(94)  评论:(0)  加入收藏
Spring 七种事务传播性介绍
本文主要介绍了Spring事务传播性的相关知识。Spring中定义了7种事务传播性: PROPAGATION_REQUIRED PROPAGATION_SUPPORTS PROPAGATION_MANDATORY PROPAGATION_REQUIRES_NEW ...【详细内容】
2024-01-04  Search: Spring  点击:(103)  评论:(0)  加入收藏
监控 Spring Cloud 微服务的实践方案
一、简介Spring Cloud是一个基于Spring Boot实现的微服务框架,它提供了丰富的微服务功能,如分布式配置、服务注册与发现、服务熔断、负载均衡等。为了更好地管理和监控这样复...【详细内容】
2023-12-19  Search: Spring  点击:(145)  评论:(0)  加入收藏
▌简易百科推荐
Qt与Flutter:在跨平台UI框架中哪个更受欢迎?
在跨平台UI框架领域,Qt和Flutter是两个备受瞩目的选择。它们各自具有独特的优势,也各自有着广泛的应用场景。本文将对Qt和Flutter进行详细的比较,以探讨在跨平台UI框架中哪个更...【详细内容】
2024-04-12  刘长伟    Tags:UI框架   点击:(1)  评论:(0)  加入收藏
Web Components实践:如何搭建一个框架无关的AI组件库
一、让人又爱又恨的Web ComponentsWeb Components是一种用于构建可重用的Web元素的技术。它允许开发者创建自定义的HTML元素,这些元素可以在不同的Web应用程序中重复使用,并且...【详细内容】
2024-04-03  京东云开发者    Tags:Web Components   点击:(8)  评论:(0)  加入收藏
Kubernetes 集群 CPU 使用率只有 13% :这下大家该知道如何省钱了
作者 | THE STACK译者 | 刘雅梦策划 | Tina根据 CAST AI 对 4000 个 Kubernetes 集群的分析,Kubernetes 集群通常只使用 13% 的 CPU 和平均 20% 的内存,这表明存在严重的过度...【详细内容】
2024-03-08  InfoQ    Tags:Kubernetes   点击:(18)  评论:(0)  加入收藏
Spring Security:保障应用安全的利器
SpringSecurity作为一个功能强大的安全框架,为Java应用程序提供了全面的安全保障,包括认证、授权、防护和集成等方面。本文将介绍SpringSecurity在这些方面的特性和优势,以及它...【详细内容】
2024-02-27  风舞凋零叶    Tags:Spring Security   点击:(55)  评论:(0)  加入收藏
五大跨平台桌面应用开发框架:Electron、Tauri、Flutter等
一、什么是跨平台桌面应用开发框架跨平台桌面应用开发框架是一种工具或框架,它允许开发者使用一种统一的代码库或语言来创建能够在多个操作系统上运行的桌面应用程序。传统上...【详细内容】
2024-02-26  贝格前端工场    Tags:框架   点击:(47)  评论:(0)  加入收藏
Spring Security权限控制框架使用指南
在常用的后台管理系统中,通常都会有访问权限控制的需求,用于限制不同人员对于接口的访问能力,如果用户不具备指定的权限,则不能访问某些接口。本文将用 waynboot-mall 项目举例...【详细内容】
2024-02-19  程序员wayn  微信公众号  Tags:Spring   点击:(39)  评论:(0)  加入收藏
开发者的Kubernetes懒人指南
你可以将本文作为开发者快速了解 Kubernetes 的指南。从基础知识到更高级的主题,如 Helm Chart,以及所有这些如何影响你作为开发者。译自Kubernetes for Lazy Developers。作...【详细内容】
2024-02-01  云云众生s  微信公众号  Tags:Kubernetes   点击:(51)  评论:(0)  加入收藏
链世界:一种简单而有效的人类行为Agent模型强化学习框架
强化学习是一种机器学习的方法,它通过让智能体(Agent)与环境交互,从而学习如何选择最优的行动来最大化累积的奖励。强化学习在许多领域都有广泛的应用,例如游戏、机器人、自动驾...【详细内容】
2024-01-30  大噬元兽  微信公众号  Tags:框架   点击:(68)  评论:(0)  加入收藏
Spring实现Kafka重试Topic,真的太香了
概述Kafka的强大功能之一是每个分区都有一个Consumer的偏移值。该偏移值是消费者将读取的下一条消息的值。可以自动或手动增加该值。如果我们由于错误而无法处理消息并想重...【详细内容】
2024-01-26  HELLO程序员  微信公众号  Tags:Spring   点击:(88)  评论:(0)  加入收藏
SpringBoot如何实现缓存预热?
缓存预热是指在 Spring Boot 项目启动时,预先将数据加载到缓存系统(如 Redis)中的一种机制。那么问题来了,在 Spring Boot 项目启动之后,在什么时候?在哪里可以将数据加载到缓存系...【详细内容】
2024-01-19   Java中文社群  微信公众号  Tags:SpringBoot   点击:(86)  评论:(0)  加入收藏
站内最新
站内热门
站内头条