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