Author: msahyoun
Date: Mon Feb 12 17:51:28 2018
New Revision: 1824047

URL: http://svn.apache.org/viewvc?rev=1824047&view=rev
Log:
PDFBOX-3111: add ability to switch between merge modes; adjust method naming; 
TODO implement new merge mode

Modified:
    
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java
    
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/multipdf/MergeAcroFormsTest.java

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java?rev=1824047&r1=1824046&r2=1824047&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/multipdf/PDFMergerUtility.java
 Mon Feb 12 17:51:28 2018
@@ -78,6 +78,25 @@ public class PDFMergerUtility
     private boolean ignoreAcroFormErrors = false;
     private PDDocumentInformation destinationDocumentInformation = null;
     private PDMetadata destinationMetadata = null;
+    private AcroFormMergeMode acroFormMergeMode = 
AcroFormMergeMode.PDFBOX_LEGACY_MODE;
+    
+    /**
+     * The mode to use when merging AcroForm between documents.
+     * 
+     * <p><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.
@@ -643,7 +662,14 @@ public class PDFMergerUtility
             {
                 if (srcAcroForm != null)
                 {
-                    acroFormLegacyMerge(cloner, destAcroForm, srcAcroForm);
+                    if (acroFormMergeMode == 
AcroFormMergeMode.PDFBOX_LEGACY_MODE)
+                    {
+                        acroFormLegacyMode(cloner, destAcroForm, srcAcroForm);
+                    }
+                    else if (acroFormMergeMode == 
AcroFormMergeMode.JOIN_FORM_FIELDS_MODE)
+                    {
+                        acroFormJoinFieldsMode(cloner, destAcroForm, 
srcAcroForm);
+                    }
                 }
             }
         }
@@ -666,7 +692,22 @@ public class PDFMergerUtility
      * @param srcAcroForm the source form
      * @throws IOException If an error occurs while adding the field.
      */
-    private void acroFormLegacyMerge(PDFCloneUtility cloner, PDAcroForm 
destAcroForm, PDAcroForm srcAcroForm)
+    private void acroFormJoinFieldsMode(PDFCloneUtility cloner, PDAcroForm 
destAcroForm, PDAcroForm srcAcroForm)
+            throws IOException
+    {
+        acroFormLegacyMode(cloner, destAcroForm, srcAcroForm);
+    }
+    
+    /*
+     * Merge the contents of the source form into the destination form for the
+     * destination file.
+     *
+     * @param cloner the object cloner for the destination document
+     * @param destAcroForm the destination form
+     * @param srcAcroForm the source form
+     * @throws IOException If an error occurs while adding the field.
+     */
+    private void acroFormLegacyMode(PDFCloneUtility cloner, PDAcroForm 
destAcroForm, PDAcroForm srcAcroForm)
             throws IOException
     {
         List<PDField> srcFields = srcAcroForm.getFields();
@@ -762,6 +803,26 @@ public class PDFMergerUtility
     }
 
     /**
+     * Get the mode to be used for merging AcroForms
+     * 
+     * {@link AcroFormMergeMode}
+     */
+    public AcroFormMergeMode getAcroFormMergeMode()
+    {
+        return acroFormMergeMode;
+    }
+    
+    /**
+     * Set the mode to be used for merging AcroForms
+     * 
+     * {@link AcroFormMergeMode}
+     */
+    public void setAcroFormMergeMode(AcroFormMergeMode theAcroFormMergeMode)
+    {
+        this.acroFormMergeMode = theAcroFormMergeMode;
+    }
+
+    /**
      * Update the Pg and Obj references to the new (merged) page.
      *
      * @param parentTreeEntry

Modified: 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/multipdf/MergeAcroFormsTest.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/multipdf/MergeAcroFormsTest.java?rev=1824047&r1=1824046&r2=1824047&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/multipdf/MergeAcroFormsTest.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/multipdf/MergeAcroFormsTest.java
 Mon Feb 12 17:51:28 2018
@@ -29,6 +29,7 @@ import java.net.URL;
 import org.apache.pdfbox.cos.COSBase;
 import org.apache.pdfbox.cos.COSDictionary;
 import org.apache.pdfbox.cos.COSName;
+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;
@@ -64,6 +65,7 @@ public class MergeAcroFormsTest
         merger.addSource(toBeMerged);
         merger.addSource(toBeMerged);
         merger.mergeDocuments(null);
+        merger.setAcroFormMergeMode(AcroFormMergeMode.PDFBOX_LEGACY_MODE);
         
         try (PDDocument compliantDocument = PDDocument.load(new 
File(IN_DIR,"PDFBoxLegacyMerge-SameMerged.pdf"));
                 PDDocument toBeCompared = PDDocument.load(new 
File(OUT_DIR,"PDFBoxLegacyMerge-SameMerged.pdf")))


Reply via email to