SpringBoot整合PDF导出功能

在实际开发中,我们经常需要将数据导出为PDF格式,以便于打印、分享或存档。SpringBoot提供了多种方式来实现PDF导出功能,下面我们将介绍其中的一些。

HTML 模板转 PDF(推荐)

通过模板引擎(如 Thymeleaf 或 Freemarker)生成 HTML,再转换为 PDF。

1.首先,需要在pom.xml文件中添加依赖项:
复制代码
<!-- Thymeleaf 模板引擎 -->
        <dependency>
            <groupId>org.thymeleaf</groupId>
            <artifactId>thymeleaf</artifactId>
            <version>3.0.12.RELEASE</version> <!-- 请检查并使用最新版本 -->
        </dependency>
        <dependency>
            <groupId>org.xhtmlrenderer</groupId>
            <artifactId>flying-saucer-pdf-itext5</artifactId>
            <version>9.1.20</version> <!-- 请检查并使用最新版本 -->
        </dependency>
2.接下来,我们需要把模板文件pdfTemplate.html放到资产文件夹中 src/main/resources/templates
复制代码
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8"/>
    <style>
        body { font-family: SimSun; } /* 解决中文乱码 */
    </style>

</head>
<body>
<div>
    <span th:text="'名称:' + ${title}" style="display: block;"></span>
</div>



</body>
</html>
3.还需要把对应的字体放到resource中,这样防止中文在pdf中不显示,放在该路径下 src/main/resources/fonts/simsun.ttc
4.接下来,创建一个Controller类,用于生成PDF文件:
复制代码
package com.onejson.ojmall.controller;

import org.thymeleaf.TemplateEngine;
import com.itextpdf.text.pdf.BaseFont;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.thymeleaf.context.Context;
import org.xhtmlrenderer.pdf.ITextRenderer;

import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;

@RestController
@RequestMapping("/pdf")
@Api(tags = "pdf管理")
public class PdfController {


    /**
     * 通过html模板生成pdf
     * @param response
     * @throws Exception
     */
    @GetMapping("/export/html2pdf")
    public void export(HttpServletResponse response) throws Exception {
        // 设置响应头
        response.setContentType("application/pdf");
        response.setHeader("Content-Disposition", "attachment; filename=report.pdf");

        // 加载HTML模板
        InputStream templateInputStream = this.getClass().getResourceAsStream("/templates/pdfTemplate.html");
        assert templateInputStream != null;
        byte[] bytes = new byte[templateInputStream.available()];
        templateInputStream.read(bytes);
        String htmlContent = new String(bytes, StandardCharsets.UTF_8);

        // 准备上下文数据
        Context context = new Context();

        context.setVariable("title", "测试");

        // 渲染HTML
        TemplateEngine templateEngine = new TemplateEngine();
        String processedHtml = templateEngine.process(htmlContent, context);

        // 将HTML转换为PDF
        ITextRenderer renderer = new ITextRenderer();
        renderer.setDocumentFromString(processedHtml);
        // 字段导入很重要,不然中文不显示
        renderer.getFontResolver().addFont("/fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        renderer.layout();

        // 输出PDF
        try (OutputStream outputStream = response.getOutputStream()) {
            renderer.createPDF(outputStream);
        }
    }
}

这里我们设置了一个 title的变量来测试内容。

5.最后利用Postman工具请求接口,得到结果显示。完成对接
相关推荐
笃行3506 小时前
SQLServer数据迁移之后,那张报表还能不能秒出
后端
LucianaiB6 小时前
别再被 AI 骗了:我把腾讯云 4 个 Skill 做成了个「AI 打假侦探」,过程的一个小配置坑惨了我
后端
candyTong7 小时前
Claude Code 如何恢复一段会话
后端·架构·ai编程
En^_^Joy8 小时前
Django项目配置全攻略:settings配置文件
后端·python·django
砍材农夫8 小时前
spring-ai|Spring‑AI 2.0.0 新特性 + 入门教程
spring boot·spring·spring cloud
IT_陈寒11 小时前
Python线程池吞了异常还不告诉我,这谁顶得住啊
前端·人工智能·后端
小强库计算机毕业设计11 小时前
SpringBoot+Vue3 学生宿舍管理系统实战
java·spring boot·后端·vue·学生宿舍管理系统
小狼18311 小时前
实践6|SDD 实战:AI 写的规格被推翻了四次
后端·claude
篮框坏了11 小时前
"DeepSeek Harness 实测:一毛钱干三活,但默认配置是个坑"
后端·ai编程
jobBridge2111 小时前
大模型到底是怎么"想"的?我把 Transformer 拆开,发现它其实是个"接词狂魔"
人工智能·后端·编程语言