Flying saucer, Thymeleaf and Spring

后端 未结 1 479
野趣味
野趣味 2021-02-01 20:01

I have a Spring application and need to build support for PDF generation. I\'m thinking of using Flying-saucer together with Thymeleaf to render the PDF. However, I cannot find

1条回答
  •  太阳男子
    2021-02-01 20:43

    I'm using Flyingsaucer-R8 with Thymeleaf 2.0.14 without problems (and I'm sure current version of Thymeleaf works as well).

    I have separate TemplateEngine with classpath template resolver configured for this purpose. Using it to produce XHTML as String. Flyingsaucer creates PDF document from result then. Check example below.

    Code below is example - NOT PRODUCTION ready code use it with NO WARRANTY. For sake of clarity there's no try-catch handling and no resources caching (creating PDF is quite expensive operation). Consider that.

    Code

    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();
      }
    }
    

    Template

    
    
    
    
        
            
                    
        
    
    
    

    message

    0 讨论(0)
提交回复
热议问题