返回顶部
首页 > 资讯 > 后端开发 > JAVA >2023最新SpringBoot导出PDF方式(模板方式)
  • 294
分享到

2023最新SpringBoot导出PDF方式(模板方式)

springbootpdfjava 2023-09-10 14:09:27 294人浏览 八月长安
摘要

一、前期准备 在开发中经常会遇到需要进行对一些数据进行动态导出pdf文件,然后让用户自己选择是否需要打印出来,这篇文章我们来用个相对来说比较简单的方式来实现PDF动态导出; 导入依赖 S

一、前期准备


开发中经常会遇到需要进行对一些数据进行动态导出pdf文件,然后让用户自己选择是否需要打印出来,这篇文章我们来用个相对来说比较简单的方式来实现PDF动态导出;
导入依赖 SpringBoot版本2.0.5.RELEASE
<dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-WEB</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-freemarker</artifactId>        </dependency>        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>            <version>1.18.20</version>        </dependency>        <dependency>            <groupId>com.itextpdf</groupId>            <artifactId>html2pdf</artifactId>            <version>4.0.3</version>        </dependency>

二、代码实现) 先准备一个html,这个html是一个模板,是将我们需要动态展示的数据插入到每个占位符进来,如下:


先准备一个html,这个html是一个模板,是将我们需要动态展示的数据插入到每个占位符进来,如下:
DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8"/>    <title>Titletitle>    <style>        body{            font-size: 15px;        }        .title{            text-align: center;        }        .content{            margin:0 auto;            width: 400px;        }        .content .text{            text-indent: 2em;        }        .content .datetime{            text-align: right;        }    style>head><body><div>    <div class="view">        <h2 class="title">自我介绍h2>        <div class="content">            <p class="text">                大家好,我叫${person.personName},我今年${person.personAge},我是个${person.personGender},                我的职业是${person.personVocation},我目前住在${person.address},我在性格方面${person.personalityDesc}。            p>            <p class="datetime">${person.createTime}p>        div>    div>div>body>html>

在准备一个PDFUtil的工具
PDFUtil工具类

public class PdfUtil {    @Autowired    private Configuration configuration;        public static String getTemplateContent(String templateDirectory, String templateName, Map<String, Object> paramMap) throws Exception {        Configuration configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS);        try {            configuration.setDirectoryForTemplateLoading(new File(templateDirectory));        } catch (Exception e) {            System.out.println("-- exception --");        }        Writer out = new StringWriter();        Template template = configuration.getTemplate(templateName,"UTF-8");        template.process(paramMap, out);        out.flush();        out.close();        return out.toString();    }        public static boolean html2Pdf(String content, String outPath) {        try {            ConverterProperties converterProperties = new ConverterProperties();            converterProperties.setCharset("UTF-8");            FontProvider fontProvider = new FontProvider();            fontProvider.addSystemFonts();            converterProperties.setFontProvider(fontProvider);            HtmlConverter.convertToPdf(content, new FileOutputStream(outPath), converterProperties);        } catch (Exception e) {            log.error("生成模板内容失败,{}",e);            return false;        }        return true;    }        public static byte[] html2Pdf(String content) {        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();        try {            ConverterProperties converterProperties = new ConverterProperties();            converterProperties.setCharset("UTF-8");            FontProvider fontProvider = new FontProvider();            fontProvider.addSystemFonts();            converterProperties.setFontProvider(fontProvider);            HtmlConverter.convertToPdf(content,outputStream,converterProperties);        } catch (Exception e) {            log.error("生成 PDF 失败,{}",e);        }        return outputStream.toByteArray();    }}Bean类```java@Datapublic class PersonIntroduce {    //名称    private String personName ;    //年龄    private Integer personAge ;    //性格描述    private String personalityDesc;    //性别    private String personGender;    //职业    private String personVocation;    //现居地址    private String address;    //创建时间    private String createTime;}

Controller层代码

@Controllerpublic class PersonIntroduceController {    @Autowired    private PersonIntroduceService personIntroduceService;    @GetMapping("/exPdf")    @ResponseBody    public void exPdfPersonIntroduce(httpservletRequest request , HttpServletResponse response) throws TemplateException, IOException {        PersonIntroduce personIntroduce = new PersonIntroduce();        personIntroduce.setPersonName("小刘");        personIntroduce.setAddress("北京朝阳区");        personIntroduce.setPersonAge(24);        personIntroduce.setPersonGender("男生");        personIntroduce.setPersonalityDesc("其实我也不是很清楚");        personIntroduce.setPersonVocation("Java后端开发");        personIntroduceService.exPersonIntroduce(personIntroduce , request , response);    }}

Service业务层代码:
注意:建议使用这种方式,之前我在项目开发的过程中,使用了PdUtil.class.ClassLoader()这种方式去定位exPdf.html,在线下(开发环境)是可以使用的,但是部署到服务器的时候就出现了文件找不到的情况,因为上述这种方式他是使用的磁盘绝对路径查找的。使用freeMarkerConfigurer.getConfiguration().getTemplate(“exPdf.html”);来定位就不会出现这种问题。

@Servicepublic class PersonIntroduceServiceImpl implements PersonIntroduceService {    @Autowired    private FreeMarkerConfigurer freeMarkerConfigurer;        public void exPersonIntroduce(PersonIntroduce personIntroduce , HttpServletRequest  request, HttpServletResponse response) throws IOException, TemplateException {        SimpleDateFORMat sdf = new SimpleDateFormat("yyyy年MM月dd日");        Map<String, Object> paramMap = new HashMap<>();        personIntroduce.setCreateTime(sdf.format(new Date()));        paramMap.put("person" , personIntroduce);        Writer out = new StringWriter();        //获取模板地址        Template template = freeMarkerConfigurer.getConfiguration().getTemplate("exPdf.html");        template.process(paramMap, out);        out.flush();        out.close();        String templateContent = out.toString();        response.setCharacterEncoding("UTF-8");        response.setContentType("application/pdf");        String fileName =personIntroduce.getPersonName() + "-个人介绍-" + sdf.format(new Date());        response.setHeader("Content-Disposition", "filename=" + new String(fileName.getBytes(), "iso8859-1"));        byte[] resources = PdfUtil.html2Pdf(templateContent);        ServletOutputStream outputStream = response.getOutputStream();        outputStream.write(resources);        outputStream.close();    }}

项目结构:
1680967754954.png

三、使用


1680967622137.png
这样就Ok了

来源地址:https://blog.csdn.net/JAVA_EE_J/article/details/130035074

--结束END--

本文标题: 2023最新SpringBoot导出PDF方式(模板方式)

本文链接: https://lsjlt.com/news/402351.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 2023最新SpringBoot导出PDF方式(模板方式)
    一、前期准备 在开发中经常会遇到需要进行对一些数据进行动态导出PDF文件,然后让用户自己选择是否需要打印出来,这篇文章我们来用个相对来说比较简单的方式来实现PDF动态导出; 导入依赖 S...
    99+
    2023-09-10
    spring boot pdf java
  • java、springboot 接口导出txt方式
    目录java、springboot 接口导出txt就写两个方法Springboot 文件处理导入导出后台导入前台导入前台导出总结:本篇主要记录了java、springboot 接口导...
    99+
    2024-04-02
  • 模板方法模式
    http://www.cnblogs.com/java-my-life/archive/2012/05/14/2495235.htmlhttp://www.importnew.com/15546.html...
    99+
    2023-06-03
  • Java设计模式-模板方法模式
    定义Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subcl...
    99+
    2023-06-05
  • Java设计模式之模板方法模式
    在我们实际开发中,如果一个方法极其复杂时,如果我们将所有的逻辑写在一个方法中,那维护起来就很困难,要替换某些步骤时都要重新写,这样代码的扩展性就很差,当遇到这种情况就要考虑今天的主角...
    99+
    2022-11-13
    Java 设计模式 模板方法模式
  • Typescript模块的导入导出与继承方式
    目录Typescript模块的导入导出与继承导入测试导出测试TypeScript知识点整理TS 和 JS 有什么差异TS 数据类型TS 中的类TS 的访问修饰符TS 中的接口 - i...
    99+
    2024-04-02
  • Springboot导出文件,前端下载文件方式
    Springboot导出文件,前端下载文件 后端代码 可以把请求设置为post,我这里是Get @RequestMapping(value = "/download", met...
    99+
    2024-04-02
  • Java设计模式之浅谈模板方法模式
    一. 什么是模板方法设计模式 从字面意义上理解, 模板方法就是定义出来一套方法, 作为模板, 也就是基础。 在这个基础上, 我们可以进行加工,实现个性化的实现。比如:一日餐三. 早餐...
    99+
    2024-04-02
  • Java设计模式之模板方法模式详解
    目录模板方法模式模板方法模式的优缺点使用场景总结模板方法模式 模板方法模式法(Template Method)定义一个操作中的算法骨架,而将算法的一些步骤延迟到子类中,使得子类可以不...
    99+
    2024-04-02
  • pythonflask之模板继承方式
    目录总结 为什么要用模板继承?原因很简单,因为模板继承能让我们在实现效果的前提下少些很多代码! 咱废话不多说,先来看个小例子,看完我讲的这个例子,相信你能更加明白模板继承的好处、优点...
    99+
    2023-03-02
    python flask flask模板继承 python flask模板继承
  • Java设计模式之java模板方法模式详解
    目录模板方法模式介绍角色代码演示模板方法模式总结优点缺点适用场景源码分析模板方法模式的典型应用Servlet 中的模板方法模式Hello World!Spring中的IOC容器启动—...
    99+
    2024-04-02
  • PHP设计模式之模板方法模式TemplateMethodPattern详解
    目录简介适用场景优点缺点其它代码简介 模板方法模式,是行为型的设计模式。 定义一个操作中的算法的骨架,而将一些步骤延迟到子类当中,使得子类可以不改变一个算法的结构即可重新定义该算法的...
    99+
    2022-12-20
    PHP设计模式之模板方法模式 PHP模板方法模式
  • Java设计模式之模板方法模式TemplateMethodPattern详解
    目录概述模板方法模板方法模式好莱坞原则好莱坞原则与依赖倒置原则真实案例模板方法模式的注意事项和细节概述 模板方法 模板方法定义了一个算法的步骤,并允许子类为一个或多个步骤提供实现。那...
    99+
    2022-11-13
    Java模板方法模式 Java Template Method Pattern
  • node导出模块的两种方式是什么
    今天小编给大家分享一下node导出模块的两种方式是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了...
    99+
    2024-04-02
  • 最新springboot解决跨域的几种方式小结
    目录什么是跨域springboot解决跨域的几种方式方法一、SpringBoot的注解@CrossOrigin方式二:使用CorsFilter方式三:自定义过滤(web  ...
    99+
    2024-04-02
  • Java设计模式之模板方法模式实例分析
    本文小编为大家详细介绍“Java设计模式之模板方法模式实例分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java设计模式之模板方法模式实例分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。模板方法模式模板方...
    99+
    2023-06-29
  • 怎么理解Java设计模式的模板方法模式
    这篇文章主要讲解了“怎么理解Java设计模式的模板方法模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解Java设计模式的模板方法模式”吧!一、什么是模板方法模式模板方法模式在一个方...
    99+
    2023-06-25
  • 设计模式二十三:模板方法模式(Template Method Pattern)
    定义了一个算法的框架,将算法的具体步骤延迟到子类中实现。这样可以在不改变算法结构的情况下,允许子类重写算法的特定步骤以满足自己的需求 模版方法使用场景 算法框架固定,但具体步骤可以变化:当你有一个算法的整体结构是固定的,但其中某些步骤的实现...
    99+
    2023-08-30
    设计模式 模板方法模式
  • 深入理解Java设计模式之模板方法模式
    目录一、什么是模板方法模式二、模板方法模式的使用场景三、模板方法模式的优缺点四、模板方法模式的实现五、总结一、什么是模板方法模式 模板方法模式在一个方法中定义一个算法的骨架,而将一些...
    99+
    2024-04-02
  • PHP入门指南:模板方法模式
    PHP是一种流行的Web开发语言,被广泛应用于构建动态网页和Web应用程序。PHP支持许多不同的编程模式,包括面向对象编程、函数式编程和设计模式。其中,模板方法模式是一种常见的设计模式,它可以帮助开发人员构建可维护、可扩展的代码。什么是模板...
    99+
    2023-05-22
    PHP 模板方法 入门
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作