使用Thymeleaf生成PDF文件

Generating PDF Files Using Thymeleaf

1.概述

在本教程中,我们将通过一个简单实用的示例来学习如何使用Thymeleaf作为模板引擎来生成PDF。

2. Maven依赖

首先,让我们添加Thymeleaf依赖项:

1
2
3
4
5
<dependency>
    <groupId>org.thymeleaf</groupId>
    thymeleaf</artifactId>
    <version>3.0.11.RELEASE</version>
</dependency>

Thymeleaf本身只是一个模板引擎,它不能自行生成PDF。为此,我们将把flying-saucer-pdf添加到我们的pom.xml中:

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

3.生成PDF

接下来,让我们创建一个简单的Thymeleaf HTML模板– thymeleaf_template.html:

1
2
3
4
5
6
7
8
9
<html xmlns:th="http://www.thymeleaf.org">
 
    <p>

      <span th:text="'Welcome to ' + ${to} + '!'"></span>
   
</p>
 
</html>

然后,我们将创建一个简单的函数parseThymeleafTemplate,它将解析我们的模板并返回一个HTML字符串:

1
2
3
4
5
6
7
8
9
10
11
12
13
private String parseThymeleafTemplate() {
    ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
    templateResolver.setSuffix(".html");
    templateResolver.setTemplateMode(TemplateMode.HTML);

    TemplateEngine templateEngine = new TemplateEngine();
    templateEngine.setTemplateResolver(templateResolver);

    Context context = new Context();
    context.setVariable("to","Baeldung");

    return templateEngine.process("thymeleaf_template", context);
}

最后,让我们实现一个简单的函数,该函数接收先前生成的HTML作为输入并将PDF写入我们的主文件夹:

1
2
3
4
5
6
7
8
9
10
11
public void generatePdfFromHtml(String html) {
    String outputFolder = System.getProperty("user.home") + File.separator +"thymeleaf.pdf";
    OutputStream outputStream = new FileOutputStream(outputFolder);

    ITextRenderer renderer = new ITextRenderer();
    renderer.setDocumentFromString(html);
    renderer.layout();
    renderer.createPDF(outputStream);

    outputStream.close();
}

运行我们的代码之后,我们会在用户的主目录中注意到一个名为thymeleaf.pdf的文件,如下所示:

 width=

 width=

如我们所见,文本是绿色的,并且与内联CSS中定义的中心对齐。这是用于定制我们的PDF的功能非常强大的工具。

我们应该记住,Thymeleaf与Flying Saucer是完全脱钩的,这意味着我们可以使用任何其他模板引擎来创建PDF,例如Apache FreeMarker。

4。结论

在本快速教程中,我们学习了如何使用Thymeleaf作为模板引擎轻松生成PDF。

与往常一样,该代码可在GitHub上获得。