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();