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 2014/08/12 18:54:58 UTC

svn commit: r1617528 - in /pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser: NonSequentialPDFParser.java PDFParser.java

Author: lehmi
Date: Tue Aug 12 16:54:58 2014
New Revision: 1617528

URL: http://svn.apache.org/r1617528
Log:
PDFBOX-2250: don't override offset/trailer when parsing the cross reference stream of a hybrid xref table

Modified:
    pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/NonSequentialPDFParser.java
    pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFParser.java

Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/NonSequentialPDFParser.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/NonSequentialPDFParser.java?rev=1617528&r1=1617527&r2=1617528&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/NonSequentialPDFParser.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/NonSequentialPDFParser.java Tue Aug 12 16:54:58 2014
@@ -378,7 +378,7 @@ public class NonSequentialPDFParser exte
                     int streamOffset = trailer.getInt(COSName.XREF_STM);
                     setPdfSource(streamOffset);
                     skipSpaces();
-                    parseXrefObjStream(prev); 
+                    parseXrefObjStream(prev, false); 
                 }
                 prev = trailer.getInt(COSName.PREV);
                 if (isLenient && prev > -1)
@@ -395,7 +395,7 @@ public class NonSequentialPDFParser exte
             else
             {
                 // parse xref stream
-                prev = parseXrefObjStream(prev);
+                prev = parseXrefObjStream(prev, true);
                 if (isLenient && prev > -1)
                 {
                 	// check the xref table reference
@@ -514,7 +514,7 @@ public class NonSequentialPDFParser exte
      * @return value of PREV item in dictionary or <code>-1</code> if no such
      *         item exists
      */
-    private long parseXrefObjStream(long objByteOffset) throws IOException
+    private long parseXrefObjStream(long objByteOffset, boolean isStandalone) throws IOException
     {
         // ---- parse indirect object head
         readObjectNumber();
@@ -523,8 +523,7 @@ public class NonSequentialPDFParser exte
 
         COSDictionary dict = parseCOSDictionary();
         COSStream xrefStream = parseCOSStream(dict, getDocument().getScratchFile());
-        parseXrefStream(xrefStream, (int) objByteOffset);
-
+        parseXrefStream(xrefStream, (int) objByteOffset,isStandalone);
         return dict.getLong(COSName.PREV);
     }
 

Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFParser.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFParser.java?rev=1617528&r1=1617527&r2=1617528&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFParser.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFParser.java Tue Aug 12 16:54:58 2014
@@ -884,8 +884,26 @@ public class PDFParser extends BaseParse
      */
     public void parseXrefStream( COSStream stream, long objByteOffset ) throws IOException
     {
-        xrefTrailerResolver.nextXrefObj( objByteOffset );
-        xrefTrailerResolver.setTrailer( stream );
+        parseXrefStream(stream, objByteOffset, true);
+    }
+
+    /**
+     * Fills XRefTrailerResolver with data of given stream.
+     * Stream must be of type XRef.
+     * @param stream the stream to be read
+     * @param objByteOffset the offset to start at
+     * @param isStandalone should be set to true if the stream is not part of a hybrid xref table
+     * @throws IOException if there is an error parsing the stream
+     */
+    public void parseXrefStream( COSStream stream, long objByteOffset, boolean isStandalone ) throws IOException
+    {
+        // the cross reference stream of a hybrid xref table will be added to the existing one
+        // and we must not override the offset and the trailer
+        if (isStandalone)
+        {
+            xrefTrailerResolver.nextXrefObj( objByteOffset );
+            xrefTrailerResolver.setTrailer( stream );
+        }
         PDFXrefStreamParser parser =
             new PDFXrefStreamParser( stream, document, forceParsing, xrefTrailerResolver );
         parser.parse();