You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2014/03/17 19:09:50 UTC

svn commit: r1578489 - in /pdfbox/trunk/pdfbox/src: main/java/org/apache/pdfbox/pdmodel/graphics/image/ test/java/org/apache/pdfbox/pdmodel/graphics/image/ test/resources/org/apache/pdfbox/pdmodel/graphics/image/

Author: tilman
Date: Mon Mar 17 18:09:50 2014
New Revision: 1578489

URL: http://svn.apache.org/r1578489
Log:
PDFBOX-1990: Support creating PDF from lossless encoded images; improved the other tests in that package; added test image

Added:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactory.java   (with props)
    pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactoryTest.java
      - copied, changed from r1578235, pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactoryTest.java
    pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/NullOutputStream.java   (with props)
    pdfbox/trunk/pdfbox/src/test/resources/org/apache/pdfbox/pdmodel/graphics/image/png.png   (with props)
Modified:
    pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/CCITTFactoryTest.java
    pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactoryTest.java
    pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/PDInlineImageTest.java

Added: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactory.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactory.java?rev=1578489&view=auto
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactory.java (added)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactory.java Mon Mar 17 18:09:50 2014
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2014 The Apache Software Foundation.
+ *
+ * Licensed 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.pdmodel.graphics.image;
+
+import java.awt.Color;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import org.apache.pdfbox.cos.COSDictionary;
+import org.apache.pdfbox.cos.COSName;
+import org.apache.pdfbox.filter.Filter;
+import org.apache.pdfbox.filter.FilterFactory;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB;
+
+/**
+ * Factory for creating a PDImageXObject containing a lossless compressed image.
+ * 
+ * @author Tilman Hausherr
+ */
+class LosslessFactory
+{
+    /**
+     * Creates a new lossless encoded Image XObject from a Buffered Image.
+     *
+     * @param document the document where the image will be created
+     * @param image the buffered image to embed
+     * @return a new Image XObject
+     * @throws IOException if something goes wrong
+     */
+    static PDImageXObject createLosslessFromImage(PDDocument document, BufferedImage bim)
+            throws IOException
+    {
+        ByteArrayOutputStream bos = new ByteArrayOutputStream();
+
+        //TODO use bit writing, indexed, etc
+        int h = bim.getHeight();
+        int w = bim.getWidth();
+        for (int y = 0; y < h; ++y)
+        {
+            for (int x = 0; x < w; ++x)
+            {
+                Color co = new Color(bim.getRGB(x, y));
+                bos.write(co.getRed());
+                bos.write(co.getGreen());
+                bos.write(co.getBlue());
+            }
+        }
+
+        ByteArrayInputStream bais = new ByteArrayInputStream(bos.toByteArray());
+
+        Filter filter = FilterFactory.INSTANCE.getFilter(COSName.FLATE_DECODE);
+        ByteArrayOutputStream bos2 = new ByteArrayOutputStream();
+        filter.encode(bais, bos2, new COSDictionary(), 0);
+
+        ByteArrayInputStream filteredByteStream = new ByteArrayInputStream(bos2.toByteArray());
+        PDImageXObject pdImage = new PDImageXObject(document, filteredByteStream);
+
+        COSDictionary dict = pdImage.getCOSStream();
+        dict.setItem(COSName.FILTER, COSName.FLATE_DECODE);
+        pdImage.setColorSpace(PDDeviceRGB.INSTANCE);  //TODO from image
+        pdImage.setBitsPerComponent(8); //TODO other sizes
+        pdImage.setHeight(bim.getHeight());
+        pdImage.setWidth(bim.getWidth());
+        return pdImage;
+    }
+
+}

Propchange: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactory.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/CCITTFactoryTest.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/CCITTFactoryTest.java?rev=1578489&r1=1578488&r2=1578489&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/CCITTFactoryTest.java (original)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/CCITTFactoryTest.java Mon Mar 17 18:09:50 2014
@@ -19,9 +19,11 @@ import java.io.File;
 import java.io.IOException;
 
 import junit.framework.TestCase;
+import static junit.framework.TestCase.assertTrue;
 import org.apache.pdfbox.io.RandomAccess;
 import org.apache.pdfbox.io.RandomAccessFile;
 import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.util.ImageIOUtil;
 
 /**
  * Unit tests for CCITTFactory
@@ -53,6 +55,10 @@ public class CCITTFactoryTest extends Te
         assertEquals(344, ximage.getImage().getWidth());
         assertEquals(287, ximage.getImage().getHeight());
 
+        // dummy write the image
+        boolean writeOk = ImageIOUtil.writeImage(ximage.getImage(), "png", new NullOutputStream());
+        assertTrue(writeOk);
+        
         document.close();
     }
 }

Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactoryTest.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactoryTest.java?rev=1578489&r1=1578488&r2=1578489&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactoryTest.java (original)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactoryTest.java Mon Mar 17 18:09:50 2014
@@ -22,6 +22,7 @@ import java.io.InputStream;
 import javax.imageio.ImageIO;
 import junit.framework.TestCase;
 import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.util.ImageIOUtil;
 
 /**
  * Unit tests for JPEGFactory
@@ -100,5 +101,9 @@ public class JPEGFactoryTest extends Tes
         assertNotNull(ximage.getImage());
         assertEquals(344, ximage.getImage().getWidth());
         assertEquals(287, ximage.getImage().getHeight());
+        
+        // dummy write the image
+        boolean writeOk = ImageIOUtil.writeImage(ximage.getImage(), "png", new NullOutputStream());
+        assertTrue(writeOk);
     }
 }

Copied: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactoryTest.java (from r1578235, pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactoryTest.java)
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactoryTest.java?p2=pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactoryTest.java&p1=pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactoryTest.java&r1=1578235&r2=1578489&rev=1578489&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/JPEGFactoryTest.java (original)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/LosslessFactoryTest.java Mon Mar 17 18:09:50 2014
@@ -15,90 +15,45 @@
  */
 package org.apache.pdfbox.pdmodel.graphics.image;
 
-import java.awt.Graphics;
 import java.awt.image.BufferedImage;
 import java.io.IOException;
-import java.io.InputStream;
 import javax.imageio.ImageIO;
 import junit.framework.TestCase;
 import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.util.ImageIOUtil;
 
 /**
  * Unit tests for JPEGFactory
+ *
  * @author Tilman Hausherr
  */
-public class JPEGFactoryTest extends TestCase
+public class LosslessFactoryTest extends TestCase
 {
     /**
-     * Tests JPEGFactory#createFromStream(PDDocument document, InputStream stream)
+     * Tests LosslessFactoryTest#createLosslessFromImage(PDDocument document,
+     * BufferedImage image)
      */
-    public void testCreateFromStream() throws IOException
+    public void testCreateLosslessFromImage() throws IOException
     {
         PDDocument document = new PDDocument();
-        InputStream stream = JPEGFactoryTest.class.getResourceAsStream("jpeg.jpg");
-        PDImageXObject ximage = JPEGFactory.createFromStream(document, stream);
-        validate(ximage);
-        document.close();
-    }
-
-    /**
-     * Tests RGB JPEGFactory#createFromImage(PDDocument document, BufferedImage image)
-     */
-    public void testCreateFromImageRGB() throws IOException
-    {
-        PDDocument document = new PDDocument();
-        BufferedImage image = ImageIO.read(JPEGFactoryTest.class.getResourceAsStream("jpeg.jpg"));
-        PDImageXObject ximage = JPEGFactory.createFromImage(document, image);
-        validate(ximage);
-        document.close();
-    }
-
-    /**
-     * Tests ARGB JPEGFactory#createFromImage(PDDocument document, BufferedImage image)
-     */
-    public void testCreateFromImageARGB() throws IOException
-    {
-        PDDocument document = new PDDocument();
-        BufferedImage image = ImageIO.read(JPEGFactoryTest.class.getResourceAsStream("jpeg.jpg"));
-
-        // create an ARGB image
-        int w = image.getWidth();
-        int h = image.getHeight();
-        BufferedImage argbImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
-        Graphics ag = argbImage.getGraphics();
-        ag.drawImage(image, 0, 0, null);
-        ag.dispose();
-
-        // left half of image with 50% alpha
-        for (int x = 0; x < w / 2; ++x)
-        {
-            for (int y = 0; y < h; ++y)
-            {
-                argbImage.setRGB(x, y, image.getRGB(x, y) & 0x7FFFFFFF);
-            }
-        }
-
-        PDImageXObject ximage = JPEGFactory.createFromImage(document, image);
-        validate(ximage);
-        assertNull(ximage.getSoftMask());
-
-        document.close();
-    }
-
-    private void validate(PDImageXObject ximage) throws IOException
-    {
-        // check the dictionary
+        BufferedImage image = ImageIO.read(JPEGFactoryTest.class.getResourceAsStream("png.png"));
+        PDImageXObject ximage = LosslessFactory.createLosslessFromImage(document, image);
         assertNotNull(ximage);
         assertNotNull(ximage.getCOSStream());
         assertTrue(ximage.getCOSStream().getFilteredLength() > 0);
         assertEquals(8, ximage.getBitsPerComponent());
         assertEquals(344, ximage.getWidth());
         assertEquals(287, ximage.getHeight());
-        assertEquals("jpg", ximage.getSuffix());
+        assertEquals("png", ximage.getSuffix());
 
         // check the image
         assertNotNull(ximage.getImage());
-        assertEquals(344, ximage.getImage().getWidth());
-        assertEquals(287, ximage.getImage().getHeight());
+        assertEquals(ximage.getWidth(), ximage.getImage().getWidth());
+        assertEquals(ximage.getHeight(), ximage.getImage().getHeight());
+
+        boolean writeOk = ImageIOUtil.writeImage(ximage.getImage(), "png", new NullOutputStream());
+        assertTrue(writeOk);
+
+        document.close();
     }
 }

Added: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/NullOutputStream.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/NullOutputStream.java?rev=1578489&view=auto
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/NullOutputStream.java (added)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/NullOutputStream.java Mon Mar 17 18:09:50 2014
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2014 The Apache Software Foundation.
+ *
+ * Licensed 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.pdmodel.graphics.image;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * Dummy output stream, everything written there gets lost.
+ *
+ * @author Tilman Hausherr
+ */
+public class NullOutputStream extends OutputStream
+{
+    @Override
+    public void write(int b) throws IOException
+    {
+    }
+}

Propchange: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/NullOutputStream.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/PDInlineImageTest.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/PDInlineImageTest.java?rev=1578489&r1=1578488&r2=1578489&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/PDInlineImageTest.java (original)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/image/PDInlineImageTest.java Mon Mar 17 18:09:50 2014
@@ -57,5 +57,8 @@ public class PDInlineImageTest extends T
         BufferedImage image = inlineImage.getImage();
         assertEquals(30, image.getWidth());
         assertEquals(28, image.getHeight());
+        
+        boolean writeOk = ImageIOUtil.writeImage(image, "png", new NullOutputStream());
+        assertTrue(writeOk);
     }
 }

Added: pdfbox/trunk/pdfbox/src/test/resources/org/apache/pdfbox/pdmodel/graphics/image/png.png
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/resources/org/apache/pdfbox/pdmodel/graphics/image/png.png?rev=1578489&view=auto
==============================================================================
Binary file - no diff available.

Propchange: pdfbox/trunk/pdfbox/src/test/resources/org/apache/pdfbox/pdmodel/graphics/image/png.png
------------------------------------------------------------------------------
    svn:mime-type = image/png