com.ephesoft.dcma.util.TIFFUtil.java Source code

Java tutorial

Introduction

Here is the source code for com.ephesoft.dcma.util.TIFFUtil.java

Source

/********************************************************************************* 
* Ephesoft is a Intelligent Document Capture and Mailroom Automation program 
* developed by Ephesoft, Inc. Copyright (C) 2010-2012 Ephesoft Inc. 
* 
* This program is free software; you can redistribute it and/or modify it under 
* the terms of the GNU Affero General Public License version 3 as published by the 
* Free Software Foundation with the addition of the following permission added 
* to Section 15 as permitted in Section 7(a): FOR ANY PART OF THE COVERED WORK 
* IN WHICH THE COPYRIGHT IS OWNED BY EPHESOFT, EPHESOFT DISCLAIMS THE WARRANTY 
* OF NON INFRINGEMENT OF THIRD PARTY RIGHTS. 
* 
* This program is distributed in the hope that it will be useful, but WITHOUT 
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 
* FOR A PARTICULAR PURPOSE.  See the GNU Affero General Public License for more 
* details. 
* 
* You should have received a copy of the GNU Affero General Public License along with 
* this program; if not, see http://www.gnu.org/licenses or write to the Free 
* Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 
* 02110-1301 USA. 
* 
* You can contact Ephesoft, Inc. headquarters at 111 Academy Way, 
* Irvine, CA 92617, USA. or at email address info@ephesoft.com. 
* 
* The interactive user interfaces in modified source and object code versions 
* of this program must display Appropriate Legal Notices, as required under 
* Section 5 of the GNU Affero General Public License version 3. 
* 
* In accordance with Section 7(b) of the GNU Affero General Public License version 3, 
* these Appropriate Legal Notices must retain the display of the "Ephesoft" logo. 
* If the display of the logo is not reasonably feasible for 
* technical reasons, the Appropriate Legal Notices must display the words 
* "Powered by Ephesoft". 
********************************************************************************/

package com.ephesoft.dcma.util;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;

import javax.media.jai.NullOpImage;
import javax.media.jai.OpImage;
import javax.media.jai.PlanarImage;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.itextpdf.text.pdf.RandomAccessFileOrArray;
import com.itextpdf.text.pdf.codec.TiffImage;
import com.sun.media.jai.codec.FileSeekableStream;
import com.sun.media.jai.codec.ImageCodec;
import com.sun.media.jai.codec.ImageDecoder;
import com.sun.media.jai.codec.ImageEncoder;
import com.sun.media.jai.codec.SeekableStream;
import com.sun.media.jai.codec.TIFFEncodeParam;

/**
 * This is util class for TIFF.
 * 
 * @author Ephesoft
 * @version 1.0
 * @see com.itextpdf.text.pdf.codec.TiffImage
 */
public class TIFFUtil {

    /**
     * log reference.
     */
    private static final Log LOG = LogFactory.getLog(TIFFUtil.class);

    /**
     * API for getting the number of pages in a tiff file.
     * 
     * @param filePath file path {@link String}
     * @return numberOfPage
     */
    public static int getTIFFPageCount(String filePath) {
        LOG.info("Counting number of pages in a tiff file = " + filePath);
        int numberOfPages = 0;
        RandomAccessFileOrArray randomAccessFile = null;
        String filePathLowerCase = filePath.toLowerCase(Locale.getDefault());
        if (!filePathLowerCase.endsWith(IUtilCommonConstants.EXTENSION_TIFF)
                && !filePathLowerCase.endsWith(IUtilCommonConstants.EXTENSION_TIF)) {
            LOG.info("File not a tiff file." + filePath);
        } else {
            try {
                randomAccessFile = new RandomAccessFileOrArray(filePath);
                numberOfPages = TiffImage.getNumberOfPages(randomAccessFile);
                LOG.info("Number of pages found = " + numberOfPages);
            } catch (IOException ioe) {
                LOG.error("IIO exception while reading the tiff file = " + filePath);
            } finally {
                if (null != randomAccessFile) {
                    try {
                        randomAccessFile.close();
                    } catch (IOException ioe) {
                        LOG.error("Error while closing the RandomAccessFileOrArray for file  = " + filePath);
                    }
                }
            }
        }
        return numberOfPages;

    }

    /**
     * The <code>getSelectedTiffFile</code> method is used to limit the file
     * to the page limit given.
     * 
     * @param tiffFile {@link File} tiff file from which limit has to be applied
     * @param pageLimit int
     * @throws IOException if file is not found
     */
    public static void getSelectedTiffFile(final File tiffFile, final int pageLimit) throws IOException {
        OutputStream out = null;
        File newTiffFile = null;
        if (null != tiffFile && getTIFFPageCount(tiffFile.getAbsolutePath()) > pageLimit) {
            try {
                final List<BufferedImage> imageList = new ArrayList<BufferedImage>();
                final SeekableStream seekableStream = new FileSeekableStream(tiffFile);
                final ImageDecoder decoder = ImageCodec.createImageDecoder("tiff", seekableStream, null);
                for (int i = 1; i < pageLimit; i++) {
                    final PlanarImage planarImage = new NullOpImage(decoder.decodeAsRenderedImage(i), null, null,
                            OpImage.OP_IO_BOUND);
                    imageList.add(planarImage.getAsBufferedImage());
                }
                seekableStream.close();
                final TIFFEncodeParam params = new TIFFEncodeParam();
                params.setCompression(TIFFEncodeParam.COMPRESSION_GROUP4);
                String name = tiffFile.getName();
                final int indexOf = name.lastIndexOf(IUtilCommonConstants.DOT);
                name = name.substring(0, indexOf);
                final String finalPath = tiffFile.getParent() + File.separator + name + System.currentTimeMillis()
                        + IUtilCommonConstants.EXTENSION_TIF;
                newTiffFile = new File(finalPath);
                out = new FileOutputStream(finalPath);
                final ImageEncoder encoder = ImageCodec.createImageEncoder("tiff", out, params);
                params.setExtraImages(imageList.iterator());
                encoder.encode(imageList.get(0));
            } finally {
                if (null != out) {
                    out.flush();
                    out.close();
                }
            }
            if (tiffFile.delete() && null != newTiffFile) {
                newTiffFile.renameTo(tiffFile);
            } else {
                if (null != newTiffFile) {
                    newTiffFile.delete();
                }
            }
        }
    }
}