Author: lehmi Date: Sun Dec 18 15:46:21 2011 New Revision: 1220438 URL: http://svn.apache.org/viewvc?rev=1220438&view=rev Log: PDFBOX-1190: avoid IllegalStateException when rendering pages to BMP or WBMP
Added: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/util/TestImageIOUtils.java Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/ImageIOUtil.java pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/TestAll.java Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/ImageIOUtil.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/ImageIOUtil.java?rev=1220438&r1=1220437&r2=1220438&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/ImageIOUtil.java (original) +++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/util/ImageIOUtil.java Sun Dec 18 15:46:21 2011 @@ -83,6 +83,11 @@ public class ImageIOUtil if( writerParams.canWriteCompressed() ) { writerParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); + // reset the compression type if overwritten by setCompressionMode + if (writerParams.getCompressionType() == null) + { + writerParams.setCompressionType(writerParams.getCompressionTypes()[0]); + } writerParams.setCompressionQuality(1.0f); } IIOMetadata meta = createMetadata( image, imageWriter, writerParams, resolution); @@ -138,10 +143,15 @@ public class ImageIOUtil private static boolean addResolution(IIOMetadata meta, int resolution) { - if (meta.isStandardMetadataFormatSupported()) + if (!meta.isReadOnly() && meta.isStandardMetadataFormatSupported()) { IIOMetadataNode root = (IIOMetadataNode)meta.getAsTree(STANDARD_METADATA_FORMAT); IIOMetadataNode dim = getChildNode(root, "Dimension"); + if (dim == null) + { + dim = new IIOMetadataNode("Dimension"); + root.appendChild(dim); + } IIOMetadataNode child; child = getChildNode(dim, "HorizontalPixelSize"); if (child == null) Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/TestAll.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/TestAll.java?rev=1220438&r1=1220437&r2=1220438&view=diff ============================================================================== --- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/TestAll.java (original) +++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/TestAll.java Sun Dec 18 15:46:21 2011 @@ -33,6 +33,7 @@ import org.apache.pdfbox.pdmodel.TestPDD import org.apache.pdfbox.pdmodel.interactive.form.TestFields; import org.apache.pdfbox.tika.PDFParserTest; import org.apache.pdfbox.util.TestDateUtil; +import org.apache.pdfbox.util.TestImageIOUtils; import org.apache.pdfbox.util.TestMatrix; /** @@ -89,6 +90,7 @@ public class TestAll extends TestCase suite.addTest( org.apache.pdfbox.pdmodel.common.function.TestFunctions.suite() ); suite.addTestSuite( TestIOUtils.class ); + suite.addTestSuite( TestImageIOUtils.class ); suite.addTestSuite( TestPackedBitArray.class ); suite.addTestSuite( TestCCITTFaxG31DDecodeInputStream.class ); Added: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/util/TestImageIOUtils.java URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/util/TestImageIOUtils.java?rev=1220438&view=auto ============================================================================== --- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/util/TestImageIOUtils.java (added) +++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/util/TestImageIOUtils.java Sun Dec 18 15:46:21 2011 @@ -0,0 +1,134 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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.util; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.FilenameFilter; +import java.io.IOException; +import java.util.List; + +import junit.framework.TestCase; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.PDPage; + +/** + * Test suite for ImageIOUtil. + * + * @version $Revision: 1.0 $ + */ +public class TestImageIOUtils extends TestCase +{ + + /** + * Logger instance. + */ + private static final Log LOG = LogFactory.getLog(TestImageIOUtils.class); + + private boolean testFailed = false; + + /** + * Validate page rendering for all supported image formats (JDK5). + * + * @param file The file to validate + * @param inDir Name of the input directory + * @param outDir Name of the output directory + * @throws Exception when there is an exception + */ + private void doTestFile(File file, String inDir, String outDir) + throws Exception + { + PDDocument document = null; + String imageType = "png"; + LOG.info("Preparing to convert " + file.getName()); + try + { + int resolution = 120; + document = PDDocument.load(file); + // testing PNG + writeImage(document, imageType, outDir + file.getName() + "-", + BufferedImage.TYPE_INT_RGB, resolution); + // testing JPG/JPEG + imageType = "jpg"; + writeImage(document, imageType, outDir + file.getName() + "-", + BufferedImage.TYPE_INT_RGB, resolution); + // testing BMP + imageType = "bmp"; + writeImage(document, imageType, outDir + file.getName() + "-", + BufferedImage.TYPE_INT_RGB, resolution); + // testing WBMP + imageType = "wbmp"; + writeImage(document, imageType, outDir + file.getName() + "-", + BufferedImage.TYPE_BYTE_BINARY, resolution); + } + catch(Exception e) + { + testFailed = true; + LOG.error("Error converting file " + file.getName() + " using image type " + imageType, e); + } + finally + { + document.close(); + } + + } + + private void writeImage(PDDocument document, String imageFormat, String outputPrefix, int imageType, int resolution) + throws IOException + { + List pages = document.getDocumentCatalog().getAllPages(); + PDPage page = (PDPage)pages.get( 0 ); + BufferedImage image = page.convertToImage(imageType, resolution); + String fileName = outputPrefix + 1; + System.out.println( "Writing: " + fileName + "." +imageFormat); + ImageIOUtil.writeImage(image, imageFormat, fileName, imageType, resolution); + } + + /** + * Test to validate image rendering of file set. + * + * @throws Exception when there is an exception + */ + public void testRenderImage() + throws Exception + { + String inDir = "src/test/resources/input/rendering"; + String outDir = "target/test-output/"; + + File[] testFiles = new File(inDir).listFiles(new FilenameFilter() + { + public boolean accept(File dir, String name) + { + return (name.endsWith(".pdf") || name.endsWith(".ai")); + } + }); + + for (int n = 0; n < testFiles.length; n++) + { + doTestFile(testFiles[n], inDir, outDir); + } + + if (testFailed) + { + fail("One or more failures, see test log for details"); + } + } + +}