aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/pdfbox/PDFDebugger.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/pdfbox/PDFDebugger.java')
-rw-r--r--src/main/java/org/pdfbox/PDFDebugger.java420
1 files changed, 420 insertions, 0 deletions
diff --git a/src/main/java/org/pdfbox/PDFDebugger.java b/src/main/java/org/pdfbox/PDFDebugger.java
new file mode 100644
index 0000000..0ccf2fe
--- /dev/null
+++ b/src/main/java/org/pdfbox/PDFDebugger.java
@@ -0,0 +1,420 @@
+/**
+ * Copyright (c) 2004-2005, www.pdfbox.org
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ * 3. Neither the name of pdfbox; nor the names of its
+ * contributors may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * http://www.pdfbox.org
+ *
+ */
+package org.pdfbox;
+
+import org.pdfbox.exceptions.InvalidPasswordException;
+
+import org.pdfbox.pdfviewer.PDFTreeModel;
+import org.pdfbox.pdfviewer.PDFTreeCellRenderer;
+import org.pdfbox.pdfviewer.ArrayEntry;
+import org.pdfbox.pdfviewer.MapEntry;
+
+import org.pdfbox.pdmodel.PDDocument;
+
+import org.pdfbox.util.DefaultFileFilter;
+
+import org.pdfbox.cos.COSBoolean;
+import org.pdfbox.cos.COSFloat;
+import org.pdfbox.cos.COSInteger;
+import org.pdfbox.cos.COSName;
+import org.pdfbox.cos.COSNull;
+import org.pdfbox.cos.COSStream;
+import org.pdfbox.cos.COSString;
+
+//import javax.swing.tree.*;
+import javax.swing.tree.TreeModel;
+import javax.swing.tree.TreePath;
+import javax.swing.JFileChooser;
+import javax.swing.JScrollPane;
+import javax.swing.JPanel;
+
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStream;
+import java.io.IOException;
+
+/**
+ *
+ * @author wurtz
+ * @author Ben Litchfield (ben@csh.rit.edu)
+ * @version $Revision: 1.1 $
+ */
+public class PDFDebugger extends javax.swing.JFrame
+{
+ private File currentDir=new File(".");
+
+ /**
+ * Constructor.
+ */
+ public PDFDebugger()
+ {
+ initComponents();
+ }
+
+ /**
+ * This method is called from within the constructor to
+ * initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is
+ * always regenerated by the Form Editor.
+ */
+ private void initComponents()
+ {
+ jSplitPane1 = new javax.swing.JSplitPane();
+ jScrollPane1 = new javax.swing.JScrollPane();
+ jTree1 = new javax.swing.JTree();
+ jScrollPane2 = new javax.swing.JScrollPane();
+ jTextPane1 = new javax.swing.JTextPane();
+ menuBar = new javax.swing.JMenuBar();
+ fileMenu = new javax.swing.JMenu();
+ openMenuItem = new javax.swing.JMenuItem();
+ saveMenuItem = new javax.swing.JMenuItem();
+ saveAsMenuItem = new javax.swing.JMenuItem();
+ exitMenuItem = new javax.swing.JMenuItem();
+ editMenu = new javax.swing.JMenu();
+ cutMenuItem = new javax.swing.JMenuItem();
+ copyMenuItem = new javax.swing.JMenuItem();
+ pasteMenuItem = new javax.swing.JMenuItem();
+ deleteMenuItem = new javax.swing.JMenuItem();
+ helpMenu = new javax.swing.JMenu();
+ contentsMenuItem = new javax.swing.JMenuItem();
+ aboutMenuItem = new javax.swing.JMenuItem();
+
+ jTree1.setCellRenderer( new PDFTreeCellRenderer() );
+ jTree1.setModel( null );
+
+ setTitle("PDFBox - PDF Viewer");
+ addWindowListener(new java.awt.event.WindowAdapter()
+ {
+ public void windowClosing(java.awt.event.WindowEvent evt)
+ {
+ exitForm(evt);
+ }
+ });
+
+
+ jScrollPane1.setBorder(new javax.swing.border.BevelBorder(javax.swing.border.BevelBorder.RAISED));
+ jScrollPane1.setPreferredSize(new java.awt.Dimension(300, 500));
+ jTree1.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener()
+ {
+ public void valueChanged(javax.swing.event.TreeSelectionEvent evt)
+ {
+ jTree1ValueChanged(evt);
+ }
+ });
+
+ jScrollPane1.setViewportView(jTree1);
+
+ jSplitPane1.setRightComponent(jScrollPane2);
+
+ jScrollPane2.setPreferredSize(new java.awt.Dimension(300, 500));
+ jScrollPane2.setViewportView(jTextPane1);
+
+ jSplitPane1.setLeftComponent(jScrollPane1);
+
+ JScrollPane documentScroller = new JScrollPane();
+ //documentScroller.setPreferredSize( new Dimension( 300, 500 ) );
+ documentScroller.setViewportView( documentPanel );
+
+ getContentPane().add( jSplitPane1, java.awt.BorderLayout.CENTER );
+
+ fileMenu.setText("File");
+ openMenuItem.setText("Open");
+ openMenuItem.setToolTipText("Open PDF file");
+ openMenuItem.addActionListener(new java.awt.event.ActionListener()
+ {
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ openMenuItemActionPerformed(evt);
+ }
+ });
+
+ fileMenu.add(openMenuItem);
+
+ saveMenuItem.setText("Save");
+ //fileMenu.add(saveMenuItem);
+
+ saveAsMenuItem.setText("Save As ...");
+ //fileMenu.add(saveAsMenuItem);
+
+ exitMenuItem.setText("Exit");
+ exitMenuItem.addActionListener(new java.awt.event.ActionListener()
+ {
+ public void actionPerformed(java.awt.event.ActionEvent evt)
+ {
+ exitMenuItemActionPerformed(evt);
+ }
+ });
+
+ fileMenu.add(exitMenuItem);
+
+ menuBar.add(fileMenu);
+
+ editMenu.setText("Edit");
+ cutMenuItem.setText("Cut");
+ editMenu.add(cutMenuItem);
+
+ copyMenuItem.setText("Copy");
+ editMenu.add(copyMenuItem);
+
+ pasteMenuItem.setText("Paste");
+ editMenu.add(pasteMenuItem);
+
+ deleteMenuItem.setText("Delete");
+ editMenu.add(deleteMenuItem);
+
+ //menuBar.add(editMenu);
+
+ helpMenu.setText("Help");
+ contentsMenuItem.setText("Contents");
+ helpMenu.add(contentsMenuItem);
+
+ aboutMenuItem.setText("About");
+ helpMenu.add(aboutMenuItem);
+
+ //menuBar.add(helpMenu);
+
+ setJMenuBar(menuBar);
+
+
+ java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
+ setBounds((screenSize.width-700)/2, (screenSize.height-600)/2, 700, 600);
+ }//GEN-END:initComponents
+
+ private void openMenuItemActionPerformed(java.awt.event.ActionEvent evt)
+ {
+ JFileChooser chooser = new JFileChooser();
+ chooser.setCurrentDirectory(currentDir);
+
+ DefaultFileFilter pdfFilter = new DefaultFileFilter(new String[] {"pdf", "PDF"}, "PDF Files");
+ chooser.setFileFilter(pdfFilter);
+ int result = chooser.showOpenDialog(PDFDebugger.this);
+ if (result == JFileChooser.APPROVE_OPTION)
+ {
+ String name = chooser.getSelectedFile().getPath();
+ currentDir = new File(name).getParentFile();
+ try
+ {
+ readPDFFile(name);
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+ }//GEN-LAST:event_openMenuItemActionPerformed
+
+ private void jTree1ValueChanged(javax.swing.event.TreeSelectionEvent evt)
+ {
+ TreePath path = jTree1.getSelectionPath();
+ if (path != null)
+ {
+ try
+ {
+ Object selectedNode = path.getLastPathComponent();
+ String data=convertToString(selectedNode);
+
+
+
+ if (data != null)
+ {
+ jTextPane1.setText(data);
+ }
+ else
+ {
+ jTextPane1.setText( "" );
+ }
+ }
+ catch (Exception e)
+ {
+ e.printStackTrace();
+ }
+ }
+ }//GEN-LAST:event_jTree1ValueChanged
+
+ private String convertToString( Object selectedNode )
+ {
+ String data = null;
+ if(selectedNode instanceof COSBoolean)
+ {
+ data = "" + ((COSBoolean)selectedNode).getValue();
+ }
+ else if( selectedNode instanceof COSFloat )
+ {
+ data = "" + ((COSFloat)selectedNode).floatValue();
+ }
+ else if( selectedNode instanceof COSNull )
+ {
+ data = "null";
+ }
+ else if( selectedNode instanceof COSInteger )
+ {
+ data = "" + ((COSInteger)selectedNode).intValue();
+ }
+ else if( selectedNode instanceof COSName )
+ {
+ data = "" + ((COSName)selectedNode).getName();
+ }
+ else if( selectedNode instanceof COSString )
+ {
+ data = "" + ((COSString)selectedNode).getString();
+ }
+ else if( selectedNode instanceof COSStream )
+ {
+ try
+ {
+ COSStream stream = (COSStream)selectedNode;
+ InputStream ioStream = stream.getUnfilteredStream();
+ ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
+ byte[] buffer = new byte[1024];
+ int amountRead = 0;
+ while( (amountRead = ioStream.read( buffer, 0, buffer.length ) ) != -1 )
+ {
+ byteArray.write( buffer, 0, amountRead );
+ }
+ data = byteArray.toString();
+ }
+ catch( IOException e )
+ {
+ e.printStackTrace();
+ }
+ }
+ else if( selectedNode instanceof MapEntry )
+ {
+ data = convertToString( ((MapEntry)selectedNode).getValue() );
+ }
+ else if( selectedNode instanceof ArrayEntry )
+ {
+ data = convertToString( ((ArrayEntry)selectedNode).getValue() );
+ }
+ return data;
+ }
+
+ private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt)
+ {
+ System.exit(0);
+ }
+
+ /**
+ * Exit the Application.
+ */
+ private void exitForm(java.awt.event.WindowEvent evt)
+ {
+ System.exit(0);
+ }
+
+ /**
+ * @param args the command line arguments
+ *
+ * @throws Exception If anything goes wrong.
+ */
+ public static void main(String[] args) throws Exception
+ {
+ PDFDebugger viewer = new PDFDebugger();
+ if( args.length >0 )
+ {
+ viewer.readPDFFile( args[0] );
+ }
+ viewer.show();
+ }
+
+ private void readPDFFile(String file) throws Exception
+ {
+ InputStream input = null;
+ File f = new File( file );
+ input = new FileInputStream(f);
+ PDDocument document = parseDocument( input );
+ TreeModel model=new PDFTreeModel(document);
+ jTree1.setModel(model);
+ setTitle( "PDFBox - " + f.getAbsolutePath() );
+ /*
+ List pages = document.getDocumentCatalog().getAllPages();
+ for( int i=0; i<pages.size(); i++ )
+ {
+ PageWrapper wrapper = new PageWrapper();
+ wrapper.displayPage( (PDPage)pages.get(i) );
+ documentPanel.add( wrapper.getPanel() );
+ }*/
+ }
+ /**
+ * This will parse a document.
+ *
+ * @param input The input stream for the document.
+ *
+ * @return The document.
+ *
+ * @throws IOException If there is an error parsing the document.
+ */
+ private static PDDocument parseDocument( InputStream input )throws IOException
+ {
+ PDDocument document = PDDocument.load( input );
+ if( document.isEncrypted() )
+ {
+ try
+ {
+ document.decrypt( "" );
+ }
+ catch( InvalidPasswordException e )
+ {
+ System.err.println( "Error: The document is encrypted." );
+ }
+ catch( org.pdfbox.exceptions.CryptographyException e )
+ {
+ e.printStackTrace();
+ }
+ }
+
+ return document;
+ }
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JMenuItem aboutMenuItem;
+ private javax.swing.JMenuItem contentsMenuItem;
+ private javax.swing.JMenuItem copyMenuItem;
+ private javax.swing.JMenuItem cutMenuItem;
+ private javax.swing.JMenuItem deleteMenuItem;
+ private javax.swing.JMenu editMenu;
+ private javax.swing.JMenuItem exitMenuItem;
+ private javax.swing.JMenu fileMenu;
+ private javax.swing.JMenu helpMenu;
+ private javax.swing.JScrollPane jScrollPane1;
+ private javax.swing.JScrollPane jScrollPane2;
+ private javax.swing.JSplitPane jSplitPane1;
+ private javax.swing.JTextPane jTextPane1;
+ private javax.swing.JTree jTree1;
+ private javax.swing.JMenuBar menuBar;
+ private javax.swing.JMenuItem openMenuItem;
+ private javax.swing.JMenuItem pasteMenuItem;
+ private javax.swing.JMenuItem saveAsMenuItem;
+ private javax.swing.JMenuItem saveMenuItem;
+ private JPanel documentPanel = new JPanel();
+ // End of variables declaration//GEN-END:variables
+
+} \ No newline at end of file