diff --git a/app/core/src/main/java/stirling/software/SPDF/controller/api/misc/FlattenController.java b/app/core/src/main/java/stirling/software/SPDF/controller/api/misc/FlattenController.java index a76a737b56..6a187936ce 100644 --- a/app/core/src/main/java/stirling/software/SPDF/controller/api/misc/FlattenController.java +++ b/app/core/src/main/java/stirling/software/SPDF/controller/api/misc/FlattenController.java @@ -67,19 +67,32 @@ public class FlattenController { PDFRenderer pdfRenderer = new PDFRenderer(document); PDDocument newDocument = pdfDocumentFactory.createNewDocumentBasedOnOldDocument(document); + + int defaultRenderDpi = 100; // Default fallback + ApplicationProperties properties = + ApplicationContextProvider.getBean(ApplicationProperties.class); + Integer configuredMaxDpi = null; + if (properties != null && properties.getSystem() != null) { + configuredMaxDpi = properties.getSystem().getMaxDPI(); + } + + int maxDpi = + (configuredMaxDpi != null && configuredMaxDpi > 0) + ? configuredMaxDpi + : defaultRenderDpi; + + Integer requestedDpi = request.getRenderDpi(); + int renderDpi = maxDpi; + if (requestedDpi != null) { + renderDpi = Math.min(requestedDpi, maxDpi); + renderDpi = Math.max(renderDpi, 72); + } + int numPages = document.getNumberOfPages(); for (int i = 0; i < numPages; i++) { try { BufferedImage image; - // Use global maximum DPI setting, fallback to 300 if not set - int renderDpi = 300; // Default fallback - ApplicationProperties properties = - ApplicationContextProvider.getBean(ApplicationProperties.class); - if (properties != null && properties.getSystem() != null) { - renderDpi = properties.getSystem().getMaxDPI(); - } - try { image = pdfRenderer.renderImageWithDPI(i, renderDpi, ImageType.RGB); } catch (OutOfMemoryError e) { diff --git a/app/core/src/main/java/stirling/software/SPDF/model/api/misc/FlattenRequest.java b/app/core/src/main/java/stirling/software/SPDF/model/api/misc/FlattenRequest.java index cf4e7c575f..b53653a36f 100644 --- a/app/core/src/main/java/stirling/software/SPDF/model/api/misc/FlattenRequest.java +++ b/app/core/src/main/java/stirling/software/SPDF/model/api/misc/FlattenRequest.java @@ -18,4 +18,10 @@ public class FlattenRequest extends PDFFile { requiredMode = Schema.RequiredMode.REQUIRED, defaultValue = "false") private Boolean flattenOnlyForms; + + @Schema( + description = "Optional DPI for page rendering when flattening the full document.", + requiredMode = Schema.RequiredMode.NOT_REQUIRED, + minimum = "72") + private Integer renderDpi; } diff --git a/app/core/src/main/resources/messages_en_GB.properties b/app/core/src/main/resources/messages_en_GB.properties index 86f6e928ab..eb75856d3b 100644 --- a/app/core/src/main/resources/messages_en_GB.properties +++ b/app/core/src/main/resources/messages_en_GB.properties @@ -1259,6 +1259,8 @@ repair.submit=Repair flatten.title=Flatten flatten.header=Flatten PDF flatten.flattenOnlyForms=Flatten only forms +flatten.renderDpi=Rendering DPI (optional, recommended 150 DPI): +flatten.renderDpi.help=Leave blank to use the system default. Higher DPI sharpens output but increases processing time and file size. flatten.submit=Flatten diff --git a/app/core/src/main/resources/templates/misc/flatten.html b/app/core/src/main/resources/templates/misc/flatten.html index fca06e0931..3e31d1cbf9 100644 --- a/app/core/src/main/resources/templates/misc/flatten.html +++ b/app/core/src/main/resources/templates/misc/flatten.html @@ -24,7 +24,20 @@