From 76e6a23674ae7c047f4f362a562fd039b61a2863 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Mon, 1 Jan 2024 12:14:46 +0000 Subject: [PATCH] split fixes --- .../api/SplitPdfBySectionsController.java | 7 ++- .../api/pipeline/PipelineController.java | 54 +++++++++++++------ .../api/pipeline/PipelineProcessor.java | 30 ++++++++++- 3 files changed, 70 insertions(+), 21 deletions(-) diff --git a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java index 5d96920f..b024879b 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java @@ -70,7 +70,7 @@ public class SplitPdfBySectionsController { for (int i = 0; i < splitDocumentsBoas.size(); i++) { ByteArrayOutputStream baos = splitDocumentsBoas.get(i); int sectionNum = (i % (horiz * verti)) + 1; - String fileName = filename + "_" + pageNum + "_" + sectionNum + ".pdf"; + String fileName = filename + "_" + pageNum + "_" + sectionNum + ".pdf"; byte[] pdf = baos.toByteArray(); ZipEntry pdfEntry = new ZipEntry(fileName); zipOut.putNextEntry(pdfEntry); @@ -118,7 +118,7 @@ public class SplitPdfBySectionsController { new PDPageContentStream(subDoc, subPage)) { // Set clipping area and position float translateX = -subPageWidth * i; - float translateY = height - subPageHeight * (verticalDivisions - j); + float translateY = -subPageHeight * (verticalDivisions - 1 - j); contentStream.saveGraphicsState(); contentStream.addRect(0, 0, subPageWidth, subPageHeight); @@ -137,4 +137,7 @@ public class SplitPdfBySectionsController { return splitDocuments; } + + + } 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 db5e9661..274c3f03 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 @@ -5,6 +5,8 @@ import java.io.InputStream; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; +import java.util.HashMap; +import java.util.Map; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -80,28 +82,46 @@ public class PipelineController { return null; } - // Create a ByteArrayOutputStream to hold the zip - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - ZipOutputStream zipOut = new ZipOutputStream(baos); - // Loop through each file and add it to the zip - for (Resource file : outputFiles) { - ZipEntry zipEntry = new ZipEntry(file.getFilename()); - zipOut.putNextEntry(zipEntry); + // Create a ByteArrayOutputStream to hold the zip + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ZipOutputStream zipOut = new ZipOutputStream(baos); - // Read the file into a byte array - InputStream is = file.getInputStream(); - byte[] bytes = new byte[(int) file.contentLength()]; - is.read(bytes); + // A map to keep track of filenames and their counts + Map filenameCount = new HashMap<>(); - // Write the bytes of the file to the zip - zipOut.write(bytes, 0, bytes.length); - zipOut.closeEntry(); + // Loop through each file and add it to the zip + for (Resource file : outputFiles) { + String originalFilename = file.getFilename(); + String filename = originalFilename; - is.close(); - } + // Check if the filename already exists, and modify it if necessary + if (filenameCount.containsKey(originalFilename)) { + int count = filenameCount.get(originalFilename); + String baseName = originalFilename.replaceAll("\\.[^.]*$", ""); + String extension = originalFilename.replaceAll("^.*\\.", ""); + filename = baseName + "(" + count + ")." + extension; + filenameCount.put(originalFilename, count + 1); + } else { + filenameCount.put(originalFilename, 1); + } - zipOut.close(); + ZipEntry zipEntry = new ZipEntry(filename); + zipOut.putNextEntry(zipEntry); + + // Read the file into a byte array + InputStream is = file.getInputStream(); + byte[] bytes = new byte[(int) file.contentLength()]; + is.read(bytes); + + // Write the bytes of the file to the zip + zipOut.write(bytes, 0, bytes.length); + zipOut.closeEntry(); + + is.close(); + } + + zipOut.close(); logger.info("Returning zipped file response..."); return WebResponseUtils.boasToWebResponse( 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 9bebb96f..3e39a65e 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 @@ -5,6 +5,8 @@ import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.io.PrintStream; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; @@ -217,11 +219,12 @@ public class PipelineProcessor { throws IOException { // Define filename String newFilename; - if ("auto-rename".equals(operation)) { + if (operation.contains("auto-rename")) { // If the operation is "auto-rename", generate a new filename. // This is a simple example of generating a filename using current timestamp. // Modify as per your needs. - newFilename = "file_" + System.currentTimeMillis(); + + newFilename = extractFilename(response); } else { // Otherwise, keep the original filename. newFilename = fileName; @@ -245,6 +248,29 @@ public class PipelineProcessor { return newOutputFiles; } + +public String extractFilename(ResponseEntity response) { + String filename = "default-filename.ext"; // Default filename if not found + + HttpHeaders headers = response.getHeaders(); + String contentDisposition = headers.getFirst(HttpHeaders.CONTENT_DISPOSITION); + + if (contentDisposition != null && !contentDisposition.isEmpty()) { + String[] parts = contentDisposition.split(";"); + for (String part : parts) { + if (part.trim().startsWith("filename")) { + // Extracts filename and removes quotes if present + filename = part.split("=")[1].trim().replace("\"", ""); + filename = URLDecoder.decode(filename, StandardCharsets.UTF_8); + + break; + } + } + } + + return filename; +} + List generateInputFiles(File[] files) throws Exception { if (files == null || files.length == 0) { logger.info("No files");