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 2011/11/06 14:39:52 UTC

svn commit: r1198363 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox: PDFReader.java util/ImageIOUtil.java util/PDFImageWriter.java

Author: lehmi
Date: Sun Nov  6 13:39:52 2011
New Revision: 1198363

URL: http://svn.apache.org/viewvc?rev=1198363&view=rev
Log:
PDFBOX-1160: added "Save as image" to PDFReader

Added:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/ImageIOUtil.java
Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/PDFReader.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/PDFImageWriter.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/PDFReader.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/PDFReader.java?rev=1198363&r1=1198362&r2=1198363&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/PDFReader.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/PDFReader.java Sun Nov  6 13:39:52 2011
@@ -22,12 +22,14 @@ import org.apache.pdfbox.pdfviewer.Reade
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
 import org.apache.pdfbox.util.ExtensionFileFilter;
+import org.apache.pdfbox.util.ImageIOUtil;
 
 import javax.swing.JFileChooser;
 import javax.swing.JScrollPane;
 import javax.swing.JPanel;
 import javax.swing.KeyStroke;
 
+import java.awt.image.BufferedImage;
 import java.awt.print.PrinterException;
 import java.io.File;
 import java.io.FileInputStream;
@@ -45,11 +47,9 @@ import java.util.List;
 public class PDFReader extends javax.swing.JFrame
 {
     private File currentDir=new File(".");
-    private javax.swing.JMenuItem aboutMenuItem;
-    private javax.swing.JMenuItem contentsMenuItem;
+    private javax.swing.JMenuItem saveAsImageMenuItem;
     private javax.swing.JMenuItem exitMenuItem;
     private javax.swing.JMenu fileMenu;
-    private javax.swing.JMenu helpMenu;
     private javax.swing.JMenuBar menuBar;
     private javax.swing.JMenuItem openMenuItem;
     private javax.swing.JMenuItem printMenuItem;
@@ -85,10 +85,8 @@ public class PDFReader extends javax.swi
         menuBar = new javax.swing.JMenuBar();
         fileMenu = new javax.swing.JMenu();
         openMenuItem = new javax.swing.JMenuItem();
+        saveAsImageMenuItem = new javax.swing.JMenuItem();
         exitMenuItem = new javax.swing.JMenuItem();
-        helpMenu = new javax.swing.JMenu();
-        contentsMenuItem = new javax.swing.JMenuItem();
-        aboutMenuItem = new javax.swing.JMenuItem();
         printMenuItem = new javax.swing.JMenuItem();
         viewMenu = new javax.swing.JMenu();
         nextPageItem = new javax.swing.JMenuItem();
@@ -145,6 +143,19 @@ public class PDFReader extends javax.swi
         });
         fileMenu.add( printMenuItem );
 
+        saveAsImageMenuItem.setText( "Save as image" );
+        saveAsImageMenuItem.addActionListener(new java.awt.event.ActionListener()
+        {
+            public void actionPerformed(java.awt.event.ActionEvent evt)
+            {
+                if (document != null) 
+                {
+                    saveImage();
+                }
+            }
+        });
+        fileMenu.add( saveAsImageMenuItem );
+
         exitMenuItem.setText("Exit");
         exitMenuItem.addActionListener(new java.awt.event.ActionListener()
         {
@@ -158,15 +169,6 @@ public class PDFReader extends javax.swi
 
         menuBar.add(fileMenu);
 
-        helpMenu.setText("Help");
-        contentsMenuItem.setText("Contents");
-        helpMenu.add(contentsMenuItem);
-
-        aboutMenuItem.setText("About");
-        helpMenu.add(aboutMenuItem);
-
-        //menuBar.add(helpMenu);
-
         viewMenu.setText("View");
         nextPageItem.setText("Next page");
         nextPageItem.setAccelerator(KeyStroke.getKeyStroke('+'));
@@ -200,7 +202,8 @@ public class PDFReader extends javax.swi
     }
 
 
-    private void updateTitle() {
+    private void updateTitle() 
+    {
         setTitle( "PDFBox - " + currentFilename + " ("+(currentPage+1)+"/"+numberOfPages+")");
     }
     
@@ -316,6 +319,26 @@ public class PDFReader extends javax.swi
             exception.printStackTrace();
         }
     }
+
+    private void saveImage()
+    {
+        try 
+        {
+            PDPage pageToSave = (PDPage)pages.get(currentPage);
+            BufferedImage pageAsImage = pageToSave.convertToImage();
+            String imageFilename = currentFilename;
+            if (imageFilename.toLowerCase().endsWith(".pdf"))
+            {
+                imageFilename = imageFilename.substring(0, imageFilename.length()-4);
+            }
+            imageFilename += "_" + (currentPage + 1); 
+            ImageIOUtil.writeImage(pageAsImage, "png", imageFilename,  BufferedImage.TYPE_USHORT_565_RGB, 300);
+        }
+        catch (IOException exception)
+        {
+            exception.printStackTrace();
+        }
+    }
     /**
      * This will parse a document.
      *

Added: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/ImageIOUtil.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/ImageIOUtil.java?rev=1198363&view=auto
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/ImageIOUtil.java (added)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/ImageIOUtil.java Sun Nov  6 13:39:52 2011
@@ -0,0 +1,190 @@
+/*
+ * 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.util;
+
+import java.awt.image.BufferedImage;
+import java.awt.image.RenderedImage;
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+
+import javax.imageio.IIOException;
+import javax.imageio.IIOImage;
+import javax.imageio.ImageIO;
+import javax.imageio.ImageTypeSpecifier;
+import javax.imageio.ImageWriteParam;
+import javax.imageio.ImageWriter;
+import javax.imageio.metadata.IIOInvalidTreeException;
+import javax.imageio.metadata.IIOMetadata;
+import javax.imageio.metadata.IIOMetadataNode;
+import javax.imageio.stream.ImageOutputStream;
+
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+
+/**
+ * This class handles some ImageIO operations.
+ *
+ * @version $Revision$
+ * 
+ */
+public class ImageIOUtil
+{   
+    private ImageIOUtil()
+    {
+        // Default constructor
+    }
+
+    /**
+     * Converts a given page range of a PDF document to bitmap images.
+     * @param image the image to be written
+     * @param imageFormat the target format (ex. "png")
+     * @param filename used to construct the filename for the individual images
+     * @param imageType the image type (see {@link BufferedImage}.TYPE_*)
+     * @param resolution the resolution in dpi (dots per inch)
+     * @return true if the images were produced, false if there was an error
+     * @throws IOException if an I/O error occurs
+     */
+    public static boolean writeImage(BufferedImage image, String imageFormat, String filename, 
+            int imageType, int resolution)
+    throws IOException
+    {
+        boolean bSuccess = true;
+        ImageOutputStream output = null;
+        ImageWriter imageWriter = null;
+        try
+        {
+            String fileName = filename + "." + imageFormat;
+            output = ImageIO.createImageOutputStream( new File( fileName ) );
+    
+            boolean foundWriter = false;
+            Iterator<ImageWriter> writerIter = ImageIO.getImageWritersByFormatName( imageFormat );
+            while( writerIter.hasNext() && !foundWriter )
+            {
+                try
+                {
+                    imageWriter = (ImageWriter)writerIter.next();
+                    ImageWriteParam writerParams = imageWriter.getDefaultWriteParam();
+                    if( writerParams.canWriteCompressed() )
+                    {
+                        writerParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
+                        writerParams.setCompressionQuality(1.0f);
+                    }
+                    IIOMetadata meta = createMetadata( image, imageWriter, writerParams, resolution);
+                    imageWriter.setOutput( output );
+                    imageWriter.write( null, new IIOImage( image, null, meta ), writerParams );
+                    foundWriter = true;
+                }
+                catch( IIOException io )
+                {
+                    throw new IOException( io.getMessage() );
+                }
+                finally
+                {
+                    if( imageWriter != null )
+                    {
+                        imageWriter.dispose();
+                    }
+                }
+            }
+            if( !foundWriter )
+            {
+                bSuccess = false;
+            }
+        }
+        finally
+        {
+            if( output != null )
+            {
+                output.flush();
+                output.close();
+            }
+        }
+        return bSuccess;
+    }
+
+    private static IIOMetadata createMetadata(RenderedImage image, ImageWriter imageWriter,
+            ImageWriteParam writerParams, int resolution)
+    {
+        ImageTypeSpecifier type;
+        if (writerParams.getDestinationType() != null)
+        {
+            type = writerParams.getDestinationType();
+        }
+        else
+        {
+            type = ImageTypeSpecifier.createFromRenderedImage( image );
+        }
+        IIOMetadata meta = imageWriter.getDefaultImageMetadata( type, writerParams );
+        return (addResolution(meta, resolution) ? meta : null);
+    }
+
+    private static final String STANDARD_METADATA_FORMAT = "javax_imageio_1.0";
+
+    private static boolean addResolution(IIOMetadata meta, int resolution)
+    {
+        if (meta.isStandardMetadataFormatSupported())
+        {
+            IIOMetadataNode root = (IIOMetadataNode)meta.getAsTree(STANDARD_METADATA_FORMAT);
+            IIOMetadataNode dim = getChildNode(root, "Dimension");
+            IIOMetadataNode child;
+            child = getChildNode(dim, "HorizontalPixelSize");
+            if (child == null)
+            {
+                child = new IIOMetadataNode("HorizontalPixelSize");
+                dim.appendChild(child);
+            }
+            child.setAttribute("value",
+                    Double.toString(resolution / 25.4));
+            child = getChildNode(dim, "VerticalPixelSize");
+            if (child == null)
+            {
+                child = new IIOMetadataNode("VerticalPixelSize");
+                dim.appendChild(child);
+            }
+            child.setAttribute("value",
+                    Double.toString(resolution / 25.4));
+            try
+            {
+                meta.mergeTree(STANDARD_METADATA_FORMAT, root);
+            }
+            catch (IIOInvalidTreeException e)
+            {
+                throw new RuntimeException("Cannot update image metadata: "
+                        + e.getMessage());
+            }
+            return true;
+        }
+        return false;
+    }
+
+    private static IIOMetadataNode getChildNode(Node n, String name)
+    {
+        NodeList nodes = n.getChildNodes();
+        for (int i = 0; i < nodes.getLength(); i++)
+        {
+            Node child = nodes.item(i);
+            if (name.equals(child.getNodeName()))
+            {
+                return (IIOMetadataNode)child;
+            }
+        }
+        return null;
+    }
+    
+}

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/PDFImageWriter.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/PDFImageWriter.java?rev=1198363&r1=1198362&r2=1198363&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/PDFImageWriter.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/PDFImageWriter.java Sun Nov  6 13:39:52 2011
@@ -19,29 +19,13 @@ package org.apache.pdfbox.util;
 import java.awt.HeadlessException;
 import java.awt.Toolkit;
 import java.awt.image.BufferedImage;
-import java.awt.image.RenderedImage;
-import java.io.File;
 import java.io.IOException;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Properties;
 
-import javax.imageio.IIOException;
-import javax.imageio.IIOImage;
-import javax.imageio.ImageIO;
-import javax.imageio.ImageTypeSpecifier;
-import javax.imageio.ImageWriteParam;
-import javax.imageio.ImageWriter;
-import javax.imageio.metadata.IIOInvalidTreeException;
-import javax.imageio.metadata.IIOMetadata;
-import javax.imageio.metadata.IIOMetadataNode;
-import javax.imageio.stream.ImageOutputStream;
-
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
 
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
 
 /**
  * This class will take a PDF document and strip out all of the text and ignore the
@@ -127,130 +111,13 @@ public class PDFImageWriter extends PDFS
         List pages = document.getDocumentCatalog().getAllPages();
         for( int i = startPage - 1; i < endPage && i < pages.size(); i++ )
         {
-            ImageOutputStream output = null;
-            ImageWriter imageWriter = null;
-            try
-            {
-                PDPage page = (PDPage)pages.get( i );
-                BufferedImage image = page.convertToImage(imageType, resolution);
-                String fileName = outputPrefix + (i + 1) + "." + imageFormat;
-                System.out.println( "Writing: " + fileName );
-                output = ImageIO.createImageOutputStream( new File( fileName ) );
-
-                boolean foundWriter = false;
-                Iterator writerIter = ImageIO.getImageWritersByFormatName( imageFormat );
-                while( writerIter.hasNext() && !foundWriter )
-                {
-                    try
-                    {
-                        imageWriter = (ImageWriter)writerIter.next();
-                        ImageWriteParam writerParams = imageWriter.getDefaultWriteParam();
-                        if( writerParams.canWriteCompressed() )
-                        {
-                            writerParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
-                            writerParams.setCompressionQuality(1.0f);
-                        }
-                        IIOMetadata meta = createMetadata( image, imageWriter, writerParams, resolution);
-                        imageWriter.setOutput( output );
-                        imageWriter.write( null, new IIOImage( image, null, meta ), writerParams );
-                        foundWriter = true;
-                    }
-                    catch( IIOException io )
-                    {
-                        throw new IOException( io.getMessage() );
-                    }
-                    finally
-                    {
-                        if( imageWriter != null )
-                        {
-                            imageWriter.dispose();
-                        }
-                    }
-                }
-                if( !foundWriter )
-                {
-                    bSuccess = false;
-                }
-            }
-            finally
-            {
-                if( output != null )
-                {
-                    output.flush();
-                    output.close();
-                }
-            }
+            PDPage page = (PDPage)pages.get( i );
+            BufferedImage image = page.convertToImage(imageType, resolution);
+            String fileName = outputPrefix + (i + 1);
+            System.out.println( "Writing: " + fileName + "." +imageFormat);
+            bSuccess &= ImageIOUtil.writeImage(image, imageFormat, fileName, imageType, resolution);
         }
         return bSuccess;
     }
 
-    private IIOMetadata createMetadata(RenderedImage image, ImageWriter imageWriter,
-            ImageWriteParam writerParams, int resolution)
-    {
-        ImageTypeSpecifier type;
-        if (writerParams.getDestinationType() != null)
-        {
-            type = writerParams.getDestinationType();
-        }
-        else
-        {
-            type = ImageTypeSpecifier.createFromRenderedImage( image );
-        }
-        IIOMetadata meta = imageWriter.getDefaultImageMetadata( type, writerParams );
-        return (addResolution(meta, resolution) ? meta : null);
-    }
-
-    private static final String STANDARD_METADATA_FORMAT = "javax_imageio_1.0";
-
-    private boolean addResolution(IIOMetadata meta, int resolution)
-    {
-        if (meta.isStandardMetadataFormatSupported())
-        {
-            IIOMetadataNode root = (IIOMetadataNode)meta.getAsTree(STANDARD_METADATA_FORMAT);
-            IIOMetadataNode dim = getChildNode(root, "Dimension");
-            IIOMetadataNode child;
-            child = getChildNode(dim, "HorizontalPixelSize");
-            if (child == null)
-            {
-                child = new IIOMetadataNode("HorizontalPixelSize");
-                dim.appendChild(child);
-            }
-            child.setAttribute("value",
-                    Double.toString(resolution / 25.4));
-            child = getChildNode(dim, "VerticalPixelSize");
-            if (child == null)
-            {
-                child = new IIOMetadataNode("VerticalPixelSize");
-                dim.appendChild(child);
-            }
-            child.setAttribute("value",
-                    Double.toString(resolution / 25.4));
-            try
-            {
-                meta.mergeTree(STANDARD_METADATA_FORMAT, root);
-            }
-            catch (IIOInvalidTreeException e)
-            {
-                throw new RuntimeException("Cannot update image metadata: "
-                        + e.getMessage());
-            }
-            return true;
-        }
-        return false;
-    }
-
-    private static IIOMetadataNode getChildNode(Node n, String name)
-    {
-        NodeList nodes = n.getChildNodes();
-        for (int i = 0; i < nodes.getLength(); i++)
-        {
-            Node child = nodes.item(i);
-            if (name.equals(child.getNodeName()))
-            {
-                return (IIOMetadataNode)child;
-            }
-        }
-        return null;
-    }
-
 }