【Spring Boot 实现 PDF 导出】
Spring Boot 实现 PDF 导出在Spring Boot应用程序中实现PDF导出功能可以选择多种库和技术栈。每种方法都有其优缺点适用于不同的场景。以下是四种常见的方式iText、Apache PDFBox、JasperReports 和 Thymeleaf Flying Saucer。我将详细对比这些方法并提供相应的代码示例。1. iText优点:丰富的API: 支持复杂的PDF操作如加密、数字签名、表单处理等。企业级支持: 提供广泛的文档和支持社区。多格式输出: 除了PDF还支持其他格式如HTML、XML的转换。缺点:商业许可: iText 7 是商业软件某些高级功能需要购买许可证。学习曲线: API较为复杂可能需要一定的学习成本。性能:对于大多数应用场景来说iText 的性能是足够的。它在内存管理和文件处理速度方面表现优秀尤其适合处理复杂的PDF文档。适用场景:适合需要生成复杂PDF文档的应用尤其是那些涉及安全性和高级功能的企业级应用。示例代码:!-- 添加依赖 -- dependency groupIdcom.itextpdf/groupId artifactIditext7-core/artifactId version7.1.15/version !-- 请检查并使用最新版本 -- /dependency import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.layout.Document; import com.itextpdf.layout.element.Paragraph; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class ITextPdfService { public void export(HttpServletResponse response) throws IOException { // 设置响应头 response.setContentType(application/pdf); response.setHeader(Content-Disposition, attachment; filenameusers.pdf); try (PdfWriter writer new PdfWriter(response.getOutputStream()); PdfDocument pdf new PdfDocument(writer); Document document new Document(pdf)) { // 添加内容到PDF document.add(new Paragraph(Hello, this is a PDF document created with iText in Spring Boot!)); // 关闭文档 document.close(); } } }2. Apache PDFBox优点:完全开源: 没有商业限制适合所有类型的项目。轻量级: 依赖项较少项目结构简洁。易于上手: API相对简单适合快速开发和学习。缺点:功能有限: 在一些复杂的功能上如处理大型PDF或执行高级操作可能不如iText强大。性能问题: 在处理非常大的文件或高并发场景下性能可能会略逊于iText。性能:PDFBox 在处理较小的PDF文件时表现良好但在处理大文件或者高并发场景下其性能可能会略逊于iText。适用场景:适合需要生成简单PDF文档的应用尤其是那些希望保持完全开源的项目。示例代码:!-- 添加依赖 -- dependency groupIdorg.apache.pdfbox/groupId artifactIdpdfbox/artifactId version2.0.27/version !-- 请检查并使用最新版本 -- /dependency import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.font.PDType1Font; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class PdfBoxPdfService { public void export(HttpServletResponse response) throws IOException { // 设置响应头 response.setContentType(application/pdf); response.setHeader(Content-Disposition, attachment; filenameusers.pdf); try (PDDocument document new PDDocument()) { PDPage page new PDPage(); document.addPage(page); try (PDPageContentStream contentStream new PDPageContentStream(document, page)) { contentStream.setFont(PDType1Font.HELVETICA_BOLD, 12); contentStream.beginText(); contentStream.newLineAtOffset(100, 700); contentStream.showText(Hello, this is a PDF document created with Apache PDFBox in Spring Boot!); contentStream.endText(); } // 将PDF写入响应输出流 document.save(response.getOutputStream()); } } }3. JasperReports优点:强大的报表设计能力: 支持复杂的表格、图表、分组、子报表等功能。多数据源支持: 可以从数据库、JavaBean集合、CSV、XML等多种数据源获取数据。丰富的样式和格式化: 支持多种字体、颜色、边框、背景等样式设置以及日期、数字等格式化。集成度高: 与Spring Boot集成方便可以轻松地将报表生成逻辑嵌入到应用程序中。输出格式多样: 除了PDF还支持HTML、Excel、CSV等多种输出格式。缺点:学习曲线较陡: JRXML模板语法较为复杂需要一定时间来掌握。依赖项较多: 需要引入多个依赖项可能会增加项目的复杂度。性能问题: 在处理非常大的数据集时可能会遇到性能瓶颈尤其是在内存管理和渲染速度方面。性能:在处理复杂报表和大数据集时表现较好尤其是在需要高级功能如分组、图表的情况下。适用场景:适合需要生成复杂报表的应用尤其是包含大量数据、图表、分组等元素的场景。适合需要支持多种输出格式的应用。示例代码:!-- 添加依赖 -- dependency groupIdnet.sf.jasperreports/groupId artifactIdjasperreports/artifactId version6.17.0/version !-- 请检查并使用最新版本 -- /dependency import net.sf.jasperreports.engine.*; import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.http.HttpServletResponse; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; RestController RequestMapping(/api) public class JasperReportController { GetMapping(/export-jasper-pdf) public void export(HttpServletResponse response) throws Exception { // 设置响应头 response.setContentType(application/pdf); response.setHeader(Content-Disposition, attachment; filenamereport.pdf); // 加载JRXML模板 InputStream reportTemplate getClass().getResourceAsStream(/templates/report.jrxml); JasperReport jasperReport JasperCompileManager.compileReport(reportTemplate); // 准备数据 ListUser users userService.getAllUsers(); // 假设有一个UserService类 JRBeanCollectionDataSource dataSource new JRBeanCollectionDataSource(users); // 设置参数 MapString, Object parameters new HashMap(); parameters.put(title, User Report); // 生成PDF JasperPrint jasperPrint JasperFillManager.fillReport(jasperReport, parameters, dataSource); JasperExportManager.exportReportToPdfStream(jasperPrint, response.getOutputStream()); } }4. Thymeleaf Flying Saucer优点:HTML/CSS友好: 使用标准的HTML和CSS进行页面布局和样式设置非常适合前端开发人员。易于维护: HTML模板容易理解和修改尤其适合那些已经熟悉HTML/CSS的团队。灵活性高: 可以轻松地将现有的Thymeleaf模板转换为PDF减少了重复工作。轻量级: 相对于JasperReportsFlying Saucer的依赖项较少项目结构更简洁。快速开发: 对于简单的PDF生成需求开发速度较快因为不需要学习新的模板语言。缺点:功能有限: 相比JasperReportsFlying Saucer的功能较为有限特别是在处理复杂报表如分组、图表时。性能一般: 在处理大文件或高并发场景下性能可能不如JasperReports。样式兼容性: 某些CSS样式可能无法完全兼容导致PDF渲染效果与预期不符。性能:对于简单的PDF生成需求性能足够并且开发速度快维护成本低。适用场景:适合需要将现有的HTML页面转换为PDF的应用尤其是那些已经有现成的HTML模板的情况。适合生成简单的文档如发票、合同、报告等而不涉及复杂的报表功能。示例代码:!-- 添加依赖 -- dependency groupIdorg.thymeleaf/groupId artifactIdthymeleaf/artifactId version3.0.12.RELEASE/version !-- 请检查并使用最新版本 -- /dependency dependency groupIdorg.xhtmlrenderer/groupId artifactIdflying-saucer-pdf-itext5/artifactId version9.1.20/version !-- 请检查并使用最新版本 -- /dependency import org.springframework.core.io.ClassPathResource; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.thymeleaf.TemplateEngine; import org.thymeleaf.context.Context; import org.xhtmlrenderer.pdf.ITextRenderer; import javax.servlet.http.HttpServletResponse; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.nio.charset.StandardCharsets; RestController RequestMapping(/api) public class PdfController { private final TemplateEngine templateEngine; public PdfController(TemplateEngine templateEngine) { this.templateEngine templateEngine; } GetMapping(/export-thymeleaf-pdf) public void export(HttpServletResponse response) throws Exception { // 设置响应头 response.setContentType(application/pdf); response.setHeader(Content-Disposition, attachment; filenamereport.pdf); // 加载HTML模板 InputStream templateInputStream new ClassPathResource(templates/report.html).getInputStream(); String htmlContent new String(templateInputStream.readAllBytes(), StandardCharsets.UTF_8); // 准备上下文数据 Context context new Context(); context.setVariable(users, userService.getAllUsers()); // 假设有一个UserService类 context.setVariable(title, User Report); // 渲染HTML String processedHtml templateEngine.process(htmlContent, context); // 将HTML转换为PDF ITextRenderer renderer new ITextRenderer(); renderer.setDocumentFromString(processedHtml); renderer.layout(); // 输出PDF try (OutputStream outputStream response.getOutputStream()) { renderer.createPDF(outputStream); } } }性能与易用性对比特性iTextApache PDFBoxJasperReportsThymeleaf Flying Saucer性能高中高复杂报表中简单文档易用性复杂简单复杂简单功能强大有限非常强大报表有限HTML/CSS依赖项较多部分需商业许可少较多少适用场景复杂PDF文档简单PDF文档复杂报表简单文档/HTML转PDF学习曲线陡峭平缓陡峭平缓总结选择 iText如果你需要生成复杂的PDF文档尤其是涉及到安全性和高级功能的企业级应用。iText 提供了最全面的功能和最佳的性能但需要注意其商业许可要求。选择 Apache PDFBox如果你希望保持完全开源并且只需要生成简单的PDF文档。PDFBox 轻量级且易于上手适合小型项目或对性能要求不高的场景。选择 JasperReports如果你需要生成复杂的报表特别是涉及到分组、图表、子报表等功能。JasperReports 是一个功能强大且成熟的工具适合企业级应用。选择 Thymeleaf Flying Saucer如果你需要将现有的HTML页面转换为PDF或者只需要生成简单的文档如发票、合同等。它易于使用开发速度快特别适合前端开发人员。在实际项目中建议根据具体需求和技术栈选择合适的工具。如果你不确定哪种工具更适合可以先尝试一个小规模的原型项目评估其性能和易用性再做最终决定。

相关新闻

SCI一区预定!独家原创!26年最新算法CCO优化JMD轻松实现信号分解!附Matlab代码

SCI一区预定!独家原创!26年最新算法CCO优化JMD轻松实现信号分解!附Matlab代码

目录 数据输入方法 模型流程 创新点 1.使用JMD的创新点在于 2.使用中心碰撞优化算法CCO创新点在于 结果展示 完整代码 今天给大家带来一期利用26年最新中心碰撞优化算法CCO优化最新且小众的信号分解方法JMD的代码,JMD这个算法也是2025年刚提出来的一个新算法…

2026/7/5 6:44:34 阅读更多 →
基于‘Matlab+Yalmip+Cplex‘的阶梯碳交易成本含电转气-碳捕集(P2G-CCS...

基于‘Matlab+Yalmip+Cplex‘的阶梯碳交易成本含电转气-碳捕集(P2G-CCS...

基于阶梯碳交易成本的含电转气-碳捕集(P2G-CCS)耦合的综合能源系统低碳经济优化调度,采用(MatlabYalmipCplex) 考虑P2G设备、碳捕集电厂、风电机组、光伏机组、CHP机组、燃气锅炉、电储能、热储能、烟气存储罐。最近在…

2026/7/5 3:56:07 阅读更多 →
海外GEO优化公司实践:5个亲测案例分享

海外GEO优化公司实践:5个亲测案例分享

一、 行业痛点分析:从“信息可见”到“智能可信”的断层当前,企业在拓展海外市场时,于GEO优化领域面临的核心挑战已发生本质变化。传统搜索引擎优化(SEO)侧重于关键词排名与点击率,其逻辑建立在用户主动检索…

2026/7/3 20:21:27 阅读更多 →

最新新闻

HTTP协议及其POST与GET操作差异  C#中如何使用POST、GET等

HTTP协议及其POST与GET操作差异 C#中如何使用POST、GET等

HTTP协议我想任何IT人士都耳熟能详了,大家都能说出个所以然来。但是如果我问你HTTP协议的请求方法有哪些?POST与GET的差异?GET或POST传送数据量的大小有限制吗?HTTP响应的状态有哪些?以及在C#中你如何使用?…

2026/7/6 4:16:17 阅读更多 →
【git教程】科研技能必备——git的使用

【git教程】科研技能必备——git的使用

【git教程】科研技能必备——git的使用 git的知识其实常用的就那几个,由于网上的教程有很多,笔者感觉能给各位读者做的也只有帮忙筛选了。 注:其实这些git的命令行操作在目前主流的IDE(如VScode,cursor)上已经集成好了…

2026/7/6 4:14:17 阅读更多 →
个人数据主权革命:WeChatMsg如何重新定义数字记忆资产管理

个人数据主权革命:WeChatMsg如何重新定义数字记忆资产管理

个人数据主权革命:WeChatMsg如何重新定义数字记忆资产管理 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/W…

2026/7/6 4:14:17 阅读更多 →
web应用技术作业10

web应用技术作业10

完成自己项目的分页显示、条件查询、添加、删除、修改等功能分页显示:条件查询:添加:删除:修改:

2026/7/6 4:12:16 阅读更多 →
为什么我们需要SDD(规格驱动开发)

为什么我们需要SDD(规格驱动开发)

输入“使用 FastAPI 在 Python 中创建一个登录接口。”改一下提示词:“使用JWT”。想了想,再输入:“数据存储到MySQL”。如此来回折腾数次之后,满心欢喜的交付给测试。这就是Vibe Coding,你和大模型进行对话&#xff0…

2026/7/6 4:10:16 阅读更多 →
Java3:Java运算符详解:编程世界的加减乘除

Java3:Java运算符详解:编程世界的加减乘除

目录 写在前面 一、运算符是什么? 二、算术运算符:最基础的数学工具 2.1 基本四则运算: - * / % 2.2 增量运算符: - * / % 2.3 自增/自减运算符: -- 三、关系运算符:比较大小的利器 四、逻辑运算符&…

2026/7/6 4:10:16 阅读更多 →

日新闻

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2 与 MySQL 单元测试兼容性:5 个关键 SQL 语句差异与规避方案

H2与MySQL单元测试兼容性:5个关键SQL语句差异与规避方案1. 单元测试中的数据库兼容性挑战在Java开发领域,单元测试是保证代码质量的重要环节。当应用涉及数据库操作时,测试环境的搭建往往成为开发者的痛点。H2数据库因其轻量级、内存模式和快…

2026/7/6 0:01:17 阅读更多 →
Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘

Windows任务栏终极清理指南:用RBTray一键隐藏窗口到系统托盘 【免费下载链接】rbtray A fork of RBTray from http://sourceforge.net/p/rbtray/code/. 项目地址: https://gitcode.com/gh_mirrors/rb/rbtray 你是否厌倦了Windows任务栏上密密麻麻的图标&…

2026/7/6 0:01:17 阅读更多 →
Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C++ 运行时库一键安装终极指南:告别DLL缺失烦恼

Visual C 运行时库一键安装终极指南:告别DLL缺失烦恼 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过这样的情况:下载了…

2026/7/6 0:05:19 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻