This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository faxtomail. See https://gitlab.nuiton.org/codelutin/faxtomail.git commit 9a003ccda419cab6c3b221dd6f549d4b6f3e3fdf Author: jcouteau <couteau@codelutin.com> Date: Fri Jun 8 06:45:38 2018 +0200 refs #9931 - Should be able to : - generate PDF Pages on email reception - use PDF Pages on DemandUI - deal with PDF with no generated PDF (generate on the fly) - delete PDF Pages on archived mail - no previsualisation on DemandUI for Archived demands Not tested ! Still need to do : - use generate PDF Pages on printing - deal with PDF with no generated PDF (generate on the fly) while printing --- faxtomail-persistence/src/main/xmi/faxtomail.zargo | Bin 36261 -> 36986 bytes .../h2/V2_4180607_1__addGeneratedPDFPages.sql | 17 ++++++ .../V2_4180607_1__addGeneratedPDFPages.sql | 22 ++++++++ .../ui/swing/content/demande/DemandeUIModel.java | 8 ++- .../content/demande/actions/ArchiveAction.java | 3 + .../faxtomail/ui/swing/util/FaxToMailUIUtil.java | 61 +++++++++++++++------ faxtomail-ui-web/pom.xml | 5 ++ .../faxtomail/web/job/MailFilterJob.java | 58 ++++++++++++++++---- 8 files changed, 144 insertions(+), 30 deletions(-) diff --git a/faxtomail-persistence/src/main/xmi/faxtomail.zargo b/faxtomail-persistence/src/main/xmi/faxtomail.zargo index 860e6db6..1d3e2e80 100644 Binary files a/faxtomail-persistence/src/main/xmi/faxtomail.zargo and b/faxtomail-persistence/src/main/xmi/faxtomail.zargo differ diff --git a/faxtomail-service/src/main/resources/db/migration/h2/V2_4180607_1__addGeneratedPDFPages.sql b/faxtomail-service/src/main/resources/db/migration/h2/V2_4180607_1__addGeneratedPDFPages.sql new file mode 100644 index 00000000..1fe41c8d --- /dev/null +++ b/faxtomail-service/src/main/resources/db/migration/h2/V2_4180607_1__addGeneratedPDFPages.sql @@ -0,0 +1,17 @@ +-- add generatedPDFPages + +drop table GENERETADPDFPAGES; + +create table GENERETADPDFPAGES ( + page blob not null + topiaId VARCHAR(255) NOT NULL, + topiaVersion BIGINT NOT NULL, + topiaCreateDate datetime2, + attachment VARCHAR(255) NOT NULL, + PRIMARY KEY (topiaId) +); + +ALTER TABLE GENERATEDPDFPAGE + ADD CONSTRAINT FK_9CRCVUPPG70VCFW7334VAH7PJ + FOREIGN KEY(ATTACHMENT) + REFERENCES ATTACHMENT; \ No newline at end of file diff --git a/faxtomail-service/src/main/resources/db/migration/sqlserver/V2_4180607_1__addGeneratedPDFPages.sql b/faxtomail-service/src/main/resources/db/migration/sqlserver/V2_4180607_1__addGeneratedPDFPages.sql new file mode 100644 index 00000000..a531e658 --- /dev/null +++ b/faxtomail-service/src/main/resources/db/migration/sqlserver/V2_4180607_1__addGeneratedPDFPages.sql @@ -0,0 +1,22 @@ +-- add generatedPDFPages + +drop table GENERETADPDFPAGES; + +GO + +create table GENERETADPDFPAGES ( + page blob not null + topiaId VARCHAR(255) NOT NULL, + topiaVersion BIGINT NOT NULL, + topiaCreateDate datetime2, + attachment VARCHAR(255) NOT NULL, + PRIMARY KEY (topiaId) +); + +GO + +ALTER TABLE GENERATEDPDFPAGE + ADD CONSTRAINT FK_9CRCVUPPG70VCFW7334VAH7PJ + FOREIGN KEY(ATTACHMENT) + REFERENCES ATTACHMENT +GO \ No newline at end of file diff --git a/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIModel.java b/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIModel.java index 55006fbb..55cc42d8 100644 --- a/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIModel.java +++ b/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIModel.java @@ -254,7 +254,7 @@ public class DemandeUIModel extends AbstractFaxToMailBeanUIModel<Email, DemandeU if (entity.getAttachment() != null) { for (Attachment attachment : entity.getAttachment()) { Attachment clone = new AttachmentImpl(); - fromAttachmentBinder.copyExcluding(attachment, clone, Attachment.PROPERTY_EDITED_FILE, Attachment.PROPERTY_ORIGINAL_FILE); + fromAttachmentBinder.copyExcluding(attachment, clone, Attachment.PROPERTY_EDITED_FILE, Attachment.PROPERTY_ORIGINAL_FILE, Attachment.PROPERTY_GENERATED_PDFPAGES); attachmentCopy.add(clone); } } @@ -1078,4 +1078,10 @@ public class DemandeUIModel extends AbstractFaxToMailBeanUIModel<Email, DemandeU public void setCloseable(boolean closeable) { this.closeable = closeable; } + + public void clearPDFPages(){ + for (Attachment attachment:attachments){ + attachment.clearGeneratedPDFPages(); + } + } } diff --git a/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/actions/ArchiveAction.java b/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/actions/ArchiveAction.java index 0fad329e..87880e6e 100644 --- a/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/actions/ArchiveAction.java +++ b/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/actions/ArchiveAction.java @@ -111,6 +111,9 @@ public class ArchiveAction extends SaveDemandeAndExitAction { model.setDemandStatus(DemandStatus.ARCHIVED); model.setTakenBy(null); + //cannot be reverted in postFailedAction + model.clearPDFPages(); + super.doAction(); } diff --git a/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/FaxToMailUIUtil.java b/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/FaxToMailUIUtil.java index ecac3cb1..9b80aedc 100644 --- a/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/FaxToMailUIUtil.java +++ b/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/util/FaxToMailUIUtil.java @@ -25,8 +25,10 @@ package com.franciaflex.faxtomail.ui.swing.util; import com.franciaflex.faxtomail.FaxToMailConfiguration; import com.franciaflex.faxtomail.persistence.entities.Attachment; import com.franciaflex.faxtomail.persistence.entities.AttachmentFile; +import com.franciaflex.faxtomail.persistence.entities.DemandStatus; import com.franciaflex.faxtomail.persistence.entities.DemandType; import com.franciaflex.faxtomail.persistence.entities.ExtensionCommand; +import com.franciaflex.faxtomail.persistence.entities.GeneratedPDFPage; import com.franciaflex.faxtomail.persistence.entities.MailField; import com.franciaflex.faxtomail.persistence.entities.MailFolder; import com.franciaflex.faxtomail.persistence.entities.Reply; @@ -70,6 +72,7 @@ import org.nuiton.jaxx.application.swing.util.ApplicationUIUtil; import org.nuiton.util.FileUtil; import org.nuiton.util.StringUtil; +import javax.imageio.ImageIO; import javax.media.jai.PlanarImage; import javax.print.attribute.HashPrintRequestAttributeSet; import javax.print.attribute.PrintRequestAttributeSet; @@ -119,6 +122,7 @@ import java.net.URI; import java.nio.ByteBuffer; import java.nio.channels.FileChannel; import java.nio.charset.StandardCharsets; +import java.sql.SQLException; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -385,7 +389,7 @@ public final class FaxToMailUIUtil extends ApplicationUIUtil { while (mailFolder.getParent() != null && mailFolder.getShowAttachmentPreview() == null) { mailFolder = mailFolder.getParent(); } - if (Boolean.TRUE.equals(mailFolder.getShowAttachmentPreview())) { + if (Boolean.TRUE.equals(mailFolder.getShowAttachmentPreview()) && demandeUIModel.getDemandStatus() != DemandStatus.ARCHIVED) { for (Attachment attachment : demandeUIModel.getAttachment()) { if (!attachment.isInlineAttachment() && !attachment.isMailContent() && !attachment.isAddedByUser()) { addAttachmentPane(handler, textPanePanel, attachment, config); @@ -476,7 +480,7 @@ public final class FaxToMailUIUtil extends ApplicationUIUtil { /** * Imprime du texte. - * + * * @param text text to print * @return File to print **/ @@ -964,18 +968,45 @@ public final class FaxToMailUIUtil extends ApplicationUIUtil { } }); - PDDocument pdDocument = null; try { if (isFileAPDF(originalAttachmentFile)) { - pdDocument = PDDocument.load(originalFile); - PDFRenderer renderer = new PDFRenderer(pdDocument); - for (int i = 0 ; i < pdDocument.getNumberOfPages() ; i++) { - JImagePanel imagePanel = new JImagePanel(); - imagePanel.setScaleImageToFitPanel(true); - imagePanel.setImage(renderer.renderImage(i)); - imagePanel.setAlignmentX(Component.LEFT_ALIGNMENT); - box.add(imagePanel); - box.add(Box.createVerticalStrut(3)); + + //get back images + Collection<GeneratedPDFPage> pages = attachment.getGeneratedPDFPages(); + + if (pages != null) { + //Got pre-generated pages + for (GeneratedPDFPage page : pages) { + try { + System.out.println("get back image"); + InputStream in = page.getPage().getBinaryStream(); + BufferedImage pageImage = ImageIO.read(in); + JImagePanel imagePanel = new JImagePanel(); + imagePanel.setScaleImageToFitPanel(true); + imagePanel.setImage(pageImage); + imagePanel.setAlignmentX(Component.LEFT_ALIGNMENT); + box.add(imagePanel); + box.add(Box.createVerticalStrut(3)); + } catch (SQLException eee) { + log.error("Could not print generated PDF page", eee); + } + } + } else { + //No pre-generated pages - old school on the fly generation + try { + PDDocument pdDocument = PDDocument.load(originalFile); + PDFRenderer renderer = new PDFRenderer(pdDocument); + for (int i = 0; i < pdDocument.getNumberOfPages(); i++) { + JImagePanel imagePanel = new JImagePanel(); + imagePanel.setScaleImageToFitPanel(true); + imagePanel.setImage(renderer.renderImage(i)); + imagePanel.setAlignmentX(Component.LEFT_ALIGNMENT); + box.add(imagePanel); + box.add(Box.createVerticalStrut(3)); + } + } catch (IOException eee) { + log.error("Error generating PDF pages", eee); + } } } else if (isFileATif(originalAttachmentFile)) { @@ -998,7 +1029,7 @@ public final class FaxToMailUIUtil extends ApplicationUIUtil { Dimension maximumSize = new Dimension(maxWidth, imagePanel.getMaximumSize().height); imagePanel.setMaximumSize(maximumSize); } - + imagePanel.setScaleImageToFitPanel(true); imagePanel.setImage(awtImage); imagePanel.setAlignmentX(Component.LEFT_ALIGNMENT); @@ -1039,10 +1070,6 @@ public final class FaxToMailUIUtil extends ApplicationUIUtil { if (log.isErrorEnabled()) { log.error("Error while reading the file " + originalFile, e); } - } finally { - if (pdDocument != null) { - IOUtils.closeQuietly(pdDocument); - } } } } diff --git a/faxtomail-ui-web/pom.xml b/faxtomail-ui-web/pom.xml index 7d7e6b86..47b00d09 100644 --- a/faxtomail-ui-web/pom.xml +++ b/faxtomail-ui-web/pom.xml @@ -316,6 +316,11 @@ <artifactId>jsoup</artifactId> </dependency> + <dependency> + <groupId>org.apache.pdfbox</groupId> + <artifactId>pdfbox</artifactId> + </dependency> + </dependencies> <build> diff --git a/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/MailFilterJob.java b/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/MailFilterJob.java index 45e28ba8..defb330d 100644 --- a/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/MailFilterJob.java +++ b/faxtomail-ui-web/src/main/java/com/franciaflex/faxtomail/web/job/MailFilterJob.java @@ -26,17 +26,7 @@ package com.franciaflex.faxtomail.web.job; import com.franciaflex.faxtomail.FaxToMailApplicationContext; import com.franciaflex.faxtomail.FaxToMailConfiguration; -import com.franciaflex.faxtomail.persistence.entities.Attachment; -import com.franciaflex.faxtomail.persistence.entities.Client; -import com.franciaflex.faxtomail.persistence.entities.DemandStatus; -import com.franciaflex.faxtomail.persistence.entities.Email; -import com.franciaflex.faxtomail.persistence.entities.EmailAccount; -import com.franciaflex.faxtomail.persistence.entities.EmailImpl; -import com.franciaflex.faxtomail.persistence.entities.FaxToMailTopiaPersistenceContext; -import com.franciaflex.faxtomail.persistence.entities.FaxToMailUser; -import com.franciaflex.faxtomail.persistence.entities.MailFilter; -import com.franciaflex.faxtomail.persistence.entities.MailFolder; -import com.franciaflex.faxtomail.persistence.entities.OriginalEmail; +import com.franciaflex.faxtomail.persistence.entities.*; import com.franciaflex.faxtomail.services.DecoratorService; import com.franciaflex.faxtomail.services.FaxToMailServiceContext; import com.franciaflex.faxtomail.services.FaxToMailServiceUtils; @@ -52,10 +42,15 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.decorator.Decorator; +import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.util.FileUtil; import org.quartz.DisallowConcurrentExecution; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.rendering.PDFRenderer; +import javax.imageio.ImageIO; import javax.mail.Address; import javax.mail.Flags; import javax.mail.Folder; @@ -65,7 +60,11 @@ import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.Store; import javax.mail.internet.MimeMessage; +import javax.sql.rowset.serial.SerialBlob; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; import java.nio.charset.Charset; +import java.sql.Blob; import java.text.DateFormat; import java.util.ArrayList; import java.util.Arrays; @@ -74,6 +73,7 @@ import java.util.Date; import java.util.Enumeration; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Properties; import java.util.Set; @@ -212,7 +212,7 @@ public class MailFilterJob extends AbstractFaxToMailJob { } /** - * Check the emails of teh folder, create the emails in the database and delete the email in the folder. + * Check the emails of the folder, create the emails in the database and delete the email in the folder. * * @param emailAccount email account currently checked * @param folder the folder to check @@ -464,6 +464,36 @@ public class MailFilterJob extends AbstractFaxToMailJob { List<Attachment> attachments = emailService.extractAttachmentsFromMessage((MimeMessage) message); + for (Attachment attachment:attachments) { + if (isFileAPDF(attachment.getOriginalFile())) { + + //Pre-generate PDF rendering + PDDocument pdDocument = PDDocument.load(attachment.getOriginalFile().getContent()); + PDFRenderer renderer = new PDFRenderer(pdDocument); + + List<GeneratedPDFPage> pages = new ArrayList<> (); + + for (int i = 0; i < pdDocument.getNumberOfPages(); i++) { + BufferedImage pageImage = renderer.renderImage(i); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + + ImageIO.write( pageImage, "png", baos ); + baos.flush(); + Blob pageBlob = new SerialBlob(baos.toByteArray()); + baos.close(); + + GeneratedPDFPage page = new GeneratedPDFPageImpl(); + page.setPage(pageBlob); + pages.add(page); + System.out.println("Page generated"); + + } + System.out.println("Pages generated"); + attachment.setGeneratedPDFPages(pages); + } + } + emailService.saveEmail(email, attachments, null, @@ -567,4 +597,8 @@ public class MailFilterJob extends AbstractFaxToMailJob { message.setFlag(Flags.Flag.DELETED, true); } } + + public static boolean isFileAPDF(AttachmentFile file) { + return FileUtil.extension(file.getFilename()).toUpperCase().equals("PDF"); + } } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.