1.引入相关依赖:在Maven或Gradle项目中添加Thymeleaf、Flying Saucer和OpenPDF相关依赖。可以通过以下Maven坐标或者Gradle配置添加:
<!-- Thymeleaf -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- Flying Saucer -->
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf</artifactId>
<version>9.1.20</version>
</dependency>
<!-- OpenPDF -->
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.7</version>
</dependency>
2.编写PDF模板:使用Thymeleaf编写PDF模板,需要指定页面的大小为A4。样式中的@page指令用于定义页面大小和页边距,body标签中为PDF文档的主体内容。
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>PDF Demo</title>
<style type="text/css">
@page {
size: A4;
margin: 1cm;
}
</style>
</head>
<body>
<h1 th:text="${title}">PDF Demo</h1>
<p th:text="${content}">Hello, World!</p>
</body>
</html>
3.创建Thymeleaf模板引擎:在Spring Boot中,可以使用SpringTemplateEngine类创建Thymeleaf模板引擎。需要添加SpringResourceTemplateResolver作为模板解析器,指定模板文件的位置和前缀后缀等信息。
@Bean
public SpringTemplateEngine templateEngine() {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
resolver.setPrefix("classpath:/templates/");
resolver.setSuffix(".html");
resolver.setTemplateMode(TemplateMode.HTML);
templateEngine.setTemplateResolver(resolver);
return templateEngine;
}
4.创建PDF生成器:使用Flying Saucer和OpenPDF生成PDF文档。
@Component
public class PdfGenerator {
private final String TEMPLATE = "pdf_template";
private final SpringTemplateEngine templateEngine;
@Autowired
public PdfGenerator(SpringTemplateEngine templateEngine) {
this.templateEngine = templateEngine;
}
public ByteArrayInputStream generatePdf(String title, String content) {
// 根据 Thymeleaf 模板生成 HTML 页面
Context context = new Context();
context.setVariable("title", title);
context.setVariable("content", content);
String htmlContent = templateEngine.process(TEMPLATE, context);
// 将 HTML 页面转换为 PDF 文档
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
ITextRenderer renderer = new ITextRenderer();
renderer.setDocumentFromString(htmlContent);
renderer.layout();
renderer.createPDF(baos);
return new ByteArrayInputStream(baos.toByteArray());
} catch (IOException | DocumentException e) {
throw new RuntimeException(e);
}
}
}
5.调用PDF生成器生成PDF文档:在Controller中使用PdfGenerator生成PDF文档,并通过Response返回给前端。
@RestController
public class PdfController {
private final PdfGenerator pdfGenerator;
@Autowired
public PdfController(PdfGenerator pdfGenerator) {
this.pdfGenerator = pdfGenerator;
}
@GetMapping("/pdf")
public void downloadPdf(HttpServletResponse response) throws IOException {
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=test.pdf");
ByteArrayInputStream bis = pdfGenerator.generatePdf("Test Title", "Test Content");
IOUtils.copy(bis, response.getOutputStream());
}
}
完整的示例代码可以参考下面的GitHub链接:
https://github.com/binjie09/spring-boot-pdf-demo