飞碟,Thymeleaf和春天

per*_*son 16 pdf spring flying-saucer thymeleaf

我有一个Spring应用程序,需要构建对PDF生成的支持.我正在考虑将飞碟与Thymeleaf一起使用来渲染PDF.但是,我找不到有关将飞碟与Thymeleaf一起使用的更多信息.有没有其他人一起使用这些技术?

mic*_*man 21

我正在使用Flyingsaucer-R8和Thymeleaf 2.0.14而没有任何问题(我确信当前版本的Thymeleaf也能正常工作).

我已经TemplateEngine为此目的配置了classpath模板解析器.用它来产生XHTMLString.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();
  }
}
Run Code Online (Sandbox Code Playgroud)

模板

<?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>
Run Code Online (Sandbox Code Playgroud)

  • @michal.kreuzman 希望你仍然和我们在一起,因为这个解决方案帮助了我一点。祝一切顺利。引自上面:`ctx.setVariable("message", "我不想再生活在这个星球上");` (2认同)