Author: lehmi
Date: Sat Dec 31 16:34:12 2022
New Revision: 1906301

URL: http://svn.apache.org/viewvc?rev=1906301&view=rev
Log:
PDFBOX-5178: reuse object keys from cross reference table/stream if available

Modified:
    
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/BaseParser.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/BaseParser.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/BaseParser.java?rev=1906301&r1=1906300&r2=1906301&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/BaseParser.java 
(original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/BaseParser.java 
Sat Dec 31 16:34:12 2022
@@ -23,6 +23,8 @@ import java.nio.charset.CharacterCodingE
 import java.nio.charset.Charset;
 import java.nio.charset.CharsetDecoder;
 import java.nio.charset.StandardCharsets;
+import java.util.Optional;
+
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.pdfbox.cos.COSArray;
@@ -141,6 +143,31 @@ public abstract class BaseParser
     }
 
     /**
+     * Returns the object key for the given combination of object and 
generation number. The object key from the cross
+     * reference table/stream will be reused if available. Otherwise a newly 
created object will be returned.
+     * 
+     * @param num the given object number
+     * @param gen the given generation number
+     * 
+     * @return the COS object key
+     */
+    protected COSObjectKey getObjectKey(long num, int gen)
+    {
+        if (document == null || document.getXrefTable() == null)
+        {
+            return new COSObjectKey(num, gen);
+        }
+        Optional<COSObjectKey> foundKey = 
document.getXrefTable().keySet().stream()
+                .filter(k -> k.getNumber() == num && k.getGeneration() == gen) 
//
+                .findAny();
+        if (foundKey == null || !foundKey.isPresent())
+        {
+            return new COSObjectKey(num, gen);
+        }
+        return foundKey.get();
+    }
+
+    /**
      * This will parse a PDF dictionary value.
      *
      * @return The parsed Dictionary object.
@@ -185,7 +212,7 @@ public abstract class BaseParser
             return COSNull.NULL;
         }
         // dereference the object
-        return getObjectFromPool(new COSObjectKey(objNumber, genNumber));
+        return getObjectFromPool(getObjectKey(objNumber, genNumber));
     }
 
     private COSBase getObjectFromPool(COSObjectKey key) throws IOException
@@ -654,7 +681,7 @@ public abstract class BaseParser
                         COSInteger number = (COSInteger)po.remove( po.size() 
-1 );
                         if (number.longValue() >= 0 && genNumber.intValue() >= 
0)
                         {
-                            COSObjectKey key = new 
COSObjectKey(number.longValue(),
+                            COSObjectKey key = getObjectKey(number.longValue(),
                                     genNumber.intValue());
                             pbo = getObjectFromPool(key);
                         }

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java?rev=1906301&r1=1906300&r2=1906301&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java 
(original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java 
Sat Dec 31 16:34:12 2022
@@ -774,7 +774,7 @@ public class COSParser extends BaseParse
         {
             return objectStreamObject;
         }
-        final COSObjectKey objKey = new COSObjectKey(objstmObjNr, 0);
+        final COSObjectKey objKey = getObjectKey(objstmObjNr, 0);
         final COSBase objstmBaseObj = 
document.getObjectFromPool(objKey).getObject();
         if (objstmBaseObj instanceof COSStream)
         {


Reply via email to