2014-04-19 29 views
15

Bir Bahar uygulama var ve PDF nesil için destek oluşturmak gerekir. PDF'yi oluşturmak için Thymeleaf ile birlikte Flying-Saucer'ı kullanmayı düşünüyorum. Ancak, Uçan-daire ile Thymeleaf birlikte kullanımı hakkında çok fazla bilgi bulamıyorum. Bunları teknolojilere başka kim kullandı?Uçan fincan tabağı, Thymeleaf ve Bahar

cevap

17

Ben sorunsuz Thymeleaf 2.0.14 ile FlyingSaucer-R8 kullanıyorum (ve Thymeleaf olarak iyi çalışır ve emin güncel sürümü değilim).

Bu amaçla yapılandırılmış sınıf yolu şablon resolverli TemplateEngine ayrı var. Bunu kullanarak String olarak XHTML üretmek. Flyingsaucer sonuçtan PDF belgesi oluşturur. Aşağıdaki örneği kontrol edin. DEĞİL ÜRETİM GARANTİSİZLİK ile hazır kod kullanımı it - aşağıda

Kod örneğidir. Netlik sağlamak için, hiçbir yakalama işlemesi yoktur ve kaynak önbelleği yoktur (PDF oluşturma oldukça pahalı bir işlemdir). Bunu bir düşün.

Kod

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

Şablon

<?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> 
+0

michal.kreuzman @ bu çözüm beni biraz yardım ettiği için bizimle hala umuyorum. Herşey gönlünce olsun. Yukarıdaki alıntı: 'ctx.setVariable ("mesaj", "Artık bu gezegende yaşamak istemiyoruz");' – KingJahfy

+0

Bu yaklaşım aynı zamanda çeviri için messages.properties kullanarak, uluslararasılaşma ele almaz. Bunun yanı sıra, işe yarıyor. – SiriusBits