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")))