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