在现代Web开发中,生成PDF文档是一个常见的需求,无论是生成报表、导出合同还是制作发票,都需要高效、灵活的PDF生成方案。本篇文章将深入探讨如何使用 SpringBoot 3.3 结合 Thymeleaf、JavaScript 和 Bootstrap 实现高效的PDF文档生成,并通过详细的代码示例和配置说明,帮助大家快速上手这一技术方案。
随着业务需求的不断增长,传统的PDF生成方式已经难以满足复杂、多样化的需求。使用HTML模板生成PDF具有以下优势:
- 可视化强:可以直接在浏览器中预览效果,所见即所得。
- 样式灵活:借助CSS和Bootstrap,可以轻松实现复杂的布局和样式。
- 开发高效:前后端分离,开发维护更加便捷。
本篇文章将基于 SpringBoot 3.3,利用 Thymeleaf 模板引擎和 OpenPDF 库,将HTML模板渲染为PDF文档,实现高效、灵活的PDF生成方案。
运行效果:
图片
生成 pdf 效果:
图片
若想获取项目完整代码以及其他文章的项目源码,且在代码编写时遇到问题需要咨询交流,欢迎加入下方的知识星球。
项目环境准备
1. 开发环境
- JDK 17:确保您的项目运行在Java 17环境下。
- Maven 3.8+:用于项目构建和依赖管理。
- SpringBoot 3.3:最新版本的SpringBoot框架。
- Thymeleaf:流行的Java模板引擎。
- OpenPDF:开源的PDF生成库。
- Bootstrap 5:用于前端页面的布局和样式。
- JavaScript:用于增强页面交互性。
2. 项目结构
项目的基本结构如下:
项目依赖配置(pom.xml)
首先,我们需要在 pom.xml 中添加必要的依赖。
依赖说明:
- spring-boot-starter-web:提供Web开发所需的基本依赖。
- spring-boot-starter-thymeleaf:集成Thymeleaf模板引擎。
- openpdf:用于生成PDF文档的核心库。
- flying-saucer:将HTML转换为PDF的工具,结合OpenPDF使用。
- spring-boot-starter-logging:提供日志支持。
应用配置(application.yml)
在 src/main/resources 目录下创建 application.yml 配置文件。
配置说明:
- server.port:设置应用运行端口为8080。
- spring.thymeleaf:配置Thymeleaf模板引擎的相关属性,指定模板路径、后缀、编码等。
后端代码实现
1. 主启动类
创建主启动类 PdfDemoApplication.java。
2. 控制器层
创建控制器类 PdfController.java,负责处理请求和生成PDF文档。
代码说明:
- /preview:用于展示HTML内容的预览页面,方便在生成PDF前查看效果。
- /download:生成PDF文档并通过HTTP响应下载。
3. 服务层
创建服务类 PdfService.java,负责处理HTML内容的生成和PDF文档的生成。
代码说明:
- generateHtmlContent():使用Thymeleaf模板引擎渲染HTML内容,填充模板变量。
- generatePdf():使用 ITextRenderer 将HTML内容转换为PDF文档,并写入HTTP响应,供用户下载。
注意事项:
- 模板引擎配置:TemplateEngine 需要在配置类中进行相应设置,这里通过自动装配注入。
- 字符编码:确保HTML内容的字符编码为UTF-8,避免中文乱码。
前端代码实现
1. Thymeleaf模板
在 src/main/resources/templates 目录下创建 preview.html 和 pdf_template.html 两个模板文件。
1.1 preview.html
用于在浏览器中预览内容。
代码说明:
- 使用 Bootstrap 5 进行简单的页面布局和样式设计。
- 通过Thymeleaf的 th:text 属性渲染动态内容。
- 提供一个下载PDF的按钮,链接到 /download`。
1.2 pdf_template.html
用于生成PDF的模板。
代码说明:
- 内联样式:为了确保PDF中样式正确渲染,使用内联CSS样式。
- 字体设置:指定 font-family 为中文字体(如 "SimSun"),避免中文显示乱码。
- 内容布局:简单的标题、内容和页脚布局,满足基本的PDF文档需求。
2. 静态资源
对于简单的示例,我们直接使用CDN引入Bootstrap的CSS和JS。如果需要自定义样式和脚本,可以在 src/main/resources/static 目录下添加相应的文件。
运行与测试
1. 启动应用
在项目根目录下执行以下命令启动应用:
2. 访问预览页面
在浏览器中访问:
您将看到预览页面,展示了将要生成的PDF内容。
3. 下载PDF文档
在预览页面点击“下载PDF文档”按钮,浏览器将自动下载生成的PDF文件 generated.pdf。
效果展示:
生成的PDF文档应当包含正确的中文内容和样式,确保没有乱码和样式错乱。
深度解析
1. 为什么选择OpenPDF和Flying Saucer
OpenPDF 是一个功能强大且稳定的开源PDF库,支持丰富的PDF操作。而 Flying Saucer 是一个专门用于将XHTML/CSS转换为PDF的库,与OpenPDF兼容性良好。两者结合,可以方便地将HTML模板转换为高质量的PDF文档。
优势:
- 易于使用:API简洁明了,集成方便。
- 支持CSS样式:能够很好地渲染复杂的CSS样式,满足多样化的布局需求。
- 开源免费:无版权限制,适用于商业项目。
2. 字体和编码问题
在生成包含中文内容的PDF时,常常会遇到乱码或字体缺失的问题。为了解决这些问题,我们需要:
- 指定中文字体:在CSS中设置 font-family 为系统支持的中文字体,如 "SimSun"、"Microsoft YaHei" 等。
- 嵌入字体:确保PDF中嵌入所需的字体文件,可以通过配置ITextRenderer来实现。
- 设置编码:确保HTML内容和生成的PDF使用统一的UTF-8编码。
示例:嵌入字体
注意:需要将字体文件放在项目的资源目录中,并指定正确的路径。
3. 处理复杂布局和样式
对于复杂的PDF文档,可以在HTML模板中使用更丰富的Bootstrap组件和自定义CSS,实现多栏布局、表格、图片等元素。同时,Thymeleaf的强大模板功能也可以帮助我们动态生成复杂的内容。
示例:在模板中使用表格
4. 动态数据填充
通过在服务层获取数据库或其他数据源的数据,并将其传递给Thymeleaf模板,我们可以动态生成包含业务数据的PDF文档。
示例:传递数据列表
在模板中迭代显示数据:
总结
通过本文的讲解,我们成功实现了使用 SpringBoot 3.3 结合 Thymeleaf 模板引擎、高效生成PDF文档的功能。从环境配置、依赖管理到代码实现,再到样式设计和复杂布局处理,都进行了详细的阐述。
优势总结:
- 高效性:利用现有的HTML模板和样式,快速生成所见即所得的PDF文档。
- 灵活性:通过模板和数据的结合,轻松实现动态内容的生成。
- 可维护性:清晰的前后端分离,方便维护和扩展。
未来展望:
- 多语言支持:通过国际化配置,实现PDF文档的多语言版本。
- 更复杂的样式:引入更丰富的前端框架,如Tailwind CSS,提升文档的美观度。
- 性能优化:对于大批量PDF生成的场景,可以考虑异步处理和缓存机制,提升性能。
希望本文能对大家的开发工作有所帮助,助大家在项目中高效地实现PDF文档生成功能。