Author: echatellier Date: 2014-09-09 11:20:47 +0200 (Tue, 09 Sep 2014) New Revision: 610 Url: http://forge.codelutin.com/projects/faxtomail/repository/revisions/610 Log: Replace odt template by html mustache template Added: trunk/faxtomail-service/src/main/resources/pdf/demande.mustache Removed: trunk/faxtomail-service/src/main/resources/pdf/demande.odt trunk/faxtomail-service/src/main/resources/pdf/demande.pdf Modified: trunk/faxtomail-service/pom.xml trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java trunk/faxtomail-service/src/test/java/com/franciaflex/faxtomail/services/service/EmailServiceTest.java trunk/pom.xml Modified: trunk/faxtomail-service/pom.xml =================================================================== --- trunk/faxtomail-service/pom.xml 2014-09-05 12:01:37 UTC (rev 609) +++ trunk/faxtomail-service/pom.xml 2014-09-09 09:20:47 UTC (rev 610) @@ -188,9 +188,14 @@ </dependency> <dependency> - <groupId>org.apache.pdfbox</groupId> - <artifactId>pdfbox</artifactId> + <groupId>com.github.spullara.mustache.java</groupId> + <artifactId>compiler</artifactId> </dependency> + + <dependency> + <groupId>org.xhtmlrenderer</groupId> + <artifactId>flying-saucer-pdf-itext5</artifactId> + </dependency> </dependencies> <build> Modified: trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java =================================================================== --- trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java 2014-09-05 12:01:37 UTC (rev 609) +++ trunk/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java 2014-09-09 09:20:47 UTC (rev 610) @@ -34,6 +34,7 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; +import java.io.StringWriter; import java.io.Writer; import java.nio.charset.StandardCharsets; import java.util.ArrayList; @@ -67,10 +68,6 @@ import org.apache.commons.mail.EmailConstants; import org.apache.commons.mail.EmailException; import org.apache.commons.mail.MultiPartEmail; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.PDDocumentCatalog; -import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; -import org.apache.pdfbox.pdmodel.interactive.form.PDField; import org.hibernate.Hibernate; import org.nuiton.csv.Import; import org.nuiton.csv.ImportRuntimeException; @@ -80,6 +77,7 @@ import org.nuiton.util.beans.BinderFactory; import org.nuiton.util.pagination.PaginationParameter; import org.nuiton.util.pagination.PaginationResult; +import org.xhtmlrenderer.pdf.ITextRenderer; import com.franciaflex.faxtomail.persistence.entities.*; import com.franciaflex.faxtomail.services.FaxToMailServiceSupport; @@ -89,8 +87,10 @@ import com.franciaflex.faxtomail.services.service.exceptions.InvalidClientException; import com.franciaflex.faxtomail.services.service.imports.ArchiveImportBean; import com.franciaflex.faxtomail.services.service.imports.ArchiveImportModel; +import com.github.mustachejava.DefaultMustacheFactory; +import com.github.mustachejava.Mustache; +import com.github.mustachejava.MustacheFactory; import com.google.common.base.Function; -import com.google.common.base.Joiner; import com.google.common.base.Preconditions; import com.google.common.base.Splitter; import com.google.common.base.Strings; @@ -1245,41 +1245,22 @@ */ @Override public AttachmentFile getEmailDetailAsAttachment(Email email) { - Map<String, String> pdfFieldValues = Maps.newHashMap(); - InputStream emptyPage = null; - PDDocument resultDocument; AttachmentFile result = null; try { - emptyPage = getClass().getResourceAsStream("/pdf/demande.pdf"); - resultDocument = PDDocument.load(emptyPage); - /*SetField fields = new SetField(); - if (log.isTraceEnabled()) { - log.trace("fields in document are:"); - PrintFields printFields = new PrintFields(); - printFields.printFields(resultDocument); - }*/ + // get html content + String content = getEmailDetailAsHtml(email); - loadDocumentDedails(pdfFieldValues, email); - - - if (log.isDebugEnabled()) { - log.debug("will fill form document:\n" + pdfFieldValues); - } - - for (Map.Entry<String, String> field : pdfFieldValues.entrySet()) { - String fieldName = field.getKey(); - String fieldValue = field.getValue(); - setField(resultDocument, fieldName, fieldValue); - } - - + // generate pdf ByteArrayOutputStream out = new ByteArrayOutputStream(); - resultDocument.save(out); - resultDocument.close(); + ITextRenderer renderer = new ITextRenderer(); + renderer.setDocumentFromString(content); + renderer.layout(); + renderer.createPDF(out); + // create attachent result = new AttachmentFileImpl(); result.setContent(out.toByteArray()); result.setFilename(t("faxtomail.attachment.demand.filename") + ".pdf"); @@ -1289,46 +1270,36 @@ if (log.isErrorEnabled()) { log.error("", e); } - } finally { - IOUtils.closeQuietly(emptyPage); } return result; } + + protected String getEmailDetailAsHtml(Email email) { + Map<String, Object> scopes = new HashMap<String, Object>(); + scopes.put("receivedDate", DateFormatUtils.format(email.getReceptionDate(), "dd/MM/yyyy")); + scopes.put("sender", email.getSender()); + scopes.put("object", email.getObject()); + scopes.put("clientCode", email.getClient() == null ? "" : email.getClient().getCode()); + scopes.put("demandType", email.getDemandType() == null ? "" : email.getDemandType().getLabel()); + scopes.put("priority", email.getPriority() == null ? "" : email.getPriority().getLabel()); + scopes.put("projectReference", email.getProjectReference()); + scopes.put("companyReference", email.getCompanyReference()); + scopes.put("waitingState", email.getWaitingState() == null ? "" : email.getWaitingState().getLabel()); + scopes.put("status", email.getDemandStatus() == null ? "" : email.getDemandStatus().getLabel()); + scopes.put("takenBy", email.getTakenBy() == null ? "" : (email.getTakenBy().getLogin() + " " + email.getTakenBy().getFirstName() + " " + email.getTakenBy().getLastName())); + scopes.put("date", DateFormatUtils.format(new Date(), "dd/MM/yyyy")); - protected void loadDocumentDedails(Map<String, String> pdfFieldValues, Email email) { - setField(pdfFieldValues, "demand", email.getObject()); - setField(pdfFieldValues, "receivedDate", DateFormatUtils.format(email.getReceptionDate(), "dd/MM/yyyy")); - setField(pdfFieldValues, "sender", email.getSender()); - setField(pdfFieldValues, "object", email.getObject()); - setField(pdfFieldValues, "clientCode", email.getClient() == null ? "" : email.getClient().getCode()); - setField(pdfFieldValues, "demandType", email.getDemandType() == null ? "" : email.getDemandType().getLabel()); - setField(pdfFieldValues, "priority", email.getPriority() == null ? "" : email.getPriority().getLabel()); - setField(pdfFieldValues, "projectReference", email.getProjectReference()); - setField(pdfFieldValues, "companyReference", email.getCompanyReference()); - setField(pdfFieldValues, "waitingState", email.getWaitingState() == null ? "" : email.getWaitingState().getLabel()); - setField(pdfFieldValues, "status", email.getDemandStatus() == null ? "" : email.getDemandStatus().getLabel()); - setField(pdfFieldValues, "takenBy", email.getTakenBy() == null ? "" : (email.getTakenBy().getLogin() + " " + email.getTakenBy().getFirstName() + " " + email.getTakenBy().getLastName())); + // find template + InputStream is = EmailServiceImpl.class.getResourceAsStream("/pdf/demande.mustache"); + MustacheFactory mf = new DefaultMustacheFactory(); + Mustache mustache = mf.compile(new InputStreamReader(is), "demande"); + StringWriter writer = new StringWriter(); + mustache.execute(writer, scopes); + writer.flush(); + + return writer.toString(); } - protected void setField(Map<String, String> pdfFieldValues, String fieldName, String... value) { - if (value == null) { - pdfFieldValues.put(fieldName, ""); - } else { - pdfFieldValues.put(fieldName, Joiner.on(" ").skipNulls().join(value)); - } - } - - protected void setField(PDDocument pdfDocument, String name, String value ) throws IOException { - PDDocumentCatalog docCatalog = pdfDocument.getDocumentCatalog(); - PDAcroForm acroForm = docCatalog.getAcroForm(); - PDField field = acroForm.getField( name ); - if ( field != null ) { - field.setValue( value ); - } else if (log.isWarnEnabled()) { - log.warn("Can't find field " + name + " in pdf form"); - } - } - /** * Compute mail folder path (separated by /) from root to current. * Added: trunk/faxtomail-service/src/main/resources/pdf/demande.mustache =================================================================== --- trunk/faxtomail-service/src/main/resources/pdf/demande.mustache (rev 0) +++ trunk/faxtomail-service/src/main/resources/pdf/demande.mustache 2014-09-09 09:20:47 UTC (rev 610) @@ -0,0 +1,70 @@ +<html> + <head> + <style> + .title { + text-align:center; + } + .footer { + position: running(footer); + font-size: small; + } + @page { + @bottom-center { content: element(footer) } + } + </style> + </head> + <body> + <h1 class="title">Détail de la demande</h1> + + <table> + <tr> + <td>Objet :</td> + <td>{{object}}</td> + </tr> + <tr> + <td>Reçue le :</td> + <td>{{receivedDate}}</td> + </tr> + <tr> + <td>Emetteur :</td> + <td>{{sender}}</td> + </tr> + <tr> + <td>Client :</td> + <td>{{client}}</td> + </tr> + <tr> + <td>Type :</td> + <td>{{demandType}}</td> + </tr> + <tr> + <td>Priorité :</td> + <td>{{priority}}</td> + </tr> + <tr> + <td>Référence chantier :</td> + <td>{{projectReference}}</td> + </tr> + <tr> + <td>Notre référence :</td> + <td>{{companyReference}}</td> + </tr> + <tr> + <td>Etat d'attente :</td> + <td>{{waitingState}}</td> + </tr> + <tr> + <td>Statut :</td> + <td>{{status}}</td> + </tr> + <tr> + <td>Pris par :</td> + <td>{{takenBy}}</td> + </tr> + </table> + + <div class="footer"> + Date d'impression : {{date}} + </div> + </body> +</html> \ No newline at end of file Deleted: trunk/faxtomail-service/src/main/resources/pdf/demande.odt =================================================================== (Binary files differ) Deleted: trunk/faxtomail-service/src/main/resources/pdf/demande.pdf =================================================================== (Binary files differ) Modified: trunk/faxtomail-service/src/test/java/com/franciaflex/faxtomail/services/service/EmailServiceTest.java =================================================================== --- trunk/faxtomail-service/src/test/java/com/franciaflex/faxtomail/services/service/EmailServiceTest.java 2014-09-05 12:01:37 UTC (rev 609) +++ trunk/faxtomail-service/src/test/java/com/franciaflex/faxtomail/services/service/EmailServiceTest.java 2014-09-09 09:20:47 UTC (rev 610) @@ -28,6 +28,8 @@ import java.io.IOException; import java.io.InputStream; import java.util.Collections; +import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; @@ -123,9 +125,10 @@ /** * Generate email detail as pdf test. + * @throws InterruptedException */ @Test - public void testEmailDetailsPdf() { + public void testEmailDetailsPdf() throws InterruptedException { // select a random test email PaginationParameter paginationParameter = PaginationParameter.of(0, 1); @@ -136,9 +139,26 @@ // test pdf generation AttachmentFile attachmentFile = service.getEmailDetailAsAttachment(testEmail); Assert.assertNotNull(attachmentFile); + Thread.sleep(10000); } + /** + * Test que le contenu textuel du pdf généré. + */ @Test + public void testEmailDetails() { + // select a random test email + PaginationParameter paginationParameter = PaginationParameter.of(0, 1); + EmailFilter filter = new EmailFilter(); + PaginationResult<Email> emails = service.search(filter, getCurrentUser(), paginationParameter); + Email testEmail = emails.getElements().get(0); + + // get html content + String content = ((EmailServiceImpl)service).getEmailDetailAsHtml(testEmail); + Assert.assertTrue(content.contains(testEmail.getObject())); + } + + @Test public void testGetEmailForFolder() { // tests fetch + pagination Modified: trunk/pom.xml =================================================================== --- trunk/pom.xml 2014-09-05 12:01:37 UTC (rev 609) +++ trunk/pom.xml 2014-09-09 09:20:47 UTC (rev 610) @@ -590,9 +590,9 @@ </dependency> <dependency> - <groupId>org.apache.pdfbox</groupId> - <artifactId>pdfbox</artifactId> - <version>1.8.6</version> + <groupId>com.github.spullara.mustache.java</groupId> + <artifactId>compiler</artifactId> + <version>0.8.16</version> </dependency> <dependency>
participants (1)
-
echatellier@users.forge.codelutin.com