Author: lehmi Date: Sat Dec 31 16:34:12 2022 New Revision: 1906301 URL: http://svn.apache.org/viewvc?rev=1906301&view=rev Log: PDFBOX-5178: reuse object keys from cross reference table/stream if available
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/BaseParser.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/BaseParser.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/BaseParser.java?rev=1906301&r1=1906300&r2=1906301&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/BaseParser.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/BaseParser.java Sat Dec 31 16:34:12 2022 @@ -23,6 +23,8 @@ import java.nio.charset.CharacterCodingE import java.nio.charset.Charset; import java.nio.charset.CharsetDecoder; import java.nio.charset.StandardCharsets; +import java.util.Optional; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.pdfbox.cos.COSArray; @@ -141,6 +143,31 @@ public abstract class BaseParser } /** + * Returns the object key for the given combination of object and generation number. The object key from the cross + * reference table/stream will be reused if available. Otherwise a newly created object will be returned. + * + * @param num the given object number + * @param gen the given generation number + * + * @return the COS object key + */ + protected COSObjectKey getObjectKey(long num, int gen) + { + if (document == null || document.getXrefTable() == null) + { + return new COSObjectKey(num, gen); + } + Optional<COSObjectKey> foundKey = document.getXrefTable().keySet().stream() + .filter(k -> k.getNumber() == num && k.getGeneration() == gen) // + .findAny(); + if (foundKey == null || !foundKey.isPresent()) + { + return new COSObjectKey(num, gen); + } + return foundKey.get(); + } + + /** * This will parse a PDF dictionary value. * * @return The parsed Dictionary object. @@ -185,7 +212,7 @@ public abstract class BaseParser return COSNull.NULL; } // dereference the object - return getObjectFromPool(new COSObjectKey(objNumber, genNumber)); + return getObjectFromPool(getObjectKey(objNumber, genNumber)); } private COSBase getObjectFromPool(COSObjectKey key) throws IOException @@ -654,7 +681,7 @@ public abstract class BaseParser COSInteger number = (COSInteger)po.remove( po.size() -1 ); if (number.longValue() >= 0 && genNumber.intValue() >= 0) { - COSObjectKey key = new COSObjectKey(number.longValue(), + COSObjectKey key = getObjectKey(number.longValue(), genNumber.intValue()); pbo = getObjectFromPool(key); } Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java?rev=1906301&r1=1906300&r2=1906301&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java Sat Dec 31 16:34:12 2022 @@ -774,7 +774,7 @@ public class COSParser extends BaseParse { return objectStreamObject; } - final COSObjectKey objKey = new COSObjectKey(objstmObjNr, 0); + final COSObjectKey objKey = getObjectKey(objstmObjNr, 0); final COSBase objstmBaseObj = document.getObjectFromPool(objKey).getObject(); if (objstmBaseObj instanceof COSStream) {