Skip to content

Commit ae12932

Browse files
authored
Default dpi to 300 when omitted from convert to image (#7823)
1 parent 21b53c2 commit ae12932

4 files changed

Lines changed: 70 additions & 2 deletions

File tree

app/core/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,12 @@ public ResponseEntity<?> convertToImage(@ModelAttribute ConvertToImageRequest re
103103
String imageFormat = request.getImageFormat();
104104
String singleOrMultiple = request.getSingleOrMultiple();
105105
String colorType = request.getColorType();
106-
int dpi = request.getDpi();
106+
// Spring binds an empty dpi form field to null, which the field default cannot cover
107+
Integer requestedDpi = request.getDpi();
108+
int dpi =
109+
(requestedDpi == null || requestedDpi <= 0)
110+
? ConvertToImageRequest.DEFAULT_DPI
111+
: requestedDpi;
107112
String pageNumbers = request.getPageNumbers();
108113
boolean includeAnnotations = Boolean.TRUE.equals(request.getIncludeAnnotations());
109114
Path tempFile = null;

app/core/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToImageRequest.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
@EqualsAndHashCode(callSuper = true)
1212
public class ConvertToImageRequest extends PDFWithPageNums {
1313

14+
public static final int DEFAULT_DPI = 300;
15+
1416
@Schema(
1517
description = "The output image format",
1618
defaultValue = "png",
@@ -38,7 +40,7 @@ public class ConvertToImageRequest extends PDFWithPageNums {
3840
description = "The DPI (dots per inch) for the output image(s)",
3941
defaultValue = "300",
4042
requiredMode = Schema.RequiredMode.REQUIRED)
41-
private Integer dpi;
43+
private Integer dpi = DEFAULT_DPI;
4244

4345
@Schema(
4446
description = "Include annotations such as comments in the output image(s)",

app/core/src/test/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFControllerGapTest.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -490,6 +490,54 @@ private MockMultipartFile imagePdf(byte[] bytes) {
490490
return pdfFile("source.pdf", bytes);
491491
}
492492

493+
@Test
494+
@DisplayName("omitted dpi falls back to the documented default instead of throwing")
495+
void nullDpiUsesDefault() throws Exception {
496+
MockMultipartFile file = imagePdf(tinyPdfBytes(1));
497+
498+
ConvertToImageRequest request = new ConvertToImageRequest();
499+
request.setFileInput(file);
500+
request.setImageFormat("png");
501+
request.setSingleOrMultiple("single");
502+
request.setColorType("color");
503+
request.setDpi(null);
504+
request.setPageNumbers("all");
505+
request.setIncludeAnnotations(false);
506+
507+
Mockito.when(pdfDocumentFactory.load(any(MockMultipartFile.class)))
508+
.thenReturn(tinyDocument(1));
509+
510+
byte[] imageBytes = "png-image".getBytes();
511+
ResponseEntity<byte[]> expected = ResponseEntity.ok(imageBytes);
512+
513+
try (MockedStatic<PdfUtils> pu = Mockito.mockStatic(PdfUtils.class);
514+
MockedStatic<WebResponseUtils> wr =
515+
Mockito.mockStatic(WebResponseUtils.class)) {
516+
517+
pu.when(
518+
() ->
519+
PdfUtils.convertFromPdf(
520+
eq(pdfDocumentFactory),
521+
any(byte[].class),
522+
eq("PNG"),
523+
eq(ImageType.RGB),
524+
eq(true),
525+
eq(ConvertToImageRequest.DEFAULT_DPI),
526+
any(String.class),
527+
eq(false)))
528+
.thenReturn(imageBytes);
529+
wr.when(
530+
() ->
531+
WebResponseUtils.bytesToWebResponse(
532+
eq(imageBytes),
533+
any(String.class),
534+
any(MediaType.class)))
535+
.thenReturn(expected);
536+
537+
assertSame(expected, controller.convertToImage(request));
538+
}
539+
}
540+
493541
@Test
494542
@DisplayName("single-image PNG path returns the rendered bytes")
495543
void singleImagePng() throws Exception {

app/core/src/test/java/stirling/software/SPDF/model/api/converters/ConvertToImageRequestTest.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,19 @@ private static MultipartFile file() {
1616
"fileInput", "doc.pdf", "application/pdf", new byte[] {1, 2, 3});
1717
}
1818

19+
@Nested
20+
@DisplayName("defaults")
21+
class Defaults {
22+
23+
@Test
24+
@DisplayName("dpi defaults to the value the schema documents")
25+
void dpiDefaultMatchesSchema() {
26+
assertThat(new ConvertToImageRequest().getDpi())
27+
.isEqualTo(ConvertToImageRequest.DEFAULT_DPI)
28+
.isEqualTo(300);
29+
}
30+
}
31+
1932
@Nested
2033
@DisplayName("accessors")
2134
class Accessors {

0 commit comments

Comments
 (0)