From 97d48b3ffc9ebae97506c714504b618c8f04fc23 Mon Sep 17 00:00:00 2001
From: Makhtar DIAGNE <makhtar.diagne@teamdlab.com>
Date: Tue, 5 May 2020 13:41:58 +0200
Subject: [PATCH] [US DLAB-3806] Add pdf generation with images[US DLAB-3806]
 Add TU on PDF generation

---
 .../vitamui/commons/api/FileExtensions.java   |   3 +
 commons/commons-utils/pom.xml                 |   5 ++
 .../commons/utils/PdfFileGenerator.java       |  54 +++++++++---
 .../commons/utils/PdfFileGeneratorTest.java   |  79 ++++++++++++++++++
 .../test/resources/template-dynamic-info.odt  | Bin 0 -> 9198 bytes
 .../src/test/resources/template-metadata.odt  | Bin 0 -> 10108 bytes
 pom.xml                                       |  14 ++++
 7 files changed, 142 insertions(+), 13 deletions(-)
 create mode 100644 commons/commons-utils/src/test/java/fr/gouv/vitamui/commons/utils/PdfFileGeneratorTest.java
 create mode 100644 commons/commons-utils/src/test/resources/template-dynamic-info.odt
 create mode 100644 commons/commons-utils/src/test/resources/template-metadata.odt

diff --git a/commons/commons-api/src/main/java/fr/gouv/vitamui/commons/api/FileExtensions.java b/commons/commons-api/src/main/java/fr/gouv/vitamui/commons/api/FileExtensions.java
index 2f343a2c..b2faa552 100644
--- a/commons/commons-api/src/main/java/fr/gouv/vitamui/commons/api/FileExtensions.java
+++ b/commons/commons-api/src/main/java/fr/gouv/vitamui/commons/api/FileExtensions.java
@@ -53,7 +53,10 @@ public class FileExtensions {
 
     public static final String JSON = ".json";
 
+    public static final String PNG = ".png";
+
     private FileExtensions() {
         // do nothing
     }
+
 }
diff --git a/commons/commons-utils/pom.xml b/commons/commons-utils/pom.xml
index cec29363..ca29c392 100644
--- a/commons/commons-utils/pom.xml
+++ b/commons/commons-utils/pom.xml
@@ -114,5 +114,10 @@
 			<artifactId>powermock-module-junit4</artifactId>
 		    <scope>test</scope>
 		</dependency>
+		<dependency>
+			<groupId>org.apache.pdfbox</groupId>
+			<artifactId>pdfbox</artifactId>
+			<scope>test</scope>
+		</dependency>
 	</dependencies>
 </project>
diff --git a/commons/commons-utils/src/main/java/fr/gouv/vitamui/commons/utils/PdfFileGenerator.java b/commons/commons-utils/src/main/java/fr/gouv/vitamui/commons/utils/PdfFileGenerator.java
index a4638978..deec7056 100644
--- a/commons/commons-utils/src/main/java/fr/gouv/vitamui/commons/utils/PdfFileGenerator.java
+++ b/commons/commons-utils/src/main/java/fr/gouv/vitamui/commons/utils/PdfFileGenerator.java
@@ -53,9 +53,10 @@ public class PdfFileGenerator {
 
     /**
      * Method allowing to fill an odt template and generate a pdf file from it.
-     * @param odtTemplateInputStream the odt template to fill and convert to pdf /!\ the owner is reponsible for closing the stream.
-     * @param pdfOutputStream the generated pdf file /!\ the owner is reponsible for closing the stream.
-     * @param dataMap the object containing the data to add to the template.
+     *
+     * @param odtTemplateInputStream the odt template to fill and convert to pdf /!\ the owner is responsible for closing the stream.
+     * @param pdfOutputStream        the generated pdf file /!\ the owner is responsible for closing the stream.
+     * @param dataMap                the object containing the data to add to the template.
      * @throws Exception
      */
     public static void createPdf(final InputStream odtTemplateInputStream, final OutputStream pdfOutputStream, final Map<String, Object> dataMap)
@@ -66,26 +67,39 @@ public class PdfFileGenerator {
 
     /**
      * Method allowing to fill an odt template with dynamic and static data and generate a pdf file from it.
+     *
      * @param odtTemplateInputStream the odt template to fill and convert to pdf /!\ the owner is reponsible for closing the stream.
-     * @param pdfOutputStream the generated pdf file /!\ the owner is reponsible for closing the stream.
-     * @param dataMap the object containing the data to add to the template.
-     * @param dynamicFields the dynamic fields to add to the report to enable the creation of the pdf.
+     * @param pdfOutputStream        the generated pdf file /!\ the owner is reponsible for closing the stream.
+     * @param dataMap                the object containing the data to add to the template.
+     * @param dynamicFields          the dynamic fields to add to the report to enable the creation of the pdf.
      * @throws Exception
      */
     public static void createPdfWithDynamicInfo(final InputStream odtTemplateInputStream, final OutputStream pdfOutputStream, final Map<String, Object> dataMap,
             final String... dynamicFields) throws Exception {
-        final IXDocReport xdocGenerator = createXDocReport(odtTemplateInputStream);
-        final FieldsMetadata dynamicFieldsMetadata = new FieldsMetadata();
-        for (final String dynamicField : dynamicFields) {
-            dynamicFieldsMetadata.addFieldAsList(dynamicField);
-        }
-        xdocGenerator.setFieldsMetadata(dynamicFieldsMetadata);
+        final IXDocReport xdocGenerator = generateXDocReport(odtTemplateInputStream, dynamicFields, new String[]{});
+        createPdfDocument(xdocGenerator, dataMap, pdfOutputStream);
+    }
+
+    /**
+     * Method allowing to fill an odt template with images, dynamic and static data and generate a pdf file from it.
+     *
+     * @param odtTemplateInputStream the odt template to fill and convert to pdf /!\ the owner is responsible for closing the stream.
+     * @param pdfOutputStream        the generated pdf file /!\ the owner is responsible for closing the stream.
+     * @param dataMap                the object containing the data to add to the template.
+     * @param dynamicFields          the dynamic fields to add to the report to enable the creation of the pdf.
+     * @param imageFields            the image fields to add to the report to enable the creation of the pdf.
+     * @throws Exception
+     */
+    public static void createPdfWithMetadata(final InputStream odtTemplateInputStream, final OutputStream pdfOutputStream, final Map<String, Object> dataMap,
+            final String[] dynamicFields, final String[] imageFields) throws Exception {
+        final IXDocReport xdocGenerator = generateXDocReport(odtTemplateInputStream, dynamicFields, imageFields);
         createPdfDocument(xdocGenerator, dataMap, pdfOutputStream);
     }
 
     /**
      * Method allowing to get the report to generate a pdf file.
-     * @param odtTemplateInputStream the odt template to fill and convert to pdf /!\ the owner is reponsible for closing the stream.
+     *
+     * @param odtTemplateInputStream the odt template to fill and convert to pdf /!\ the owner is responsible for closing the stream.
      * @return the XDocReport.
      * @throws Exception
      */
@@ -108,4 +122,18 @@ public class PdfFileGenerator {
         xdocGenerator.convert(context, options, pdfOutputStream);
     }
 
+    private static IXDocReport generateXDocReport(final InputStream odtTemplateInputStream, final String[] dynamicFields, final String[] imageFields)
+            throws Exception {
+        final IXDocReport xdocGenerator = createXDocReport(odtTemplateInputStream);
+        final FieldsMetadata fieldsMetadata = new FieldsMetadata();
+        for (final String dynamicField : dynamicFields) {
+            fieldsMetadata.addFieldAsList(dynamicField);
+        }
+        for (final String imageField : imageFields) {
+            fieldsMetadata.addFieldAsImage(imageField);
+        }
+        xdocGenerator.setFieldsMetadata(fieldsMetadata);
+        return xdocGenerator;
+    }
+
 }
diff --git a/commons/commons-utils/src/test/java/fr/gouv/vitamui/commons/utils/PdfFileGeneratorTest.java b/commons/commons-utils/src/test/java/fr/gouv/vitamui/commons/utils/PdfFileGeneratorTest.java
new file mode 100644
index 00000000..82fc6c60
--- /dev/null
+++ b/commons/commons-utils/src/test/java/fr/gouv/vitamui/commons/utils/PdfFileGeneratorTest.java
@@ -0,0 +1,79 @@
+package fr.gouv.vitamui.commons.utils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.text.PDFTextStripper;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class PdfFileGeneratorTest {
+
+    public static final String GENERATED_PDF_NAME = "generated-pdf.pdf";
+
+    private static final String TEST_DIRECTORY = "src/test/resources/";
+
+    private static final String TMP_DIRECTORY = "/tmp/dlab/test/PdfFileGeneratorTest/";
+
+    @BeforeClass
+    public static void setUp() throws IOException {
+        if (!new File(TMP_DIRECTORY).exists()) {
+            Files.createDirectories(Paths.get(TMP_DIRECTORY));
+        }
+    }
+
+    @Test
+    public void testCreatePdfWithDynamicInfo() throws Exception {
+        // The template contains "${data},${dynamic.field}"
+        try (final InputStream templateInput = new FileInputStream(new File(TEST_DIRECTORY + "template-dynamic-info.odt"));
+             final FileOutputStream pdfOutput = new FileOutputStream(new File(TMP_DIRECTORY + GENERATED_PDF_NAME))) {
+            final Map<String, Object> dataMap = new HashMap<>();
+            final String[] dynamicFields = {"dynamic.field"};
+            dataMap.put("data", "value1");
+            dataMap.put("dynamic.field", "value2");
+
+            PdfFileGenerator.createPdfWithDynamicInfo(templateInput, pdfOutput, dataMap, dynamicFields);
+        }
+
+        try (final PDDocument document = PDDocument.load(new File(TMP_DIRECTORY + GENERATED_PDF_NAME))) {
+            final String content = new PDFTextStripper().getText(document);
+            final String[] results = content.split(",");
+            Assert.assertEquals("value1", results[0].trim());
+            Assert.assertEquals("value2", results[1].trim());
+        }
+    }
+
+    @Test
+    public void testCreatePdfWithMetadata() throws Exception {
+        // The template contains "${data},${dynamic.field},${imageField}"
+        try (final InputStream templateInput = new FileInputStream(new File(TEST_DIRECTORY + "template-metadata.odt"));
+             final FileOutputStream pdfOutput = new FileOutputStream(new File(TMP_DIRECTORY + GENERATED_PDF_NAME))) {
+            final Map<String, Object> dataMap = new HashMap<>();
+            final String[] dynamicFields = {"dynamic.field"};
+            final String[] imageFields = {"imageField"};
+            dataMap.put("data", "value1");
+            dataMap.put("dynamic.field", "value2");
+            dataMap.put("imageField", "value3");
+
+            PdfFileGenerator.createPdfWithMetadata(templateInput, pdfOutput, dataMap, dynamicFields, imageFields);
+        }
+
+        try (final PDDocument document = PDDocument.load(new File(TMP_DIRECTORY + GENERATED_PDF_NAME))) {
+            final String content = new PDFTextStripper().getText(document);
+            final String[] results = content.split(",");
+            Assert.assertEquals("value1", results[0].trim());
+            Assert.assertEquals("value2", results[1].trim());
+            Assert.assertEquals("value3", results[2].trim());
+        }
+    }
+
+}
diff --git a/commons/commons-utils/src/test/resources/template-dynamic-info.odt b/commons/commons-utils/src/test/resources/template-dynamic-info.odt
new file mode 100644
index 0000000000000000000000000000000000000000..95124f09ea33130cefc2675814f57bf382b0664e
GIT binary patch
literal 9198
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

literal 0
HcmV?d00001

diff --git a/commons/commons-utils/src/test/resources/template-metadata.odt b/commons/commons-utils/src/test/resources/template-metadata.odt
new file mode 100644
index 0000000000000000000000000000000000000000..e7032e8a8caddfa97bfd6199519360557e0ccf9f
GIT binary patch
literal 10108
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
XE6F~2uo?h>@$dmXyn;|K9`F7O-xN~O

literal 0
HcmV?d00001

diff --git a/pom.xml b/pom.xml
index 36d2f5e4..48717ec0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -144,6 +144,7 @@
         <maven.deploy.plugin.version>2.8.2</maven.deploy.plugin.version>
         <maven.exec.plugin.version>1.6.0</maven.exec.plugin.version>
         <maven.failsafe.plugin.version>2.21.0</maven.failsafe.plugin.version>
+        <maven.filtering.plugin.version>1.3</maven.filtering.plugin.version>
         <maven.findbugs.plugin.version>3.0.4</maven.findbugs.plugin.version>
         <maven.frontend.plugin.version>1.6</maven.frontend.plugin.version>
         <maven.jacoco.plugin.version>0.8.0</maven.jacoco.plugin.version>
@@ -821,6 +822,12 @@
                 <version>${jsonassert.version}</version>
                 <scope>test</scope>
             </dependency>
+            <dependency>
+                <groupId>org.apache.pdfbox</groupId>
+                <artifactId>pdfbox</artifactId>
+                <version>${apache.pdfbox.version}</version>
+                <scope>test</scope>
+            </dependency>
 
             <!-- CUCUMBER SERENITY -->
             <dependency>
@@ -1009,6 +1016,13 @@
                         <nonFilteredFileExtension>pem</nonFilteredFileExtension>
                     </nonFilteredFileExtensions>
                 </configuration>
+                <dependencies>
+                    <dependency>
+                        <groupId>org.apache.maven.shared</groupId>
+                        <artifactId>maven-filtering</artifactId>
+                        <version>${maven.filtering.plugin.version}</version>
+                    </dependency>
+                </dependencies>
             </plugin>
         </plugins>
         <pluginManagement>
-- 
GitLab