This commit is contained in:
Anthony Stirling 2025-08-08 14:30:58 +01:00
parent 65e894870c
commit 5b80a15950
9 changed files with 47 additions and 17 deletions

View File

@ -5,8 +5,11 @@ import java.awt.image.*;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.util.Iterator;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@ -115,7 +118,34 @@ public class ImageProcessingUtils {
public static BufferedImage loadImageWithExifOrientation(MultipartFile file) public static BufferedImage loadImageWithExifOrientation(MultipartFile file)
throws IOException { throws IOException {
BufferedImage image = ImageIO.read(file.getInputStream()); BufferedImage image = null;
String filename = file.getOriginalFilename();
// Try different approaches for different file types
if (filename != null && filename.toLowerCase().endsWith(".psd")) {
// For PSD files, try explicit ImageReader
Iterator<ImageReader> readers = ImageIO.getImageReadersByFormatName("PSD");
if (readers.hasNext()) {
ImageReader reader = readers.next();
try (ImageInputStream iis = ImageIO.createImageInputStream(file.getInputStream())) {
reader.setInput(iis);
image = reader.read(0);
} finally {
reader.dispose();
}
}
}
// Fallback to standard ImageIO.read for all files (including PSD if explicit reader failed)
if (image == null) {
image = ImageIO.read(file.getInputStream());
}
if (image == null) {
throw new IOException("Unable to read image from file: " + filename +
". Supported PSD formats: RGB/CMYK/Gray 8-32 bit, RLE/ZIP compression");
}
double orientation = extractImageOrientation(file.getInputStream()); double orientation = extractImageOrientation(file.getInputStream());
return applyOrientation(image, orientation); return applyOrientation(image, orientation);
} }

View File

@ -91,7 +91,7 @@ dependencies {
// runtimeOnly "com.twelvemonkeys.imageio:imageio-pcx:$imageioVersion@ // runtimeOnly "com.twelvemonkeys.imageio:imageio-pcx:$imageioVersion@
// runtimeOnly "com.twelvemonkeys.imageio:imageio-pict:$imageioVersion" // runtimeOnly "com.twelvemonkeys.imageio:imageio-pict:$imageioVersion"
// runtimeOnly "com.twelvemonkeys.imageio:imageio-pnm:$imageioVersion" // runtimeOnly "com.twelvemonkeys.imageio:imageio-pnm:$imageioVersion"
// runtimeOnly "com.twelvemonkeys.imageio:imageio-psd:$imageioVersion" runtimeOnly "com.twelvemonkeys.imageio:imageio-psd:$imageioVersion"
// runtimeOnly "com.twelvemonkeys.imageio:imageio-sgi:$imageioVersion" // runtimeOnly "com.twelvemonkeys.imageio:imageio-sgi:$imageioVersion"
// runtimeOnly "com.twelvemonkeys.imageio:imageio-tga:$imageioVersion" // runtimeOnly "com.twelvemonkeys.imageio:imageio-tga:$imageioVersion"
// runtimeOnly "com.twelvemonkeys.imageio:imageio-thumbsdb:$imageioVersion" // runtimeOnly "com.twelvemonkeys.imageio:imageio-thumbsdb:$imageioVersion"

View File

@ -569,12 +569,12 @@ rotate.tags=server side
home.imageToPdf.title=Image to PDF home.imageToPdf.title=Image to PDF
home.imageToPdf.desc=Convert a image (PNG, JPEG, GIF) to PDF. home.imageToPdf.desc=Convert a image (PNG, JPEG, GIF, PSD) to PDF.
imageToPdf.tags=conversion,img,jpg,picture,photo imageToPdf.tags=conversion,img,jpg,picture,photo,psd,photoshop
home.pdfToImage.title=PDF to Image home.pdfToImage.title=PDF to Image
home.pdfToImage.desc=Convert a PDF to a image. (PNG, JPEG, GIF) home.pdfToImage.desc=Convert a PDF to a image. (PNG, JPEG, GIF, PSD)
pdfToImage.tags=conversion,img,jpg,picture,photo pdfToImage.tags=conversion,img,jpg,picture,photo,psd,photoshop
home.pdfOrganiser.title=Organise home.pdfOrganiser.title=Organise
home.pdfOrganiser.desc=Remove/Rearrange pages in any order home.pdfOrganiser.desc=Remove/Rearrange pages in any order

View File

@ -569,12 +569,12 @@ rotate.tags=server side
home.imageToPdf.title=Image to PDF home.imageToPdf.title=Image to PDF
home.imageToPdf.desc=Convert a image (PNG, JPEG, GIF) to PDF. home.imageToPdf.desc=Convert a image (PNG, JPEG, GIF, PSD) to PDF.
imageToPdf.tags=conversion,img,jpg,picture,photo imageToPdf.tags=conversion,img,jpg,picture,photo,psd,photoshop
home.pdfToImage.title=PDF to Image home.pdfToImage.title=PDF to Image
home.pdfToImage.desc=Convert a PDF to a image. (PNG, JPEG, GIF) home.pdfToImage.desc=Convert a PDF to a image. (PNG, JPEG, GIF, PSD)
pdfToImage.tags=conversion,img,jpg,picture,photo pdfToImage.tags=conversion,img,jpg,picture,photo,psd,photoshop
home.pdfOrganiser.title=Organize home.pdfOrganiser.title=Organize
home.pdfOrganiser.desc=Remove/Rearrange pages in any order home.pdfOrganiser.desc=Remove/Rearrange pages in any order

View File

@ -570,11 +570,11 @@ rotate.tags=server side
home.imageToPdf.title=Irudia PDF bihurtu home.imageToPdf.title=Irudia PDF bihurtu
home.imageToPdf.desc=Irudi bat(PNG, JPEG, GIF)PDF bihurtu home.imageToPdf.desc=Irudi bat(PNG, JPEG, GIF)PDF bihurtu
imageToPdf.tags=conversion,img,jpg,picture,photo imageToPdf.tags=conversion,img,jpg,picture,photo,psd,photoshop
home.pdfToImage.title=PDFa irudi bihurtu home.pdfToImage.title=PDFa irudi bihurtu
home.pdfToImage.desc=PDF bat irudi (PNG, JPEG, GIF) bihurtu home.pdfToImage.desc=PDF bat irudi (PNG, JPEG, GIF) bihurtu
pdfToImage.tags=conversion,img,jpg,picture,photo pdfToImage.tags=conversion,img,jpg,picture,photo,psd,photoshop
home.pdfOrganiser.title=Antolatzailea home.pdfOrganiser.title=Antolatzailea
home.pdfOrganiser.desc=Ezabatu/Berrantolatu orrialdeak edozein ordenatan home.pdfOrganiser.desc=Ezabatu/Berrantolatu orrialdeak edozein ordenatan

View File

@ -569,7 +569,7 @@ rotate.tags=pivoter,server side,rotate
home.imageToPdf.title=Image en PDF home.imageToPdf.title=Image en PDF
home.imageToPdf.desc=Convertissez une image (PNG, JPEG, GIF) en PDF. home.imageToPdf.desc=Convertissez une image (PNG, JPEG, GIF, PSD) en PDF.
imageToPdf.tags=pdf,conversion,img,jpg,image,photo imageToPdf.tags=pdf,conversion,img,jpg,image,photo
home.pdfToImage.title=PDF en image home.pdfToImage.title=PDF en image

View File

@ -570,11 +570,11 @@ rotate.tags=server side
home.imageToPdf.title=画像をPDFに変換 home.imageToPdf.title=画像をPDFに変換
home.imageToPdf.desc=画像 (PNG, JPEG, GIF) をPDFに変換します。 home.imageToPdf.desc=画像 (PNG, JPEG, GIF) をPDFに変換します。
imageToPdf.tags=conversion,img,jpg,picture,photo imageToPdf.tags=conversion,img,jpg,picture,photo,psd,photoshop
home.pdfToImage.title=PDFを画像に変換 home.pdfToImage.title=PDFを画像に変換
home.pdfToImage.desc=PDFを画像 (PNG, JPEG, GIF) に変換します。 home.pdfToImage.desc=PDFを画像 (PNG, JPEG, GIF) に変換します。
pdfToImage.tags=conversion,img,jpg,picture,photo pdfToImage.tags=conversion,img,jpg,picture,photo,psd,photoshop
home.pdfOrganiser.title=整理 home.pdfOrganiser.title=整理
home.pdfOrganiser.desc=ページの削除/並べ替えします。 home.pdfOrganiser.desc=ページの削除/並べ替えします。

View File

@ -22,7 +22,7 @@
<form id="imageToPDFForm" method="post" enctype="multipart/form-data" <form id="imageToPDFForm" method="post" enctype="multipart/form-data"
th:action="@{'/api/v1/convert/img/pdf'}"> th:action="@{'/api/v1/convert/img/pdf'}">
<div <div
th:replace="~{fragments/common :: fileSelector(name='fileInput', multipleInputsForSingleRequest=false, accept='image/*', inputText=#{imgPrompt})}"> th:replace="~{fragments/common :: fileSelector(name='fileInput', multipleInputsForSingleRequest=false, accept='image/*,.psd', inputText=#{imgPrompt})}">
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label for="fitOption" th:text="#{imageToPDF.selectLabel}">Fit Options</label> <label for="fitOption" th:text="#{imageToPDF.selectLabel}">Fit Options</label>

View File

@ -58,7 +58,7 @@ repositories {
allprojects { allprojects {
group = 'stirling.software' group = 'stirling.software'
version = '1.1.1' version = '1.2.0'
configurations.configureEach { configurations.configureEach {
exclude group: 'commons-logging', module: 'commons-logging' exclude group: 'commons-logging', module: 'commons-logging'