本例以Java JDK1.8, Maven, thymeleaf 为基础,演示使用thymeleaf的模版来生成pdf文件。

项目总览

为了快速的创建应用,我选择以SpringBoot为基础来进行创建,首先在我们的https://start.spring.io/生成一个带有thymeleaf依赖的一个项目。

pom.xml可以查看到关于thymeleaf的依赖:

1
2
3
4
   <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

关于版本,需要在spring-boot-starter-parent的属性配置里面可以查看到。以本例中的使用的SpringBoot 2.3.1.RELEASE为例,thymeleaf的版本为3.0.11.RELEAS

实际上thymeleaf只是一个模版引擎,要生成pdf文件还是需要借助另外的库来进行生成,这里使用flyingsaucer,关于更多flyingsaucer 的信息,可以参阅:https://github.com/flyingsaucerproject/flyingsaucer

这里添加flyingsaucer依赖:

1
2
3
4
5
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf-itext5</artifactId>
<version>9.1.6</version>
</dependency>

生成pdf文件

首先需要先准备使用thymeleaf模版的一个html, demo.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8"/>
<title>This is demo</title>
</head>
<body>
<div>
<h1>Demo</h1>
<div style="color:red;">
<p th:text="'Hi ' + ${name}"></p>
Generating pdf files when using thymeleaf!
</div>
</div>
</body>
</html>

接下来,需要通过模版引擎来读取html文件,然后使用flyingsaucer来生成pdf文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Override
public void run(String... args) throws Exception {
Context context = new Context();

context.setVariable("name", "Java");

String html = this.templateEngine.process("demo", context);

String outputFolder = "demo.pdf";

OutputStream outputStream = new FileOutputStream(outputFolder);

ITextRenderer renderer = new ITextRenderer();

renderer.setDocumentFromString(html);
renderer.layout();

renderer.createPDF(outputStream);

outputStream.close();
}

执行完代码之后,我们可以看到pdf文件的效果:

image-20200716180106402

代码

完整代码例子可以通过github来进行查看:https://github.com/duliu1990/dev-website-code/tree/master/thymeleaf-generate-pdf