/**
* Copyright (c) 2004-2006, 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.ExtensionFileFilter;
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 <a href="mailto:ben@benlitchfield.com">Ben Litchfield</a>
* @version $Revision: 1.3 $
*/
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);
ExtensionFileFilter pdfFilter = new ExtensionFileFilter(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
}