Skip to content

Commit

Permalink
extract and apply the image orientation from exif data in imageToPdf (#…
Browse files Browse the repository at this point in the history
  • Loading branch information
sbplat authored Oct 23, 2024
1 parent bac81c9 commit e0b77ca
Show file tree
Hide file tree
Showing 9 changed files with 93 additions and 33 deletions.
3 changes: 3 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -179,6 +179,9 @@ dependencies {
runtimeOnly "com.twelvemonkeys.imageio:imageio-webp:$imageioVersion"
// runtimeOnly "com.twelvemonkeys.imageio:imageio-xwd:$imageioVersion"

// Image metadata extractor
implementation "com.drewnoakes:metadata-extractor:2.19.0"

implementation "commons-io:commons-io:2.17.0"
implementation "org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0"
//general PDF
Expand Down
6 changes: 2 additions & 4 deletions src/main/java/stirling/software/SPDF/EE/EEAppConfig.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package stirling.software.SPDF.EE;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
Expand All @@ -20,6 +18,6 @@ public class EEAppConfig {

@Bean(name = "runningEE")
public boolean runningEnterpriseEdition() {
return licenseKeyChecker.getEnterpriseEnabledResult();
return licenseKeyChecker.getEnterpriseEnabledResult();
}
}
}
6 changes: 2 additions & 4 deletions src/main/java/stirling/software/SPDF/config/InitialSetup.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import org.springframework.stereotype.Component;

import io.micrometer.common.util.StringUtils;

import jakarta.annotation.PostConstruct;
import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.model.ApplicationProperties;
Expand Down Expand Up @@ -40,7 +41,7 @@ public void initSecretKey() throws IOException {
applicationProperties.getAutomaticallyGenerated().setKey(secretKey);
}
}

@PostConstruct
public void initLegalUrls() throws IOException {
// Initialize Terms and Conditions
Expand All @@ -59,7 +60,4 @@ public void initLegalUrls() throws IOException {
applicationProperties.getLegal().setPrivacyPolicy(defaultPrivacyUrl);
}
}

}


Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,8 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
}

// Handle SAML
if (applicationProperties.getSecurity().isSaml2Activ() && applicationProperties.getSystem().getEnableAlphaFunctionality()) {
if (applicationProperties.getSecurity().isSaml2Activ()
&& applicationProperties.getSystem().getEnableAlphaFunctionality()) {
http.authenticationProvider(samlAuthenticationProvider());
http.saml2Login(
saml2 ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ public class UserService implements UserServiceInterface {

@Autowired DatabaseBackupInterface databaseBackupHelper;


// Handle OAUTH2 login and user auto creation.
public boolean processOAuth2PostLogin(String username, boolean autoCreateUser)
throws IllegalArgumentException, IOException {
Expand Down Expand Up @@ -360,8 +359,8 @@ public String getCurrentUsername() {
}
}

@Override
public long getTotalUsersCount() {
return userRepository.count();
}
@Override
public long getTotalUsersCount() {
return userRepository.count();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ public interface UserServiceInterface {
String getApiKeyForUser(String username);

String getCurrentUsername();

long getTotalUsersCount();
}
11 changes: 5 additions & 6 deletions src/main/java/stirling/software/SPDF/service/PostHogService.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,12 @@ public class PostHogService {
private final ApplicationProperties applicationProperties;
private final UserServiceInterface userService;


@Autowired
public PostHogService(
PostHog postHog,
@Qualifier("UUID") String uuid,
ApplicationProperties applicationProperties, @Autowired(required = false) UserServiceInterface userService) {
ApplicationProperties applicationProperties,
@Autowired(required = false) UserServiceInterface userService) {
this.postHog = postHog;
this.uniqueId = uuid;
this.applicationProperties = applicationProperties;
Expand Down Expand Up @@ -137,10 +137,9 @@ public Map<String, Object> captureServerMetrics() {
metrics.put("docker_metrics", getDockerMetrics());
}
metrics.put("application_properties", captureApplicationProperties());


if(userService != null) {
metrics.put("total_users_created", userService.getTotalUsersCount());

if (userService != null) {
metrics.put("total_users_created", userService.getTotalUsersCount());
}

} catch (Exception e) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,30 +1,46 @@
package stirling.software.SPDF.utils;

import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.awt.image.DataBuffer;
import java.awt.image.DataBufferByte;
import java.awt.image.DataBufferInt;
import java.io.IOException;
import java.io.InputStream;
import java.nio.ByteBuffer;

import javax.imageio.ImageIO;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;

import com.drew.imaging.ImageMetadataReader;
import com.drew.imaging.ImageProcessingException;
import com.drew.metadata.Metadata;
import com.drew.metadata.MetadataException;
import com.drew.metadata.exif.ExifSubIFDDirectory;

public class ImageProcessingUtils {

private static final Logger logger = LoggerFactory.getLogger(PdfUtils.class);

static BufferedImage convertColorType(BufferedImage sourceImage, String colorType) {
BufferedImage convertedImage;
switch (colorType) {
case "greyscale":
convertedImage =
new BufferedImage(
sourceImage.getWidth(),
sourceImage.getHeight(),
BufferedImage.TYPE_BYTE_GRAY);
convertedImage = new BufferedImage(
sourceImage.getWidth(),
sourceImage.getHeight(),
BufferedImage.TYPE_BYTE_GRAY);
convertedImage.getGraphics().drawImage(sourceImage, 0, 0, null);
break;
case "blackwhite":
convertedImage =
new BufferedImage(
sourceImage.getWidth(),
sourceImage.getHeight(),
BufferedImage.TYPE_BYTE_BINARY);
convertedImage = new BufferedImage(
sourceImage.getWidth(),
sourceImage.getHeight(),
BufferedImage.TYPE_BYTE_BINARY);
convertedImage.getGraphics().drawImage(sourceImage, 0, 0, null);
break;
default: // full color
Expand Down Expand Up @@ -59,4 +75,49 @@ public static byte[] getImageData(BufferedImage image) {
return data;
}
}

public static double extractImageOrientation(InputStream is) throws IOException {
try {
Metadata metadata = ImageMetadataReader.readMetadata(is);
ExifSubIFDDirectory directory = metadata.getFirstDirectoryOfType(ExifSubIFDDirectory.class);
if (directory == null) {
return 0;
}
int orientationTag = directory.getInt(ExifSubIFDDirectory.TAG_ORIENTATION);
switch (orientationTag) {
case 1:
return 0;
case 6:
return 90;
case 3:
return 180;
case 8:
return 270;
default:
logger.warn("Unknown orientation tag: {}", orientationTag);
return 0;
}
} catch (ImageProcessingException | MetadataException e) {
return 0;
}
}

public static BufferedImage applyOrientation(BufferedImage image, double orientation) {
if (orientation == 0) {
return image;
}
AffineTransform transform = AffineTransform.getRotateInstance(
Math.toRadians(orientation),
image.getWidth() / 2.0,
image.getHeight() / 2.0);
AffineTransformOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_BILINEAR);
return op.filter(image, null);
}

public static BufferedImage loadImageWithExifOrientation(MultipartFile file)
throws IOException {
BufferedImage image = ImageIO.read(file.getInputStream());
double orientation = extractImageOrientation(file.getInputStream());
return applyOrientation(image, orientation);
}
}
5 changes: 3 additions & 2 deletions src/main/java/stirling/software/SPDF/utils/PdfUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -194,7 +194,8 @@ public boolean pageSize(PDDocument pdfDocument, String expectedPageSize) throws

pdfDocument.close();

// Assumes the expectedPageSize is in the format "widthxheight", e.g. "595x842" for A4
// Assumes the expectedPageSize is in the format "widthxheight", e.g. "595x842"
// for A4
String[] dimensions = expectedPageSize.split("x");
float expectedPageWidth = Float.parseFloat(dimensions[0]);
float expectedPageHeight = Float.parseFloat(dimensions[1]);
Expand Down Expand Up @@ -407,7 +408,7 @@ public static byte[] imageToPdf(
addImageToDocument(doc, pdImage, fitOption, autoRotate);
}
} else {
BufferedImage image = ImageIO.read(file.getInputStream());
BufferedImage image = ImageProcessingUtils.loadImageWithExifOrientation(file);
BufferedImage convertedImage =
ImageProcessingUtils.convertColorType(image, colorType);
// Use JPEGFactory if it's JPEG since JPEG is lossy
Expand Down

0 comments on commit e0b77ca

Please sign in to comment.