Author: lehmi Date: Sat Jan 27 10:42:31 2024 New Revision: 1915420 URL: http://svn.apache.org/viewvc?rev=1915420&view=rev Log: PDFBOX-5714: update key of indirect objects if the key of the referenced object was replaced
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java?rev=1915420&r1=1915419&r2=1915420&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java Sat Jan 27 10:42:31 2024 @@ -1074,20 +1074,36 @@ public class COSWriter implements ICOSVi COSBase actual = obj; if( actual instanceof COSObject ) { + actual = ((COSObject) obj).getObject(); if (reuseObjectNumbers) { COSObjectKey key = obj.getKey(); if (key != null) { + COSObjectKey actualKey = actual != null ? actual.getKey() : null; + // check if the key of the referenced object and the indirect object is the same + if (actualKey != null && !key.equals(actualKey)) + { + // update the object key of the indirect object + key = actualKey; + obj.setKey(key); + } objectKeys.put(obj, key); return key; } } - actual = ((COSObject) obj).getObject(); } // PDFBOX-4540: because objectKeys is accessible from outside, it is possible // that a COSObject obj is already in the objectKeys map. - return objectKeys.computeIfAbsent(actual, k -> new COSObjectKey(++number, 0)); + COSObjectKey newKey = objectKeys.computeIfAbsent(actual, + k -> new COSObjectKey(++number, 0)); + COSObjectKey actualKey = actual.getKey(); + // if the returned key is new update the existing key of the given object + if (actualKey != null && !actualKey.equals(newKey)) + { + actual.setKey(newKey); + } + return newKey; } @Override