2014-04-19 31 views
15

Tôi có một ứng dụng Spring và cần xây dựng hỗ trợ cho việc tạo PDF. Tôi đang nghĩ đến việc sử dụng Flying-saucer cùng với Thymeleaf để hiển thị tệp PDF. Tuy nhiên, tôi không thể tìm thấy nhiều thông tin về việc sử dụng đĩa bay cùng với Thymeleaf. Có ai khác đã sử dụng những công nghệ đó với nhau không?Chiếc đĩa bay, Thymeleaf và Spring

Trả lời

17

Tôi đang sử dụng Flyingsaucer-R8 với Thymeleaf 2.0.14 mà không gặp sự cố (và tôi chắc chắn phiên bản hiện tại của Thymeleaf cũng hoạt động).

Tôi có riêng biệt TemplateEngine với trình phân giải mẫu lớp con được định cấu hình cho mục đích này. Sử dụng nó để sản xuất XHTMLString. Flyingsaucer tạo ra tài liệu PDF từ kết quả sau đó. Kiểm tra ví dụ dưới đây.

Mã dưới đây là ví dụ - KHÔNG SẢN XUẤT sẵn sàng sử dụng mã nó với KHÔNG BẢO ĐẢM. Vì lợi ích của sự rõ ràng không có xử lý cố gắng bắt và không có bộ nhớ đệm tài nguyên (tạo PDF là hoạt động khá tốn kém). Xem xét điều đó.

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

<?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 hy vọng bạn vẫn còn với chúng tôi vì giải pháp này đã giúp tôi ra một chút. Tất cả là tốt nhất. Được trích dẫn từ trên: 'ctx.setVariable (" message "," Tôi không muốn sống trên hành tinh này nữa "); – KingJahfy

+0

Cách tiếp cận này cũng không giải quyết vấn đề quốc tế hóa, sử dụng messages.properties để dịch. Bên cạnh đó, nó hoạt động. – SiriusBits

Các vấn đề liên quan