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.