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/01/01 10:02:44 UTC

svn commit: r1906309 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox: cos/COSObjectKey.java pdfparser/PDFXrefStreamParser.java

Author: lehmi
Date: Sun Jan  1 10:02:43 2023
New Revision: 1906309

URL: http://svn.apache.org/viewvc?rev=1906309&view=rev
Log:
PDFBOX-5178: add support for the optional index value for an object of a compressed stream

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSObjectKey.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFXrefStreamParser.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSObjectKey.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSObjectKey.java?rev=1906309&r1=1906308&r2=1906309&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSObjectKey.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSObjectKey.java Sun Jan  1 10:02:43 2023
@@ -30,6 +30,8 @@ public final class COSObjectKey implemen
     // The lowest 16 bits hold the generation 0-65535
     // The rest is used for the number (even though 34 bit are sufficient for 10 digits)
     private final long numberAndGeneration;
+    // index within a compressed object stream if applicable otherwise -1
+    private final int streamIndex;
     
     /**
      * Constructor.
@@ -48,6 +50,28 @@ public final class COSObjectKey implemen
             throw new IllegalArgumentException("Generation number must not be a negative value");
         }
         numberAndGeneration = num << NUMBER_OFFSET | (gen & GENERATION_MASK);
+        streamIndex = -1;
+    }
+
+    /**
+     * Constructor.
+     *
+     * @param num The object number.
+     * @param gen The object generation number.
+     * @param index The index within a compressed object stream
+     */
+    public COSObjectKey(long num, int gen, int index)
+    {
+        if (num < 0)
+        {
+            throw new IllegalArgumentException("Object number must not be a negative value");
+        }
+        if (gen < 0)
+        {
+            throw new IllegalArgumentException("Generation number must not be a negative value");
+        }
+        numberAndGeneration = num << NUMBER_OFFSET | (gen & GENERATION_MASK);
+        this.streamIndex = index;
     }
 
     /**
@@ -82,6 +106,16 @@ public final class COSObjectKey implemen
     }
 
     /**
+     * The index within a compressed object stream.
+     * 
+     * @return the index within a compressed object stream if applicable otherwise -1
+     */
+    public int getStreamIndex()
+    {
+        return streamIndex;
+    }
+
+    /**
      * {@inheritDoc}
      */
     @Override

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFXrefStreamParser.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFXrefStreamParser.java?rev=1906309&r1=1906308&r2=1906309&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFXrefStreamParser.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFXrefStreamParser.java Sun Jan  1 10:02:43 2023
@@ -136,19 +136,19 @@ public class PDFXrefStreamParser extends
             }
             // second field holds the offset (type 1) or the object stream number (type 2)
             long offset = parseValue(currLine, w[0], w[1]);
-            // third field holds the generation number for type 1 entries
-            int genNum = type == 1 ? (int) parseValue(currLine, w[0] + w[1], w[2]) : 0;
-            COSObjectKey objKey = new COSObjectKey(objID, genNum);
+            // third filed may hold the generation number (type1) or the index within a object stream (type2)
+            int thirdValue = (int) parseValue(currLine, w[0] + w[1], w[2]);
             if (type == 1)
             {
-                resolver.setXRef(objKey, offset);
+                // third field holds the generation number for type 1 entries
+                resolver.setXRef(new COSObjectKey(objID, thirdValue), offset);
             }
             else
             {
                 // For XRef aware parsers we have to know which objects contain object streams. We will store this
                 // information in normal xref mapping table but add object stream number with minus sign in order to
                 // distinguish from file offsets
-                resolver.setXRef(objKey, -offset);
+                resolver.setXRef(new COSObjectKey(objID, 0, thirdValue), -offset);
             }
         }
         close();