我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

一、前期准备


在开发中经常会遇到需要进行对一些数据进行动态导出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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录