Skip to content

Commit bf90219

Browse files
committed
Refactor ObjectStream Parsing. RES-713
1 parent 23c198b commit bf90219

File tree

2 files changed

+57
-29
lines changed

2 files changed

+57
-29
lines changed
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
package com.itextpdf.rups.view.itext;
2+
3+
import com.itextpdf.io.source.PdfTokenizer;
4+
import com.itextpdf.io.source.RandomAccessFileOrArray;
5+
import com.itextpdf.io.source.RandomAccessSourceFactory;
6+
import com.itextpdf.kernel.pdf.PdfName;
7+
import com.itextpdf.kernel.pdf.PdfStream;
8+
import com.itextpdf.rups.model.LoggerHelper;
9+
import com.itextpdf.rups.view.Console;
10+
11+
import java.io.IOException;
12+
import java.util.Arrays;
13+
14+
/**
15+
* Utility class to parse ObjectStreams to extract the offset of a given object id within the stream.
16+
*/
17+
public class ObjectStreamParser {
18+
19+
/**
20+
* Parses an ObjectStream to find the offset to the passed parameter, compressedObjectNumber. This offset is
21+
* relative to the ObjectStream and not to the complete file, as described in the specification.
22+
*
23+
* If an Object ID isn't found inside the ObjectStream, this will return -1.
24+
*
25+
* @param objStm The ObjectStream to parse
26+
* @param compressedObjectNumber the ID of the object of which you want the offset
27+
* @return the offset of the object or -1 if the object is not found
28+
*/
29+
public int parseObjectStream(PdfStream objStm, int compressedObjectNumber) {
30+
byte[] objStmBytes = objStm.getBytes(true);
31+
int byteOffsetOfFirst = objStm.getAsInt(PdfName.First);
32+
33+
PdfTokenizer pdfTokenizer = new PdfTokenizer(
34+
new RandomAccessFileOrArray(
35+
new RandomAccessSourceFactory()
36+
.createSource(
37+
Arrays.copyOfRange(objStmBytes, 0, byteOffsetOfFirst))));
38+
39+
try {
40+
while (pdfTokenizer.nextToken()) {
41+
if ( pdfTokenizer.getTokenType().equals(PdfTokenizer.TokenType.Number )) {
42+
int objNumber = pdfTokenizer.getIntValue();
43+
pdfTokenizer.nextToken();
44+
if ( objNumber == compressedObjectNumber ) {
45+
return pdfTokenizer.getIntValue();
46+
}
47+
}
48+
}
49+
} catch (IOException e) {
50+
LoggerHelper.error(e.getMessage(), e, ObjectStreamParser.class);
51+
return -1;
52+
}
53+
54+
return -1;
55+
}
56+
}

src/main/java/com/itextpdf/rups/view/itext/XRefTable.java

Lines changed: 1 addition & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -188,38 +188,10 @@ private String getByteOffSetByRow(int rowIndex) {
188188
int objStreamNumber = indirectReference.getObjStreamNumber();
189189
PdfObject refersTo = indirectReference.getRefersTo();
190190
int compressedObjectNumber = refersTo.getIndirectReference().getObjNumber();
191-
int internalCompressedObjectOffset = -1;
192191
PdfObject objectByIndex = objects.loadObjectByReference(objStreamNumber);
193192

194193
PdfStream objStm = (PdfStream) objectByIndex;
195-
byte[] objStmBytes = objStm.getBytes(true);
196-
int byteOffsetOfFirst = objStm.getAsInt(PdfName.First);
197-
198-
PdfTokenizer pdfTokenizer = new PdfTokenizer(
199-
new RandomAccessFileOrArray( new RandomAccessSourceFactory().createSource(Arrays.copyOfRange(objStmBytes, 0, byteOffsetOfFirst)))
200-
);
201-
202-
try {
203-
while (pdfTokenizer.nextToken()) {
204-
if ( pdfTokenizer.getTokenType().equals(PdfTokenizer.TokenType.Number )) {
205-
int objNumber = pdfTokenizer.getIntValue();
206-
pdfTokenizer.nextToken();
207-
int internalByteOffset = pdfTokenizer.getIntValue();
208-
if ( objNumber == compressedObjectNumber ) {
209-
internalCompressedObjectOffset = internalByteOffset;
210-
break;
211-
}
212-
}
213-
}
214-
} catch (IOException e) {
215-
throw new RuntimeException(e);
216-
}
217-
218-
219-
220-
221-
PdfIndirectReference streamIndRef = objectByIndex.getIndirectReference();
222-
long streamOffset = streamIndRef.getOffset();
194+
int internalCompressedObjectOffset = new ObjectStreamParser().parseObjectStream(objStm, compressedObjectNumber);
223195

224196
return String.format(
225197
Language.XREF_BYTE_OFFSET_OBJECT_STREAM.getString(),

0 commit comments

Comments
 (0)