You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2023/03/25 12:47:31 UTC
svn commit: r1908711 - in /pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger: ./ treestatus/ ui/
Author: lehmi
Date: Sat Mar 25 12:47:30 2023
New Revision: 1908711
URL: http://svn.apache.org/viewvc?rev=1908711&view=rev
Log:
PDFBOX-5539: add a view for the cross reference table
Added:
pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/TreeViewMenu.java (with props)
pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/XrefEntries.java (with props)
pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/XrefEntry.java (with props)
Modified:
pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/PDFDebugger.java
pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/treestatus/TreeStatus.java
pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/PDFTreeCellRenderer.java
pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/PDFTreeModel.java
pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/Tree.java
pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/ViewMenu.java
Modified: pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/PDFDebugger.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/PDFDebugger.java?rev=1908711&r1=1908710&r2=1908711&view=diff
==============================================================================
--- pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/PDFDebugger.java (original)
+++ pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/PDFDebugger.java Sat Mar 25 12:47:30 2023
@@ -117,8 +117,11 @@ import org.apache.pdfbox.debugger.ui.Ren
import org.apache.pdfbox.debugger.ui.RotationMenu;
import org.apache.pdfbox.debugger.ui.TextDialog;
import org.apache.pdfbox.debugger.ui.Tree;
+import org.apache.pdfbox.debugger.ui.TreeViewMenu;
import org.apache.pdfbox.debugger.ui.ViewMenu;
import org.apache.pdfbox.debugger.ui.WindowPrefs;
+import org.apache.pdfbox.debugger.ui.XrefEntries;
+import org.apache.pdfbox.debugger.ui.XrefEntry;
import org.apache.pdfbox.debugger.ui.ZoomMenu;
import org.apache.pdfbox.filter.FilterFactory;
import org.apache.pdfbox.io.IOUtils;
@@ -189,6 +192,9 @@ public class PDFDebugger extends JFrame
private JMenuItem findNextMenuItem;
private JMenuItem findPreviousMenuItem;
+ // current view mode of the tree
+ private String treeViewMode = TreeViewMenu.VIEW_PAGES;
+
// cli options
// Expected for CLI app to write to System.out/System.err
@SuppressWarnings("squid:S106")
@@ -216,17 +222,28 @@ public class PDFDebugger extends JFrame
*/
public PDFDebugger()
{
+ if (viewstructure)
+ {
+ treeViewMode = TreeViewMenu.VIEW_STRUCTURE;
+ }
}
/**
* Constructor.
*
- * @param isPageMode true if pages are to be displayed, false if internal
- * structure is to be displayed.
+ * @param initialViewMode initial view mode for the tree view on the left hand side.
+ *
*/
- public PDFDebugger(boolean isPageMode)
+ public PDFDebugger(String initialViewMode)
{
- viewstructure = !isPageMode;
+ if (TreeViewMenu.isValidViewMode(initialViewMode))
+ {
+ treeViewMode = initialViewMode;
+ }
+ else
+ {
+ SYSERR.println("Onknown view mode " + initialViewMode);
+ }
}
/**
@@ -297,16 +314,28 @@ public class PDFDebugger extends JFrame
return 0;
}
- public boolean isPageMode()
+ /**
+ * Provide the current view mode of the tree view. see {@link TreeViewMenu} for valid values
+ */
+ public String getTreeViewMode()
{
- return !viewstructure;
+ return treeViewMode;
}
-
- public void setPageMode(boolean isPageMode)
+
+ /**
+ * Set the current view mode of the tree view. see {@link TreeViewMenu} for valid values
+ *
+ * @param the view mode to be set
+ *
+ */
+ public void setTreeViewMode(String viewMode)
{
- viewstructure = !isPageMode;
+ if (TreeViewMenu.isValidViewMode(viewMode))
+ {
+ treeViewMode = viewMode;
+ }
}
-
+
public boolean hasDocument()
{
return document != null;
@@ -762,6 +791,12 @@ public class PDFDebugger extends JFrame
statusBar.getStatusLabel().setText("");
+ if (selectedNode instanceof XrefEntry)
+ {
+ jTextPane.setText(convertToString(selectedNode));
+ return;
+ }
+
if (isPage(selectedNode))
{
showPage(selectedNode);
@@ -1167,6 +1202,10 @@ public class PDFDebugger extends JFrame
{
data = convertToString( ((ArrayEntry)selectedNode).getValue() );
}
+ else if (selectedNode instanceof XrefEntry)
+ {
+ data = ((XrefEntry) selectedNode).toString();
+ }
return data;
}
@@ -1369,22 +1408,31 @@ public class PDFDebugger extends JFrame
TreeStatus treeStatus = new TreeStatus(document.getDocument().getTrailer());
statusPane.updateTreeStatus(treeStatus);
- if (!viewstructure)
+ String treeViewMode = TreeViewMenu.getInstance().getTreeViewSelection();
+ if (TreeViewMenu.VIEW_PAGES.equals(treeViewMode))
{
File file = new File(currentFilePath);
DocumentEntry documentEntry = new DocumentEntry(document, file.getName());
ZoomMenu.getInstance().resetZoom();
RotationMenu.getInstance().setRotationSelection(RotationMenu.ROTATE_0_DEGREES);
ImageTypeMenu.getInstance().setImageTypeSelection(ImageTypeMenu.IMAGETYPE_RGB);
- RenderDestinationMenu.getInstance().setRenderDestinationSelection(RenderDestinationMenu.RENDER_DESTINATION_EXPORT);
+ RenderDestinationMenu.getInstance()
+ .setRenderDestinationSelection(RenderDestinationMenu.RENDER_DESTINATION_EXPORT);
tree.setModel(new PDFTreeModel(documentEntry));
// Root/Pages/Kids/[0] is not always the first page, so use the first row instead:
tree.setSelectionPath(tree.getPathForRow(1));
}
- else
+ else if (TreeViewMenu.VIEW_STRUCTURE.equals(treeViewMode))
{
tree.setModel(new PDFTreeModel(document));
tree.setSelectionPath(treeStatus.getPathForString("Root"));
+ tree.setSelectionPath(tree.getPathForRow(1));
+ }
+ else if (TreeViewMenu.VIEW_CROSS_REF_TABLE.equals(treeViewMode))
+ {
+ tree.setModel(new PDFTreeModel(new XrefEntries(document)));
+ tree.setSelectionPath(treeStatus.getPathForString("CRT"));
+ tree.setSelectionPath(tree.getPathForRow(1));
}
}
Modified: pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/treestatus/TreeStatus.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/treestatus/TreeStatus.java?rev=1908711&r1=1908710&r2=1908711&view=diff
==============================================================================
--- pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/treestatus/TreeStatus.java (original)
+++ pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/treestatus/TreeStatus.java Sat Mar 25 12:47:30 2023
@@ -27,6 +27,7 @@ import org.apache.pdfbox.cos.COSObject;
import org.apache.pdfbox.debugger.ui.ArrayEntry;
import org.apache.pdfbox.debugger.ui.MapEntry;
import org.apache.pdfbox.debugger.ui.PageEntry;
+import org.apache.pdfbox.debugger.ui.XrefEntry;
/**
* @author Khyrul Bashar
@@ -141,6 +142,11 @@ public final class TreeStatus
PageEntry entry = (PageEntry) treeNode;
return entry.getPath();
}
+ else if (treeNode instanceof XrefEntry)
+ {
+ XrefEntry entry = (XrefEntry) treeNode;
+ return entry.getPath();
+ }
throw new IllegalArgumentException("Unknown treeNode type: " + treeNode.getClass().getName());
}
@@ -186,6 +192,11 @@ public final class TreeStatus
{
obj = ((ArrayEntry) obj).getValue();
}
+ else if (obj instanceof XrefEntry)
+ {
+ obj = ((XrefEntry) obj).getObject();
+ }
+
if (obj instanceof COSObject)
{
obj = ((COSObject) obj).getObject();
@@ -198,7 +209,7 @@ public final class TreeStatus
MapEntry entry = new MapEntry();
entry.setKey(COSName.getPDFName(searchStr));
entry.setValue(dic.getDictionaryObject(searchStr));
- entry.setValue(dic.getItem(searchStr));
+ entry.setItem(dic.getItem(searchStr));
return entry;
}
}
Modified: pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/PDFTreeCellRenderer.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/PDFTreeCellRenderer.java?rev=1908711&r1=1908710&r2=1908711&view=diff
==============================================================================
--- pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/PDFTreeCellRenderer.java (original)
+++ pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/PDFTreeCellRenderer.java Sat Mar 25 12:47:30 2023
@@ -178,6 +178,14 @@ public class PDFTreeCellRenderer extends
{
result = nodeValue.toString();
}
+ else if (nodeValue instanceof XrefEntries)
+ {
+ result = nodeValue.toString();
+ }
+ else if (nodeValue instanceof XrefEntry)
+ {
+ result = nodeValue.toString();
+ }
return result;
}
@@ -251,6 +259,11 @@ public class PDFTreeCellRenderer extends
isStream = entry.getValue() instanceof COSStream;
}
}
+ else if (nodeValue instanceof XrefEntry)
+ {
+ isIndirect = true;
+ isStream = false;
+ }
if (isIndirect && !isStream)
{
@@ -268,6 +281,10 @@ public class PDFTreeCellRenderer extends
MapEntry entry = (MapEntry) nodeValue;
return lookupIcon(entry.getValue());
}
+ if (nodeValue instanceof XrefEntry)
+ {
+ return ICON_INDIRECT;
+ }
else if (nodeValue instanceof ArrayEntry)
{
ArrayEntry entry = (ArrayEntry) nodeValue;
@@ -326,6 +343,10 @@ public class PDFTreeCellRenderer extends
{
return ICON_PAGE;
}
+ else if (nodeValue instanceof COSObject)
+ {
+ return ICON_DICT;
+ }
else
{
return null;
@@ -337,6 +358,8 @@ public class PDFTreeCellRenderer extends
*/
private static class OverlayIcon extends ImageIcon
{
+ private static final long serialVersionUID = 1343672579481297481L;
+
private final ImageIcon base;
private final List<ImageIcon> overlays;
Modified: pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/PDFTreeModel.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/PDFTreeModel.java?rev=1908711&r1=1908710&r2=1908711&view=diff
==============================================================================
--- pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/PDFTreeModel.java (original)
+++ pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/PDFTreeModel.java Sat Mar 25 12:47:30 2023
@@ -75,11 +75,20 @@ public class PDFTreeModel implements Tre
}
/**
- * Adds a listener for the <code>TreeModelEvent</code>
- * posted after the tree changes.
+ * Constructor to take the cross reference table of a document.
*
- * @param l the listener to add
- * @see #removeTreeModelListener
+ * @param xrefEntries The cross reference table to display in the tree.
+ */
+ public PDFTreeModel(XrefEntries xrefEntries)
+ {
+ root = xrefEntries;
+ }
+
+ /**
+ * Adds a listener for the <code>TreeModelEvent</code> posted after the tree changes.
+ *
+ * @param l the listener to add
+ * @see #removeTreeModelListener
*
*/
@Override
@@ -138,6 +147,19 @@ public class PDFTreeModel implements Tre
{
retval = ((DocumentEntry)parent).getPage(index);
}
+ else if (parent instanceof XrefEntries)
+ {
+ retval = ((XrefEntries) parent).getXrefEntry(index);
+ }
+ else if (parent instanceof XrefEntry)
+ {
+ XrefEntry xrefEntry = (XrefEntry) parent;
+ ArrayEntry entry = new ArrayEntry();
+ entry.setIndex(index);
+ entry.setValue(xrefEntry.getObject());
+ entry.setItem(xrefEntry.getCOSObject());
+ retval = entry;
+ }
else if( parent instanceof PageEntry)
{
retval = getChild(((PageEntry)parent).getDict(), index);
@@ -186,6 +208,14 @@ public class PDFTreeModel implements Tre
{
retval = ((DocumentEntry)parent).getPageCount();
}
+ else if (parent instanceof XrefEntries)
+ {
+ retval = ((XrefEntries) parent).getXrefEntryCount();
+ }
+ else if (parent instanceof XrefEntry)
+ {
+ retval = 1;
+ }
else if( parent instanceof PageEntry)
{
retval = getChildCount(((PageEntry) parent).getDict());
@@ -252,6 +282,14 @@ public class PDFTreeModel implements Tre
{
retval = ((DocumentEntry)parent).indexOf( (PageEntry)child );
}
+ else if (parent instanceof XrefEntries)
+ {
+ retval = (((XrefEntry) child).getIndex());
+ }
+ else if (parent instanceof XrefEntry)
+ {
+ retval = 0;
+ }
else if( parent instanceof PageEntry)
{
retval = getIndexOfChild(((PageEntry)parent).getDict(), child);
@@ -298,6 +336,9 @@ public class PDFTreeModel implements Tre
node instanceof COSArray ||
node instanceof COSDocument ||
node instanceof DocumentEntry ||
+ node instanceof XrefEntries
+ || (node instanceof XrefEntry && !isLeaf(((XrefEntry) node).getCOSObject()))
+ ||
node instanceof PageEntry ||
node instanceof COSObject ||
(node instanceof MapEntry && !isLeaf(((MapEntry)node).getValue()) ) ||
Modified: pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/Tree.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/Tree.java?rev=1908711&r1=1908710&r2=1908711&view=diff
==============================================================================
--- pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/Tree.java (original)
+++ pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/Tree.java Sat Mar 25 12:47:30 2023
@@ -107,6 +107,10 @@ public class Tree extends JTree
{
obj = ((ArrayEntry) obj).getValue();
}
+ else if (obj instanceof XrefEntry)
+ {
+ obj = ((XrefEntry) obj).getObject();
+ }
if (!(obj instanceof COSStream))
{
Added: pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/TreeViewMenu.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/TreeViewMenu.java?rev=1908711&view=auto
==============================================================================
--- pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/TreeViewMenu.java (added)
+++ pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/TreeViewMenu.java Sat Mar 25 12:47:30 2023
@@ -0,0 +1,149 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.pdfbox.debugger.ui;
+
+import java.util.Arrays;
+import java.util.List;
+
+import javax.swing.ButtonGroup;
+import javax.swing.JMenu;
+import javax.swing.JRadioButtonMenuItem;
+
+/**
+ * A singleton class that provides tree view menu which can be used to switch the kind of tree view. To act upon the
+ * menu item selection user of the class must add ActionListener which will check for the action command and act
+ * accordingly.
+ */
+public final class TreeViewMenu extends MenuBase
+{
+ public static final String VIEW_PAGES = "Show pages";
+ public static final String VIEW_STRUCTURE = "Internal structure";
+ public static final String VIEW_CROSS_REF_TABLE = "Cross reference table";
+
+ private static final List<String> validTreeModes = Arrays.asList(VIEW_PAGES, VIEW_STRUCTURE,
+ VIEW_CROSS_REF_TABLE);
+
+ private static TreeViewMenu instance;
+ private JRadioButtonMenuItem pagesItem;
+ private JRadioButtonMenuItem structureItem;
+ private JRadioButtonMenuItem crtItem;
+
+ /**
+ * Constructor.
+ */
+ private TreeViewMenu()
+ {
+ setMenu(createTreeViewMenu());
+ }
+
+ /**
+ * Provides the TreeViewMenu instance.
+ *
+ * @return TreeViewMenu instance.
+ */
+ public static TreeViewMenu getInstance()
+ {
+ if (instance == null)
+ {
+ instance = new TreeViewMenu();
+ }
+ return instance;
+ }
+
+ /**
+ * Set the tree view selection.
+ *
+ * @param selection String instance.
+ */
+ public void setTreeViewSelection(String selection)
+ {
+ switch (selection)
+ {
+ case VIEW_PAGES:
+ pagesItem.setSelected(true);
+ break;
+ case VIEW_STRUCTURE:
+ structureItem.setSelected(true);
+ break;
+ case VIEW_CROSS_REF_TABLE:
+ crtItem.setSelected(true);
+ break;
+ default:
+ throw new IllegalArgumentException("Invalid tree view selection: " + selection);
+ }
+ }
+
+ /**
+ * Provide the current tree view selection.
+ *
+ * @return the selection String instance
+ */
+ public String getTreeViewSelection()
+ {
+ if (pagesItem.isSelected())
+ {
+ return VIEW_PAGES;
+ }
+ if (structureItem.isSelected())
+ {
+ return VIEW_STRUCTURE;
+ }
+ if (crtItem.isSelected())
+ {
+ return VIEW_CROSS_REF_TABLE;
+ }
+ return null;
+ }
+
+ /**
+ * Checks if the given viewMode value is a valid one.
+ *
+ * @param viewMode the view mode to be checked
+ * @return true if the given value is a valid view mode, otherwise false
+ */
+ public static boolean isValidViewMode(String viewMode)
+ {
+ return validTreeModes.contains(viewMode);
+ }
+
+ private JMenu createTreeViewMenu()
+ {
+ JMenu menu = new JMenu();
+ menu.setText("Tree view");
+
+ pagesItem = new JRadioButtonMenuItem();
+ structureItem = new JRadioButtonMenuItem();
+ crtItem = new JRadioButtonMenuItem();
+ pagesItem.setSelected(true);
+
+ ButtonGroup bg = new ButtonGroup();
+ bg.add(pagesItem);
+ bg.add(structureItem);
+ bg.add(crtItem);
+
+ pagesItem.setText(VIEW_PAGES);
+ structureItem.setText(VIEW_STRUCTURE);
+ crtItem.setText(VIEW_CROSS_REF_TABLE);
+
+ menu.add(pagesItem);
+ menu.add(structureItem);
+ menu.add(crtItem);
+
+ return menu;
+ }
+}
Propchange: pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/TreeViewMenu.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/ViewMenu.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/ViewMenu.java?rev=1908711&r1=1908710&r2=1908711&view=diff
==============================================================================
--- pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/ViewMenu.java (original)
+++ pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/ViewMenu.java Sat Mar 25 12:47:30 2023
@@ -36,7 +36,6 @@ public class ViewMenu extends MenuBase
private static final String EXTRACT_TEXT = "Extract Text";
private static final String REPAIR_ACROFORM = "Repair AcroForm";
- private JMenuItem viewModeItem;
private JCheckBoxMenuItem showTextStripper;
private JCheckBoxMenuItem showTextStripperBeads;
private JCheckBoxMenuItem showFontBBox;
@@ -174,33 +173,18 @@ public class ViewMenu extends MenuBase
JMenu viewMenu = new JMenu("View");
viewMenu.setMnemonic('V');
- if (pdfDebugger.isPageMode())
+ TreeViewMenu treeViewMenu = TreeViewMenu.getInstance();
+ treeViewMenu.setEnableMenu(false);
+ viewMenu.add(treeViewMenu.getMenu());
+ treeViewMenu.addMenuListeners(actionEvent ->
{
- viewModeItem = new JMenuItem("Show Internal Structure");
- }
- else
- {
- viewModeItem = new JMenuItem("Show Pages");
- }
- viewModeItem.addActionListener(actionEvent ->
- {
- if (pdfDebugger.isPageMode())
- {
- viewModeItem.setText("Show Pages");
- pdfDebugger.setPageMode(false);
- }
- else
- {
- viewModeItem.setText("Show Internal Structure");
- pdfDebugger.setPageMode(true);
- }
+ pdfDebugger.setTreeViewMode(treeViewMenu.getTreeViewSelection());
if (pdfDebugger.hasDocument())
{
pdfDebugger.initTree();
}
});
- viewMenu.add(viewModeItem);
-
+
ZoomMenu zoomMenu = ZoomMenu.getInstance();
zoomMenu.setEnableMenu(false);
viewMenu.add(zoomMenu.getMenu());
Added: pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/XrefEntries.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/XrefEntries.java?rev=1908711&view=auto
==============================================================================
--- pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/XrefEntries.java (added)
+++ pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/XrefEntries.java Sat Mar 25 12:47:30 2023
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.pdfbox.debugger.ui;
+
+import org.apache.pdfbox.pdmodel.PDDocument;
+
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.stream.Collectors;
+
+import org.apache.pdfbox.cos.COSDocument;
+import org.apache.pdfbox.cos.COSObject;
+import org.apache.pdfbox.cos.COSObjectKey;
+
+/**
+ * Represents an abstract view of the cross references of a pdf.
+ *
+ */
+public class XrefEntries
+{
+ public static final String path = "CRT";
+
+ private final List<Entry<COSObjectKey, Long>> xrefEntries;
+ private final COSDocument document;
+
+ public XrefEntries(PDDocument document)
+ {
+ Map<COSObjectKey, Long> xrefTable = document.getDocument().getXrefTable();
+ xrefEntries = xrefTable.entrySet().stream()
+ .sorted(Comparator.comparingLong(e -> e.getKey().getNumber()))
+ .collect(Collectors.toList());
+ this.document = document.getDocument();
+ }
+
+ public int getXrefEntryCount()
+ {
+ return xrefEntries.size();
+ }
+
+ public XrefEntry getXrefEntry(int index)
+ {
+ Entry<COSObjectKey, Long> entry = xrefEntries.get(index);
+ COSObject objectFromPool = document.getObjectFromPool(entry.getKey());
+
+ XrefEntry xrefEntry = new XrefEntry(index, entry.getKey(), entry.getValue(),
+ objectFromPool);
+ return xrefEntry;
+ }
+
+ public int indexOf(XrefEntry xrefEntry)
+ {
+ COSObjectKey key = xrefEntry.getKey();
+ Entry<COSObjectKey, Long> entry = xrefEntries.stream().filter(e -> key.equals(e.getKey()))
+ .findFirst().orElse(null);
+ return entry != null ? xrefEntries.indexOf(entry) : 0;
+ }
+
+ @Override
+ public String toString()
+ {
+ return path;
+ }
+
+}
Propchange: pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/XrefEntries.java
------------------------------------------------------------------------------
svn:eol-style = native
Added: pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/XrefEntry.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/XrefEntry.java?rev=1908711&view=auto
==============================================================================
--- pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/XrefEntry.java (added)
+++ pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/XrefEntry.java Sat Mar 25 12:47:30 2023
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.pdfbox.debugger.ui;
+
+import org.apache.pdfbox.cos.COSBase;
+import org.apache.pdfbox.cos.COSObject;
+import org.apache.pdfbox.cos.COSObjectKey;
+
+/**
+ * Represents an abstract view of the cross references of a pdf.
+ *
+ */
+public class XrefEntry
+{
+ private final int index;
+ private final COSObjectKey key;
+ private final long offset;
+ private final COSObject cosObject;
+
+ public XrefEntry(int index, COSObjectKey key, long offset, COSObject cosObject)
+ {
+ this.index = index;
+ this.key = key;
+ this.offset = offset;
+ this.cosObject = cosObject;
+ }
+
+ public COSObjectKey getKey()
+ {
+ return key;
+ }
+
+ public int getIndex()
+ {
+ return index;
+ }
+
+ public COSObject getCOSObject()
+ {
+ return cosObject;
+ }
+
+ public COSBase getObject()
+ {
+ return cosObject != null ? cosObject.getObject() : null;
+ }
+
+ public String getPath()
+ {
+ return XrefEntries.path + "/" + toString();
+ }
+
+ @Override
+ public String toString()
+ {
+ if (key == null)
+ {
+ return "(null)";
+ }
+ return offset >= 0 ? //
+ "Offset: " + offset + " [" + key.toString() + "]" : //
+ "Compressed object stream: " + (-offset) + " [" + key.toString() + "]";
+ }
+}
Propchange: pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/XrefEntry.java
------------------------------------------------------------------------------
svn:eol-style = native