You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2018/03/27 19:22:47 UTC

svn commit: r1827857 - in /pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox: cos/COSDocument.java pdfparser/COSParser.java pdfwriter/COSWriter.java

Author: tilman
Date: Tue Mar 27 19:22:47 2018
New Revision: 1827857

URL: http://svn.apache.org/viewvc?rev=1827857&view=rev
Log:
PDFBOX-3631: remember the highest XRef stream object number for incremental saving to avoid reusing it

Modified:
    pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDocument.java
    pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java
    pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java

Modified: pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDocument.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDocument.java?rev=1827857&r1=1827856&r2=1827857&view=diff
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDocument.java (original)
+++ pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/cos/COSDocument.java Tue Mar 27 19:22:47 2018
@@ -86,6 +86,11 @@ public class COSDocument extends COSBase
     private ScratchFile scratchFile;
 
     /**
+     * Used for incremental saving, to avoid XRef object numbers from being reused.
+     */
+    private long highestXRefObjectNumber;
+
+    /**
      * Constructor. Uses main memory to buffer PDF streams.
      */
     public COSDocument()
@@ -407,6 +412,28 @@ public class COSDocument extends COSBase
     }
 
     /**
+     * Internal PDFBox use only. Get the object number of the highest XRef stream. This is needed to
+     * avoid reusing such a number in incremental saving.
+     *
+     * @return The object number of the highest XRef stream, or 0 if there was no XRef stream.
+     */
+    public long getHighestXRefObjectNumber()
+    {
+        return highestXRefObjectNumber;
+    }
+
+    /**
+     * Internal PDFBox use only. Sets the object number of the highest XRef stream. This is needed
+     * to avoid reusing such a number in incremental saving.
+     *
+     * @param highestXRefObjectNumber The object number of the highest XRef stream.
+     */
+    public void setHighestXRefObjectNumber(long highestXRefObjectNumber)
+    {
+        this.highestXRefObjectNumber = highestXRefObjectNumber;
+    }
+
+    /**
      * visitor pattern double dispatch method.
      *
      * @param visitor The object to notify when visiting this object.

Modified: pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java?rev=1827857&r1=1827856&r2=1827857&view=diff
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java (original)
+++ pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java Tue Mar 27 19:22:47 2018
@@ -386,7 +386,12 @@ public class COSParser extends BaseParse
     private long parseXrefObjStream(long objByteOffset, boolean isStandalone) throws IOException
     {
         // ---- parse indirect object head
-        readObjectNumber();
+        long objectNumber = readObjectNumber();
+
+        // remember the highest XRef object number to avoid it being reused in incremental saving
+        long currentHighestXRefObjectNumber = document.getHighestXRefObjectNumber();
+        document.setHighestXRefObjectNumber(Math.max(currentHighestXRefObjectNumber, objectNumber));
+
         readGenerationNumber();
         readExpectedString(OBJ_MARKER, true);
 

Modified: pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java?rev=1827857&r1=1827856&r2=1827857&view=diff
==============================================================================
--- pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java (original)
+++ pdfbox/branches/2.0/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java Tue Mar 27 19:22:47 2018
@@ -259,7 +259,7 @@ public class COSWriter implements ICOSVi
           
           Map<COSObjectKey, Long> xrefTable = cosDoc.getXrefTable();
           Set<COSObjectKey> keySet = xrefTable.keySet();
-          long highestNumber=0;
+          long highestNumber = doc.getDocument().getHighestXRefObjectNumber();
           for ( COSObjectKey cosObjectKey : keySet ) 
           {
             COSBase object = cosDoc.getObjectFromPool(cosObjectKey).getObject();