当前位置: 首页 > 知识库问答 >
问题:

飞碟、胸叶和Spring

巫晋鹏
2023-03-14

我有一个Spring应用程序,需要建立对PDF生成的支持。我正在考虑使用飞碟和Thymeleaf来渲染PDF。然而,我找不到那么多关于将飞碟与Thymeleaf结合使用的信息。还有其他人一起使用这些技术吗?

共有1个答案

墨高杰
2023-03-14

我将Flyingsaucer-R8与Thymeleaf 2.0.14配合使用,没有任何问题(我相信Thymeleaf的当前版本也能正常工作)。

我有单独的模板引擎,带有为此配置的类路径模板解析器。使用它将XHTML生成为字符串。Flyingsaucer根据结果创建PDF文档。检查以下示例。

下面的代码是示例-Not PRODUCTION就绪代码在没有保证的情况下使用它。为了清楚起见,没有try-catch处理和资源缓存(创建PDF是相当昂贵的操作)。考虑一下。

密码

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;

import org.springframework.core.io.ClassPathResource;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;
import org.thymeleaf.templateresolver.ClassLoaderTemplateResolver;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;

import com.lowagie.text.DocumentException;
import com.lowagie.text.pdf.BaseFont;
import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;

public class FlyingSoucerTestService {

  public void test() throws DocumentException, IOException {
    ClassLoaderTemplateResolver templateResolver = new ClassLoaderTemplateResolver();
    templateResolver.setPrefix("META-INF/pdfTemplates/");
    templateResolver.setSuffix(".html");
    templateResolver.setTemplateMode("XHTML");
    templateResolver.setCharacterEncoding("UTF-8");

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

    Context ctx = new Context();
    ctx.setVariable("message", "I don't want to live on this planet anymore");
    String htmlContent = templateEngine.process("messageTpl", ctx);

    ByteOutputStream os = new ByteOutputStream();
    ITextRenderer renderer = new ITextRenderer();
    ITextFontResolver fontResolver = renderer.getFontResolver();

    ClassPathResource regular = new ClassPathResource("/META-INF/fonts/LiberationSerif-Regular.ttf");
    fontResolver.addFont(regular.getURL().toString(), BaseFont.IDENTITY_H, true);

    renderer.setDocumentFromString(htmlContent);
    renderer.layout();
    renderer.createPDF(os);

    byte[] pdfAsBytes = os.getBytes();
    os.close();

    FileOutputStream fos = new FileOutputStream(new File("/tmp/message.pdf"));
    fos.write(pdfAsBytes);
    fos.close();
  }
}

模板

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-spring3-4.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <style>
            div.border {
                border: solid;
                border-width: 1px 1px 0px 1px;  
                padding: 5px 20px 5px 20px;
            }
        </style>        
    </head>
<body style="font-family: Liberation Serif;">

<div class="border">
    <h1 th:text="${message}">message</h1>
</div>

</body>
</html>
 类似资料:
  • 我想做一些像 在百里香叶中。我知道有一个价值观,我要做的就是 如何在Thyemleaf的select选项中传递两个值。

  • 我正在使用飞碟/iText生成报告。现在,报告有一个条件,即如果发生特定情况,报告应移动到pdf的下一页,并在pdf上添加数据,等等<问候Pawan

  • 我计划使用Spring Boot将MVC应用程序从Spring 3移植到Spring 4。 这个web应用程序使用Apache Tiles。 考虑到百里香叶似乎是Spring的新标准,我有点困惑,并且集成得很好。 在这个应用程序中配置Tiles是一件痛苦的事情。 我们在这个应用程序中有大约20个JSP页面。 问题: 胸腔和瓷砖是相似的概念吗?(模板引擎?) 我已经看到胸腔叶可以和瓷砖一起使用…我不

  • 我试图在thymleaf中迭代函数列表。这就是我所做的。 控制器: 并在html中: 我是新来的。我做错了什么?或者我应该使用?

  • 我想把JavaScript onClick属性使用Thym立叶。 我这样写代码 此代码正在运行。当productName包含这样的特殊字符时,我会遇到问题 然后JavaScript函数看起来像这样 我需要从产品名称中转义双引号和单引号字符。我该怎么做?

  • 这是一个例外。。 Java语言lang.ClassCastException:org。XHTMLender。提供BlockBox无法转换为组织。XHTMLender。牛顿表。桌子盒