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/05/08 20:35:54 UTC

svn commit: r1593370 - in /pdfbox/branches/1.8/pdfbox/src: main/java/org/apache/pdfbox/pdmodel/graphics/xobject/ test/java/org/apache/pdfbox/ test/java/org/apache/pdfbox/pdmodel/graphics/xobject/ test/resources/org/apache/pdfbox/pdmodel/graphics/xobject/

Author: tilman
Date: Thu May  8 18:35:53 2014
New Revision: 1593370

URL: http://svn.apache.org/r1593370
Log:
PDFBOX-2067: Added tests for PDJpeg

Added:
    pdfbox/branches/1.8/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpegTest.java   (with props)
Modified:
    pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.java
    pdfbox/branches/1.8/pdfbox/src/test/java/org/apache/pdfbox/TestAll.java
    pdfbox/branches/1.8/pdfbox/src/test/resources/org/apache/pdfbox/pdmodel/graphics/xobject/jpeg.jpg
    pdfbox/branches/1.8/pdfbox/src/test/resources/org/apache/pdfbox/pdmodel/graphics/xobject/jpeg256.jpg

Modified: pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.java?rev=1593370&r1=1593369&r2=1593370&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpeg.java Thu May  8 18:35:53 2014
@@ -25,6 +25,7 @@ import java.awt.image.ColorModel;
 import java.awt.image.ComponentColorModel;
 import java.awt.image.DataBuffer;
 import java.awt.image.DataBufferByte;
+import java.awt.image.DataBufferInt;
 import java.awt.image.Raster;
 import java.awt.image.WritableRaster;
 import java.io.InputStream;
@@ -129,7 +130,7 @@ public class PDJpeg extends PDXObjectIma
             }
             else
             {
-                throw new IllegalStateException();
+                throw new IllegalStateException("");
             }
         }
         setHeight( image.getHeight() );
@@ -166,36 +167,32 @@ public class PDJpeg extends PDXObjectIma
 
     private void createImageStream(PDDocument doc, BufferedImage bi, float compressionQuality) throws IOException
     {
-        BufferedImage alpha = null;
+        BufferedImage alphaImage = null;
         if (bi.getColorModel().hasAlpha())
         {
-            // extract the alpha information
-            WritableRaster alphaRaster = bi.getAlphaRaster();
-            ColorModel cm = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_GRAY), 
-                    false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE);
-            alpha = new BufferedImage(cm, alphaRaster, false, null);
-            // create a RGB image without alpha
-            image = new BufferedImage(bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_INT_RGB);
-            Graphics2D g = image.createGraphics();
+            alphaImage = extractAlphaImage(bi);
+
+            // create an RGB image without alpha
+            BufferedImage img = new BufferedImage(bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_INT_RGB);
+            Graphics2D g = img.createGraphics();
             g.setComposite(AlphaComposite.Src);
             g.drawImage(bi, 0, 0, null);
             g.dispose();
-            bi = image;
+            bi = img;
         }
 
         java.io.OutputStream os = getCOSStream().createFilteredStream();
         try
         {
             ImageIOUtil.writeImage(bi, JPG, os, ImageIOUtil.DEFAULT_SCREEN_RESOLUTION, compressionQuality);
-            
+
             COSDictionary dic = getCOSStream();
-            dic.setItem( COSName.FILTER, COSName.DCT_DECODE );
-            dic.setItem( COSName.SUBTYPE, COSName.IMAGE);
-            dic.setItem( COSName.TYPE, COSName.XOBJECT );
-            PDXObjectImage alphaPdImage = null;
-            if(alpha != null)
+            dic.setItem(COSName.FILTER, COSName.DCT_DECODE);
+            dic.setItem(COSName.SUBTYPE, COSName.IMAGE);
+            dic.setItem(COSName.TYPE, COSName.XOBJECT);
+            if (alphaImage != null)
             {
-                alphaPdImage = new PDJpeg(doc, alpha, compressionQuality);
+                PDXObjectImage alphaPdImage = new PDJpeg(doc, alphaImage, compressionQuality);
                 dic.setItem(COSName.SMASK, alphaPdImage);
             }
             setPropertiesFromAWT(bi);
@@ -209,6 +206,8 @@ public class PDJpeg extends PDXObjectIma
     /**
      * Returns an image of the JPeg, or null if JPegs are not supported. (They should be. )
      * {@inheritDoc}
+     * @return A Jpeg image.
+     * @throws java.io.IOException
      */
     public BufferedImage getRGBImage() throws IOException
     {   

Modified: pdfbox/branches/1.8/pdfbox/src/test/java/org/apache/pdfbox/TestAll.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/test/java/org/apache/pdfbox/TestAll.java?rev=1593370&r1=1593369&r2=1593370&view=diff
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/test/java/org/apache/pdfbox/TestAll.java (original)
+++ pdfbox/branches/1.8/pdfbox/src/test/java/org/apache/pdfbox/TestAll.java Thu May  8 18:35:53 2014
@@ -41,6 +41,7 @@ import org.apache.pdfbox.pdmodel.edit.Te
 import org.apache.pdfbox.pdmodel.graphics.color.PDColorStateTest;
 import org.apache.pdfbox.pdmodel.graphics.color.PDLabTest;
 import org.apache.pdfbox.pdmodel.graphics.optionalcontent.TestOptionalContentGroups;
+import org.apache.pdfbox.pdmodel.graphics.xobject.PDJpegTest;
 import org.apache.pdfbox.pdmodel.graphics.xobject.PDPixelMapTest;
 import org.apache.pdfbox.pdmodel.interactive.form.TestFields;
 import org.apache.pdfbox.util.PDFCloneUtilityTest;
@@ -122,6 +123,7 @@ public class TestAll extends TestCase
         suite.addTestSuite(PDFCloneUtilityTest.class);
         suite.addTestSuite(PDLabTest.class);
         suite.addTestSuite(PDPixelMapTest.class);
+        suite.addTestSuite(PDJpegTest.class);        
         suite.addTestSuite(TestPDFText2HTML.class);
         suite.addTestSuite(PDColorStateTest.class);
 

Added: pdfbox/branches/1.8/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpegTest.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpegTest.java?rev=1593370&view=auto
==============================================================================
--- pdfbox/branches/1.8/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpegTest.java (added)
+++ pdfbox/branches/1.8/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpegTest.java Thu May  8 18:35:53 2014
@@ -0,0 +1,341 @@
+/*
+ * 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.xobject;
+
+import java.awt.Graphics;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import javax.imageio.ImageIO;
+import junit.framework.TestCase;
+import org.apache.pdfbox.exceptions.COSVisitorException;
+import org.apache.pdfbox.pdmodel.PDDocument;
+import org.apache.pdfbox.pdmodel.PDPage;
+import org.apache.pdfbox.pdmodel.edit.PDPageContentStream;
+import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceGray;
+import org.apache.pdfbox.pdmodel.graphics.color.PDDeviceRGB;
+import static org.apache.pdfbox.pdmodel.graphics.xobject.PDUtils.checkIdent;
+import static org.apache.pdfbox.pdmodel.graphics.xobject.PDUtils.createInterestingImage;
+import org.apache.pdfbox.util.ImageIOUtil;
+
+/**
+ *
+ * @author Tilman Hausherr
+ */
+public class PDJpegTest extends TestCase
+{
+    private final File testResultsDir = new File("target/test-output/graphics");
+
+    @Override
+    protected void setUp() throws Exception
+    {
+        super.setUp();
+        testResultsDir.mkdirs();
+    }
+
+    /**
+     * Tests RGB PDJpegTest() with color and gray images
+     *
+     * @throws java.io.IOException
+     */
+    public void testCreateJpegFromImages() throws IOException
+    {
+        PDDocument document = new PDDocument();
+        BufferedImage image = ImageIO.read(this.getClass().getResourceAsStream("jpeg.jpg"));
+
+        PDXObjectImage ximage = new PDJpeg(document, image);
+        validate(ximage, 8, image.getWidth(), image.getHeight(), "jpg", PDDeviceRGB.NAME);
+
+        // Create a grayscale image
+        BufferedImage grayImage = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_BYTE_GRAY);
+        Graphics g = grayImage.getGraphics();
+        g.drawImage(image, 0, 0, null);
+        g.dispose();
+
+        ximage = new PDJpeg(document, grayImage);
+        validate(ximage, 8, grayImage.getWidth(), grayImage.getHeight(), "jpg", PDDeviceGray.NAME);
+
+        document.close();
+    }
+
+    /**
+     * Tests RGB PDJpegTest() with color file
+     *
+     * @throws java.io.IOException
+     * @throws org.apache.pdfbox.exceptions.COSVisitorException
+     */
+    public void testCreateJpegFromRGBImageFile() throws IOException, COSVisitorException
+    {
+        PDDocument document = new PDDocument();
+        BufferedImage image = ImageIO.read(this.getClass().getResourceAsStream("jpeg.jpg"));
+
+        PDXObjectImage ximage = new PDJpeg(document, this.getClass().getResourceAsStream("jpeg.jpg"));
+        validate(ximage, 8, image.getWidth(), image.getHeight(), "jpg", PDDeviceRGB.NAME);
+
+        // this can be checked for ident, because the actual jpeg stream is stored
+        PDUtils.checkIdent(image, ximage.getRGBImage());
+        
+        assertNull(ximage.getSMaskImage());
+
+        // This part isn't really needed because this test doesn't break
+        // if the mask has the wrong colorspace (PDFBOX-2057), but it is still useful
+        // if something goes wrong in the future and we want to have a PDF to open.
+        PDPage page = new PDPage();
+        document.addPage(page);
+        PDPageContentStream contentStream = new PDPageContentStream(document, page, true, false);
+        contentStream.drawXObject(ximage, 150, 300, ximage.getWidth(), ximage.getHeight());
+        contentStream.drawXObject(ximage, 200, 350, ximage.getWidth(), ximage.getHeight());
+        contentStream.close();
+        File pdfFile = new File(testResultsDir, "jpegfile.pdf");
+        document.save(pdfFile);
+        document.close();
+        document = PDDocument.loadNonSeq(pdfFile, null);
+        document.close();
+    }
+
+    /**
+     * Tests RGB PDJpegTest() with gray file
+     *
+     * @throws java.io.IOException
+     * @throws org.apache.pdfbox.exceptions.COSVisitorException
+     */
+    public void testCreateJpegFromGrayImageFile() throws IOException, COSVisitorException
+    {
+        PDDocument document = new PDDocument();
+        BufferedImage image = ImageIO.read(this.getClass().getResourceAsStream("jpeg256.jpg"));
+
+        PDXObjectImage ximage = new PDJpeg(document, this.getClass().getResourceAsStream("jpeg256.jpg"));
+        validate(ximage, 8, image.getWidth(), image.getHeight(), "jpg", PDDeviceGray.NAME);
+
+        // this can be checked for ident, because the actual jpeg stream is stored
+        checkIdent(image, ximage.getRGBImage()); 
+        
+        assertNull(ximage.getSMaskImage());
+
+        // This part isn't really needed because this test doesn't break
+        // if the mask has the wrong colorspace (PDFBOX-2057), but it is still useful
+        // if something goes wrong in the future and we want to have a PDF to open.
+        PDPage page = new PDPage();
+        document.addPage(page);
+        PDPageContentStream contentStream = new PDPageContentStream(document, page, true, false);
+        contentStream.drawXObject(ximage, 150, 300, ximage.getWidth(), ximage.getHeight());
+        contentStream.drawXObject(ximage, 200, 350, ximage.getWidth(), ximage.getHeight());
+        contentStream.close();
+        File pdfFile = new File(testResultsDir, "jpeg256file.pdf");
+        document.save(pdfFile);
+        document.close();
+        document = PDDocument.loadNonSeq(pdfFile, null);
+        document.close();
+    }
+
+    public void testCreateJpegFromImageGray() throws IOException
+    {
+        PDDocument document = new PDDocument();
+        BufferedImage image = new BufferedImage(256, 256, BufferedImage.TYPE_BYTE_GRAY);
+        int w = image.getWidth();
+        int h = image.getHeight();
+        for (int x = 0; x < w; ++x)
+        {
+            for (int y = 0; y < h; ++y)
+            {
+                int color = ((x + y) / 2) & 0xFF;
+                color += (color << 8) + (color << 16);
+                image.setRGB(x, y, color);
+            }
+        }
+        PDXObjectImage ximage = new PDJpeg(document, image);
+        validate(ximage, 8, w, h, "jpg", PDDeviceGray.NAME);
+        assertNull(ximage.getSMaskImage());
+        document.close();
+    }
+
+    /**
+     * Tests RGB PDJpegTest() with TYPE_4BYTE_ABGR image.
+     *
+     * @throws java.io.IOException
+     * @throws org.apache.pdfbox.exceptions.COSVisitorException
+     */
+    public void testCreateJpeg4BYTE_ABGR() throws IOException, COSVisitorException
+    {
+        PDDocument document = new PDDocument();
+        BufferedImage awtImage = createInterestingImage(BufferedImage.TYPE_4BYTE_ABGR);
+
+        for (int x = 0; x < awtImage.getWidth(); ++x)
+        {
+            for (int y = 0; y < awtImage.getHeight(); ++y)
+            {
+                awtImage.setRGB(x, y, (awtImage.getRGB(x, y) & 0xFFFFFF) | ((y / 10 * 10) << 24));
+            }
+        }
+
+        PDJpeg ximage = new PDJpeg(document, awtImage);
+        validate(ximage, 8, awtImage.getWidth(), awtImage.getHeight(), "jpg", PDDeviceRGB.NAME);
+        validate(ximage.getSMaskImage(), 8, awtImage.getWidth(), awtImage.getHeight(), "jpg", PDDeviceGray.NAME);
+
+        // This part isn't really needed because this test doesn't break
+        // if the mask has the wrong colorspace (PDFBOX-2057), but it is still useful
+        // if something goes wrong in the future and we want to have a PDF to open.
+        PDPage page = new PDPage();
+        document.addPage(page);
+        PDPageContentStream contentStream = new PDPageContentStream(document, page, true, false);
+        contentStream.drawXObject(ximage, 150, 300, ximage.getWidth(), ximage.getHeight());
+        contentStream.drawXObject(ximage, 200, 350, ximage.getWidth(), ximage.getHeight());
+        contentStream.close();
+        File pdfFile = new File(testResultsDir, "jpeg-4babgr.pdf");
+        document.save(pdfFile);
+        document.close();
+        document = PDDocument.loadNonSeq(pdfFile, null);
+        document.close();
+    }
+
+    /**
+     * Tests RGB PDJpegTest() with TYPE_INT_ARGB image.
+     *
+     * @throws java.io.IOException
+     * @throws org.apache.pdfbox.exceptions.COSVisitorException
+     */
+    public void testCreateJpegINT_ARGB() throws IOException, COSVisitorException
+    {
+        PDDocument document = new PDDocument();
+        BufferedImage awtImage = createInterestingImage(BufferedImage.TYPE_INT_ARGB);
+
+        for (int x = 0; x < awtImage.getWidth(); ++x)
+        {
+            for (int y = 0; y < awtImage.getHeight(); ++y)
+            {
+                awtImage.setRGB(x, y, (awtImage.getRGB(x, y) & 0xFFFFFF) | ((y / 10 * 10) << 24));
+            }
+        }
+
+        PDJpeg ximage = new PDJpeg(document, awtImage);
+        validate(ximage, 8, awtImage.getWidth(), awtImage.getHeight(), "jpg", PDDeviceRGB.NAME);
+        validate(ximage.getSMaskImage(), 8, awtImage.getWidth(), awtImage.getHeight(), "jpg", PDDeviceGray.NAME);
+
+        // This part isn't really needed because this test doesn't break
+        // if the mask has the wrong colorspace (PDFBOX-2057), but it is still useful
+        // if something goes wrong in the future and we want to have a PDF to open.
+        PDPage page = new PDPage();
+        document.addPage(page);
+        PDPageContentStream contentStream = new PDPageContentStream(document, page, true, false);
+        contentStream.drawXObject(ximage, 150, 300, ximage.getWidth(), ximage.getHeight());
+        contentStream.drawXObject(ximage, 200, 350, ximage.getWidth(), ximage.getHeight());
+        contentStream.close();
+        File pdfFile = new File(testResultsDir, "jpeg-intargb.pdf");
+        document.save(pdfFile);
+        document.close();
+        document = PDDocument.loadNonSeq(pdfFile, null);
+        document.close();
+    }
+
+    /**
+     * Tests RGB PDJpegTest() with TYPE_INT_RGB image.
+     *
+     * @throws java.io.IOException
+     * @throws org.apache.pdfbox.exceptions.COSVisitorException
+     */
+    public void testCreateJpegINT_RGB() throws IOException, COSVisitorException
+    {
+        PDDocument document = new PDDocument();
+        BufferedImage awtImage = createInterestingImage(BufferedImage.TYPE_INT_RGB);
+
+        PDJpeg ximage = new PDJpeg(document, awtImage);
+        validate(ximage, 8, awtImage.getWidth(), awtImage.getHeight(), "jpg", PDDeviceRGB.NAME);
+        assertNull(ximage.getSMaskImage());
+
+        // This part isn't really needed because this test doesn't break
+        // if the mask has the wrong colorspace (PDFBOX-2057), but it is still useful
+        // if something goes wrong in the future and we want to have a PDF to open.
+        PDPage page = new PDPage();
+        document.addPage(page);
+        PDPageContentStream contentStream = new PDPageContentStream(document, page, true, false);
+        contentStream.drawXObject(ximage, 150, 300, ximage.getWidth(), ximage.getHeight());
+        contentStream.drawXObject(ximage, 200, 350, ximage.getWidth(), ximage.getHeight());
+        contentStream.close();
+        File pdfFile = new File(testResultsDir, "jpeg-intrgb.pdf");
+        document.save(pdfFile);
+        document.close();
+        document = PDDocument.loadNonSeq(pdfFile, null);
+        document.close();
+    }
+
+    /**
+     * Tests RGB PDJpegTest() with TYPE_INT_BGR image.
+     *
+     * @throws java.io.IOException
+     * @throws org.apache.pdfbox.exceptions.COSVisitorException
+     */
+    public void testCreateJpegINT_BGR() throws IOException, COSVisitorException
+    {
+        PDDocument document = new PDDocument();
+        BufferedImage awtImage = createInterestingImage(BufferedImage.TYPE_INT_BGR);
+
+        PDJpeg ximage = new PDJpeg(document, awtImage);
+        validate(ximage, 8, awtImage.getWidth(), awtImage.getHeight(), "jpg", PDDeviceRGB.NAME);
+        assertNull(ximage.getSMaskImage());
+
+        // This part isn't really needed because this test doesn't break
+        // if the mask has the wrong colorspace (PDFBOX-2057), but it is still useful
+        // if something goes wrong in the future and we want to have a PDF to open.
+        PDPage page = new PDPage();
+        document.addPage(page);
+        PDPageContentStream contentStream = new PDPageContentStream(document, page, true, false);
+        contentStream.drawXObject(ximage, 150, 300, ximage.getWidth(), ximage.getHeight());
+        contentStream.drawXObject(ximage, 200, 350, ximage.getWidth(), ximage.getHeight());
+        contentStream.close();
+        File pdfFile = new File(testResultsDir, "jpeg-intbgr.pdf");
+        document.save(pdfFile);
+        document.close();
+        document = PDDocument.loadNonSeq(pdfFile, null);
+        document.close();
+    }
+    
+    /**
+     * Tests RGB PDJpegTest() with image from a color GIF
+     *
+     * @throws java.io.IOException
+     */
+    public void testCreateJpegFromColorGIF() throws IOException
+    {
+        PDDocument document = new PDDocument();
+        BufferedImage imageFromColorGif = ImageIO.read(this.getClass().getResourceAsStream("color.gif"));
+        PDXObjectImage ximage = new PDJpeg(document, imageFromColorGif);
+        validate(ximage, 8, 344, 287, "jpg", PDDeviceRGB.NAME);
+        document.close();
+    }
+
+    static public void validate(PDXObjectImage ximage, int bpc, int width, int height, String format, String colorSpaceName) throws IOException
+    {
+        // check the dictionary
+        assertNotNull(ximage);
+        assertNotNull(ximage.getCOSStream());
+        assertTrue(ximage.getCOSStream().getFilteredLength() > 0);
+        assertEquals(bpc, ximage.getBitsPerComponent());
+        assertEquals(width, ximage.getWidth());
+        assertEquals(height, ximage.getHeight());
+        assertEquals(format, ximage.getSuffix());
+        assertEquals(colorSpaceName, ximage.getColorSpace().getName());
+
+        // check the image
+        assertNotNull(ximage.getRGBImage());
+        assertEquals(ximage.getWidth(), ximage.getRGBImage().getWidth());
+        assertEquals(ximage.getHeight(), ximage.getRGBImage().getHeight());
+
+        boolean writeOk = ImageIOUtil.writeImage(ximage.getRGBImage(), format, new NullOutputStream());
+        assertTrue(writeOk);
+    }
+
+}

Propchange: pdfbox/branches/1.8/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/graphics/xobject/PDJpegTest.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: pdfbox/branches/1.8/pdfbox/src/test/resources/org/apache/pdfbox/pdmodel/graphics/xobject/jpeg.jpg
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/test/resources/org/apache/pdfbox/pdmodel/graphics/xobject/jpeg.jpg?rev=1593370&r1=1593369&r2=1593370&view=diff
==============================================================================
Binary files - no diff available.

Modified: pdfbox/branches/1.8/pdfbox/src/test/resources/org/apache/pdfbox/pdmodel/graphics/xobject/jpeg256.jpg
URL: http://svn.apache.org/viewvc/pdfbox/branches/1.8/pdfbox/src/test/resources/org/apache/pdfbox/pdmodel/graphics/xobject/jpeg256.jpg?rev=1593370&r1=1593369&r2=1593370&view=diff
==============================================================================
Binary files - no diff available.