Skip to content

Commit cc01382

Browse files
committed
only replace xRef with corrected entries, if the original entry was not valid
1 parent 8604732 commit cc01382

File tree

1 file changed

+10
-2
lines changed

1 file changed

+10
-2
lines changed

pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java

+10-2
Original file line numberDiff line numberDiff line change
@@ -1159,6 +1159,7 @@ private boolean validateXrefOffsets(Map<COSObjectKey, Long> xrefOffset) throws I
11591159
return true;
11601160
}
11611161
Map<COSObjectKey, COSObjectKey> correctedKeys = new HashMap<>();
1162+
Map<COSObjectKey, COSObjectKey> validKeys = new HashMap<>();
11621163
for (Entry<COSObjectKey, Long> objectEntry : xrefOffset.entrySet())
11631164
{
11641165
COSObjectKey objectKey = objectEntry.getKey();
@@ -1178,13 +1179,18 @@ else if (foundObjectKey != objectKey)
11781179
{
11791180
// Generation was fixed - need to update map later, after iteration
11801181
correctedKeys.put(objectKey, foundObjectKey);
1182+
} else {
1183+
validKeys.put(objectKey, foundObjectKey);
11811184
}
11821185
}
11831186
}
11841187
for (Entry<COSObjectKey, COSObjectKey> correctedKeyEntry : correctedKeys.entrySet())
11851188
{
1186-
xrefOffset.put(correctedKeyEntry.getValue(),
1187-
xrefOffset.remove(correctedKeyEntry.getKey()));
1189+
if(!validKeys.containsKey(correctedKeyEntry.getValue())) {
1190+
// Only replacy entries, if the original entry does not point to a valid object
1191+
xrefOffset.put(correctedKeyEntry.getValue(),
1192+
xrefOffset.remove(correctedKeyEntry.getKey()));
1193+
}
11881194
}
11891195
return true;
11901196
}
@@ -1237,8 +1243,10 @@ private COSObjectKey findObjectKey(COSObjectKey objectKey, long offset) throws I
12371243
// try to read the given object/generation number
12381244
long foundObjectNumber = readObjectNumber();
12391245
if(objectKey.getNumber() != foundObjectNumber){
1246+
System.out.println("found wrong object number. expected [" + objectKey.getNumber() +"] found ["+ foundObjectNumber + "]");
12401247
LOG.warn("found wrong object number. expected [" + objectKey.getNumber() +"] found ["+ foundObjectNumber + "]");
12411248
if(!isLenient) return null;
1249+
else objectKey = new COSObjectKey(foundObjectNumber, objectKey.getGeneration());
12421250
}
12431251

12441252
int genNumber = readGenerationNumber();

0 commit comments

Comments
 (0)