Author: lehmi Date: Sun Jan 1 10:02:43 2023 New Revision: 1906309 URL: http://svn.apache.org/viewvc?rev=1906309&view=rev Log: PDFBOX-5178: add support for the optional index value for an object of a compressed stream
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSObjectKey.java pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFXrefStreamParser.java Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSObjectKey.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSObjectKey.java?rev=1906309&r1=1906308&r2=1906309&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSObjectKey.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/COSObjectKey.java Sun Jan 1 10:02:43 2023 @@ -30,6 +30,8 @@ public final class COSObjectKey implemen // The lowest 16 bits hold the generation 0-65535 // The rest is used for the number (even though 34 bit are sufficient for 10 digits) private final long numberAndGeneration; + // index within a compressed object stream if applicable otherwise -1 + private final int streamIndex; /** * Constructor. @@ -48,6 +50,28 @@ public final class COSObjectKey implemen throw new IllegalArgumentException("Generation number must not be a negative value"); } numberAndGeneration = num << NUMBER_OFFSET | (gen & GENERATION_MASK); + streamIndex = -1; + } + + /** + * Constructor. + * + * @param num The object number. + * @param gen The object generation number. + * @param index The index within a compressed object stream + */ + public COSObjectKey(long num, int gen, int index) + { + if (num < 0) + { + throw new IllegalArgumentException("Object number must not be a negative value"); + } + if (gen < 0) + { + throw new IllegalArgumentException("Generation number must not be a negative value"); + } + numberAndGeneration = num << NUMBER_OFFSET | (gen & GENERATION_MASK); + this.streamIndex = index; } /** @@ -82,6 +106,16 @@ public final class COSObjectKey implemen } /** + * The index within a compressed object stream. + * + * @return the index within a compressed object stream if applicable otherwise -1 + */ + public int getStreamIndex() + { + return streamIndex; + } + + /** * {@inheritDoc} */ @Override Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFXrefStreamParser.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFXrefStreamParser.java?rev=1906309&r1=1906308&r2=1906309&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFXrefStreamParser.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/PDFXrefStreamParser.java Sun Jan 1 10:02:43 2023 @@ -136,19 +136,19 @@ public class PDFXrefStreamParser extends } // second field holds the offset (type 1) or the object stream number (type 2) long offset = parseValue(currLine, w[0], w[1]); - // third field holds the generation number for type 1 entries - int genNum = type == 1 ? (int) parseValue(currLine, w[0] + w[1], w[2]) : 0; - COSObjectKey objKey = new COSObjectKey(objID, genNum); + // third filed may hold the generation number (type1) or the index within a object stream (type2) + int thirdValue = (int) parseValue(currLine, w[0] + w[1], w[2]); if (type == 1) { - resolver.setXRef(objKey, offset); + // third field holds the generation number for type 1 entries + resolver.setXRef(new COSObjectKey(objID, thirdValue), offset); } else { // For XRef aware parsers we have to know which objects contain object streams. We will store this // information in normal xref mapping table but add object stream number with minus sign in order to // distinguish from file offsets - resolver.setXRef(objKey, -offset); + resolver.setXRef(new COSObjectKey(objID, 0, thirdValue), -offset); } } close();