You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ms...@apache.org on 2019/02/08 22:17:05 UTC

svn commit: r1853240 - in /pdfbox/branches/2.0/pdfbox/src: main/java/org/apache/pdfbox/multipdf/ test/java/org/apache/pdfbox/multipdf/ test/resources/org/apache/pdfbox/multipdf/

Author: msahyoun
Date: Fri Feb  8 22:17:05 2019
New Revision: 1853240

URL: http://svn.apache.org/viewvc?rev=1853240&view=rev
Log:
PDFBOX-3111: backport unit test and test files from trunk

Added:
    pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/
    pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcroFormForMerge-DifferentExportValues.pdf   (with props)
    pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcroFormForMerge-DifferentFieldType.pdf   (with props)
    pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcroFormForMerge-DifferentOptions.pdf   (with props)
    pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcroFormForMerge-SameNameNode.pdf   (with props)
    pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcroFormForMerge.pdf   (with props)
    pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-DifferentExportValues-WasMaster.pdf   (with props)
    pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-DifferentExportValues.pdf   (with props)
    pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-DifferentFieldType-WasMaster.pdf   (with props)
    pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-DifferentFieldType.pdf   (with props)
    pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-DifferentOptions-WasMaster.pdf   (with props)
    pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-DifferentOptions.pdf   (with props)
    pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-SameMerged.pdf   (with props)
    pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-SameNameNode.pdf   (with props)
    pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/PDFBoxLegacyMerge-SameMerged.pdf   (with props)
Modified:
    pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java
    pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/multipdf/MergeAcroFormsTest.java

Modified: pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java?rev=1853240&r1=1853239&r2=1853240&view=diff
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java (original)
+++ pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java Fri Feb  8 22:17:05 2019
@@ -95,6 +95,7 @@ public class PDFMergerUtility
     private PDMetadata destinationMetadata = null;
 
     private DocumentMergeMode documentMergeMode = DocumentMergeMode.PDFBOX_LEGACY_MODE;
+    private AcroFormMergeMode acroFormMergeMode = AcroFormMergeMode.PDFBOX_LEGACY_MODE;
 
     /**
      * The mode to use when merging documents:
@@ -117,6 +118,24 @@ public class PDFMergerUtility
         PDFBOX_LEGACY_MODE
     }
 
+        /**
+     * The mode to use when merging AcroForm between documents:
+     * 
+     * <ul>
+     * <li>{@link AcroFormMergeMode#JOIN_FORM_FIELDS_MODE} fields with the same fully qualified name
+     *      will be merged into one with the widget annotations of the merged fields 
+     *      becoming part of the same field.
+     * <li>{@link AcroFormMergeMode#PDFBOX_LEGACY_MODE} fields with the same fully qualified name
+     *      will be renamed and treated as independent. This mode was used in versions
+     *      of PDFBox up to 2.x.
+     * </ul>
+     */
+    public enum AcroFormMergeMode
+    {
+        JOIN_FORM_FIELDS_MODE,
+        PDFBOX_LEGACY_MODE
+    }
+
     /**
      * Instantiate a new PDFMergerUtility.
      */
@@ -125,6 +144,18 @@ public class PDFMergerUtility
         sources = new ArrayList<Object>();
     }
 
+
+
+    /**
+     * Set the mode to be used for merging the documents
+     * 
+     * {@link AcroFormMergeMode}
+     */
+    public void setAcroFormMergeMode(AcroFormMergeMode theAcroFormMergeMode)
+    {
+        this.acroFormMergeMode = theAcroFormMergeMode;
+    }
+
     /**
      * Get the name of the destination file.
      *

Modified: pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/multipdf/MergeAcroFormsTest.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/multipdf/MergeAcroFormsTest.java?rev=1853240&r1=1853239&r2=1853240&view=diff
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/multipdf/MergeAcroFormsTest.java (original)
+++ pdfbox/branches/2.0/pdfbox/src/test/java/org/apache/pdfbox/multipdf/MergeAcroFormsTest.java Fri Feb  8 22:17:05 2019
@@ -17,6 +17,7 @@
 package org.apache.pdfbox.multipdf;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertNotNull;
 
 import java.io.File;
@@ -24,8 +25,11 @@ import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 
+import org.apache.pdfbox.cos.COSBase;
+import org.apache.pdfbox.cos.COSDictionary;
 import org.apache.pdfbox.cos.COSName;
 import org.apache.pdfbox.io.IOUtils;
+import org.apache.pdfbox.multipdf.PDFMergerUtility.AcroFormMergeMode;
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
 import org.apache.pdfbox.pdmodel.interactive.form.PDField;
@@ -34,11 +38,12 @@ import org.junit.Test;
 
 /**
  * Test merging different PDFs with AcroForms.
- * 
- * 
+ *
+ *
  */
 public class MergeAcroFormsTest
 {
+    private static final File IN_DIR = new File("src/test/resources/org/apache/pdfbox/multipdf");
     private static final File OUT_DIR = new File("target/test-output/merge/");
     private static final File TARGET_PDF_DIR = new File("target/pdfs");
 
@@ -47,7 +52,86 @@ public class MergeAcroFormsTest
     {
         OUT_DIR.mkdirs();
     }
-    
+
+    /*
+     * Test LegacyMode merge
+     */
+    @Test
+    public void testLegacyModeMerge() throws IOException
+    {
+        PDFMergerUtility merger = new PDFMergerUtility();
+        File toBeMerged = new File(IN_DIR,"AcroFormForMerge.pdf");
+        File pdfOutput = new File(OUT_DIR,"PDFBoxLegacyMerge-SameMerged.pdf");
+        merger.setDestinationFileName(pdfOutput.getAbsolutePath());
+        merger.addSource(toBeMerged);
+        merger.addSource(toBeMerged);
+        merger.mergeDocuments(null);
+        merger.setAcroFormMergeMode(AcroFormMergeMode.PDFBOX_LEGACY_MODE);
+
+        PDDocument compliantDocument = null;
+        PDDocument toBeCompared = null;
+
+
+        try
+        {
+            compliantDocument = PDDocument.load(new File(IN_DIR,"PDFBoxLegacyMerge-SameMerged.pdf"));
+            toBeCompared = PDDocument.load(new File(OUT_DIR,"PDFBoxLegacyMerge-SameMerged.pdf"));
+
+
+            PDAcroForm compliantAcroForm = compliantDocument.getDocumentCatalog().getAcroForm();
+            PDAcroForm toBeComparedAcroForm = toBeCompared.getDocumentCatalog().getAcroForm();
+
+            assertEquals("There shall be the same number of root fields",
+                    compliantAcroForm.getFields().size(),
+                    toBeComparedAcroForm.getFields().size());
+
+            for (PDField compliantField : compliantAcroForm.getFieldTree())
+            {
+                assertNotNull("There shall be a field with the same FQN", toBeComparedAcroForm.getField(compliantField.getFullyQualifiedName()));
+                PDField toBeComparedField = toBeComparedAcroForm.getField(compliantField.getFullyQualifiedName());
+                compareFieldProperties(compliantField, toBeComparedField);
+            }
+
+            for (PDField toBeComparedField : toBeComparedAcroForm.getFieldTree())
+            {
+                assertNotNull("There shall be a field with the same FQN", compliantAcroForm.getField(toBeComparedField.getFullyQualifiedName()));
+                PDField compliantField = compliantAcroForm.getField(toBeComparedField.getFullyQualifiedName());
+                compareFieldProperties(toBeComparedField, compliantField);
+            }
+        }
+        finally
+        {
+            IOUtils.closeQuietly(compliantDocument);
+            IOUtils.closeQuietly(toBeCompared);
+        }
+    }
+
+    private void compareFieldProperties(PDField sourceField, PDField toBeComapredField)
+    {
+        // List of keys for comparison
+        // Don't include too complex properties such as AP as this will fail the test because
+        // of a stack overflow when
+        final String[] keys = {"FT", "T", "TU", "TM", "Ff", "V", "DV", "Opts", "TI", "I", "Rect", "DA", };
+
+        COSDictionary sourceFieldCos = sourceField.getCOSObject();
+        COSDictionary toBeComparedCos = toBeComapredField.getCOSObject();
+
+        for (String key : keys)
+        {
+            COSBase sourceBase = sourceFieldCos.getDictionaryObject(key);
+            COSBase toBeComparedBase = toBeComparedCos.getDictionaryObject(key);
+
+            if (sourceBase != null)
+            {
+                assertEquals("The content of the field properties shall be the same",sourceBase.toString(), toBeComparedBase.toString());
+            }
+            else
+            {
+                assertNull("If the source property is null the compared property shall be null too", toBeComparedBase);
+            }
+        }
+    }    
+
     /*
      * PDFBOX-1031 Ensure that after merging the PDFs there is an Annots entry per page.
      */
@@ -87,7 +171,7 @@ public class MergeAcroFormsTest
             IOUtils.closeQuietly(s2);
         }
     }
-    
+
     /*
      * PDFBOX-1100 Ensure that after merging the PDFs there is an AP and V entry.
      */

Added: pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcroFormForMerge-DifferentExportValues.pdf
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcroFormForMerge-DifferentExportValues.pdf?rev=1853240&view=auto
==============================================================================
Binary file - no diff available.

Propchange: pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcroFormForMerge-DifferentExportValues.pdf
------------------------------------------------------------------------------
    svn:mime-type = application/pdf

Added: pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcroFormForMerge-DifferentFieldType.pdf
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcroFormForMerge-DifferentFieldType.pdf?rev=1853240&view=auto
==============================================================================
Binary file - no diff available.

Propchange: pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcroFormForMerge-DifferentFieldType.pdf
------------------------------------------------------------------------------
    svn:mime-type = application/pdf

Added: pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcroFormForMerge-DifferentOptions.pdf
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcroFormForMerge-DifferentOptions.pdf?rev=1853240&view=auto
==============================================================================
Binary file - no diff available.

Propchange: pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcroFormForMerge-DifferentOptions.pdf
------------------------------------------------------------------------------
    svn:mime-type = application/pdf

Added: pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcroFormForMerge-SameNameNode.pdf
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcroFormForMerge-SameNameNode.pdf?rev=1853240&view=auto
==============================================================================
Binary file - no diff available.

Propchange: pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcroFormForMerge-SameNameNode.pdf
------------------------------------------------------------------------------
    svn:mime-type = application/pdf

Added: pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcroFormForMerge.pdf
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcroFormForMerge.pdf?rev=1853240&view=auto
==============================================================================
Binary file - no diff available.

Propchange: pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcroFormForMerge.pdf
------------------------------------------------------------------------------
    svn:mime-type = application/pdf

Added: pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-DifferentExportValues-WasMaster.pdf
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-DifferentExportValues-WasMaster.pdf?rev=1853240&view=auto
==============================================================================
Binary file - no diff available.

Propchange: pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-DifferentExportValues-WasMaster.pdf
------------------------------------------------------------------------------
    svn:mime-type = application/pdf

Added: pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-DifferentExportValues.pdf
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-DifferentExportValues.pdf?rev=1853240&view=auto
==============================================================================
Binary file - no diff available.

Propchange: pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-DifferentExportValues.pdf
------------------------------------------------------------------------------
    svn:mime-type = application/pdf

Added: pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-DifferentFieldType-WasMaster.pdf
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-DifferentFieldType-WasMaster.pdf?rev=1853240&view=auto
==============================================================================
Binary file - no diff available.

Propchange: pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-DifferentFieldType-WasMaster.pdf
------------------------------------------------------------------------------
    svn:mime-type = application/pdf

Added: pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-DifferentFieldType.pdf
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-DifferentFieldType.pdf?rev=1853240&view=auto
==============================================================================
Binary file - no diff available.

Propchange: pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-DifferentFieldType.pdf
------------------------------------------------------------------------------
    svn:mime-type = application/pdf

Added: pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-DifferentOptions-WasMaster.pdf
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-DifferentOptions-WasMaster.pdf?rev=1853240&view=auto
==============================================================================
Binary file - no diff available.

Propchange: pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-DifferentOptions-WasMaster.pdf
------------------------------------------------------------------------------
    svn:mime-type = application/pdf

Added: pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-DifferentOptions.pdf
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-DifferentOptions.pdf?rev=1853240&view=auto
==============================================================================
Binary file - no diff available.

Propchange: pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-DifferentOptions.pdf
------------------------------------------------------------------------------
    svn:mime-type = application/pdf

Added: pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-SameMerged.pdf
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-SameMerged.pdf?rev=1853240&view=auto
==============================================================================
Binary file - no diff available.

Propchange: pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-SameMerged.pdf
------------------------------------------------------------------------------
    svn:mime-type = application/pdf

Added: pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-SameNameNode.pdf
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-SameNameNode.pdf?rev=1853240&view=auto
==============================================================================
Binary file - no diff available.

Propchange: pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/AcrobatMerge-SameNameNode.pdf
------------------------------------------------------------------------------
    svn:mime-type = application/pdf

Added: pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/PDFBoxLegacyMerge-SameMerged.pdf
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/PDFBoxLegacyMerge-SameMerged.pdf?rev=1853240&view=auto
==============================================================================
Binary file - no diff available.

Propchange: pdfbox/branches/2.0/pdfbox/src/test/resources/org/apache/pdfbox/multipdf/PDFBoxLegacyMerge-SameMerged.pdf
------------------------------------------------------------------------------
    svn:mime-type = application/pdf