KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > pdfbox > PDFDebugger


1 /**
2  * Copyright (c) 2004-2006, www.pdfbox.org
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  *
8  * 1. Redistributions of source code must retain the above copyright notice,
9  * this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright notice,
11  * this list of conditions and the following disclaimer in the documentation
12  * and/or other materials provided with the distribution.
13  * 3. Neither the name of pdfbox; nor the names of its
14  * contributors may be used to endorse or promote products derived from this
15  * software without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20  * DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
24  * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27  *
28  * http://www.pdfbox.org
29  *
30  */

31 package org.pdfbox;
32
33 import org.pdfbox.exceptions.InvalidPasswordException;
34
35 import org.pdfbox.pdfviewer.PDFTreeModel;
36 import org.pdfbox.pdfviewer.PDFTreeCellRenderer;
37 import org.pdfbox.pdfviewer.ArrayEntry;
38 import org.pdfbox.pdfviewer.MapEntry;
39
40 import org.pdfbox.pdmodel.PDDocument;
41
42 import org.pdfbox.util.ExtensionFileFilter;
43
44 import org.pdfbox.cos.COSBoolean;
45 import org.pdfbox.cos.COSFloat;
46 import org.pdfbox.cos.COSInteger;
47 import org.pdfbox.cos.COSName;
48 import org.pdfbox.cos.COSNull;
49 import org.pdfbox.cos.COSStream;
50 import org.pdfbox.cos.COSString;
51
52 //import javax.swing.tree.*;
53
import javax.swing.tree.TreeModel JavaDoc;
54 import javax.swing.tree.TreePath JavaDoc;
55 import javax.swing.JFileChooser JavaDoc;
56 import javax.swing.JScrollPane JavaDoc;
57 import javax.swing.JPanel JavaDoc;
58
59 import java.io.ByteArrayOutputStream JavaDoc;
60 import java.io.File JavaDoc;
61 import java.io.FileInputStream JavaDoc;
62 import java.io.InputStream JavaDoc;
63 import java.io.IOException JavaDoc;
64
65 /**
66  *
67  * @author wurtz
68  * @author <a HREF="mailto:ben@benlitchfield.com">Ben Litchfield</a>
69  * @version $Revision: 1.3 $
70  */

71 public class PDFDebugger extends javax.swing.JFrame JavaDoc
72 {
73     private File JavaDoc currentDir=new File JavaDoc(".");
74
75     /**
76      * Constructor.
77      */

78     public PDFDebugger()
79     {
80         initComponents();
81     }
82
83     /**
84      * This method is called from within the constructor to
85      * initialize the form.
86      * WARNING: Do NOT modify this code. The content of this method is
87      * always regenerated by the Form Editor.
88      */

89     private void initComponents()
90     {
91         jSplitPane1 = new javax.swing.JSplitPane JavaDoc();
92         jScrollPane1 = new javax.swing.JScrollPane JavaDoc();
93         jTree1 = new javax.swing.JTree JavaDoc();
94         jScrollPane2 = new javax.swing.JScrollPane JavaDoc();
95         jTextPane1 = new javax.swing.JTextPane JavaDoc();
96         menuBar = new javax.swing.JMenuBar JavaDoc();
97         fileMenu = new javax.swing.JMenu JavaDoc();
98         openMenuItem = new javax.swing.JMenuItem JavaDoc();
99         saveMenuItem = new javax.swing.JMenuItem JavaDoc();
100         saveAsMenuItem = new javax.swing.JMenuItem JavaDoc();
101         exitMenuItem = new javax.swing.JMenuItem JavaDoc();
102         editMenu = new javax.swing.JMenu JavaDoc();
103         cutMenuItem = new javax.swing.JMenuItem JavaDoc();
104         copyMenuItem = new javax.swing.JMenuItem JavaDoc();
105         pasteMenuItem = new javax.swing.JMenuItem JavaDoc();
106         deleteMenuItem = new javax.swing.JMenuItem JavaDoc();
107         helpMenu = new javax.swing.JMenu JavaDoc();
108         contentsMenuItem = new javax.swing.JMenuItem JavaDoc();
109         aboutMenuItem = new javax.swing.JMenuItem JavaDoc();
110
111         jTree1.setCellRenderer( new PDFTreeCellRenderer() );
112         jTree1.setModel( null );
113
114         setTitle("PDFBox - PDF Viewer");
115         addWindowListener(new java.awt.event.WindowAdapter JavaDoc()
116         {
117             public void windowClosing(java.awt.event.WindowEvent JavaDoc evt)
118             {
119                 exitForm(evt);
120             }
121         });
122
123
124         jScrollPane1.setBorder(new javax.swing.border.BevelBorder JavaDoc(javax.swing.border.BevelBorder.RAISED));
125         jScrollPane1.setPreferredSize(new java.awt.Dimension JavaDoc(300, 500));
126         jTree1.addTreeSelectionListener(new javax.swing.event.TreeSelectionListener JavaDoc()
127         {
128             public void valueChanged(javax.swing.event.TreeSelectionEvent JavaDoc evt)
129             {
130                 jTree1ValueChanged(evt);
131             }
132         });
133
134         jScrollPane1.setViewportView(jTree1);
135
136         jSplitPane1.setRightComponent(jScrollPane2);
137
138         jScrollPane2.setPreferredSize(new java.awt.Dimension JavaDoc(300, 500));
139         jScrollPane2.setViewportView(jTextPane1);
140
141         jSplitPane1.setLeftComponent(jScrollPane1);
142
143         JScrollPane JavaDoc documentScroller = new JScrollPane JavaDoc();
144         //documentScroller.setPreferredSize( new Dimension( 300, 500 ) );
145
documentScroller.setViewportView( documentPanel );
146
147         getContentPane().add( jSplitPane1, java.awt.BorderLayout.CENTER );
148
149         fileMenu.setText("File");
150         openMenuItem.setText("Open");
151         openMenuItem.setToolTipText("Open PDF file");
152         openMenuItem.addActionListener(new java.awt.event.ActionListener JavaDoc()
153         {
154             public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt)
155             {
156                 openMenuItemActionPerformed(evt);
157             }
158         });
159
160         fileMenu.add(openMenuItem);
161
162         saveMenuItem.setText("Save");
163         //fileMenu.add(saveMenuItem);
164

165         saveAsMenuItem.setText("Save As ...");
166         //fileMenu.add(saveAsMenuItem);
167

168         exitMenuItem.setText("Exit");
169         exitMenuItem.addActionListener(new java.awt.event.ActionListener JavaDoc()
170         {
171             public void actionPerformed(java.awt.event.ActionEvent JavaDoc evt)
172             {
173                 exitMenuItemActionPerformed(evt);
174             }
175         });
176
177         fileMenu.add(exitMenuItem);
178
179         menuBar.add(fileMenu);
180
181         editMenu.setText("Edit");
182         cutMenuItem.setText("Cut");
183         editMenu.add(cutMenuItem);
184
185         copyMenuItem.setText("Copy");
186         editMenu.add(copyMenuItem);
187
188         pasteMenuItem.setText("Paste");
189         editMenu.add(pasteMenuItem);
190
191         deleteMenuItem.setText("Delete");
192         editMenu.add(deleteMenuItem);
193
194         //menuBar.add(editMenu);
195

196         helpMenu.setText("Help");
197         contentsMenuItem.setText("Contents");
198         helpMenu.add(contentsMenuItem);
199
200         aboutMenuItem.setText("About");
201         helpMenu.add(aboutMenuItem);
202
203         //menuBar.add(helpMenu);
204

205         setJMenuBar(menuBar);
206
207
208         java.awt.Dimension JavaDoc screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
209         setBounds((screenSize.width-700)/2, (screenSize.height-600)/2, 700, 600);
210     }//GEN-END:initComponents
211

212     private void openMenuItemActionPerformed(java.awt.event.ActionEvent JavaDoc evt)
213     {
214         JFileChooser JavaDoc chooser = new JFileChooser JavaDoc();
215         chooser.setCurrentDirectory(currentDir);
216
217         ExtensionFileFilter pdfFilter = new ExtensionFileFilter(new String JavaDoc[] {"pdf", "PDF"}, "PDF Files");
218         chooser.setFileFilter(pdfFilter);
219         int result = chooser.showOpenDialog(PDFDebugger.this);
220         if (result == JFileChooser.APPROVE_OPTION)
221         {
222             String JavaDoc name = chooser.getSelectedFile().getPath();
223             currentDir = new File JavaDoc(name).getParentFile();
224             try
225             {
226                 readPDFFile(name);
227             }
228             catch (Exception JavaDoc e)
229             {
230                 e.printStackTrace();
231             }
232         }
233     }//GEN-LAST:event_openMenuItemActionPerformed
234

235     private void jTree1ValueChanged(javax.swing.event.TreeSelectionEvent JavaDoc evt)
236     {
237         TreePath JavaDoc path = jTree1.getSelectionPath();
238         if (path != null)
239         {
240             try
241             {
242                 Object JavaDoc selectedNode = path.getLastPathComponent();
243                 String JavaDoc data=convertToString(selectedNode);
244
245
246
247                 if (data != null)
248                 {
249                     jTextPane1.setText(data);
250                 }
251                 else
252                 {
253                     jTextPane1.setText( "" );
254                 }
255             }
256             catch (Exception JavaDoc e)
257             {
258                 e.printStackTrace();
259             }
260         }
261     }//GEN-LAST:event_jTree1ValueChanged
262

263     private String JavaDoc convertToString( Object JavaDoc selectedNode )
264     {
265         String JavaDoc data = null;
266         if(selectedNode instanceof COSBoolean)
267         {
268             data = "" + ((COSBoolean)selectedNode).getValue();
269         }
270         else if( selectedNode instanceof COSFloat )
271         {
272             data = "" + ((COSFloat)selectedNode).floatValue();
273         }
274         else if( selectedNode instanceof COSNull )
275         {
276             data = "null";
277         }
278         else if( selectedNode instanceof COSInteger )
279         {
280             data = "" + ((COSInteger)selectedNode).intValue();
281         }
282         else if( selectedNode instanceof COSName )
283         {
284             data = "" + ((COSName)selectedNode).getName();
285         }
286         else if( selectedNode instanceof COSString )
287         {
288             data = "" + ((COSString)selectedNode).getString();
289         }
290         else if( selectedNode instanceof COSStream )
291         {
292             try
293             {
294                 COSStream stream = (COSStream)selectedNode;
295                 InputStream JavaDoc ioStream = stream.getUnfilteredStream();
296                 ByteArrayOutputStream JavaDoc byteArray = new ByteArrayOutputStream JavaDoc();
297                 byte[] buffer = new byte[1024];
298                 int amountRead = 0;
299                 while( (amountRead = ioStream.read( buffer, 0, buffer.length ) ) != -1 )
300                 {
301                     byteArray.write( buffer, 0, amountRead );
302                 }
303                 data = byteArray.toString();
304             }
305             catch( IOException JavaDoc e )
306             {
307                 e.printStackTrace();
308             }
309         }
310         else if( selectedNode instanceof MapEntry )
311         {
312             data = convertToString( ((MapEntry)selectedNode).getValue() );
313         }
314         else if( selectedNode instanceof ArrayEntry )
315         {
316             data = convertToString( ((ArrayEntry)selectedNode).getValue() );
317         }
318         return data;
319     }
320
321     private void exitMenuItemActionPerformed(java.awt.event.ActionEvent JavaDoc evt)
322     {
323         System.exit(0);
324     }
325
326     /**
327      * Exit the Application.
328      */

329     private void exitForm(java.awt.event.WindowEvent JavaDoc evt)
330     {
331         System.exit(0);
332     }
333
334     /**
335      * @param args the command line arguments
336      *
337      * @throws Exception If anything goes wrong.
338      */

339     public static void main(String JavaDoc[] args) throws Exception JavaDoc
340     {
341         PDFDebugger viewer = new PDFDebugger();
342         if( args.length >0 )
343         {
344             viewer.readPDFFile( args[0] );
345         }
346         viewer.show();
347     }
348
349     private void readPDFFile(String JavaDoc file) throws Exception JavaDoc
350     {
351         InputStream JavaDoc input = null;
352         File JavaDoc f = new File JavaDoc( file );
353         input = new FileInputStream JavaDoc(f);
354         PDDocument document = parseDocument( input );
355         TreeModel model=new PDFTreeModel(document);
356         jTree1.setModel(model);
357         setTitle( "PDFBox - " + f.getAbsolutePath() );
358         /*
359         List pages = document.getDocumentCatalog().getAllPages();
360         for( int i=0; i<pages.size(); i++ )
361         {
362             PageWrapper wrapper = new PageWrapper();
363             wrapper.displayPage( (PDPage)pages.get(i) );
364             documentPanel.add( wrapper.getPanel() );
365         }*/

366     }
367         /**
368      * This will parse a document.
369      *
370      * @param input The input stream for the document.
371      *
372      * @return The document.
373      *
374      * @throws IOException If there is an error parsing the document.
375      */

376     private static PDDocument parseDocument( InputStream JavaDoc input )throws IOException JavaDoc
377     {
378         PDDocument document = PDDocument.load( input );
379         if( document.isEncrypted() )
380         {
381             try
382             {
383                 document.decrypt( "" );
384             }
385             catch( InvalidPasswordException e )
386             {
387                 System.err.println( "Error: The document is encrypted." );
388             }
389             catch( org.pdfbox.exceptions.CryptographyException e )
390             {
391                 e.printStackTrace();
392             }
393         }
394
395         return document;
396     }
397     // Variables declaration - do not modify//GEN-BEGIN:variables
398
private javax.swing.JMenuItem JavaDoc aboutMenuItem;
399     private javax.swing.JMenuItem JavaDoc contentsMenuItem;
400     private javax.swing.JMenuItem JavaDoc copyMenuItem;
401     private javax.swing.JMenuItem JavaDoc cutMenuItem;
402     private javax.swing.JMenuItem JavaDoc deleteMenuItem;
403     private javax.swing.JMenu JavaDoc editMenu;
404     private javax.swing.JMenuItem JavaDoc exitMenuItem;
405     private javax.swing.JMenu JavaDoc fileMenu;
406     private javax.swing.JMenu JavaDoc helpMenu;
407     private javax.swing.JScrollPane JavaDoc jScrollPane1;
408     private javax.swing.JScrollPane JavaDoc jScrollPane2;
409     private javax.swing.JSplitPane JavaDoc jSplitPane1;
410     private javax.swing.JTextPane JavaDoc jTextPane1;
411     private javax.swing.JTree JavaDoc jTree1;
412     private javax.swing.JMenuBar JavaDoc menuBar;
413     private javax.swing.JMenuItem JavaDoc openMenuItem;
414     private javax.swing.JMenuItem JavaDoc pasteMenuItem;
415     private javax.swing.JMenuItem JavaDoc saveAsMenuItem;
416     private javax.swing.JMenuItem JavaDoc saveMenuItem;
417     private JPanel JavaDoc documentPanel = new JPanel JavaDoc();
418     // End of variables declaration//GEN-END:variables
419

420 }
Popular Tags