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 3db6ecf1656af3b6c1550adbeddab1e3d801b63c Author: jcouteau <couteau@codelutin.com> Date: Tue Jun 12 17:56:55 2018 +0200 refs #9931 - Tested : - generate PDF Pages on email reception - use PDF Pages on DemandUI - deal with PDF with no generated PDF (generate on the fly) Not tested : - delete PDF Pages on archived mail - no previsualisation on DemandUI for Archived demands Still need to do : - use generate PDF Pages on printing - deal with PDF with no generated PDF (generate on the fly) while printing --- .../faxtomail/services/service/EmailService.java | 7 ++ .../services/service/EmailServiceImpl.java | 96 ++++++++++++---------- .../h2/V2_4180607_1__addGeneratedPDFPages.sql | 10 +-- .../V2_4180607_1__addGeneratedPDFPages.sql | 8 +- .../ui/swing/content/demande/DemandeUIHandler.java | 16 +++- .../faxtomail/ui/swing/util/FaxToMailUIUtil.java | 91 +++++++++++++++++--- .../faxtomail/web/job/MailFilterJob.java | 16 +--- 7 files changed, 159 insertions(+), 85 deletions(-) diff --git a/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailService.java b/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailService.java index 16d1ee12..14afdeb8 100644 --- a/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailService.java +++ b/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailService.java @@ -30,6 +30,7 @@ import com.franciaflex.faxtomail.persistence.entities.Email; import com.franciaflex.faxtomail.persistence.entities.EmailFilter; import com.franciaflex.faxtomail.persistence.entities.ExtensionCommand; import com.franciaflex.faxtomail.persistence.entities.FaxToMailUser; +import com.franciaflex.faxtomail.persistence.entities.GeneratedPDFPage; import com.franciaflex.faxtomail.persistence.entities.HistoryType; import com.franciaflex.faxtomail.persistence.entities.MailFolder; import com.franciaflex.faxtomail.persistence.entities.MailLock; @@ -51,10 +52,12 @@ import org.nuiton.util.pagination.PaginationResult; import javax.mail.MessagingException; import javax.mail.Part; import javax.mail.internet.MimeMessage; +import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; +import java.sql.Blob; import java.util.Collection; import java.util.Date; import java.util.List; @@ -117,6 +120,8 @@ public interface EmailService extends FaxToMailService { AttachmentFile getAttachmentFile(String attachmentId, boolean original); + Collection<GeneratedPDFPage> getGeneratedPDFPage(String attachmentId); + List<MailLock> getAllMailLocks(); void unlockMails(List<String> mailLockIds); @@ -188,4 +193,6 @@ public interface EmailService extends FaxToMailService { * @throws IOException */ Attachment convertHTMLToPdf(List<Attachment> attachments, List<String> content, String name) throws IOException; + + GeneratedPDFPage createGeneratedPDFPage(Attachment attachment, BufferedImage image); } diff --git a/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java b/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java index dc52ed59..31d635a7 100644 --- a/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java +++ b/faxtomail-service/src/main/java/com/franciaflex/faxtomail/services/service/EmailServiceImpl.java @@ -25,49 +25,7 @@ package com.franciaflex.faxtomail.services.service; */ import com.franciaflex.faxtomail.beans.QuantitiesByRange; -import com.franciaflex.faxtomail.persistence.entities.AbstractFaxToMailTopiaDao; -import com.franciaflex.faxtomail.persistence.entities.Attachment; -import com.franciaflex.faxtomail.persistence.entities.AttachmentFile; -import com.franciaflex.faxtomail.persistence.entities.AttachmentFileImpl; -import com.franciaflex.faxtomail.persistence.entities.AttachmentFileTopiaDao; -import com.franciaflex.faxtomail.persistence.entities.AttachmentImpl; -import com.franciaflex.faxtomail.persistence.entities.AttachmentTopiaDao; -import com.franciaflex.faxtomail.persistence.entities.Client; -import com.franciaflex.faxtomail.persistence.entities.DemandStatus; -import com.franciaflex.faxtomail.persistence.entities.DemandType; -import com.franciaflex.faxtomail.persistence.entities.DemandTypeTopiaDao; -import com.franciaflex.faxtomail.persistence.entities.EdiReturn; -import com.franciaflex.faxtomail.persistence.entities.Email; -import com.franciaflex.faxtomail.persistence.entities.EmailFilter; -import com.franciaflex.faxtomail.persistence.entities.EmailGroup; -import com.franciaflex.faxtomail.persistence.entities.EmailGroupTopiaDao; -import com.franciaflex.faxtomail.persistence.entities.EmailTopiaDao; -import com.franciaflex.faxtomail.persistence.entities.ExtensionCommand; -import com.franciaflex.faxtomail.persistence.entities.FaxToMailTopiaPersistenceContext; -import com.franciaflex.faxtomail.persistence.entities.FaxToMailUser; -import com.franciaflex.faxtomail.persistence.entities.FaxToMailUserGroup; -import com.franciaflex.faxtomail.persistence.entities.History; -import com.franciaflex.faxtomail.persistence.entities.HistoryTopiaDao; -import com.franciaflex.faxtomail.persistence.entities.HistoryType; -import com.franciaflex.faxtomail.persistence.entities.MailField; -import com.franciaflex.faxtomail.persistence.entities.MailFolder; -import com.franciaflex.faxtomail.persistence.entities.MailFolderTopiaDao; -import com.franciaflex.faxtomail.persistence.entities.MailLock; -import com.franciaflex.faxtomail.persistence.entities.MailLockImpl; -import com.franciaflex.faxtomail.persistence.entities.MailLockTopiaDao; -import com.franciaflex.faxtomail.persistence.entities.OriginalEmail; -import com.franciaflex.faxtomail.persistence.entities.OriginalEmailTopiaDao; -import com.franciaflex.faxtomail.persistence.entities.Priority; -import com.franciaflex.faxtomail.persistence.entities.PriorityTopiaDao; -import com.franciaflex.faxtomail.persistence.entities.RangeRow; -import com.franciaflex.faxtomail.persistence.entities.RangeRowTopiaDao; -import com.franciaflex.faxtomail.persistence.entities.Reply; -import com.franciaflex.faxtomail.persistence.entities.ReplyContent; -import com.franciaflex.faxtomail.persistence.entities.ReplyContentTopiaDao; -import com.franciaflex.faxtomail.persistence.entities.ReplyTopiaDao; -import com.franciaflex.faxtomail.persistence.entities.SearchFilter; -import com.franciaflex.faxtomail.persistence.entities.WaitingState; -import com.franciaflex.faxtomail.persistence.entities.WaitingStateTopiaDao; +import com.franciaflex.faxtomail.persistence.entities.*; import com.franciaflex.faxtomail.services.FaxToMailServiceSupport; import com.franciaflex.faxtomail.services.FaxToMailServiceUtils; import com.franciaflex.faxtomail.services.service.exceptions.AlreadyLockedMailException; @@ -140,12 +98,16 @@ import org.xhtmlrenderer.pdf.ITextRenderer; import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; +import javax.imageio.ImageIO; import javax.mail.MessagingException; import javax.mail.Part; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import javax.mail.internet.MimeUtility; +import javax.sql.rowset.serial.SerialBlob; +import javax.sql.rowset.serial.SerialException; +import java.awt.image.BufferedImage; import java.io.BufferedWriter; import java.io.ByteArrayOutputStream; import java.io.File; @@ -159,6 +121,7 @@ import java.io.UnsupportedEncodingException; import java.io.Writer; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; +import java.sql.Blob; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; @@ -462,6 +425,7 @@ public class EmailServiceImpl extends FaxToMailServiceSupport implements EmailSe AttachmentFile originalFile = null; AttachmentFile editedFile = null; + Collection<GeneratedPDFPage> pages = null; // dans tout les cas, les pieces jointes courante de l'attchent prévale // sur celles en base if (attachment.getOriginalFile() != null) { @@ -474,6 +438,11 @@ public class EmailServiceImpl extends FaxToMailServiceSupport implements EmailSe } else { editedFile = currentAttachment.getEditedFile(); } + if (attachment.getGeneratedPDFPages() != null) { + pages = attachment.getGeneratedPDFPages(); + } else { + pages = currentAttachment.getGeneratedPDFPages(); + } // copy new data attachmentBinder.copyExcluding(attachment, currentAttachment, @@ -484,11 +453,13 @@ public class EmailServiceImpl extends FaxToMailServiceSupport implements EmailSe Attachment.PROPERTY_ORIGINAL_FILE_NAME, Attachment.PROPERTY_TOPIA_CREATE_DATE, Attachment.PROPERTY_TOPIA_ID, - Attachment.PROPERTY_TOPIA_VERSION); + Attachment.PROPERTY_TOPIA_VERSION, + Attachment.PROPERTY_GENERATED_PDFPAGES); currentAttachment.setEmail(email); currentAttachment.setEditedFile(editedFile); currentAttachment.setOriginalFile(originalFile); + currentAttachment.setGeneratedPDFPages(pages); // ici les pieces jointes peuvent être sauvegardées sans que les pièces jointes // soit présentes dans les entités car l'ui ne les a pas copiées @@ -1262,6 +1233,18 @@ public class EmailServiceImpl extends FaxToMailServiceSupport implements EmailSe return result; } + @Override + public Collection<GeneratedPDFPage> getGeneratedPDFPage(String attachmentId) { + AttachmentTopiaDao dao = getPersistenceContext().getAttachmentDao(); + Attachment attachment = dao.forTopiaIdEquals(attachmentId).findUnique(); + Collection<GeneratedPDFPage> result = attachment.getGeneratedPDFPages(); + if (result != null) { + // force lazy initialize + Hibernate.initialize(result); + } + return result; + } + @Override public ReplyContent getReplyContent(String replyId) { ReplyTopiaDao dao = getPersistenceContext().getReplyDao(); @@ -2359,4 +2342,29 @@ public class EmailServiceImpl extends FaxToMailServiceSupport implements EmailSe return result; } + + public GeneratedPDFPage createGeneratedPDFPage(Attachment attachment, BufferedImage image) { + + GeneratedPDFPageTopiaDao dao = getPersistenceContext().getGeneratedPDFPageDao(); + GeneratedPDFPage generatedPDFPage = dao.newInstance(); + + + try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { + + ImageIO.write(image, "png", baos); + baos.flush(); + Blob pageBlob = new SerialBlob(baos.toByteArray()); + generatedPDFPage.setPage(pageBlob); + + attachment.addGeneratedPDFPages(generatedPDFPage); + //generatedPDFPage = dao.create(generatedPDFPage); + //getPersistenceContext().getAttachmentDao().update(attachment); + } catch (IOException | SQLException e) { + log.error("Error while writing image", e); + } + + + return generatedPDFPage; + + } } 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 index 1fe41c8d..bc115c61 100644 --- 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 @@ -1,13 +1,13 @@ -- add generatedPDFPages -drop table GENERETADPDFPAGES; +drop table if exists GENERATEDPDFPAGE; -create table GENERETADPDFPAGES ( - page blob not null +create table GENERATEDPDFPAGE ( + page blob NOT NULL, topiaId VARCHAR(255) NOT NULL, topiaVersion BIGINT NOT NULL, - topiaCreateDate datetime2, - attachment VARCHAR(255) NOT NULL, + topiaCreateDate timestamp, + attachment VARCHAR(255), PRIMARY KEY (topiaId) ); 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 index a531e658..e8eb2d27 100644 --- 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 @@ -1,15 +1,11 @@ -- add generatedPDFPages -drop table GENERETADPDFPAGES; - -GO - -create table GENERETADPDFPAGES ( +create table GENERATEDPDFPAGE ( page blob not null topiaId VARCHAR(255) NOT NULL, topiaVersion BIGINT NOT NULL, topiaCreateDate datetime2, - attachment VARCHAR(255) NOT NULL, + attachment VARCHAR(255), PRIMARY KEY (topiaId) ); diff --git a/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIHandler.java b/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIHandler.java index 1f229ce2..413ffe9f 100644 --- a/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIHandler.java +++ b/faxtomail-ui-swing/src/main/java/com/franciaflex/faxtomail/ui/swing/content/demande/DemandeUIHandler.java @@ -217,7 +217,7 @@ public class DemandeUIHandler extends AbstractFaxToMailUIHandler<DemandeUIModel, initUI(ui); - DemandeUIModel model = getModel(); + final DemandeUIModel model = getModel(); Set<String> propertiesToIgnore = getPropertiesToIgnore(); monitor = new BeanMonitor(true, propertiesToIgnore.toArray(new String[propertiesToIgnore.size()])); monitor.setBean(model); @@ -247,9 +247,17 @@ public class DemandeUIHandler extends AbstractFaxToMailUIHandler<DemandeUIModel, } initBeanFilterableComboBox(ui.getWaitingStateComboBox(), waitingStates, model.getWaitingState()); - JPanel editorPanel = ui.getMailBodyPanel(); - FaxToMailUIUtil.setEmailContentInTextPane(this, model, editorPanel, getConfig()); - FaxToMailUIUtil.initScrollPaneBars(getUI().getMailBodyScrollPane()); + final JPanel editorPanel = ui.getMailBodyPanel(); + //FaxToMailUIUtil.setEmailContentInTextPane(this, model, editorPanel, getConfig()); + //FaxToMailUIUtil.initScrollPaneBars(getUI().getMailBodyScrollPane()); + + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + FaxToMailUIUtil.setEmailContentInTextPane(DemandeUIHandler.this, model, editorPanel, getConfig()); + FaxToMailUIUtil.initScrollPaneBars(getUI().getMailBodyScrollPane()); + } + }); // init table final JXTable table = ui.getRangeTable(); 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 9b80aedc..fde1288b 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 @@ -127,6 +127,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Comparator; +import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -321,15 +322,27 @@ public final class FaxToMailUIUtil extends ApplicationUIUtil { } public static boolean isFileAPDF(AttachmentFile file) { - return FileUtil.extension(file.getFilename()).toUpperCase().equals("PDF"); + return isFileAPDF(file.getFilename()); + } + + public static boolean isFileAPDF(String filename) { + return FileUtil.extension(filename).toUpperCase().equals("PDF"); } public static boolean isFileATxt(AttachmentFile file) { - return FileUtil.extension(file.getFilename()).toUpperCase().equals("TXT"); + return isFileATxt(file.getFilename()); + } + + public static boolean isFileATxt(String filename) { + return FileUtil.extension(filename).toUpperCase().equals("TXT"); } public static boolean isFileATif(AttachmentFile file) { - return FileUtil.extension(file.getFilename()).toUpperCase().equals("TIF"); + return isFileATif(file.getFilename()); + } + + public static boolean isFileATif(String filename) { + return FileUtil.extension(filename).toUpperCase().equals("TIF"); } public static boolean isFileTypeEditable(String fileName) { @@ -421,6 +434,56 @@ public final class FaxToMailUIUtil extends ApplicationUIUtil { } } } + + public static AttachmentFile getLazyOriginalFile(FaxToMailUIContext context, Attachment attachment) { + if (log.isDebugEnabled()) { + log.debug("Force attachment loading " + attachment.getOriginalFileName()); + } + if (attachment.isPersisted()) { + FaxToMailServiceContext serviceContext = context.newServiceContext(); + EmailService service = serviceContext.getEmailService(); + if (attachment.getOriginalFile() == null) { + AttachmentFile file = service.getAttachmentFile(attachment.getTopiaId(), true); + attachment.setOriginalFile(file); + } + } + + return attachment.getOriginalFile(); + } + + public static Collection<GeneratedPDFPage> getLazyGeneratedPDFPage(FaxToMailUIContext context, Attachment attachment) { + if (log.isDebugEnabled()) { + log.debug("Force generated pages loading " + attachment.getOriginalFileName()); + } + if (attachment.isPersisted()) { + FaxToMailServiceContext serviceContext = context.newServiceContext(); + EmailService service = serviceContext.getEmailService(); + if (attachment.getGeneratedPDFPages() == null) { + Collection<GeneratedPDFPage> pages = service.getGeneratedPDFPage(attachment.getTopiaId()); + attachment.setGeneratedPDFPages(pages); + } + } + + return attachment.getGeneratedPDFPages(); + } + + public static AttachmentFile getLazyEditedFile(FaxToMailUIContext context, Attachment attachment) { + if (log.isDebugEnabled()) { + log.debug("Force attachment loading " + attachment.getOriginalFileName()); + } + if (attachment.isPersisted()) { + FaxToMailServiceContext serviceContext = context.newServiceContext(); + EmailService service = serviceContext.getEmailService(); + if (attachment.getEditedFile() == null) { + AttachmentFile file = service.getAttachmentFile(attachment.getTopiaId(), false); + attachment.setEditedFile(file); + } + } + + return attachment.getEditedFile(); + } + + /** * Force le chargement des contenu source binaire des réponses. @@ -952,9 +1015,11 @@ public final class FaxToMailUIUtil extends ApplicationUIUtil { FaxToMailConfiguration config) { if (isFileTypeEditable(attachment.getOriginalFileName())) { - forceAttachmentFileLoading(handler.getContext(), attachment); - final AttachmentFile originalAttachmentFile = attachment.getOriginalFile(); - final File originalFile = originalAttachmentFile.getFile(); + System.out.println(new Date()); + //forceAttachmentFileLoading(handler.getContext(), attachment); + System.out.println(new Date()); + //final AttachmentFile originalAttachmentFile = attachment.getOriginalFile(); + //final File originalFile = originalAttachmentFile.getFile(); Box box = Box.createVerticalBox(); box.setBorder(BorderFactory.createTitledBorder(attachment.getOriginalFileName())); @@ -969,10 +1034,10 @@ public final class FaxToMailUIUtil extends ApplicationUIUtil { }); try { - if (isFileAPDF(originalAttachmentFile)) { + if (isFileAPDF(attachment.getOriginalFileName())) { //get back images - Collection<GeneratedPDFPage> pages = attachment.getGeneratedPDFPages(); + Collection<GeneratedPDFPage> pages = getLazyGeneratedPDFPage(handler.getContext(),attachment); if (pages != null) { //Got pre-generated pages @@ -994,6 +1059,7 @@ public final class FaxToMailUIUtil extends ApplicationUIUtil { } else { //No pre-generated pages - old school on the fly generation try { + File originalFile = getLazyOriginalFile(handler.getContext(),attachment).getFile(); PDDocument pdDocument = PDDocument.load(originalFile); PDFRenderer renderer = new PDFRenderer(pdDocument); for (int i = 0; i < pdDocument.getNumberOfPages(); i++) { @@ -1009,7 +1075,8 @@ public final class FaxToMailUIUtil extends ApplicationUIUtil { } } - } else if (isFileATif(originalAttachmentFile)) { + } else if (isFileATif(attachment.getOriginalFileName())) { + File originalFile = getLazyOriginalFile(handler.getContext(),attachment).getFile(); FileInputStream fis = new FileInputStream(originalFile); try { FileChannel channel = fis.getChannel(); @@ -1041,8 +1108,9 @@ public final class FaxToMailUIUtil extends ApplicationUIUtil { IOUtils.closeQuietly(fis); } - } else if (isFileATxt(originalAttachmentFile)) { + } else if (isFileATxt(attachment.getOriginalFileName())) { JTextPane textPane = new JTextPane(); + File originalFile = getLazyOriginalFile(handler.getContext(),attachment).getFile(); textPane.setText(FileUtils.readFileToString(originalFile)); textPane.setAlignmentX(Component.LEFT_ALIGNMENT); box.add(textPane); @@ -1057,6 +1125,7 @@ public final class FaxToMailUIUtil extends ApplicationUIUtil { } imagePanel.setScaleImageToFitPanel(true); + File originalFile = getLazyOriginalFile(handler.getContext(),attachment).getFile(); imagePanel.setImage(originalFile); imagePanel.setAlignmentX(Component.LEFT_ALIGNMENT); box.add(imagePanel); @@ -1068,7 +1137,7 @@ public final class FaxToMailUIUtil extends ApplicationUIUtil { } catch (IOException e) { if (log.isErrorEnabled()) { - log.error("Error while reading the file " + originalFile, e); + log.error("Error while reading the file " + attachment.getOriginalFileName(), e); } } } 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 defb330d..ccbc6e07 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 @@ -471,26 +471,12 @@ public class MailFilterJob extends AbstractFaxToMailJob { 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"); - + emailService.createGeneratedPDFPage(attachment, pageImage); } System.out.println("Pages generated"); - attachment.setGeneratedPDFPages(pages); } } -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@codelutin.com>.