From cc013823446cb2eb5e1f210f46d43060be7ea98c Mon Sep 17 00:00:00 2001 From: Oliver Schmidtmer <O.Schmidtmer@elo.com> Date: Tue, 5 Oct 2021 16:51:30 +0200 Subject: [PATCH] only replace xRef with corrected entries, if the original entry was not valid --- .../java/org/apache/pdfbox/pdfparser/COSParser.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java b/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java index fc9d2de8cad..afde3c1305a 100644 --- a/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java +++ b/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java @@ -1159,6 +1159,7 @@ private boolean validateXrefOffsets(Map<COSObjectKey, Long> xrefOffset) throws I return true; } Map<COSObjectKey, COSObjectKey> correctedKeys = new HashMap<>(); + Map<COSObjectKey, COSObjectKey> validKeys = new HashMap<>(); for (Entry<COSObjectKey, Long> objectEntry : xrefOffset.entrySet()) { COSObjectKey objectKey = objectEntry.getKey(); @@ -1178,13 +1179,18 @@ else if (foundObjectKey != objectKey) { // Generation was fixed - need to update map later, after iteration correctedKeys.put(objectKey, foundObjectKey); + } else { + validKeys.put(objectKey, foundObjectKey); } } } for (Entry<COSObjectKey, COSObjectKey> correctedKeyEntry : correctedKeys.entrySet()) { - xrefOffset.put(correctedKeyEntry.getValue(), - xrefOffset.remove(correctedKeyEntry.getKey())); + if(!validKeys.containsKey(correctedKeyEntry.getValue())) { + // Only replacy entries, if the original entry does not point to a valid object + xrefOffset.put(correctedKeyEntry.getValue(), + xrefOffset.remove(correctedKeyEntry.getKey())); + } } return true; } @@ -1237,8 +1243,10 @@ private COSObjectKey findObjectKey(COSObjectKey objectKey, long offset) throws I // try to read the given object/generation number long foundObjectNumber = readObjectNumber(); if(objectKey.getNumber() != foundObjectNumber){ + System.out.println("found wrong object number. expected [" + objectKey.getNumber() +"] found ["+ foundObjectNumber + "]"); LOG.warn("found wrong object number. expected [" + objectKey.getNumber() +"] found ["+ foundObjectNumber + "]"); if(!isLenient) return null; + else objectKey = new COSObjectKey(foundObjectNumber, objectKey.getGeneration()); } int genNumber = readGenerationNumber();