You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2023/07/23 14:27:50 UTC

svn commit: r1911214 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter: COSWriter.java compress/COSWriterCompressionPool.java

Author: lehmi
Date: Sun Jul 23 14:27:50 2023
New Revision: 1911214

URL: http://svn.apache.org/viewvc?rev=1911214&view=rev
Log:
PDFBOX-5518: add support for indirect COSArrays

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/compress/COSWriterCompressionPool.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java?rev=1911214&r1=1911213&r2=1911214&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java Sun Jul 23 14:27:50 2023
@@ -489,13 +489,13 @@ public class COSWriter implements ICOSVi
                 objectKeys.put(object, key);
                 keyObject.put(key, object);
             }
+            number = compressionPool.getHighestXRefObjectNumber();
             for (COSObjectKey key : compressionPool.getTopLevelObjects())
             {
                 currentObjectKey = key;
                 doWriteObject(key, keyObject.get(key));
             }
             // Append object streams to document.
-            number = compressionPool.getHighestXRefObjectNumber();
             for (COSWriterObjectStream finalizedObjectStream : compressionPool
                     .createObjectStreams())
             {
@@ -1090,24 +1090,20 @@ public class COSWriter implements ICOSVi
     }
 
     @Override
-    public void visitFromArray(COSArray obj) throws IOException
+    public void visitFromArray(COSArray array) throws IOException
     {
         int count = 0;
         getStandardOutput().write(ARRAY_OPEN);
-        for (Iterator<COSBase> i = obj.iterator(); i.hasNext();)
+        for (Iterator<COSBase> i = array.iterator(); i.hasNext();)
         {
             COSBase current = i.next();
             if( current instanceof COSDictionary )
             {
-                if (current.isDirect())
-                {
-                    visitFromDictionary((COSDictionary)current);
-                }
-                else
-                {
-                    addObjectToWrite( current );
-                    writeReference( current );
-                }
+                writeDictionary((COSDictionary) current);
+            }
+            else if (current instanceof COSArray)
+            {
+                writeArray((COSArray) current);
             }
             else if( current instanceof COSObject )
             {
@@ -1139,6 +1135,32 @@ public class COSWriter implements ICOSVi
         getStandardOutput().writeEOL();
     }
 
+    private void writeArray(COSArray array) throws IOException
+    {
+        if (array.isDirect())
+        {
+            visitFromArray(array);
+        }
+        else
+        {
+            addObjectToWrite(array);
+            writeReference(array);
+        }
+    }
+
+    private void writeDictionary(COSDictionary dictionary) throws IOException
+    {
+        if (dictionary.isDirect())
+        {
+            visitFromDictionary(dictionary);
+        }
+        else
+        {
+            addObjectToWrite(dictionary);
+            writeReference(dictionary);
+        }
+    }
+
     @Override
     public void visitFromBoolean(COSBoolean obj) throws IOException
     {
@@ -1177,18 +1199,7 @@ public class COSWriter implements ICOSVi
                             item.setDirect(true);
                         }
                     }
-
-                    if(dict.isDirect())
-                    {
-                        // If the object should be written direct, we need
-                        // to pass the dictionary to the visitor again.
-                        visitFromDictionary(dict);
-                    }
-                    else
-                    {
-                        addObjectToWrite( dict );
-                        writeReference( dict );
-                    }
+                    writeDictionary(dict);
                 }
                 else if( value instanceof COSObject )
                 {
@@ -1215,7 +1226,14 @@ public class COSWriter implements ICOSVi
                     }
                     else
                     {
-                        value.accept(this);
+                        if (value instanceof COSArray)
+                        {
+                            writeArray((COSArray) value);
+                        }
+                        else
+                        {
+                            value.accept(this);
+                        }
                     }
                 }
                 getStandardOutput().writeEOL();

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/compress/COSWriterCompressionPool.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/compress/COSWriterCompressionPool.java?rev=1911214&r1=1911213&r2=1911214&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/compress/COSWriterCompressionPool.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/compress/COSWriterCompressionPool.java Sun Jul 23 14:27:50 2023
@@ -153,7 +153,9 @@ public class COSWriterCompressionPool
     {
         COSBase base = current;
         if (current instanceof COSStream
-                || (current instanceof COSDictionary && !current.isDirect()))
+                || (current instanceof COSDictionary && !current.isDirect()) //
+                || (current instanceof COSArray && !current.isDirect()) //
+        )
         {
             base = addObjectToPool(base.getKey(), current);
         }