diff --git a/engines/imagemagick/src/main/java/org/alfresco/transform/imagemagick/transformers/ImageMagickTransformer.java b/engines/imagemagick/src/main/java/org/alfresco/transform/imagemagick/transformers/ImageMagickTransformer.java index e20309ad..84e51a7d 100644 --- a/engines/imagemagick/src/main/java/org/alfresco/transform/imagemagick/transformers/ImageMagickTransformer.java +++ b/engines/imagemagick/src/main/java/org/alfresco/transform/imagemagick/transformers/ImageMagickTransformer.java @@ -26,22 +26,13 @@ */ package org.alfresco.transform.imagemagick.transformers; -import org.alfresco.transform.base.TransformManager; -import org.alfresco.transform.base.executors.AbstractCommandExecutor; -import org.alfresco.transform.base.executors.RuntimeExec; -import org.alfresco.transform.base.util.CustomTransformerFileAdaptor; -import org.alfresco.transform.exceptions.TransformException; -import org.alfresco.transform.imagemagick.ImageMagickOptionsBuilder; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import javax.annotation.PostConstruct; -import java.io.File; -import java.util.HashMap; -import java.util.Map; - import static org.alfresco.transform.base.util.Util.stringToInteger; import static org.alfresco.transform.base.util.Util.stringToLong; +import static org.alfresco.transform.common.Mimetype.MIMETYPE_IMAGE_BMP; +import static org.alfresco.transform.common.Mimetype.MIMETYPE_IMAGE_JP2; +import static org.alfresco.transform.common.Mimetype.MIMETYPE_IMAGE_JPEG; +import static org.alfresco.transform.common.Mimetype.MIMETYPE_IMAGE_PNG; +import static org.alfresco.transform.common.Mimetype.MIMETYPE_IMAGE_XWD; import static org.alfresco.transform.common.RequestParamMap.ALLOW_ENLARGEMENT; import static org.alfresco.transform.common.RequestParamMap.ALPHA_REMOVE; import static org.alfresco.transform.common.RequestParamMap.AUTO_ORIENT; @@ -61,9 +52,31 @@ import static org.alfresco.transform.common.RequestParamMap.START_PAGE; import static org.alfresco.transform.common.RequestParamMap.THUMBNAIL; import static org.alfresco.transform.common.RequestParamMap.TIMEOUT; +import javax.annotation.PostConstruct; +import java.io.File; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.alfresco.transform.base.TransformManager; +import org.alfresco.transform.base.executors.AbstractCommandExecutor; +import org.alfresco.transform.base.executors.RuntimeExec; +import org.alfresco.transform.base.util.CustomTransformerFileAdaptor; +import org.alfresco.transform.exceptions.TransformException; +import org.alfresco.transform.imagemagick.ImageMagickOptionsBuilder; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +/** + * Converts image files into different types of images. Transformer supports multi-page images and allows to specify via parameters `startPage` and `endPage` range of pages that should be converted. + * In case of a one-page target image type (like `jpeg` or `png`) parameters `startPage` and `endPage` will be set to 0 by default - this means that only first page will be converted. + */ @Component public class ImageMagickTransformer extends AbstractCommandExecutor implements CustomTransformerFileAdaptor { + private final List singlePageFormats = List.of(MIMETYPE_IMAGE_BMP, MIMETYPE_IMAGE_JP2, MIMETYPE_IMAGE_JPEG, MIMETYPE_IMAGE_PNG, MIMETYPE_IMAGE_XWD); + @Value("${transform.core.imagemagick.exe}") private String exe; @Value("${transform.core.imagemagick.dyn}") @@ -152,10 +165,24 @@ public class ImageMagickTransformer extends AbstractCommandExecutor implements C public void transform(String sourceMimetype, String targetMimetype, Map transformOptions, File sourceFile, File targetFile, TransformManager transformManager) throws TransformException { + String startPageString = transformOptions.get(START_PAGE); + String endPageString = transformOptions.get(END_PAGE); + if (singlePageFormats.contains(targetMimetype)) + { + if (StringUtils.isEmpty(startPageString)) + { + startPageString = "0"; + } + if (StringUtils.isEmpty(endPageString)) + { + endPageString = startPageString; + } + } + final String options = ImageMagickOptionsBuilder .builder() - .withStartPage(transformOptions.get(START_PAGE)) - .withEndPage(transformOptions.get(END_PAGE)) + .withStartPage(startPageString) + .withEndPage(endPageString) .withAlphaRemove(transformOptions.get(ALPHA_REMOVE)) .withAutoOrient(transformOptions.get(AUTO_ORIENT)) .withCropGravity(transformOptions.get(CROP_GRAVITY)) @@ -174,8 +201,8 @@ public class ImageMagickTransformer extends AbstractCommandExecutor implements C .build(); String pageRange = calculatePageRange( - stringToInteger(transformOptions.get(START_PAGE)), - stringToInteger(transformOptions.get(END_PAGE)) + stringToInteger(startPageString), + stringToInteger(endPageString) ); Long timeout = stringToLong(transformOptions.get(TIMEOUT)); diff --git a/engines/imagemagick/src/test/java/org/alfresco/transform/imagemagick/ImageMagickTransformationIT.java b/engines/imagemagick/src/test/java/org/alfresco/transform/imagemagick/ImageMagickTransformationIT.java index 51ca16a3..2aacaa86 100644 --- a/engines/imagemagick/src/test/java/org/alfresco/transform/imagemagick/ImageMagickTransformationIT.java +++ b/engines/imagemagick/src/test/java/org/alfresco/transform/imagemagick/ImageMagickTransformationIT.java @@ -151,16 +151,6 @@ public class ImageMagickTransformationIT { .add(Pair.of("3fr", MIMETYPE_IMAGE_RAW_3FR)) .build(); - private static final List> targetExtensionsForTiffFirstPage = new ImmutableList.Builder>() - .add(Pair.of("bmp", MIMETYPE_IMAGE_BMP)) - .add(Pair.of("jp2", MIMETYPE_IMAGE_JP2)) - .add(Pair.of("jpg", MIMETYPE_IMAGE_JPEG)) - .add(Pair.of("png", MIMETYPE_IMAGE_PNG)) - .add(Pair.of("xbm", MIMETYPE_IMAGE_XBM)) - .add(Pair.of("xpm", MIMETYPE_IMAGE_XPM)) - .add(Pair.of("xwd", MIMETYPE_IMAGE_XWD)) - .build(); - private static final Map TEST_FILES = Stream.of( testFile(MIMETYPE_IMAGE_BMP, "bmp", "quick.bmp"), testFile(MIMETYPE_IMAGE_GIF, "gif", "quick.gif"), @@ -209,16 +199,8 @@ public class ImageMagickTransformationIT { sourceFile, sourceMimetype, targetMimetype, targetExtension); try { - // note: some image/tiff->image/* will return multiple page results (hence error) unless options specified for single page - Map tOptions = emptyMap(); - Pair targetPair = Pair.of(targetExtension, targetMimetype); - if (MIMETYPE_IMAGE_TIFF.equals(sourceMimetype) && targetExtensionsForTiffFirstPage.contains(targetPair)) - { - tOptions = ImmutableMap.of("startPage", "0", "endPage", "0"); - } - final ResponseEntity response = sendTRequest(ENGINE_URL, sourceFile, sourceMimetype, - targetMimetype, targetExtension, tOptions); + targetMimetype, targetExtension, emptyMap()); assertEquals(OK, response.getStatusCode(), descriptor); } catch (Exception e) @@ -233,6 +215,4 @@ public class ImageMagickTransformationIT { .stream() .map(k -> Pair.of(TEST_FILES.get(sourceFile), k)); } - - }