You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2017/05/06 14:13:59 UTC

svn commit: r1794146 - /pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java

Author: tilman
Date: Sat May  6 14:13:59 2017
New Revision: 1794146

URL: http://svn.apache.org/viewvc?rev=1794146&view=rev
Log:
PDFBOX-3781: insert xobjects instead of overwrite AcroForm /DR entry when it exists, as suggested by Marco Monacelli

Modified:
    pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java

Modified: pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java?rev=1794146&r1=1794145&r2=1794146&view=diff
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java (original)
+++ pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDDocument.java Sat May  6 14:13:59 2017
@@ -515,16 +515,32 @@ public class PDDocument implements Close
         signatureField.getWidgets().get(0).setAppearance(ap);
     }
 
-    private void assignAcroFormDefaultResource(PDAcroForm acroForm, COSDictionary dict)
+    private void assignAcroFormDefaultResource(PDAcroForm acroForm, COSDictionary newDict)
     {
-        // read and set AcroForm default resource dictionary /DR if available
-        COSBase base = dict.getDictionaryObject(COSName.DR);
-        if (base instanceof COSDictionary)
+        // read and set/update AcroForm default resource dictionary /DR if available
+        COSBase newBase = newDict.getDictionaryObject(COSName.DR);
+        if (newBase instanceof COSDictionary)
         {
-            COSDictionary dr = (COSDictionary) base;
-            dr.setDirect(true);
-            dr.setNeedToBeUpdated(true);
-            acroForm.getCOSObject().setItem(COSName.DR, dr);
+            COSDictionary newDR = (COSDictionary) newBase;
+            PDResources defaultResources = acroForm.getDefaultResources();
+            if (defaultResources == null)
+            {
+                acroForm.getCOSObject().setItem(COSName.DR, newDR);
+                newDR.setDirect(true);
+                newDR.setNeedToBeUpdated(true);            
+            }
+            else
+            {
+                COSDictionary oldDR = defaultResources.getCOSObject();
+                COSBase newXObjectBase = newDR.getItem(COSName.XOBJECT);
+                COSBase oldXObjectBase = oldDR.getItem(COSName.XOBJECT);
+                if (newXObjectBase instanceof COSDictionary &&
+                    oldXObjectBase instanceof COSDictionary)
+                {
+                    ((COSDictionary) oldXObjectBase).addAll((COSDictionary) newXObjectBase);
+                    oldDR.setNeedToBeUpdated(true);
+                }
+            }
         }
     }