feat: implement backend support for selective page splitting in Split PDF by Sections

This commit is contained in:
Ping Lin 2025-08-03 23:47:13 +01:00
parent 07b3bfa1f3
commit 1fc40f16c2
2 changed files with 57 additions and 31 deletions

View File

@ -5,7 +5,9 @@ import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
@ -33,6 +35,7 @@ import lombok.RequiredArgsConstructor;
import stirling.software.SPDF.model.api.SplitPdfBySectionsRequest;
import stirling.software.common.service.CustomPDFDocumentFactory;
import stirling.software.common.util.GeneralUtils;
import stirling.software.common.util.WebResponseUtils;
@RestController
@ -55,13 +58,20 @@ public class SplitPdfBySectionsController {
List<ByteArrayOutputStream> splitDocumentsBoas = new ArrayList<>();
MultipartFile file = request.getFileInput();
String pageNumbers = request.getPageNumbers();
PDDocument sourceDocument = pdfDocumentFactory.load(file);
// Split the page order string into an array of page numbers or range of numbers
String[] pageOrderArr = pageNumbers.split(",");
List<Integer> pageListToSplit =
GeneralUtils.parsePageList(pageOrderArr, sourceDocument.getNumberOfPages(), false);
Set<Integer> pagesToSplit = new HashSet<>(pageListToSplit);
// Process the PDF based on split parameters
int horiz = request.getHorizontalDivisions() + 1;
int verti = request.getVerticalDivisions() + 1;
boolean merge = Boolean.TRUE.equals(request.getMerge());
List<PDDocument> splitDocuments = splitPdfPages(sourceDocument, verti, horiz);
List<PDDocument> splitDocuments = splitPdfPages(sourceDocument, verti, horiz, pagesToSplit);
String filename =
Filenames.toSimpleFileName(file.getOriginalFilename())
@ -110,11 +120,19 @@ public class SplitPdfBySectionsController {
}
public List<PDDocument> splitPdfPages(
PDDocument document, int horizontalDivisions, int verticalDivisions)
PDDocument document, int horizontalDivisions, int verticalDivisions, Set<Integer> pagesToSplit)
throws IOException {
List<PDDocument> splitDocuments = new ArrayList<>();
int pageIndex = 0;
for (PDPage originalPage : document.getPages()) {
// If current page is not to split, add it to the splitDocuments directly.
if (!pagesToSplit.contains(pageIndex)) {
PDDocument newDoc = pdfDocumentFactory.createNewDocument();
newDoc.addPage(originalPage);
splitDocuments.add(newDoc);
} else {
// Otherwise, split current page.
PDRectangle originalMediaBox = originalPage.getMediaBox();
float width = originalMediaBox.getWidth();
float height = originalMediaBox.getHeight();
@ -156,6 +174,8 @@ public class SplitPdfBySectionsController {
}
}
}
pageIndex++;
}
return splitDocuments;
}

View File

@ -10,6 +10,12 @@ import stirling.software.common.model.api.PDFFile;
@Data
@EqualsAndHashCode(callSuper = true)
public class SplitPdfBySectionsRequest extends PDFFile {
@Schema(
description = "Pages to be split by section",
defaultValue = "all",
requiredMode = Schema.RequiredMode.REQUIRED)
private String pageNumbers;
@Schema(
description = "Number of horizontal divisions for each PDF page",
defaultValue = "0",