Author: tboehme
Date: Sun Apr  8 14:55:09 2012
New Revision: 1311015

URL: http://svn.apache.org/viewvc?rev=1311015&view=rev
Log:
add parsing of object ids within compressed object streams (needed by 
conforming parsers having to know which compressed stream has to be accessed 
for a specific object id)

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

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=1311015&r1=1311014&r2=1311015&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 Apr  8 14:55:09 2012
@@ -150,9 +150,26 @@ public class PDFXrefStreamParser extends
                         break;
                     case 2:
                         /*
+                         * object stored in object stream; 2nd argument is 
object number of object stream;
+                         * 3rd argument index of object within object stream
+                         * 
+                         * For sequential PDFParser we do not need this 
information
+                         * because
                          * These objects are handled by the 
dereferenceObjects() method
                          * since they're only pointing to object numbers
+                         * 
+                         * However 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
                          */
+                             int objstmObjNr = 0;
+                             for(int i = 0; i < w1; i++)
+                             {
+                                       objstmObjNr += (currLine[i + w0] & 
0x00ff) << ((w1 - i - 1) * 8);
+                             }
+                        objKey = new COSObjectKey( objID.intValue(), 0 );
+                        xrefTrailerResolver.setXRef( objKey, -objstmObjNr );
                         break;
                     default:
                         break;

Modified: 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/XrefTrailerResolver.java
URL: 
http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/XrefTrailerResolver.java?rev=1311015&r1=1311014&r2=1311015&view=diff
==============================================================================
--- 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/XrefTrailerResolver.java
 (original)
+++ 
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/XrefTrailerResolver.java
 Sun Apr  8 14:55:09 2012
@@ -19,8 +19,11 @@ package org.apache.pdfbox.pdfparser;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
+import java.util.Map.Entry;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
@@ -118,6 +121,13 @@ public class XrefTrailerResolver
     }
 
     /**
+     * Returns the trailer last set by {@link #setTrailer(COSDictionary)}.
+     */
+    public COSDictionary getCurrentTrailer() {
+               return curXrefTrailerObj.trailer;
+    }
+
+    /**
      * Sets the byte position of the first XRef
      * (has to be called after very last startxref was read).
      * This is used to resolve chain of active XRef/trailer.
@@ -216,4 +226,33 @@ public class XrefTrailerResolver
     {
         return ( resolvedXrefTrailer == null ) ? null : 
resolvedXrefTrailer.xrefTable;
     }
+    
+    /** Returns object numbers which are referenced as contained
+     *  in object stream with specified object number.
+     *  
+     *  This will scan resolved xref table for all entries having negated
+     *  stream object number as value.
+     *
+     *  @param objstmObjNr  object number of object stream for which contained 
object numbers
+     *                      should be returned
+     *                       
+     *  @return set of object numbers referenced for given object stream
+     *          or <code>null</code> if {@link #setStartxref(long)} was not
+     *          called before so that no resolved xref table exists
+     */
+    public Set<Long> getContainedObjectNumbers( final int objstmObjNr ) 
+    {
+               if ( resolvedXrefTrailer == null )
+                       return null;
+               
+               final Set<Long> refObjNrs = new HashSet<Long>();
+               final int       cmpVal    = - objstmObjNr;
+               
+               for ( Entry<COSObjectKey,Long> xrefEntry : 
resolvedXrefTrailer.xrefTable.entrySet() ) {
+                                               if ( xrefEntry.getValue() == 
cmpVal )
+                                                       refObjNrs.add( 
xrefEntry.getKey().getNumber() );
+                               }
+               
+               return refObjNrs;
+    }
 }


Reply via email to