Skip to content

Commit 6e62c5a

Browse files
michaeldemeymarcoandries
authored andcommitted
Adding byte offsets to the XREF Table tab. Adding ObjStm to the treeview. RES-713
1 parent f9ec40f commit 6e62c5a

File tree

4 files changed

+45
-0
lines changed

4 files changed

+45
-0
lines changed

src/main/java/com/itextpdf/rups/controller/PdfReaderController.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,9 @@ This file is part of the iText (R) project.
4444

4545
import com.itextpdf.kernel.pdf.PdfArray;
4646
import com.itextpdf.kernel.pdf.PdfDictionary;
47+
import com.itextpdf.kernel.pdf.PdfIndirectReference;
4748
import com.itextpdf.kernel.pdf.PdfName;
49+
import com.itextpdf.kernel.pdf.PdfNull;
4850
import com.itextpdf.kernel.pdf.PdfObject;
4951
import com.itextpdf.kernel.pdf.PdfStream;
5052
import com.itextpdf.kernel.utils.CompareTool;
@@ -61,6 +63,7 @@ This file is part of the iText (R) project.
6163
import com.itextpdf.rups.event.OpenStructureEvent;
6264
import com.itextpdf.rups.event.RupsEvent;
6365
import com.itextpdf.rups.io.listeners.PdfTreeNavigationListener;
66+
import com.itextpdf.rups.model.IndirectObjectFactory;
6467
import com.itextpdf.rups.model.ObjectLoader;
6568
import com.itextpdf.rups.model.PdfSyntaxParser;
6669
import com.itextpdf.rups.model.TreeNodeFactory;
@@ -79,11 +82,13 @@ This file is part of the iText (R) project.
7982
import com.itextpdf.rups.view.itext.StructureTree;
8083
import com.itextpdf.rups.view.itext.SyntaxHighlightedStreamPane;
8184
import com.itextpdf.rups.view.itext.XRefTable;
85+
import com.itextpdf.rups.view.itext.treenodes.ObjectStreamTreeNode;
8286
import com.itextpdf.rups.view.itext.treenodes.PdfObjectTreeNode;
8387
import com.itextpdf.rups.view.itext.treenodes.PdfTrailerTreeNode;
8488

8589
import java.awt.Color;
8690
import java.awt.event.KeyListener;
91+
import java.util.List;
8792
import java.util.Observable;
8893
import java.util.Observer;
8994
import java.util.Stack;
@@ -310,6 +315,13 @@ public void update(Observable observable, Object obj) {
310315
root.setTrailer(loader.getFile().getPdfDocument().getTrailer());
311316
root.setUserObject(String.format(Language.PDF_OBJECT_TREE.getString(), loader.getLoaderName()));
312317
nodes.expandNode(root);
318+
IndirectObjectFactory objects = loader.getObjects();
319+
List<PdfIndirectReference> objectStreams = objects.getObjectStreams();
320+
if ( objectStreams != null && objectStreams.size() > 0 ) {
321+
ObjectStreamTreeNode objStreamNode = new ObjectStreamTreeNode(new PdfArray(objectStreams));
322+
root.add(objStreamNode);
323+
nodes.expandNode(objStreamNode);
324+
}
313325
navigationTabs.setSelectedIndex(0);
314326
setChanged();
315327
super.notifyObservers(event);

src/main/java/com/itextpdf/rups/model/IndirectObjectFactory.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,18 @@ This file is part of the iText (R) project.
4646
import com.itextpdf.kernel.exceptions.PdfException;
4747
import com.itextpdf.kernel.pdf.PdfDictionary;
4848
import com.itextpdf.kernel.pdf.PdfDocument;
49+
import com.itextpdf.kernel.pdf.PdfIndirectReference;
4950
import com.itextpdf.kernel.pdf.PdfName;
5051
import com.itextpdf.kernel.pdf.PdfNull;
5152
import com.itextpdf.kernel.pdf.PdfObject;
53+
import com.itextpdf.kernel.pdf.PdfStream;
5254
import com.itextpdf.rups.view.Language;
5355

5456
import java.lang.reflect.Field;
5557
import java.lang.reflect.InvocationTargetException;
5658
import java.lang.reflect.Method;
5759
import java.util.ArrayList;
60+
import java.util.List;
5861

5962
/**
6063
* A factory that can produce all the indirect objects in a PDF file.
@@ -77,6 +80,11 @@ public class IndirectObjectFactory {
7780
* A list of all the indirect objects in a PDF file.
7881
*/
7982
protected ArrayList<PdfObject> objects = new ArrayList<>();
83+
84+
/**
85+
* List of all Object Streams in a PDF file.
86+
*/
87+
protected List<PdfIndirectReference> objectStreams = new ArrayList<>();
8088
/**
8189
* Mapping between the index in the objects list and the reference number in the xref table.
8290
*/
@@ -161,6 +169,14 @@ public boolean storeNextObject() {
161169
final int idx = size();
162170
idxToRef.put(idx, current);
163171
refToIdx.put(current, idx);
172+
173+
if ( object.getType() == PdfObject.STREAM ) {
174+
PdfStream stream = (PdfStream) object;
175+
if ( PdfName.ObjStm.equals(stream.get(PdfName.Type) )) {
176+
this.objectStreams.add(stream.getIndirectReference());
177+
}
178+
}
179+
164180
store(object);
165181
return true;
166182
}
@@ -254,6 +270,10 @@ public boolean isLoadedByReference(int ref) {
254270
return isLoaded.get(getIndexByRef(ref));
255271
}
256272

273+
public List<PdfIndirectReference> getObjectStreams() {
274+
return objectStreams;
275+
}
276+
257277
/**
258278
* Loads an object based on its reference number in the xref table.
259279
*

src/main/java/com/itextpdf/rups/model/ObjectLoader.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,7 @@ public TreeNodeFactory getNodes() {
117117
return nodes;
118118
}
119119

120+
120121
/**
121122
* getter for a human readable name representing this loader
122123
*
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.itextpdf.rups.view.itext.treenodes;
2+
3+
import com.itextpdf.kernel.pdf.PdfObject;
4+
5+
public class ObjectStreamTreeNode extends PdfObjectTreeNode {
6+
7+
public ObjectStreamTreeNode(PdfObject object) {
8+
super(object);
9+
setUserObject("PDF Object Streams");
10+
}
11+
12+
}

0 commit comments

Comments
 (0)