/*
* Created on 01 feb 2017
* Copyright 2015 by Andrea Vacondio (andrea.vacondio@gmail.com).
* This file is part of Sejda.
*
* Sejda is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Sejda 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 Sejda. If not, see <http://www.gnu.org/licenses/>.
*/
package org.sejda.core.writer.imageio;
import static java.util.Objects.isNull;
import static java.util.Objects.nonNull;
import static org.sejda.common.ComponentsUtility.nullSafeClose;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.stream.ImageOutputStream;
import org.sejda.core.writer.model.ImageWriter;
import org.sejda.model.exception.TaskIOException;
import org.sejda.model.image.TiffCompressionType;
import org.sejda.model.parameter.image.PdfToImageParameters;
/**
* Abstract implementation of an adapter for an ImageIO image writer
*
* @param <T>
* task parameter
* @author Andrea Vacondio
*/
abstract class AbstractImageWriter<T extends PdfToImageParameters> implements ImageWriter<T> {
static final Map<TiffCompressionType, String> TIFF_COMPRESSION_TYPE_CACHE;
static {
Map<TiffCompressionType, String> compressionTypesCache = new HashMap<TiffCompressionType, String>();
compressionTypesCache.put(TiffCompressionType.PACKBITS, "PackBits");
compressionTypesCache.put(TiffCompressionType.NONE, "None");
compressionTypesCache.put(TiffCompressionType.JPEG_TTN2, "JPEG");
compressionTypesCache.put(TiffCompressionType.DEFLATE, "Deflate");
compressionTypesCache.put(TiffCompressionType.LZW, "LZW");
compressionTypesCache.put(TiffCompressionType.ZLIB, "ZLib");
compressionTypesCache.put(TiffCompressionType.CCITT_GROUP_3_1D, "CCITT RLE");
compressionTypesCache.put(TiffCompressionType.CCITT_GROUP_3_2D, "CCITT T.4");
compressionTypesCache.put(TiffCompressionType.CCITT_GROUP_4, "CCITT T.6");
TIFF_COMPRESSION_TYPE_CACHE = Collections.unmodifiableMap(compressionTypesCache);
}
private ImageOutputStream out;
protected final javax.imageio.ImageWriter writer;
AbstractImageWriter(String format) {
Iterator<javax.imageio.ImageWriter> writers = ImageIO.getImageWritersByFormatName(format);
if (isNull(writers) || !writers.hasNext()) {
throw new IllegalArgumentException(
String.format("Unable to find an ImageWriter for the format %s", format));
}
writer = writers.next();
}
/**
* @param params
* @return parameters for the {@link ImageWriter}. Each concrete class has to implement this to provide specific parameters for the adapted writer.
*/
abstract ImageWriteParam newImageWriterParams(T params);
/**
* @param image
* @param params
* @param writerParams
* @return metadata for the {@link ImageWriter}
*/
public IIOMetadata newImageMetadata(RenderedImage image, T params, ImageWriteParam writerParams) {
return null;
}
@Override
public void openDestination(File file, T params) throws TaskIOException {
try {
out = ImageIO.createImageOutputStream(file);
TaskIOException.require(nonNull(out), "Unable to create image output stream");
writer.setOutput(getOutput());
} catch (IOException e) {
throw new TaskIOException("Unable to create output stream.", e);
}
}
ImageOutputStream getOutput() {
return out;
}
@Override
public void close() throws IOException {
if (nonNull(writer)) {
writer.dispose();
}
}
@Override
public void closeDestination() throws TaskIOException {
try {
nullSafeClose(getOutput());
} catch (IOException e) {
throw new TaskIOException("Unable to close destination", e);
}
}
}