diff --git a/src/main/java/stirling/software/SPDF/EE/EEAppConfig.java b/src/main/java/stirling/software/SPDF/EE/EEAppConfig.java index 4648c033e3..67cb8a9118 100644 --- a/src/main/java/stirling/software/SPDF/EE/EEAppConfig.java +++ b/src/main/java/stirling/software/SPDF/EE/EEAppConfig.java @@ -6,6 +6,7 @@ import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.ApplicationProperties; @Configuration diff --git a/src/main/java/stirling/software/SPDF/EE/KeygenLicenseVerifier.java b/src/main/java/stirling/software/SPDF/EE/KeygenLicenseVerifier.java index c75c98e9f5..a562cbcbac 100644 --- a/src/main/java/stirling/software/SPDF/EE/KeygenLicenseVerifier.java +++ b/src/main/java/stirling/software/SPDF/EE/KeygenLicenseVerifier.java @@ -13,6 +13,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.posthog.java.shaded.org.json.JSONObject; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.utils.GeneralUtils; diff --git a/src/main/java/stirling/software/SPDF/EE/LicenseKeyChecker.java b/src/main/java/stirling/software/SPDF/EE/LicenseKeyChecker.java index 4636c89264..9de7a7059b 100644 --- a/src/main/java/stirling/software/SPDF/EE/LicenseKeyChecker.java +++ b/src/main/java/stirling/software/SPDF/EE/LicenseKeyChecker.java @@ -7,6 +7,7 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.utils.GeneralUtils; diff --git a/src/main/java/stirling/software/SPDF/SPDFApplication.java b/src/main/java/stirling/software/SPDF/SPDFApplication.java index 242a0bff69..a7c7bf3e6f 100644 --- a/src/main/java/stirling/software/SPDF/SPDFApplication.java +++ b/src/main/java/stirling/software/SPDF/SPDFApplication.java @@ -22,7 +22,9 @@ import io.github.pixee.security.SystemCommand; import jakarta.annotation.PostConstruct; import jakarta.annotation.PreDestroy; + import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.UI.WebBrowser; import stirling.software.SPDF.config.ConfigInitializer; import stirling.software.SPDF.config.InstallationPathConfig; diff --git a/src/main/java/stirling/software/SPDF/UI/impl/DesktopBrowser.java b/src/main/java/stirling/software/SPDF/UI/impl/DesktopBrowser.java index b221d01905..403b253602 100644 --- a/src/main/java/stirling/software/SPDF/UI/impl/DesktopBrowser.java +++ b/src/main/java/stirling/software/SPDF/UI/impl/DesktopBrowser.java @@ -34,11 +34,14 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Component; import jakarta.annotation.PreDestroy; + import lombok.extern.slf4j.Slf4j; + import me.friwi.jcefmaven.CefAppBuilder; import me.friwi.jcefmaven.EnumProgress; import me.friwi.jcefmaven.MavenCefAppHandlerAdapter; import me.friwi.jcefmaven.impl.progress.ConsoleProgressHandler; + import stirling.software.SPDF.UI.WebBrowser; import stirling.software.SPDF.config.InstallationPathConfig; import stirling.software.SPDF.utils.UIScaling; diff --git a/src/main/java/stirling/software/SPDF/UI/impl/LoadingWindow.java b/src/main/java/stirling/software/SPDF/UI/impl/LoadingWindow.java index b4479be399..93118924b0 100644 --- a/src/main/java/stirling/software/SPDF/UI/impl/LoadingWindow.java +++ b/src/main/java/stirling/software/SPDF/UI/impl/LoadingWindow.java @@ -14,6 +14,7 @@ import javax.swing.*; import io.github.pixee.security.BoundedLineReader; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.utils.UIScaling; @Slf4j diff --git a/src/main/java/stirling/software/SPDF/config/AppConfig.java b/src/main/java/stirling/software/SPDF/config/AppConfig.java index a3379df362..cb9dbcd801 100644 --- a/src/main/java/stirling/software/SPDF/config/AppConfig.java +++ b/src/main/java/stirling/software/SPDF/config/AppConfig.java @@ -20,6 +20,7 @@ import org.springframework.core.io.ResourceLoader; import org.thymeleaf.spring6.SpringTemplateEngine; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.ApplicationProperties; @Configuration @@ -127,15 +128,6 @@ public class AppConfig { } } - @Bean(name = "bookAndHtmlFormatsInstalled") - public boolean bookAndHtmlFormatsInstalled() { - String installOps = System.getProperty("INSTALL_BOOK_AND_ADVANCED_HTML_OPS"); - if (installOps == null) { - installOps = System.getenv("INSTALL_BOOK_AND_ADVANCED_HTML_OPS"); - } - return "true".equalsIgnoreCase(installOps); - } - @ConditionalOnMissingClass("stirling.software.SPDF.config.security.SecurityConfiguration") @Bean(name = "activSecurity") public boolean missingActivSecurity() { diff --git a/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java b/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java index c8fe0c2919..16121170d1 100644 --- a/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java +++ b/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java @@ -1,6 +1,5 @@ package stirling.software.SPDF.config; -import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; @@ -9,30 +8,24 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.context.annotation.DependsOn; import org.springframework.stereotype.Service; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.ApplicationProperties; @Service @Slf4j -@DependsOn({"bookAndHtmlFormatsInstalled"}) public class EndpointConfiguration { private static final String REMOVE_BLANKS = "remove-blanks"; private final ApplicationProperties applicationProperties; private Map endpointStatuses = new ConcurrentHashMap<>(); private Map> endpointGroups = new ConcurrentHashMap<>(); - private boolean bookAndHtmlFormatsInstalled; @Autowired - public EndpointConfiguration( - ApplicationProperties applicationProperties, - @Qualifier("bookAndHtmlFormatsInstalled") boolean bookAndHtmlFormatsInstalled) { + public EndpointConfiguration(ApplicationProperties applicationProperties) { this.applicationProperties = applicationProperties; - this.bookAndHtmlFormatsInstalled = bookAndHtmlFormatsInstalled; init(); processEnvironmentConfigs(); } @@ -197,8 +190,8 @@ public class EndpointConfiguration { addEndpointToGroup("LibreOffice", "pdf-to-html"); addEndpointToGroup("LibreOffice", "pdf-to-xml"); - // Unoconv - addEndpointToGroup("Unoconv", "file-to-pdf"); + // Unoconvert + addEndpointToGroup("Unoconvert", "file-to-pdf"); // qpdf addEndpointToGroup("qpdf", "compress-pdf"); @@ -272,12 +265,6 @@ public class EndpointConfiguration { List endpointsToRemove = applicationProperties.getEndpoints().getToRemove(); List groupsToRemove = applicationProperties.getEndpoints().getGroupsToRemove(); - if (!bookAndHtmlFormatsInstalled) { - if (groupsToRemove == null) { - groupsToRemove = new ArrayList<>(); - } - groupsToRemove.add("Calibre"); - } if (endpointsToRemove != null) { for (String endpoint : endpointsToRemove) { disableEndpoint(endpoint.trim()); diff --git a/src/main/java/stirling/software/SPDF/config/ExternalAppDepConfig.java b/src/main/java/stirling/software/SPDF/config/ExternalAppDepConfig.java index 886244ff45..3a77dd08ea 100644 --- a/src/main/java/stirling/software/SPDF/config/ExternalAppDepConfig.java +++ b/src/main/java/stirling/software/SPDF/config/ExternalAppDepConfig.java @@ -9,6 +9,7 @@ import java.util.stream.Collectors; import org.springframework.context.annotation.Configuration; import jakarta.annotation.PostConstruct; + import lombok.extern.slf4j.Slf4j; @Configuration @@ -16,21 +17,29 @@ import lombok.extern.slf4j.Slf4j; public class ExternalAppDepConfig { private final EndpointConfiguration endpointConfiguration; - private final Map> commandToGroupMapping = - new HashMap<>() { - { - put("soffice", List.of("LibreOffice")); - put("/opt/venv/bin/weasyprint", List.of("Weasyprint")); - put("pdftohtml", List.of("Pdftohtml")); - put("/opt/venv/bin/unoconvert", List.of("Unoconv")); - put("qpdf", List.of("qpdf")); - put("tesseract", List.of("tesseract")); - } - }; + private final String weasyprintPath; + private final String unoconvPath; + private final Map> commandToGroupMapping; - public ExternalAppDepConfig(EndpointConfiguration endpointConfiguration) { + public ExternalAppDepConfig( + EndpointConfiguration endpointConfiguration, RuntimePathConfig runtimePathConfig) { this.endpointConfiguration = endpointConfiguration; + weasyprintPath = runtimePathConfig.getWeasyPrintPath(); + unoconvPath = runtimePathConfig.getUnoConvertPath(); + + commandToGroupMapping = + new HashMap<>() { + + { + put("soffice", List.of("LibreOffice")); + put(weasyprintPath, List.of("Weasyprint")); + put("pdftohtml", List.of("Pdftohtml")); + put(unoconvPath, List.of("Unoconvert")); + put("qpdf", List.of("qpdf")); + put("tesseract", List.of("tesseract")); + } + }; } private boolean isCommandAvailable(String command) { @@ -101,9 +110,9 @@ public class ExternalAppDepConfig { checkDependencyAndDisableGroup("tesseract"); checkDependencyAndDisableGroup("soffice"); checkDependencyAndDisableGroup("qpdf"); - checkDependencyAndDisableGroup("/opt/venv/bin/weasyprint"); + checkDependencyAndDisableGroup(weasyprintPath); checkDependencyAndDisableGroup("pdftohtml"); - checkDependencyAndDisableGroup("/opt/venv/bin/unoconvert"); + checkDependencyAndDisableGroup(unoconvPath); // Special handling for Python/OpenCV dependencies boolean pythonAvailable = isCommandAvailable("python3") || isCommandAvailable("python"); if (!pythonAvailable) { diff --git a/src/main/java/stirling/software/SPDF/config/InitialSetup.java b/src/main/java/stirling/software/SPDF/config/InitialSetup.java index c8053b6fa3..a533c90a24 100644 --- a/src/main/java/stirling/software/SPDF/config/InitialSetup.java +++ b/src/main/java/stirling/software/SPDF/config/InitialSetup.java @@ -13,7 +13,9 @@ 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; import stirling.software.SPDF.utils.GeneralUtils; diff --git a/src/main/java/stirling/software/SPDF/config/InstallationPathConfig.java b/src/main/java/stirling/software/SPDF/config/InstallationPathConfig.java index 757e9a139b..af6076a97a 100644 --- a/src/main/java/stirling/software/SPDF/config/InstallationPathConfig.java +++ b/src/main/java/stirling/software/SPDF/config/InstallationPathConfig.java @@ -11,7 +11,6 @@ public class InstallationPathConfig { // Root paths private static final String LOG_PATH; private static final String CONFIG_PATH; - private static final String PIPELINE_PATH; private static final String CUSTOM_FILES_PATH; private static final String CLIENT_WEBUI_PATH; @@ -19,11 +18,6 @@ public class InstallationPathConfig { private static final String SETTINGS_PATH; private static final String CUSTOM_SETTINGS_PATH; - // Pipeline paths - private static final String PIPELINE_WATCHED_FOLDERS_PATH; - private static final String PIPELINE_FINISHED_FOLDERS_PATH; - private static final String PIPELINE_DEFAULT_WEB_UI_CONFIGS; - // Custom file paths private static final String STATIC_PATH; private static final String TEMPLATES_PATH; @@ -35,7 +29,6 @@ public class InstallationPathConfig { // Initialize root paths LOG_PATH = BASE_PATH + "logs" + File.separator; CONFIG_PATH = BASE_PATH + "configs" + File.separator; - PIPELINE_PATH = BASE_PATH + "pipeline" + File.separator; CUSTOM_FILES_PATH = BASE_PATH + "customFiles" + File.separator; CLIENT_WEBUI_PATH = BASE_PATH + "clientWebUI" + File.separator; @@ -43,11 +36,6 @@ public class InstallationPathConfig { SETTINGS_PATH = CONFIG_PATH + "settings.yml"; CUSTOM_SETTINGS_PATH = CONFIG_PATH + "custom_settings.yml"; - // Initialize pipeline paths - PIPELINE_WATCHED_FOLDERS_PATH = PIPELINE_PATH + "watchedFolders" + File.separator; - PIPELINE_FINISHED_FOLDERS_PATH = PIPELINE_PATH + "finishedFolders" + File.separator; - PIPELINE_DEFAULT_WEB_UI_CONFIGS = PIPELINE_PATH + "defaultWebUIConfigs" + File.separator; - // Initialize custom file paths STATIC_PATH = CUSTOM_FILES_PATH + "static" + File.separator; TEMPLATES_PATH = CUSTOM_FILES_PATH + "templates" + File.separator; @@ -92,10 +80,6 @@ public class InstallationPathConfig { return CONFIG_PATH; } - public static String getPipelinePath() { - return PIPELINE_PATH; - } - public static String getCustomFilesPath() { return CUSTOM_FILES_PATH; } @@ -112,18 +96,6 @@ public class InstallationPathConfig { return CUSTOM_SETTINGS_PATH; } - public static String getPipelineWatchedFoldersDir() { - return PIPELINE_WATCHED_FOLDERS_PATH; - } - - public static String getPipelineFinishedFoldersDir() { - return PIPELINE_FINISHED_FOLDERS_PATH; - } - - public static String getPipelineDefaultWebUIConfigsDir() { - return PIPELINE_DEFAULT_WEB_UI_CONFIGS; - } - public static String getStaticPath() { return STATIC_PATH; } diff --git a/src/main/java/stirling/software/SPDF/config/MetricsFilter.java b/src/main/java/stirling/software/SPDF/config/MetricsFilter.java index fba1ee9ce0..d187502c8e 100644 --- a/src/main/java/stirling/software/SPDF/config/MetricsFilter.java +++ b/src/main/java/stirling/software/SPDF/config/MetricsFilter.java @@ -14,6 +14,7 @@ import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; + import stirling.software.SPDF.utils.RequestUriUtils; @Component diff --git a/src/main/java/stirling/software/SPDF/config/PostHogConfig.java b/src/main/java/stirling/software/SPDF/config/PostHogConfig.java index fc5ed3084a..4d537112eb 100644 --- a/src/main/java/stirling/software/SPDF/config/PostHogConfig.java +++ b/src/main/java/stirling/software/SPDF/config/PostHogConfig.java @@ -7,6 +7,7 @@ import org.springframework.context.annotation.Configuration; import com.posthog.java.PostHog; import jakarta.annotation.PreDestroy; + import lombok.extern.slf4j.Slf4j; @Configuration diff --git a/src/main/java/stirling/software/SPDF/config/RuntimePathConfig.java b/src/main/java/stirling/software/SPDF/config/RuntimePathConfig.java new file mode 100644 index 0000000000..4172fd33ce --- /dev/null +++ b/src/main/java/stirling/software/SPDF/config/RuntimePathConfig.java @@ -0,0 +1,86 @@ +package stirling.software.SPDF.config; + +import java.io.File; +import java.nio.file.Files; +import java.nio.file.Paths; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.context.annotation.Configuration; + +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; + +import stirling.software.SPDF.model.ApplicationProperties; +import stirling.software.SPDF.model.ApplicationProperties.CustomPaths.Operations; +import stirling.software.SPDF.model.ApplicationProperties.CustomPaths.Pipeline; + +@Slf4j +@Configuration +@Getter +public class RuntimePathConfig { + private final ApplicationProperties properties; + private final String basePath; + private final String weasyPrintPath; + private final String unoConvertPath; + + // Pipeline paths + private final String pipelineWatchedFoldersPath; + private final String pipelineFinishedFoldersPath; + private final String pipelineDefaultWebUiConfigs; + private final String pipelinePath; + + public RuntimePathConfig(ApplicationProperties properties) { + this.properties = properties; + this.basePath = InstallationPathConfig.getPath(); + + String pipelinePath = basePath + "pipeline" + File.separator; + String watchedFoldersPath = pipelinePath + "watchedFolders" + File.separator; + String finishedFoldersPath = pipelinePath + "finishedFolders" + File.separator; + String webUiConfigsPath = pipelinePath + "defaultWebUIConfigs" + File.separator; + + Pipeline pipeline = properties.getSystem().getCustomPaths().getPipeline(); + if (pipeline != null) { + if (!StringUtils.isEmpty(pipeline.getWatchedFoldersDir())) { + watchedFoldersPath = pipeline.getWatchedFoldersDir(); + } + if (!StringUtils.isEmpty(pipeline.getFinishedFoldersDir())) { + finishedFoldersPath = pipeline.getFinishedFoldersDir(); + } + if (!StringUtils.isEmpty(pipeline.getWebUIConfigsDir())) { + webUiConfigsPath = pipeline.getWebUIConfigsDir(); + } + } + + this.pipelinePath = pipelinePath; + this.pipelineWatchedFoldersPath = watchedFoldersPath; + this.pipelineFinishedFoldersPath = finishedFoldersPath; + this.pipelineDefaultWebUiConfigs = webUiConfigsPath; + + boolean isDocker = isRunningInDocker(); + + // Initialize Operation paths + String weasyPrintPath = isDocker ? "/opt/venv/bin/weasyprint" : "weasyprint"; + String unoConvertPath = isDocker ? "/opt/venv/bin/unoconvert" : "unoconvert"; + + + // Check for custom operation paths + Operations operations = properties.getSystem().getCustomPaths().getOperations(); + if (operations != null) { + if (!StringUtils.isEmpty(operations.getWeasyprint())) { + weasyPrintPath = operations.getWeasyprint(); + } + if (!StringUtils.isEmpty(operations.getUnoconvert())) { + unoConvertPath = operations.getUnoconvert(); + } + } + + // Assign operations final fields + this.weasyPrintPath = weasyPrintPath; + this.unoConvertPath = unoConvertPath; + } + + private boolean isRunningInDocker() { + return Files.exists(Paths.get("/.dockerenv")); + } + +} diff --git a/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java b/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java index 23b6dc0d80..1a1e2bc31f 100644 --- a/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java @@ -14,7 +14,9 @@ import org.springframework.security.web.authentication.SimpleUrlAuthenticationFa import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; + import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.User; @Slf4j diff --git a/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationSuccessHandler.java b/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationSuccessHandler.java index 61d5a3ce8f..9784a99cde 100644 --- a/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationSuccessHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationSuccessHandler.java @@ -10,7 +10,9 @@ import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; + import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.utils.RequestUriUtils; @Slf4j diff --git a/src/main/java/stirling/software/SPDF/config/security/CustomLogoutSuccessHandler.java b/src/main/java/stirling/software/SPDF/config/security/CustomLogoutSuccessHandler.java index ffeb8d08ca..88260ea5b0 100644 --- a/src/main/java/stirling/software/SPDF/config/security/CustomLogoutSuccessHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/CustomLogoutSuccessHandler.java @@ -18,8 +18,10 @@ import com.coveo.saml.SamlClient; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; + import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.SPDFApplication; import stirling.software.SPDF.config.security.saml2.CertificateUtils; import stirling.software.SPDF.config.security.saml2.CustomSaml2AuthenticatedPrincipal; diff --git a/src/main/java/stirling/software/SPDF/config/security/FirstLoginFilter.java b/src/main/java/stirling/software/SPDF/config/security/FirstLoginFilter.java index ee1a5f489d..a11eba7f0c 100644 --- a/src/main/java/stirling/software/SPDF/config/security/FirstLoginFilter.java +++ b/src/main/java/stirling/software/SPDF/config/security/FirstLoginFilter.java @@ -16,7 +16,9 @@ import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; + import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.User; import stirling.software.SPDF.utils.RequestUriUtils; diff --git a/src/main/java/stirling/software/SPDF/config/security/IPRateLimitingFilter.java b/src/main/java/stirling/software/SPDF/config/security/IPRateLimitingFilter.java index 02ac582ab0..3599a833f4 100644 --- a/src/main/java/stirling/software/SPDF/config/security/IPRateLimitingFilter.java +++ b/src/main/java/stirling/software/SPDF/config/security/IPRateLimitingFilter.java @@ -6,6 +6,7 @@ import java.util.concurrent.atomic.AtomicInteger; import jakarta.servlet.*; import jakarta.servlet.http.HttpServletRequest; + import stirling.software.SPDF.utils.RequestUriUtils; public class IPRateLimitingFilter implements Filter { diff --git a/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java b/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java index c521d2caf6..432e2d2fc6 100644 --- a/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java +++ b/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java @@ -6,7 +6,9 @@ import java.util.UUID; import org.springframework.stereotype.Component; import jakarta.annotation.PostConstruct; + import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.interfaces.DatabaseInterface; import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.Role; diff --git a/src/main/java/stirling/software/SPDF/config/security/LoginAttemptService.java b/src/main/java/stirling/software/SPDF/config/security/LoginAttemptService.java index 088800d54e..f036acfd48 100644 --- a/src/main/java/stirling/software/SPDF/config/security/LoginAttemptService.java +++ b/src/main/java/stirling/software/SPDF/config/security/LoginAttemptService.java @@ -6,7 +6,9 @@ import java.util.concurrent.TimeUnit; import org.springframework.stereotype.Service; import jakarta.annotation.PostConstruct; + import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.AttemptCounter; diff --git a/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java b/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java index 7fbc44369f..d140f7492f 100644 --- a/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java +++ b/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java @@ -29,6 +29,7 @@ import org.springframework.security.web.savedrequest.NullRequestCache; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.security.oauth2.CustomOAuth2AuthenticationFailureHandler; import stirling.software.SPDF.config.security.oauth2.CustomOAuth2AuthenticationSuccessHandler; import stirling.software.SPDF.config.security.oauth2.CustomOAuth2UserService; diff --git a/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java b/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java index be425590e8..6f51d3d329 100644 --- a/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java +++ b/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java @@ -22,7 +22,9 @@ import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; + import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.security.saml2.CustomSaml2AuthenticatedPrincipal; import stirling.software.SPDF.config.security.session.SessionPersistentRegistry; import stirling.software.SPDF.model.ApiKeyAuthenticationToken; diff --git a/src/main/java/stirling/software/SPDF/config/security/UserBasedRateLimitingFilter.java b/src/main/java/stirling/software/SPDF/config/security/UserBasedRateLimitingFilter.java index 13573349fe..1c725c9f2a 100644 --- a/src/main/java/stirling/software/SPDF/config/security/UserBasedRateLimitingFilter.java +++ b/src/main/java/stirling/software/SPDF/config/security/UserBasedRateLimitingFilter.java @@ -23,6 +23,7 @@ import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; + import stirling.software.SPDF.model.Role; @Component diff --git a/src/main/java/stirling/software/SPDF/config/security/UserService.java b/src/main/java/stirling/software/SPDF/config/security/UserService.java index 1c8866d508..a45019bcaf 100644 --- a/src/main/java/stirling/software/SPDF/config/security/UserService.java +++ b/src/main/java/stirling/software/SPDF/config/security/UserService.java @@ -21,6 +21,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.interfaces.DatabaseInterface; import stirling.software.SPDF.config.security.saml2.CustomSaml2AuthenticatedPrincipal; import stirling.software.SPDF.config.security.session.SessionPersistentRegistry; @@ -139,8 +140,8 @@ public class UserService implements UserServiceInterface { User user = findByUsernameIgnoreCase(username) .orElseThrow(() -> new UsernameNotFoundException("User not found")); - if(user.getApiKey() == null || user.getApiKey().length() == 0) { - user = addApiKeyToUser(username); + if (user.getApiKey() == null || user.getApiKey().length() == 0) { + user = addApiKeyToUser(username); } return user.getApiKey(); } diff --git a/src/main/java/stirling/software/SPDF/config/security/database/DatabaseConfig.java b/src/main/java/stirling/software/SPDF/config/security/database/DatabaseConfig.java index 32856d0e54..d2b301c010 100644 --- a/src/main/java/stirling/software/SPDF/config/security/database/DatabaseConfig.java +++ b/src/main/java/stirling/software/SPDF/config/security/database/DatabaseConfig.java @@ -11,6 +11,7 @@ import org.springframework.context.annotation.Configuration; import lombok.Getter; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.InstallationPathConfig; import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.provider.UnsupportedProviderException; diff --git a/src/main/java/stirling/software/SPDF/config/security/database/DatabaseService.java b/src/main/java/stirling/software/SPDF/config/security/database/DatabaseService.java index adece75d90..a8daede36d 100644 --- a/src/main/java/stirling/software/SPDF/config/security/database/DatabaseService.java +++ b/src/main/java/stirling/software/SPDF/config/security/database/DatabaseService.java @@ -26,6 +26,7 @@ import org.springframework.jdbc.datasource.init.ScriptException; import org.springframework.stereotype.Service; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.InstallationPathConfig; import stirling.software.SPDF.config.interfaces.DatabaseInterface; import stirling.software.SPDF.model.ApplicationProperties; diff --git a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationFailureHandler.java b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationFailureHandler.java index 88905f7641..79ea7bfc65 100644 --- a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationFailureHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationFailureHandler.java @@ -13,6 +13,7 @@ import org.springframework.security.web.authentication.SimpleUrlAuthenticationFa import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; + import lombok.extern.slf4j.Slf4j; @Slf4j diff --git a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationSuccessHandler.java b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationSuccessHandler.java index ef4ac32477..8c40137ce2 100644 --- a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationSuccessHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationSuccessHandler.java @@ -14,6 +14,7 @@ import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; + import stirling.software.SPDF.config.security.LoginAttemptService; import stirling.software.SPDF.config.security.UserService; import stirling.software.SPDF.model.ApplicationProperties; diff --git a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2UserService.java b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2UserService.java index 5b2fb99427..2c683b387d 100644 --- a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2UserService.java +++ b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2UserService.java @@ -12,6 +12,7 @@ import org.springframework.security.oauth2.core.oidc.user.DefaultOidcUser; import org.springframework.security.oauth2.core.oidc.user.OidcUser; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.security.LoginAttemptService; import stirling.software.SPDF.config.security.UserService; import stirling.software.SPDF.model.ApplicationProperties; diff --git a/src/main/java/stirling/software/SPDF/config/security/oauth2/OAuth2Configuration.java b/src/main/java/stirling/software/SPDF/config/security/oauth2/OAuth2Configuration.java index b7571796c0..454af5255d 100644 --- a/src/main/java/stirling/software/SPDF/config/security/oauth2/OAuth2Configuration.java +++ b/src/main/java/stirling/software/SPDF/config/security/oauth2/OAuth2Configuration.java @@ -20,6 +20,7 @@ import org.springframework.security.oauth2.client.registration.InMemoryClientReg import org.springframework.security.oauth2.core.user.OAuth2UserAuthority; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.security.UserService; import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.ApplicationProperties.Security.OAUTH2; diff --git a/src/main/java/stirling/software/SPDF/config/security/saml2/CustomSaml2AuthenticationFailureHandler.java b/src/main/java/stirling/software/SPDF/config/security/saml2/CustomSaml2AuthenticationFailureHandler.java index 3b652d3588..32bc25db63 100644 --- a/src/main/java/stirling/software/SPDF/config/security/saml2/CustomSaml2AuthenticationFailureHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/saml2/CustomSaml2AuthenticationFailureHandler.java @@ -11,6 +11,7 @@ import org.springframework.security.web.authentication.SimpleUrlAuthenticationFa import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; + import lombok.extern.slf4j.Slf4j; @Slf4j diff --git a/src/main/java/stirling/software/SPDF/config/security/saml2/CustomSaml2AuthenticationSuccessHandler.java b/src/main/java/stirling/software/SPDF/config/security/saml2/CustomSaml2AuthenticationSuccessHandler.java index c6c64a8248..0f88932398 100644 --- a/src/main/java/stirling/software/SPDF/config/security/saml2/CustomSaml2AuthenticationSuccessHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/saml2/CustomSaml2AuthenticationSuccessHandler.java @@ -12,8 +12,10 @@ import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; + import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.security.LoginAttemptService; import stirling.software.SPDF.config.security.UserService; import stirling.software.SPDF.model.ApplicationProperties; diff --git a/src/main/java/stirling/software/SPDF/config/security/saml2/CustomSaml2ResponseAuthenticationConverter.java b/src/main/java/stirling/software/SPDF/config/security/saml2/CustomSaml2ResponseAuthenticationConverter.java index 6c56a2c578..47a89414d4 100644 --- a/src/main/java/stirling/software/SPDF/config/security/saml2/CustomSaml2ResponseAuthenticationConverter.java +++ b/src/main/java/stirling/software/SPDF/config/security/saml2/CustomSaml2ResponseAuthenticationConverter.java @@ -13,6 +13,7 @@ import org.springframework.security.saml2.provider.service.authentication.OpenSa import org.springframework.security.saml2.provider.service.authentication.Saml2Authentication; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.security.UserService; import stirling.software.SPDF.model.User; diff --git a/src/main/java/stirling/software/SPDF/config/security/saml2/SAML2Configuration.java b/src/main/java/stirling/software/SPDF/config/security/saml2/SAML2Configuration.java index 0e4b83d114..bc72df7ad7 100644 --- a/src/main/java/stirling/software/SPDF/config/security/saml2/SAML2Configuration.java +++ b/src/main/java/stirling/software/SPDF/config/security/saml2/SAML2Configuration.java @@ -18,7 +18,9 @@ import org.springframework.security.saml2.provider.service.registration.Saml2Mes import org.springframework.security.saml2.provider.service.web.authentication.OpenSaml4AuthenticationRequestResolver; import jakarta.servlet.http.HttpServletRequest; + import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.ApplicationProperties.Security.SAML2; diff --git a/src/main/java/stirling/software/SPDF/config/security/session/CustomHttpSessionListener.java b/src/main/java/stirling/software/SPDF/config/security/session/CustomHttpSessionListener.java index 305684b94a..3d97181ab9 100644 --- a/src/main/java/stirling/software/SPDF/config/security/session/CustomHttpSessionListener.java +++ b/src/main/java/stirling/software/SPDF/config/security/session/CustomHttpSessionListener.java @@ -5,6 +5,7 @@ import org.springframework.stereotype.Component; import jakarta.servlet.http.HttpSessionEvent; import jakarta.servlet.http.HttpSessionListener; + import lombok.extern.slf4j.Slf4j; @Component diff --git a/src/main/java/stirling/software/SPDF/config/security/session/SessionPersistentRegistry.java b/src/main/java/stirling/software/SPDF/config/security/session/SessionPersistentRegistry.java index 4c931e0148..3c9ea74dc3 100644 --- a/src/main/java/stirling/software/SPDF/config/security/session/SessionPersistentRegistry.java +++ b/src/main/java/stirling/software/SPDF/config/security/session/SessionPersistentRegistry.java @@ -11,6 +11,7 @@ import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.stereotype.Component; import jakarta.transaction.Transactional; + import stirling.software.SPDF.config.security.saml2.CustomSaml2AuthenticatedPrincipal; import stirling.software.SPDF.model.SessionEntity; diff --git a/src/main/java/stirling/software/SPDF/config/security/session/SessionRepository.java b/src/main/java/stirling/software/SPDF/config/security/session/SessionRepository.java index 0cc875a21e..b7f0133f33 100644 --- a/src/main/java/stirling/software/SPDF/config/security/session/SessionRepository.java +++ b/src/main/java/stirling/software/SPDF/config/security/session/SessionRepository.java @@ -10,6 +10,7 @@ import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import jakarta.transaction.Transactional; + import stirling.software.SPDF.model.SessionEntity; @Repository diff --git a/src/main/java/stirling/software/SPDF/controller/api/AdditionalLanguageJsController.java b/src/main/java/stirling/software/SPDF/controller/api/AdditionalLanguageJsController.java index fbd568cb64..8475d1f20c 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/AdditionalLanguageJsController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/AdditionalLanguageJsController.java @@ -13,6 +13,7 @@ import org.springframework.web.bind.annotation.RestController; import io.swagger.v3.oas.annotations.Hidden; import jakarta.servlet.http.HttpServletResponse; + import stirling.software.SPDF.service.LanguageService; @RestController diff --git a/src/main/java/stirling/software/SPDF/controller/api/DatabaseController.java b/src/main/java/stirling/software/SPDF/controller/api/DatabaseController.java index 0c7e7160e4..79138721c6 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/DatabaseController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/DatabaseController.java @@ -25,6 +25,7 @@ import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.security.database.DatabaseService; @Slf4j diff --git a/src/main/java/stirling/software/SPDF/controller/api/MergeController.java b/src/main/java/stirling/software/SPDF/controller/api/MergeController.java index b5d2cdc62f..3a71dec982 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/MergeController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/MergeController.java @@ -32,6 +32,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.general.MergePdfsRequest; import stirling.software.SPDF.service.CustomPDDocumentFactory; import stirling.software.SPDF.utils.GeneralUtils; diff --git a/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java b/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java index 35f6cf07f8..6b04ee7715 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java @@ -21,6 +21,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.SortTypes; import stirling.software.SPDF.model.api.PDFWithPageNums; import stirling.software.SPDF.model.api.general.RearrangePagesRequest; diff --git a/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java b/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java index ef6dc9a324..00776bb816 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java @@ -27,6 +27,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.PDFWithPageNums; import stirling.software.SPDF.service.CustomPDDocumentFactory; import stirling.software.SPDF.utils.WebResponseUtils; diff --git a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfByChaptersController.java b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfByChaptersController.java index e3bb9d35d4..3d7af36503 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfByChaptersController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfByChaptersController.java @@ -31,6 +31,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.PdfMetadata; import stirling.software.SPDF.model.api.SplitPdfByChaptersRequest; import stirling.software.SPDF.service.PdfMetadataService; diff --git a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java index 97e42dca91..ee7de3792e 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java @@ -24,6 +24,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.general.SplitPdfBySizeOrCountRequest; import stirling.software.SPDF.service.CustomPDDocumentFactory; import stirling.software.SPDF.utils.GeneralUtils; diff --git a/src/main/java/stirling/software/SPDF/controller/api/UserController.java b/src/main/java/stirling/software/SPDF/controller/api/UserController.java index f2534aadaf..3e37a8ed8c 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/UserController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/UserController.java @@ -26,7 +26,9 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; + import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.security.UserService; import stirling.software.SPDF.config.security.saml2.CustomSaml2AuthenticatedPrincipal; import stirling.software.SPDF.config.security.session.SessionPersistentRegistry; diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertBookToPDFController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertBookToPDFController.java deleted file mode 100644 index 778aab0473..0000000000 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertBookToPDFController.java +++ /dev/null @@ -1,77 +0,0 @@ -package stirling.software.SPDF.controller.api.converters; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.multipart.MultipartFile; - -import io.github.pixee.security.Filenames; -import io.swagger.v3.oas.annotations.Operation; - -import stirling.software.SPDF.model.api.GeneralFile; -import stirling.software.SPDF.service.CustomPDDocumentFactory; -import stirling.software.SPDF.utils.FileToPdf; -import stirling.software.SPDF.utils.WebResponseUtils; - -// @RestController -// @Tag(name = "Convert", description = "Convert APIs") -// @RequestMapping("/api/v1/convert") -public class ConvertBookToPDFController { - - private final boolean bookAndHtmlFormatsInstalled; - - private final CustomPDDocumentFactory pdfDocumentFactory; - - @Autowired - public ConvertBookToPDFController( - CustomPDDocumentFactory pdfDocumentFactory, - @Qualifier("bookAndHtmlFormatsInstalled") boolean bookAndHtmlFormatsInstalled) { - this.pdfDocumentFactory = pdfDocumentFactory; - this.bookAndHtmlFormatsInstalled = bookAndHtmlFormatsInstalled; - } - - @PostMapping(consumes = "multipart/form-data", value = "/book/pdf") - @Operation( - summary = - "Convert a BOOK/comic (*.epub | *.mobi | *.azw3 | *.fb2 | *.txt | *.docx) to PDF", - description = - "(Requires bookAndHtmlFormatsInstalled flag and Calibre installed) This endpoint takes an BOOK/comic (*.epub | *.mobi | *.azw3 | *.fb2 | *.txt | *.docx) input and converts it to PDF format.") - public ResponseEntity HtmlToPdf(@ModelAttribute GeneralFile request) throws Exception { - MultipartFile fileInput = request.getFileInput(); - - if (!bookAndHtmlFormatsInstalled) { - throw new IllegalArgumentException( - "bookAndHtmlFormatsInstalled flag is False, this functionality is not available"); - } - - if (fileInput == null) { - throw new IllegalArgumentException("Please provide a file for conversion."); - } - - String originalFilename = Filenames.toSimpleFileName(fileInput.getOriginalFilename()); - - if (originalFilename != null) { - String originalFilenameLower = originalFilename.toLowerCase(); - if (!originalFilenameLower.endsWith(".epub") - && !originalFilenameLower.endsWith(".mobi") - && !originalFilenameLower.endsWith(".azw3") - && !originalFilenameLower.endsWith(".fb2") - && !originalFilenameLower.endsWith(".txt") - && !originalFilenameLower.endsWith(".docx")) { - throw new IllegalArgumentException( - "File must be in .epub, .mobi, .azw3, .fb2, .txt, or .docx format."); - } - } - byte[] pdfBytes = FileToPdf.convertBookTypeToPdf(fileInput.getBytes(), originalFilename); - - pdfBytes = pdfDocumentFactory.createNewBytesBasedOnOldDocument(pdfBytes); - - String outputFilename = - originalFilename.replaceFirst("[.][^.]+$", "") - + ".pdf"; // Remove file extension and append .pdf - - return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename); - } -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java index bdc3dd74de..cd68798bbc 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java @@ -1,7 +1,6 @@ package stirling.software.SPDF.controller.api.converters; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -13,6 +12,7 @@ import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.config.RuntimePathConfig; import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.api.converters.HTMLToPdfRequest; import stirling.software.SPDF.service.CustomPDDocumentFactory; @@ -24,20 +24,21 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RequestMapping("/api/v1/convert") public class ConvertHtmlToPDF { - private final boolean bookAndHtmlFormatsInstalled; - private final CustomPDDocumentFactory pdfDocumentFactory; private final ApplicationProperties applicationProperties; + private final RuntimePathConfig runtimePathConfig; + @Autowired public ConvertHtmlToPDF( CustomPDDocumentFactory pdfDocumentFactory, - @Qualifier("bookAndHtmlFormatsInstalled") boolean bookAndHtmlFormatsInstalled, - ApplicationProperties applicationProperties) { + ApplicationProperties applicationProperties, + RuntimePathConfig runtimePathConfig) { this.pdfDocumentFactory = pdfDocumentFactory; - this.bookAndHtmlFormatsInstalled = bookAndHtmlFormatsInstalled; + this.applicationProperties = applicationProperties; + this.runtimePathConfig = runtimePathConfig; } @PostMapping(consumes = "multipart/form-data", value = "/html/pdf") @@ -65,10 +66,10 @@ public class ConvertHtmlToPDF { byte[] pdfBytes = FileToPdf.convertHtmlToPdf( + runtimePathConfig.getWeasyPrintPath(), request, fileInput.getBytes(), originalFilename, - bookAndHtmlFormatsInstalled, disableSanitize); pdfBytes = pdfDocumentFactory.createNewBytesBasedOnOldDocument(pdfBytes); diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java index 7bdf7534fb..104ed0fa61 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java @@ -31,6 +31,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.converters.ConvertToImageRequest; import stirling.software.SPDF.model.api.converters.ConvertToPdfRequest; import stirling.software.SPDF.service.CustomPDDocumentFactory; diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java index b1bee1056e..121539778c 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java @@ -11,7 +11,6 @@ import org.commonmark.parser.Parser; import org.commonmark.renderer.html.AttributeProvider; import org.commonmark.renderer.html.HtmlRenderer; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -23,6 +22,7 @@ import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.config.RuntimePathConfig; import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.api.GeneralFile; import stirling.software.SPDF.service.CustomPDDocumentFactory; @@ -34,20 +34,20 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RequestMapping("/api/v1/convert") public class ConvertMarkdownToPdf { - private final boolean bookAndHtmlFormatsInstalled; - private final CustomPDDocumentFactory pdfDocumentFactory; private final ApplicationProperties applicationProperties; + private final RuntimePathConfig runtimePathConfig; @Autowired public ConvertMarkdownToPdf( CustomPDDocumentFactory pdfDocumentFactory, - @Qualifier("bookAndHtmlFormatsInstalled") boolean bookAndHtmlFormatsInstalled, - ApplicationProperties applicationProperties) { + ApplicationProperties applicationProperties, + RuntimePathConfig runtimePathConfig) { this.pdfDocumentFactory = pdfDocumentFactory; - this.bookAndHtmlFormatsInstalled = bookAndHtmlFormatsInstalled; + this.applicationProperties = applicationProperties; + this.runtimePathConfig = runtimePathConfig; } @PostMapping(consumes = "multipart/form-data", value = "/markdown/pdf") @@ -86,10 +86,10 @@ public class ConvertMarkdownToPdf { byte[] pdfBytes = FileToPdf.convertHtmlToPdf( + runtimePathConfig.getWeasyPrintPath(), null, htmlContent.getBytes(), "converted.html", - bookAndHtmlFormatsInstalled, disableSanitize); pdfBytes = pdfDocumentFactory.createNewBytesBasedOnOldDocument(pdfBytes); String outputFilename = diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java index b7bb699c5e..4cdfd1bdf7 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java @@ -22,6 +22,7 @@ import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.config.RuntimePathConfig; import stirling.software.SPDF.model.api.GeneralFile; import stirling.software.SPDF.service.CustomPDDocumentFactory; import stirling.software.SPDF.utils.ProcessExecutor; @@ -34,10 +35,13 @@ import stirling.software.SPDF.utils.WebResponseUtils; public class ConvertOfficeController { private final CustomPDDocumentFactory pdfDocumentFactory; + private final RuntimePathConfig runtimePathConfig; @Autowired - public ConvertOfficeController(CustomPDDocumentFactory pdfDocumentFactory) { + public ConvertOfficeController( + CustomPDDocumentFactory pdfDocumentFactory, RuntimePathConfig runtimePathConfig) { this.pdfDocumentFactory = pdfDocumentFactory; + this.runtimePathConfig = runtimePathConfig; } public File convertToPdf(MultipartFile inputFile) throws IOException, InterruptedException { @@ -61,7 +65,7 @@ public class ConvertOfficeController { List command = new ArrayList<>( Arrays.asList( - "/opt/venv/bin/unoconvert", + runtimePathConfig.getUnoConvertPath(), "--port", "2003", "--convert-to", diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToBookController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToBookController.java deleted file mode 100644 index 1816697243..0000000000 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToBookController.java +++ /dev/null @@ -1,95 +0,0 @@ -package stirling.software.SPDF.controller.api.converters; - -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.multipart.MultipartFile; - -import io.github.pixee.security.Filenames; -import io.swagger.v3.oas.annotations.Operation; - -import stirling.software.SPDF.model.api.converters.PdfToBookRequest; -import stirling.software.SPDF.utils.ProcessExecutor; -import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; -import stirling.software.SPDF.utils.WebResponseUtils; - -// @RestController -// @Tag(name = "Convert", description = "Convert APIs") -// @RequestMapping("/api/v1/convert") -public class ConvertPDFToBookController { - - @Qualifier("bookAndHtmlFormatsInstalled") - private final boolean bookAndHtmlFormatsInstalled; - - public ConvertPDFToBookController( - @Qualifier("bookAndHtmlFormatsInstalled") boolean bookAndHtmlFormatsInstalled) { - this.bookAndHtmlFormatsInstalled = bookAndHtmlFormatsInstalled; - } - - @PostMapping(consumes = "multipart/form-data", value = "/pdf/book") - @Operation( - summary = - "Convert a PDF to a Book/comic (*.epub | *.mobi | *.azw3 | *.fb2 | *.txt | *.docx .. (others to include by chatgpt) to PDF", - description = - "(Requires bookAndHtmlFormatsInstalled flag and Calibre installed) This endpoint Convert a PDF to a Book/comic (*.epub | *.mobi | *.azw3 | *.fb2 | *.txt | *.docx .. (others to include by chatgpt) to PDF") - public ResponseEntity HtmlToPdf(@ModelAttribute PdfToBookRequest request) - throws Exception { - MultipartFile fileInput = request.getFileInput(); - if (!bookAndHtmlFormatsInstalled) { - throw new IllegalArgumentException( - "bookAndHtmlFormatsInstalled flag is False, this functionality is not available"); - } - if (fileInput == null) { - throw new IllegalArgumentException("Please provide a file for conversion."); - } - // Validate the output format - String outputFormat = request.getOutputFormat().toLowerCase(); - List allowedFormats = - Arrays.asList( - "epub", "mobi", "azw3", "docx", "rtf", "txt", "html", "lit", "fb2", "pdb", - "lrf"); - if (!allowedFormats.contains(outputFormat)) { - throw new IllegalArgumentException("Invalid output format: " + outputFormat); - } - byte[] outputFileBytes; - List command = new ArrayList<>(); - Path tempOutputFile = - Files.createTempFile( - "output_", // Use the output format for the file extension - "." + outputFormat); - Path tempInputFile = null; - try { - // Create temp input file from the provided PDF - // Assuming input is always PDF - tempInputFile = Files.createTempFile("input_", ".pdf"); - Files.write(tempInputFile, fileInput.getBytes()); - command.add("ebook-convert"); - command.add(tempInputFile.toString()); - command.add(tempOutputFile.toString()); - ProcessExecutorResult returnCode = - ProcessExecutor.getInstance(ProcessExecutor.Processes.CALIBRE) - .runCommandWithOutputHandling(command); - outputFileBytes = Files.readAllBytes(tempOutputFile); - } finally { - // Clean up temporary files - if (tempInputFile != null) { - Files.deleteIfExists(tempInputFile); - } - Files.deleteIfExists(tempOutputFile); - } - String outputFilename = - Filenames.toSimpleFileName(fileInput.getOriginalFilename()) - .replaceFirst("[.][^.]+$", "") - + "." - + // Remove file extension and append .pdf - outputFormat; - return WebResponseUtils.bytesToWebResponse(outputFileBytes, outputFilename); - } -} diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java index 69c4270168..25c0a213e8 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java @@ -21,6 +21,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.converters.PdfToPdfARequest; import stirling.software.SPDF.utils.ProcessExecutor; import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java index dccc4dffe7..6c9f93fc78 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java @@ -18,6 +18,8 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + +import stirling.software.SPDF.config.RuntimePathConfig; import stirling.software.SPDF.model.api.converters.UrlToPdfRequest; import stirling.software.SPDF.service.CustomPDDocumentFactory; import stirling.software.SPDF.utils.GeneralUtils; @@ -32,10 +34,13 @@ import stirling.software.SPDF.utils.WebResponseUtils; public class ConvertWebsiteToPDF { private final CustomPDDocumentFactory pdfDocumentFactory; + private final RuntimePathConfig runtimePathConfig; @Autowired - public ConvertWebsiteToPDF(CustomPDDocumentFactory pdfDocumentFactory) { + public ConvertWebsiteToPDF( + CustomPDDocumentFactory pdfDocumentFactory, RuntimePathConfig runtimePathConfig) { this.pdfDocumentFactory = pdfDocumentFactory; + this.runtimePathConfig = runtimePathConfig; } @PostMapping(consumes = "multipart/form-data", value = "/url/pdf") @@ -65,7 +70,7 @@ public class ConvertWebsiteToPDF { // Prepare the WeasyPrint command List command = new ArrayList<>(); - command.add("/opt/venv/bin/weasyprint"); + command.add(runtimePathConfig.getWeasyPrintPath()); command.add(URL); command.add(tempOutputFile.toString()); diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractCSVController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractCSVController.java index 7f8e708781..d88bb02d64 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractCSVController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractCSVController.java @@ -25,9 +25,12 @@ import org.springframework.web.bind.annotation.RestController; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; + import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.PDFWithPageNums; import stirling.software.SPDF.pdf.FlexibleCSVWriter; + import technology.tabula.ObjectExtractor; import technology.tabula.Page; import technology.tabula.Table; @@ -51,22 +54,20 @@ public class ExtractCSVController { try (PDDocument document = Loader.loadPDF(form.getFileInput().getBytes())) { List pages = form.getPageNumbersList(document, true); SpreadsheetExtractionAlgorithm sea = new SpreadsheetExtractionAlgorithm(); - CSVFormat format = CSVFormat.EXCEL.builder() - .setEscape('"') - .setQuoteMode(QuoteMode.ALL) - .build(); + CSVFormat format = + CSVFormat.EXCEL.builder().setEscape('"').setQuoteMode(QuoteMode.ALL).build(); for (int pageNum : pages) { try (ObjectExtractor extractor = new ObjectExtractor(document)) { - log.info("{}",pageNum); + log.info("{}", pageNum); Page page = extractor.extract(pageNum); List tables = sea.extract(page); - + for (int i = 0; i < tables.size(); i++) { StringWriter sw = new StringWriter(); FlexibleCSVWriter csvWriter = new FlexibleCSVWriter(format); - csvWriter.write(sw, Collections.singletonList(tables.get(i))); - + csvWriter.write(sw, Collections.singletonList(tables.get(i))); + String entryName = generateEntryName(baseName, pageNum, i + 1); csvEntries.add(new CsvEntry(entryName, sw.toString())); } @@ -83,7 +84,8 @@ public class ExtractCSVController { } } - private ResponseEntity createZipResponse(List entries, String baseName) throws IOException { + private ResponseEntity createZipResponse(List entries, String baseName) + throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); try (ZipOutputStream zipOut = new ZipOutputStream(baos)) { for (CsvEntry entry : entries) { @@ -93,21 +95,25 @@ public class ExtractCSVController { zipOut.closeEntry(); } } - + HttpHeaders headers = new HttpHeaders(); - headers.setContentDisposition(ContentDisposition.builder("attachment") - .filename(baseName + "_extracted.zip").build()); + headers.setContentDisposition( + ContentDisposition.builder("attachment") + .filename(baseName + "_extracted.zip") + .build()); headers.setContentType(MediaType.parseMediaType("application/zip")); - + return ResponseEntity.ok().headers(headers).body(baos.toByteArray()); } private ResponseEntity createCsvResponse(CsvEntry entry, String baseName) { HttpHeaders headers = new HttpHeaders(); - headers.setContentDisposition(ContentDisposition.builder("attachment") - .filename(baseName + "_extracted.csv").build()); + headers.setContentDisposition( + ContentDisposition.builder("attachment") + .filename(baseName + "_extracted.csv") + .build()); headers.setContentType(MediaType.parseMediaType("text/csv")); - + return ResponseEntity.ok().headers(headers).body(entry.content()); } diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java index 6625c6f5d0..b85b7fdff2 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java @@ -21,6 +21,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.misc.ExtractHeaderRequest; import stirling.software.SPDF.utils.WebResponseUtils; diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java index d2f850ce92..4700284cb2 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java @@ -33,6 +33,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.misc.AutoSplitPdfRequest; import stirling.software.SPDF.service.CustomPDDocumentFactory; import stirling.software.SPDF.utils.WebResponseUtils; diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java index 1f3407d335..9c84a8e9f1 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java @@ -29,6 +29,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.misc.RemoveBlankPagesRequest; import stirling.software.SPDF.service.CustomPDDocumentFactory; import stirling.software.SPDF.utils.PdfUtils; diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java index 6bcc8003b2..92c4ed42a4 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java @@ -30,6 +30,7 @@ import io.swagger.v3.oas.annotations.parameters.RequestBody; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.misc.ExtractImageScansRequest; import stirling.software.SPDF.utils.CheckProgramInstall; import stirling.software.SPDF.utils.ProcessExecutor; diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java index 1036cda6f6..189b1a7eb3 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java @@ -38,6 +38,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.PDFExtractImagesRequest; import stirling.software.SPDF.utils.ImageProcessingUtils; import stirling.software.SPDF.utils.WebResponseUtils; diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/FlattenController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/FlattenController.java index c1e205ead8..9361e715c6 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/FlattenController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/FlattenController.java @@ -25,6 +25,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.misc.FlattenRequest; import stirling.software.SPDF.service.CustomPDDocumentFactory; import stirling.software.SPDF.utils.WebResponseUtils; diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java index 2eec954713..4ebce31936 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java @@ -21,6 +21,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.misc.MetadataRequest; import stirling.software.SPDF.utils.WebResponseUtils; import stirling.software.SPDF.utils.propertyeditor.StringToMapPropertyEditor; diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java index c8ffe9de5e..44fbb65b5a 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java @@ -30,6 +30,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.api.misc.ProcessPdfWithOcrRequest; import stirling.software.SPDF.service.CustomPDDocumentFactory; diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java index 951515ada6..2814149e84 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java @@ -16,6 +16,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.misc.OverlayImageRequest; import stirling.software.SPDF.service.CustomPDDocumentFactory; import stirling.software.SPDF.utils.PdfUtils; diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/PrintFileController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/PrintFileController.java index 059e70513e..79140c5717 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/PrintFileController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/PrintFileController.java @@ -26,6 +26,7 @@ import org.springframework.web.multipart.MultipartFile; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.misc.PrintFileRequest; @RestController diff --git a/src/main/java/stirling/software/SPDF/controller/api/pipeline/ApiDocService.java b/src/main/java/stirling/software/SPDF/controller/api/pipeline/ApiDocService.java index 12a33051ef..eb7730e3ed 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/pipeline/ApiDocService.java +++ b/src/main/java/stirling/software/SPDF/controller/api/pipeline/ApiDocService.java @@ -19,7 +19,9 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.ServletContext; + import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.SPDFApplication; import stirling.software.SPDF.model.ApiEndpoint; import stirling.software.SPDF.model.Role; diff --git a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineController.java b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineController.java index 2d6dd7b33d..291cd9b45b 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineController.java @@ -24,6 +24,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.PipelineConfig; import stirling.software.SPDF.model.PipelineResult; import stirling.software.SPDF.model.api.HandleDataRequest; diff --git a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineDirectoryProcessor.java b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineDirectoryProcessor.java index 38550c5c68..192bed0e4d 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineDirectoryProcessor.java +++ b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineDirectoryProcessor.java @@ -5,9 +5,14 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.nio.charset.StandardCharsets; +import java.nio.file.FileSystemException; +import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.StandardCopyOption; +import java.nio.file.attribute.BasicFileAttributes; import java.time.LocalDate; import java.time.LocalTime; import java.time.format.DateTimeFormatter; @@ -24,7 +29,8 @@ import org.springframework.stereotype.Service; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; -import stirling.software.SPDF.config.InstallationPathConfig; + +import stirling.software.SPDF.config.RuntimePathConfig; import stirling.software.SPDF.model.PipelineConfig; import stirling.software.SPDF.model.PipelineOperation; import stirling.software.SPDF.model.PipelineResult; @@ -50,18 +56,19 @@ public class PipelineDirectoryProcessor { ObjectMapper objectMapper, ApiDocService apiDocService, PipelineProcessor processor, - FileMonitor fileMonitor) { + FileMonitor fileMonitor, + RuntimePathConfig runtimePathConfig) { this.objectMapper = objectMapper; this.apiDocService = apiDocService; - this.watchedFoldersDir = InstallationPathConfig.getPipelineWatchedFoldersDir(); - this.finishedFoldersDir = InstallationPathConfig.getPipelineFinishedFoldersDir(); + this.watchedFoldersDir = runtimePathConfig.getPipelineWatchedFoldersPath(); + this.finishedFoldersDir = runtimePathConfig.getPipelineFinishedFoldersPath(); this.processor = processor; this.fileMonitor = fileMonitor; } @Scheduled(fixedRate = 60000) public void scanFolders() { - Path watchedFolderPath = Paths.get(watchedFoldersDir); + Path watchedFolderPath = Paths.get(watchedFoldersDir).toAbsolutePath(); if (!Files.exists(watchedFolderPath)) { try { Files.createDirectories(watchedFolderPath); @@ -71,19 +78,33 @@ public class PipelineDirectoryProcessor { return; } } - try (Stream paths = Files.walk(watchedFolderPath)) { - paths.filter(Files::isDirectory) - .forEach( - t -> { - try { - if (!t.equals(watchedFolderPath) && !t.endsWith("processing")) { - handleDirectory(t); - } - } catch (Exception e) { - log.error("Error handling directory: {}", t, e); + + try { + Files.walkFileTree( + watchedFolderPath, + new SimpleFileVisitor<>() { + @Override + public FileVisitResult preVisitDirectory( + Path dir, BasicFileAttributes attrs) { + try { + // Skip root directory and "processing" subdirectories + if (!dir.equals(watchedFolderPath) && !dir.endsWith("processing")) { + handleDirectory(dir); } - }); - } catch (Exception e) { + } catch (Exception e) { + log.error("Error handling directory: {}", dir, e); + } + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult visitFileFailed(Path path, IOException exc) { + // Handle broken symlinks or inaccessible directories + log.error("Error accessing path: {}", path, exc); + return FileVisitResult.CONTINUE; + } + }); + } catch (IOException e) { log.error("Error walking through directory: {}", watchedFolderPath, e); } } @@ -187,6 +208,7 @@ public class PipelineDirectoryProcessor { } return isAllowed; }) + .map(Path::toAbsolutePath) .filter( path -> { boolean isReady = @@ -200,7 +222,10 @@ public class PipelineDirectoryProcessor { }) .map(Path::toFile) .toArray(File[]::new); - log.info("Collected {} files for processing", files.length); + log.info( + "Collected {} files for processing for {}", + files.length, + dir.toAbsolutePath().toString()); return files; } } @@ -210,8 +235,35 @@ public class PipelineDirectoryProcessor { List filesToProcess = new ArrayList<>(); for (File file : files) { Path targetPath = resolveUniqueFilePath(processingDir, file.getName()); - Files.move(file.toPath(), targetPath); - filesToProcess.add(targetPath.toFile()); + + // Retry with exponential backoff + int maxRetries = 3; + int retryDelayMs = 500; + boolean moved = false; + + for (int attempt = 1; attempt <= maxRetries; attempt++) { + try { + Files.move(file.toPath(), targetPath, StandardCopyOption.REPLACE_EXISTING); + moved = true; + break; + } catch (FileSystemException e) { + if (attempt < maxRetries) { + log.info("File move failed (attempt {}), retrying...", attempt); + try { + Thread.sleep(retryDelayMs * (int) Math.pow(2, attempt - 1)); + } catch (InterruptedException e1) { + // TODO Auto-generated catch block + e1.printStackTrace(); + } + } + } + } + + if (moved) { + filesToProcess.add(targetPath.toFile()); + } else { + log.error("Failed to move file after {} attempts: {}", maxRetries, file.getName()); + } } return filesToProcess; } diff --git a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java index 80171f2036..cc533e4cc6 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java +++ b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java @@ -29,7 +29,9 @@ import io.github.pixee.security.Filenames; import io.github.pixee.security.ZipSecurity; import jakarta.servlet.ServletContext; + import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.SPDFApplication; import stirling.software.SPDF.model.PipelineConfig; import stirling.software.SPDF.model.PipelineOperation; diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java b/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java index 68dca8b816..355755996b 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java @@ -66,6 +66,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.security.SignPDFWithCertRequest; import stirling.software.SPDF.service.CustomPDDocumentFactory; import stirling.software.SPDF.utils.WebResponseUtils; diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java b/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java index fc9e862317..b2bcfb5351 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java @@ -60,6 +60,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.PDFFile; import stirling.software.SPDF.utils.WebResponseUtils; diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java b/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java index 19d54b0b7f..71e90c2416 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java @@ -26,6 +26,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.PDFText; import stirling.software.SPDF.model.api.security.ManualRedactPdfRequest; import stirling.software.SPDF.model.api.security.RedactPdfRequest; diff --git a/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java b/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java index 31c39c1fc2..845ad675e5 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java @@ -19,7 +19,9 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; + import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.security.saml2.CustomSaml2AuthenticatedPrincipal; import stirling.software.SPDF.config.security.session.SessionPersistentRegistry; import stirling.software.SPDF.model.*; diff --git a/src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java b/src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java index 0e00afdda5..0307f67a5a 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.web; -import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @@ -15,14 +14,6 @@ import stirling.software.SPDF.utils.CheckProgramInstall; @Tag(name = "Convert", description = "Convert APIs") public class ConverterWebController { - @ConditionalOnExpression("${bookAndHtmlFormatsInstalled}") - @GetMapping("/book-to-pdf") - @Hidden - public String convertBookToPdfForm(Model model) { - model.addAttribute("currentPage", "book-to-pdf"); - return "convert/book-to-pdf"; - } - @GetMapping("/img-to-pdf") @Hidden public String convertImgToPdfForm(Model model) { @@ -67,14 +58,6 @@ public class ConverterWebController { // PDF TO...... - @ConditionalOnExpression("${bookAndHtmlFormatsInstalled}") - @GetMapping("/pdf-to-book") - @Hidden - public String convertPdfToBookForm(Model model) { - model.addAttribute("currentPage", "pdf-to-book"); - return "convert/pdf-to-book"; - } - @GetMapping("/pdf-to-img") @Hidden public String pdfToimgForm(Model model) { diff --git a/src/main/java/stirling/software/SPDF/controller/web/DatabaseWebController.java b/src/main/java/stirling/software/SPDF/controller/web/DatabaseWebController.java index fefb096e3b..c3bd4f2a30 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/DatabaseWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/DatabaseWebController.java @@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.GetMapping; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; + import stirling.software.SPDF.config.security.database.DatabaseService; import stirling.software.SPDF.utils.FileInfo; diff --git a/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java b/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java index 5bfb11b3ad..fb6e43ebc4 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java @@ -25,7 +25,9 @@ import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.InstallationPathConfig; +import stirling.software.SPDF.config.RuntimePathConfig; import stirling.software.SPDF.controller.api.pipeline.UserServiceInterface; import stirling.software.SPDF.model.SignatureFile; import stirling.software.SPDF.service.SignatureService; @@ -38,14 +40,17 @@ public class GeneralWebController { private final SignatureService signatureService; private final UserServiceInterface userService; private final ResourceLoader resourceLoader; + private final RuntimePathConfig runtimePathConfig; public GeneralWebController( SignatureService signatureService, @Autowired(required = false) UserServiceInterface userService, - ResourceLoader resourceLoader) { + ResourceLoader resourceLoader, + RuntimePathConfig runtimePathConfig) { this.signatureService = signatureService; this.userService = userService; this.resourceLoader = resourceLoader; + this.runtimePathConfig = runtimePathConfig; } @GetMapping("/pipeline") @@ -54,11 +59,9 @@ public class GeneralWebController { model.addAttribute("currentPage", "pipeline"); List pipelineConfigs = new ArrayList<>(); List> pipelineConfigsWithNames = new ArrayList<>(); - if (new File(InstallationPathConfig.getPipelineDefaultWebUIConfigsDir()).exists()) { + if (new File(runtimePathConfig.getPipelineDefaultWebUiConfigs()).exists()) { try (Stream paths = - Files.walk( - Paths.get( - InstallationPathConfig.getPipelineDefaultWebUIConfigsDir()))) { + Files.walk(Paths.get(runtimePathConfig.getPipelineDefaultWebUiConfigs()))) { List jsonFiles = paths.filter(Files::isRegularFile) .filter(p -> p.toString().endsWith(".json")) diff --git a/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java b/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java index 402c172863..3341d00541 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java @@ -20,6 +20,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.v3.oas.annotations.Hidden; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.Dependency; diff --git a/src/main/java/stirling/software/SPDF/controller/web/MetricsController.java b/src/main/java/stirling/software/SPDF/controller/web/MetricsController.java index 6479c7afe1..13c5e7ffc1 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/MetricsController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/MetricsController.java @@ -19,7 +19,9 @@ import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.PostConstruct; + import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.StartupApplicationListener; import stirling.software.SPDF.model.ApplicationProperties; diff --git a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java b/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java index 9906bec493..0400b3d8bb 100644 --- a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java +++ b/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java @@ -31,6 +31,7 @@ import lombok.Getter; import lombok.Setter; import lombok.ToString; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.InstallationPathConfig; import stirling.software.SPDF.config.YamlPropertySourceFactory; import stirling.software.SPDF.model.provider.GithubProvider; @@ -285,6 +286,26 @@ public class ApplicationProperties { private String enableAnalytics; private Datasource datasource; private Boolean disableSanitize; + private CustomPaths customPaths = new CustomPaths(); + } + + @Data + public static class CustomPaths { + private Pipeline pipeline = new Pipeline(); + private Operations operations = new Operations(); + + @Data + public static class Pipeline { + private String watchedFoldersDir; + private String finishedFoldersDir; + private String webUIConfigsDir; + } + + @Data + public static class Operations { + private String weasyprint; + private String unoconvert; + } } @Data diff --git a/src/main/java/stirling/software/SPDF/model/SessionEntity.java b/src/main/java/stirling/software/SPDF/model/SessionEntity.java index fcdb8777b6..bba7b33dc3 100644 --- a/src/main/java/stirling/software/SPDF/model/SessionEntity.java +++ b/src/main/java/stirling/software/SPDF/model/SessionEntity.java @@ -6,6 +6,7 @@ import java.util.Date; import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table; + import lombok.Data; @Entity diff --git a/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java b/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java index 1e7ae22af3..3da8b7ce96 100644 --- a/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java +++ b/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java @@ -14,6 +14,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.utils.GeneralUtils; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToImageRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToImageRequest.java index 87d30e6243..5116f19c72 100644 --- a/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToImageRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToImageRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/HTMLToPdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/HTMLToPdfRequest.java index 5f5ae05158..4bd3285660 100644 --- a/src/main/java/stirling/software/SPDF/model/api/converters/HTMLToPdfRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/converters/HTMLToPdfRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToBookRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToBookRequest.java index b3454afb3f..0d518e5723 100644 --- a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToBookRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToBookRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPdfARequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPdfARequest.java index 595353142b..c48e532689 100644 --- a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPdfARequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPdfARequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPresentationRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPresentationRequest.java index 450643750d..68c14a1f04 100644 --- a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPresentationRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToPresentationRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToTextOrRTFRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToTextOrRTFRequest.java index a399a0eea3..5d3ab2ab25 100644 --- a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToTextOrRTFRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToTextOrRTFRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToWordRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToWordRequest.java index db3c3dfbb4..c0bed06373 100644 --- a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToWordRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToWordRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/filter/ContainsTextRequest.java b/src/main/java/stirling/software/SPDF/model/api/filter/ContainsTextRequest.java index 0537362d9f..147badc375 100644 --- a/src/main/java/stirling/software/SPDF/model/api/filter/ContainsTextRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/filter/ContainsTextRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFWithPageNums; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/filter/FileSizeRequest.java b/src/main/java/stirling/software/SPDF/model/api/filter/FileSizeRequest.java index b92d2ce2ff..957951395f 100644 --- a/src/main/java/stirling/software/SPDF/model/api/filter/FileSizeRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/filter/FileSizeRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFComparison; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/filter/PageRotationRequest.java b/src/main/java/stirling/software/SPDF/model/api/filter/PageRotationRequest.java index 64692d4595..2a183deb72 100644 --- a/src/main/java/stirling/software/SPDF/model/api/filter/PageRotationRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/filter/PageRotationRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFComparison; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/filter/PageSizeRequest.java b/src/main/java/stirling/software/SPDF/model/api/filter/PageSizeRequest.java index d8f214f043..1d89ef2964 100644 --- a/src/main/java/stirling/software/SPDF/model/api/filter/PageSizeRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/filter/PageSizeRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFComparison; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/general/CropPdfForm.java b/src/main/java/stirling/software/SPDF/model/api/general/CropPdfForm.java index cec72ce40d..5f991ffcd0 100644 --- a/src/main/java/stirling/software/SPDF/model/api/general/CropPdfForm.java +++ b/src/main/java/stirling/software/SPDF/model/api/general/CropPdfForm.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java index 1ecdc2eeb7..b8beb9ff0a 100644 --- a/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/general/MergePdfsRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/MergePdfsRequest.java index ddb04295f0..9b97d88dd9 100644 --- a/src/main/java/stirling/software/SPDF/model/api/general/MergePdfsRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/general/MergePdfsRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.MultiplePDFFiles; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/general/OverlayPdfsRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/OverlayPdfsRequest.java index 372162017d..1bad804252 100644 --- a/src/main/java/stirling/software/SPDF/model/api/general/OverlayPdfsRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/general/OverlayPdfsRequest.java @@ -6,6 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/general/RearrangePagesRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/RearrangePagesRequest.java index 7cda530e1a..050dc1ebae 100644 --- a/src/main/java/stirling/software/SPDF/model/api/general/RearrangePagesRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/general/RearrangePagesRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.SortTypes; import stirling.software.SPDF.model.api.PDFWithPageNums; diff --git a/src/main/java/stirling/software/SPDF/model/api/general/RotatePDFRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/RotatePDFRequest.java index 1efd70496a..ac13e4bf45 100644 --- a/src/main/java/stirling/software/SPDF/model/api/general/RotatePDFRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/general/RotatePDFRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/general/ScalePagesRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/ScalePagesRequest.java index 0ba004c917..bba2141ca0 100644 --- a/src/main/java/stirling/software/SPDF/model/api/general/ScalePagesRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/general/ScalePagesRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFWithPageSize; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/general/SplitPdfBySizeOrCountRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/SplitPdfBySizeOrCountRequest.java index 3bb141e70c..0c436cf46d 100644 --- a/src/main/java/stirling/software/SPDF/model/api/general/SplitPdfBySizeOrCountRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/general/SplitPdfBySizeOrCountRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/AddPageNumbersRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/AddPageNumbersRequest.java index 4776ddc083..b67d765318 100644 --- a/src/main/java/stirling/software/SPDF/model/api/misc/AddPageNumbersRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/misc/AddPageNumbersRequest.java @@ -5,6 +5,7 @@ import io.swagger.v3.oas.annotations.media.Schema.RequiredMode; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFWithPageNums; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/AddStampRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/AddStampRequest.java index ebd5412851..b320b71517 100644 --- a/src/main/java/stirling/software/SPDF/model/api/misc/AddStampRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/misc/AddStampRequest.java @@ -6,6 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFWithPageNums; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/AutoSplitPdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/AutoSplitPdfRequest.java index 1880453ef7..bc4a0f5c87 100644 --- a/src/main/java/stirling/software/SPDF/model/api/misc/AutoSplitPdfRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/misc/AutoSplitPdfRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/ExtractHeaderRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/ExtractHeaderRequest.java index f2c9bb596a..3f886fcdca 100644 --- a/src/main/java/stirling/software/SPDF/model/api/misc/ExtractHeaderRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/misc/ExtractHeaderRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/FlattenRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/FlattenRequest.java index c87d197450..364d3129fc 100644 --- a/src/main/java/stirling/software/SPDF/model/api/misc/FlattenRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/misc/FlattenRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/MetadataRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/MetadataRequest.java index e638d7d2f5..fb326e79e5 100644 --- a/src/main/java/stirling/software/SPDF/model/api/misc/MetadataRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/misc/MetadataRequest.java @@ -6,6 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/OptimizePdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/OptimizePdfRequest.java index 48c95086d6..3fb15791da 100644 --- a/src/main/java/stirling/software/SPDF/model/api/misc/OptimizePdfRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/misc/OptimizePdfRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/OverlayImageRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/OverlayImageRequest.java index b057709c3b..49a3185dce 100644 --- a/src/main/java/stirling/software/SPDF/model/api/misc/OverlayImageRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/misc/OverlayImageRequest.java @@ -6,6 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/PrintFileRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/PrintFileRequest.java index 89c3357385..f6ee362c3f 100644 --- a/src/main/java/stirling/software/SPDF/model/api/misc/PrintFileRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/misc/PrintFileRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/ProcessPdfWithOcrRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/ProcessPdfWithOcrRequest.java index e26741c944..3415fbf901 100644 --- a/src/main/java/stirling/software/SPDF/model/api/misc/ProcessPdfWithOcrRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/misc/ProcessPdfWithOcrRequest.java @@ -6,6 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/RemoveBlankPagesRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/RemoveBlankPagesRequest.java index 7177449fde..85bf7d1e0c 100644 --- a/src/main/java/stirling/software/SPDF/model/api/misc/RemoveBlankPagesRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/misc/RemoveBlankPagesRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/ReplaceAndInvertColorRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/ReplaceAndInvertColorRequest.java index 1d96d35b26..7c1a620d67 100644 --- a/src/main/java/stirling/software/SPDF/model/api/misc/ReplaceAndInvertColorRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/misc/ReplaceAndInvertColorRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/security/AddPasswordRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/AddPasswordRequest.java index 99cdfc367e..ef85dfead8 100644 --- a/src/main/java/stirling/software/SPDF/model/api/security/AddPasswordRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/security/AddPasswordRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/security/AddWatermarkRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/AddWatermarkRequest.java index 81f921ec59..f4ebada01a 100644 --- a/src/main/java/stirling/software/SPDF/model/api/security/AddWatermarkRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/security/AddWatermarkRequest.java @@ -6,6 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/security/ManualRedactPdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/ManualRedactPdfRequest.java index 0bd2d41d73..2d431b7ef3 100644 --- a/src/main/java/stirling/software/SPDF/model/api/security/ManualRedactPdfRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/security/ManualRedactPdfRequest.java @@ -6,6 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFWithPageNums; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/security/PDFPasswordRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/PDFPasswordRequest.java index 2c320823f0..2ee29757ab 100644 --- a/src/main/java/stirling/software/SPDF/model/api/security/PDFPasswordRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/security/PDFPasswordRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/security/RedactPdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/RedactPdfRequest.java index de34030056..54c6a0aadb 100644 --- a/src/main/java/stirling/software/SPDF/model/api/security/RedactPdfRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/security/RedactPdfRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/security/SanitizePdfRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/SanitizePdfRequest.java index 0e12dfe755..f300673607 100644 --- a/src/main/java/stirling/software/SPDF/model/api/security/SanitizePdfRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/security/SanitizePdfRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java index 6949a95e07..b0266f307a 100644 --- a/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java @@ -6,6 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/model/api/security/SignatureValidationRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/SignatureValidationRequest.java index 73deef4002..7bb9324fe8 100644 --- a/src/main/java/stirling/software/SPDF/model/api/security/SignatureValidationRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/security/SignatureValidationRequest.java @@ -6,6 +6,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; @Data diff --git a/src/main/java/stirling/software/SPDF/pdf/TextFinder.java b/src/main/java/stirling/software/SPDF/pdf/TextFinder.java index 484f65241f..4119b3eac9 100644 --- a/src/main/java/stirling/software/SPDF/pdf/TextFinder.java +++ b/src/main/java/stirling/software/SPDF/pdf/TextFinder.java @@ -11,6 +11,7 @@ import org.apache.pdfbox.text.PDFTextStripper; import org.apache.pdfbox.text.TextPosition; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.PDFText; @Slf4j diff --git a/src/main/java/stirling/software/SPDF/service/CustomPDDocumentFactory.java b/src/main/java/stirling/software/SPDF/service/CustomPDDocumentFactory.java index 040e65d139..138420dd7a 100644 --- a/src/main/java/stirling/software/SPDF/service/CustomPDDocumentFactory.java +++ b/src/main/java/stirling/software/SPDF/service/CustomPDDocumentFactory.java @@ -12,6 +12,7 @@ import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.PdfMetadata; import stirling.software.SPDF.model.api.PDFFile; diff --git a/src/main/java/stirling/software/SPDF/service/LanguageService.java b/src/main/java/stirling/software/SPDF/service/LanguageService.java index a5048112cb..e38105c599 100644 --- a/src/main/java/stirling/software/SPDF/service/LanguageService.java +++ b/src/main/java/stirling/software/SPDF/service/LanguageService.java @@ -11,6 +11,7 @@ import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.stereotype.Service; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.ApplicationProperties; @Service diff --git a/src/main/java/stirling/software/SPDF/service/SignatureService.java b/src/main/java/stirling/software/SPDF/service/SignatureService.java index bd4642e777..f6686f3b6d 100644 --- a/src/main/java/stirling/software/SPDF/service/SignatureService.java +++ b/src/main/java/stirling/software/SPDF/service/SignatureService.java @@ -13,6 +13,7 @@ import org.springframework.stereotype.Service; import org.thymeleaf.util.StringUtils; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.InstallationPathConfig; import stirling.software.SPDF.model.SignatureFile; diff --git a/src/main/java/stirling/software/SPDF/utils/FileMonitor.java b/src/main/java/stirling/software/SPDF/utils/FileMonitor.java index 389d281984..6a815d8ce2 100644 --- a/src/main/java/stirling/software/SPDF/utils/FileMonitor.java +++ b/src/main/java/stirling/software/SPDF/utils/FileMonitor.java @@ -3,6 +3,9 @@ package stirling.software.SPDF.utils; import static java.nio.file.StandardWatchEventKinds.*; import java.io.IOException; +import java.io.RandomAccessFile; +import java.nio.channels.FileChannel; +import java.nio.channels.FileLock; import java.nio.file.*; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -15,7 +18,8 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import lombok.extern.slf4j.Slf4j; -import stirling.software.SPDF.config.InstallationPathConfig; + +import stirling.software.SPDF.config.RuntimePathConfig; @Component @Slf4j @@ -35,7 +39,9 @@ public class FileMonitor { * monitored, false otherwise */ @Autowired - public FileMonitor(@Qualifier("directoryFilter") Predicate pathFilter) + public FileMonitor( + @Qualifier("directoryFilter") Predicate pathFilter, + RuntimePathConfig runtimePathConfig) throws IOException { this.newlyDiscoveredFiles = new HashSet<>(); this.path2KeyMapping = new HashMap<>(); @@ -43,7 +49,7 @@ public class FileMonitor { this.pathFilter = pathFilter; this.readyForProcessingFiles = ConcurrentHashMap.newKeySet(); this.watchService = FileSystems.getDefault().newWatchService(); - this.rootDir = Path.of(InstallationPathConfig.getPipelineWatchedFoldersDir()); + this.rootDir = Path.of(runtimePathConfig.getPipelineWatchedFoldersPath()).toAbsolutePath(); } private boolean shouldNotProcess(Path path) { @@ -162,6 +168,37 @@ public class FileMonitor { * @return true if the file is ready for processing, false otherwise */ public boolean isFileReadyForProcessing(Path path) { - return readyForProcessingFiles.contains(path); + // 1. Check FileMonitor's ready list + boolean isReady = readyForProcessingFiles.contains(path.toAbsolutePath()); + + // 2. Check last modified timestamp + if (!isReady) { + try { + long lastModified = Files.getLastModifiedTime(path).toMillis(); + long currentTime = System.currentTimeMillis(); + isReady = (currentTime - lastModified) > 5000; + } catch (IOException e) { + log.info("Timestamp check failed for {}", path, e); + } + } + + // 3. Direct file lock check + if (isReady) { + try (RandomAccessFile raf = new RandomAccessFile(path.toFile(), "rw"); + FileChannel channel = raf.getChannel()) { + // Try acquiring an exclusive lock + FileLock lock = channel.tryLock(); + if (lock == null) { + isReady = false; + } else { + lock.release(); + } + } catch (IOException e) { + log.info("File lock detected on {}", path); + isReady = false; + } + } + + return isReady; } } diff --git a/src/main/java/stirling/software/SPDF/utils/FileToPdf.java b/src/main/java/stirling/software/SPDF/utils/FileToPdf.java index c28cda6e76..6a0e263aa9 100644 --- a/src/main/java/stirling/software/SPDF/utils/FileToPdf.java +++ b/src/main/java/stirling/software/SPDF/utils/FileToPdf.java @@ -23,10 +23,10 @@ import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; public class FileToPdf { public static byte[] convertHtmlToPdf( + String weasyprintPath, HTMLToPdfRequest request, byte[] fileBytes, String fileName, - boolean htmlFormatsInstalled, boolean disableSanitize) throws IOException, InterruptedException { @@ -49,29 +49,12 @@ public class FileToPdf { } List command = new ArrayList<>(); - if (!htmlFormatsInstalled) { - command.add("/opt/venv/bin/weasyprint"); - command.add("-e"); - command.add("utf-8"); - command.add("-v"); - command.add(tempInputFile.toString()); - command.add(tempOutputFile.toString()); - } else { - command.add("ebook-convert"); - command.add(tempInputFile.toString()); - command.add(tempOutputFile.toString()); - command.add("--paper-size"); - command.add("a4"); - - if (request != null && request.getZoom() != 1.0) { - File tempCssFile = Files.createTempFile("customStyle", ".css").toFile(); - try (FileWriter writer = new FileWriter(tempCssFile)) { - writer.write("body { zoom: " + request.getZoom() + "; }"); - } - command.add("--extra-css"); - command.add(tempCssFile.getAbsolutePath()); - } - } + command.add(weasyprintPath); + command.add("-e"); + command.add("utf-8"); + command.add("-v"); + command.add(tempInputFile.toString()); + command.add(tempOutputFile.toString()); ProcessExecutorResult returnCode = ProcessExecutor.getInstance(ProcessExecutor.Processes.WEASYPRINT) diff --git a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java index ea4b235b3f..72e1034c33 100644 --- a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java @@ -28,6 +28,7 @@ import io.github.pixee.security.HostValidator; import io.github.pixee.security.Urls; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.config.InstallationPathConfig; @Slf4j diff --git a/src/main/java/stirling/software/SPDF/utils/PDFToFile.java b/src/main/java/stirling/software/SPDF/utils/PDFToFile.java index 011a8921e4..ef2c5b9cf7 100644 --- a/src/main/java/stirling/software/SPDF/utils/PDFToFile.java +++ b/src/main/java/stirling/software/SPDF/utils/PDFToFile.java @@ -26,6 +26,7 @@ import com.vladsch.flexmark.util.data.MutableDataSet; import io.github.pixee.security.Filenames; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; @Slf4j diff --git a/src/main/java/stirling/software/SPDF/utils/PdfUtils.java b/src/main/java/stirling/software/SPDF/utils/PdfUtils.java index 78b773efdf..de16155024 100644 --- a/src/main/java/stirling/software/SPDF/utils/PdfUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/PdfUtils.java @@ -35,6 +35,7 @@ import org.springframework.web.multipart.MultipartFile; import io.github.pixee.security.Filenames; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.service.CustomPDDocumentFactory; @Slf4j diff --git a/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java b/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java index dd1e7e894e..a8d3996975 100644 --- a/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java +++ b/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java @@ -12,6 +12,7 @@ import java.util.concurrent.TimeUnit; import io.github.pixee.security.BoundedLineReader; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.ApplicationProperties; @Slf4j diff --git a/src/main/java/stirling/software/SPDF/utils/misc/CustomColorReplaceStrategy.java b/src/main/java/stirling/software/SPDF/utils/misc/CustomColorReplaceStrategy.java index e3795da9ad..b4869b02e4 100644 --- a/src/main/java/stirling/software/SPDF/utils/misc/CustomColorReplaceStrategy.java +++ b/src/main/java/stirling/software/SPDF/utils/misc/CustomColorReplaceStrategy.java @@ -23,6 +23,7 @@ import org.springframework.core.io.InputStreamResource; import org.springframework.web.multipart.MultipartFile; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.misc.HighContrastColorCombination; import stirling.software.SPDF.model.api.misc.ReplaceAndInvert; diff --git a/src/main/java/stirling/software/SPDF/utils/misc/ReplaceAndInvertColorStrategy.java b/src/main/java/stirling/software/SPDF/utils/misc/ReplaceAndInvertColorStrategy.java index 024e0e706f..c646059225 100644 --- a/src/main/java/stirling/software/SPDF/utils/misc/ReplaceAndInvertColorStrategy.java +++ b/src/main/java/stirling/software/SPDF/utils/misc/ReplaceAndInvertColorStrategy.java @@ -7,6 +7,7 @@ import org.springframework.web.multipart.MultipartFile; import lombok.Data; import lombok.EqualsAndHashCode; + import stirling.software.SPDF.model.api.PDFFile; import stirling.software.SPDF.model.api.misc.ReplaceAndInvert; diff --git a/src/main/java/stirling/software/SPDF/utils/propertyeditor/StringToArrayListPropertyEditor.java b/src/main/java/stirling/software/SPDF/utils/propertyeditor/StringToArrayListPropertyEditor.java index d4ec7acc4b..7f28ad547d 100644 --- a/src/main/java/stirling/software/SPDF/utils/propertyeditor/StringToArrayListPropertyEditor.java +++ b/src/main/java/stirling/software/SPDF/utils/propertyeditor/StringToArrayListPropertyEditor.java @@ -9,6 +9,7 @@ import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; + import stirling.software.SPDF.model.api.security.RedactionArea; @Slf4j diff --git a/src/main/resources/settings.yml.template b/src/main/resources/settings.yml.template index a7816da195..f6e2bb0f54 100644 --- a/src/main/resources/settings.yml.template +++ b/src/main/resources/settings.yml.template @@ -96,6 +96,15 @@ system: hostName: localhost # the host name to use for the database url. Set to 'localhost' when running the app locally. Set to match the name of the container name of your database container when running the app on a server (Docker configuration) port: 5432 # set the port number of the database. Ensure this matches the port the database is listening to name: postgres # set the name of your database. Should match the name of the database you create + customPaths: + pipeline: + watchedFoldersDir: "" #Defaults to /pipeline/watchedFolders + finishedFoldersDir: "" #Defaults to /pipeline/finishedFolders + operations: + weasyprint: "" #Defaults to /opt/venv/bin/weasyprint + unoconvert: "" #Defaults to /opt/venv/bin/unoconvert + + ui: appName: '' # application's visible name diff --git a/src/test/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPdfTest.java b/src/test/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPdfTest.java index fa2c6e34d7..b2efad0b66 100644 --- a/src/test/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPdfTest.java +++ b/src/test/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPdfTest.java @@ -4,6 +4,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; + +import stirling.software.SPDF.config.RuntimePathConfig; import stirling.software.SPDF.model.api.converters.UrlToPdfRequest; import stirling.software.SPDF.service.CustomPDDocumentFactory; @@ -16,12 +18,16 @@ public class ConvertWebsiteToPdfTest { @Mock private CustomPDDocumentFactory mockPdfDocumentFactory; + @Mock + private RuntimePathConfig runtimePathConfig; + + private ConvertWebsiteToPDF convertWebsiteToPDF; @BeforeEach void setUp() { MockitoAnnotations.openMocks(this); - convertWebsiteToPDF = new ConvertWebsiteToPDF(mockPdfDocumentFactory); + convertWebsiteToPDF = new ConvertWebsiteToPDF(mockPdfDocumentFactory, runtimePathConfig); } @Test diff --git a/src/test/java/stirling/software/SPDF/utils/FileToPdfTest.java b/src/test/java/stirling/software/SPDF/utils/FileToPdfTest.java index 9b0c004b7b..f5cb2c8023 100644 --- a/src/test/java/stirling/software/SPDF/utils/FileToPdfTest.java +++ b/src/test/java/stirling/software/SPDF/utils/FileToPdfTest.java @@ -14,12 +14,11 @@ public class FileToPdfTest { HTMLToPdfRequest request = new HTMLToPdfRequest(); byte[] fileBytes = new byte[0]; // Sample file bytes String fileName = "test.html"; // Sample file name - boolean htmlFormatsInstalled = true; // Sample boolean value boolean disableSanitize = false; // Sample boolean value // Check if the method throws IOException assertThrows(IOException.class, () -> { - FileToPdf.convertHtmlToPdf(request, fileBytes, fileName, htmlFormatsInstalled, disableSanitize); + FileToPdf.convertHtmlToPdf("/path/",request, fileBytes, fileName, disableSanitize); }); }