如何使用 thymeleaf 作为模板引擎生成 pdf 报告? [关闭]

Posted

技术标签:

【中文标题】如何使用 thymeleaf 作为模板引擎生成 pdf 报告? [关闭]【英文标题】:How to generate pdf report using thymeleaf as template engine? [closed] 【发布时间】:2016-05-21 02:44:02 【问题描述】:

我想在 spring mvc 应用程序中创建 pdf 报告。我想用themeleaf来设计html报告页面,然后转换成pdf文件。我不想使用 xlst 来设置 pdf 的样式。有可能这样做吗?

注意:这是客户要求。

【问题讨论】:

见***.com/questions/23173485/… 【参考方案1】:

您可以使用 thymeleaf 提供的SpringTemplateEngine。下面是它的依赖:

<dependency>
    <groupId>org.thymeleaf</groupId>
    <artifactId>thymeleaf-spring4</artifactId>
</dependency>

以下是我为生成 PDF 所做的实现:

@Autowired
SpringTemplateEngine templateEngine;

public File exportToPdfBox(Map<String, Object> variables, String templatePath, String out) 
    try (OutputStream os = new FileOutputStream(out);) 
        // There are more options on the builder than shown below.
        PdfRendererBuilder builder = new PdfRendererBuilder();
        builder.withHtmlContent(getHtmlString(variables, templatePath), "file:");
        builder.toStream(os);
        builder.run();
     catch (Exception e) 
        logger.error("Exception while generating pdf : ", e);
    
    return new File(out);


private String getHtmlString(Map<String, Object> variables, String templatePath) 
    try 
        final Context ctx = new Context();
        ctx.setVariables(variables);
        return templateEngine.process(templatePath, ctx);
     catch (Exception e) 
        logger.error("Exception while getting html string from template engine : ", e);
        return null;
    

您可以将文件存储在如下所示的 Java 临时目录中,并将文件发送到您想要的任何地方:

System.getProperty("java.io.tmpdir");

注意:如果您生成 pdf 的频率很高,请确保从 temp 目录中删除曾经使用过的文件。

【讨论】:

无法在模板中获取变量 您在示例中使用的PdfRendererBuilder 是什么?提供的库不包含它。 @zhuochenshen 变量包括您的 Html 正文。开始和结束字符串 ... 、页眉、正文和页脚消息。您还可以使用模型设置变量 final Context ctx = new Context(); ctx.setVariable("model", pdfModel); @vkirilichev - PdfRendererBuilder 用于运行 XHTML/XML 到 PDF 的转换并输出到由 toStream 设置的输出流。您需要为其添加以下依赖项: com.openhtmltopdfopenhtmltopdf-pdfbox0.0.1-RC7【参考方案2】:

你需要使用像 fly-saucer-pdf 这样的东西,创建一个有点像的组件:

@Component
public class PdfGenaratorUtil 
    @Autowired
    private TemplateEngine templateEngine;
    public void createPdf(String templateName, Map<String, Object> map) throws Exception 
        Context ctx = new Context();
        Iterator itMap = map.entrySet().iterator();
        while (itMap.hasNext()) 
            Map.Entry pair = (Map.Entry) itMap.next();
            ctx.setVariable(pair.getKey().toString(), pair.getValue());
        

        String processedHtml = templateEngine.process(templateName, ctx);
        FileOutputStream os = null;
        String fileName = UUID.randomUUID().toString();
        try 
            final File outputFile = File.createTempFile(fileName, ".pdf");
            os = new FileOutputStream(outputFile);

            ITextRenderer renderer = new ITextRenderer();
            renderer.setDocumentFromString(processedHtml);
            renderer.layout();
            renderer.createPDF(os, false);
            renderer.finishPDF();

        
        finally 
            if (os != null) 
                try 
                    os.close();
                 catch (IOException e)  /*ignore*/ 
            
        
    

然后只需将 @Autowire 这个组件添加到您的控制器/服务组件中,然后执行以下操作:

Map<String,String> data = new HashMap<String,String>();
    data.put("name","James");
    pdfGenaratorUtil.createPdf("greeting",data); 

"greeting" 是您的模板名称

详情请见http://www.oodlestechnologies.com/blogs/How-To-Create-PDF-through-HTML-Template-In-Spring-Boot

【讨论】:

以上是关于如何使用 thymeleaf 作为模板引擎生成 pdf 报告? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

模板引擎Thymeleaf 介绍及使用

SpringBoot:模板引擎 Thymeleaf 基础使用

Thymeleaf模板引擎的初步使用

Thymeleaf 模板引擎

Thymeleaf模板引擎

SpringBoot 配置 Thymeleaf模板引擎