1 package fr.ifremer.tutti.service;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 import freemarker.cache.ClassTemplateLoader;
28 import freemarker.ext.beans.BeansWrapper;
29 import freemarker.template.Configuration;
30 import freemarker.template.Template;
31 import org.apache.commons.logging.Log;
32 import org.apache.commons.logging.LogFactory;
33 import org.nuiton.jaxx.application.ApplicationTechnicalException;
34 import org.xhtmlrenderer.pdf.ITextRenderer;
35
36 import java.io.File;
37 import java.io.FileOutputStream;
38 import java.io.OutputStream;
39 import java.io.StringWriter;
40 import java.io.Writer;
41 import java.util.Locale;
42
43 import static org.nuiton.i18n.I18n.t;
44
45
46
47
48
49
50
51 public class PdfGeneratorService extends AbstractTuttiService {
52
53
54 private static final Log log = LogFactory.getLog(PdfGeneratorService.class);
55
56 protected Configuration freemarkerConfiguration;
57
58 @Override
59 public void setServiceContext(TuttiServiceContext context) {
60 super.setServiceContext(context);
61
62 freemarkerConfiguration = new Configuration();
63
64
65
66 freemarkerConfiguration.setEncoding(Locale.getDefault(), "UTF-8");
67
68
69 ClassTemplateLoader templateLoader = new ClassTemplateLoader(getClass(), "/ftl");
70 freemarkerConfiguration.setTemplateLoader(templateLoader);
71
72
73 freemarkerConfiguration.setObjectWrapper(new BeansWrapper());
74
75 }
76
77 public void generatePdf(File targetFile, Locale locale, String templateName, Object model) {
78
79 if (log.isInfoEnabled()) {
80 log.info("Will generate pdf from template " + templateName + " at " + targetFile);
81 }
82 try {
83
84
85 Template mapTemplate = freemarkerConfiguration.getTemplate(templateName, locale);
86
87 Writer out = new StringWriter();
88 mapTemplate.process(model, out);
89
90 out.flush();
91
92
93 try (OutputStream os = new FileOutputStream(targetFile)) {
94
95 ITextRenderer renderer = new ITextRenderer();
96 renderer.setDocumentFromString(out.toString());
97 renderer.layout();
98 renderer.createPDF(os);
99
100 os.close();
101 }
102
103 } catch (Exception ex) {
104 throw new ApplicationTechnicalException(t("tutti.service.exportPdf.error", targetFile), ex);
105 }
106 }
107 }