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