more stuff

This commit is contained in:
Ludy87 2025-05-11 11:18:20 +02:00
parent c07908d4ed
commit 1426cf8c48
No known key found for this signature in database
GPG Key ID: 92696155E0220F94
49 changed files with 186 additions and 123 deletions

View File

@ -59,7 +59,8 @@ public class AnalysisController {
description = "Returns title, author, subject, etc. Input:PDF Output:JSON Type:SISO") description = "Returns title, author, subject, etc. Input:PDF Output:JSON Type:SISO")
public Map<String, String> getDocumentProperties(@ModelAttribute PDFFile file) public Map<String, String> getDocumentProperties(@ModelAttribute PDFFile file)
throws IOException { throws IOException {
// Load the document in read-only mode to prevent modifications and ensure the integrity of the original file. // Load the document in read-only mode to prevent modifications and ensure the integrity of
// the original file.
try (PDDocument document = pdfDocumentFactory.load(file.getFileInput(), true)) { try (PDDocument document = pdfDocumentFactory.load(file.getFileInput(), true)) {
PDDocumentInformation info = document.getDocumentInformation(); PDDocumentInformation info = document.getDocumentInformation();
Map<String, String> properties = new HashMap<>(); Map<String, String> properties = new HashMap<>();
@ -180,7 +181,8 @@ public class AnalysisController {
// Get permissions // Get permissions
Map<String, Boolean> permissions = new HashMap<>(); Map<String, Boolean> permissions = new HashMap<>();
permissions.put("preventPrinting", !document.getCurrentAccessPermission().canPrint()); permissions.put(
"preventPrinting", !document.getCurrentAccessPermission().canPrint());
permissions.put( permissions.put(
"preventModify", !document.getCurrentAccessPermission().canModify()); "preventModify", !document.getCurrentAccessPermission().canModify());
permissions.put( permissions.put(

View File

@ -39,8 +39,8 @@ public class CropController {
description = description =
"This operation takes an input PDF file and crops it according to the given" "This operation takes an input PDF file and crops it according to the given"
+ " coordinates. Input:PDF Output:PDF Type:SISO") + " coordinates. Input:PDF Output:PDF Type:SISO")
public ResponseEntity<byte[]> cropPdf(@ModelAttribute CropPdfForm form) throws IOException { public ResponseEntity<byte[]> cropPdf(@ModelAttribute CropPdfForm request) throws IOException {
PDDocument sourceDocument = pdfDocumentFactory.load(form); PDDocument sourceDocument = pdfDocumentFactory.load(request);
PDDocument newDocument = PDDocument newDocument =
pdfDocumentFactory.createNewDocumentBasedOnOldDocument(sourceDocument); pdfDocumentFactory.createNewDocumentBasedOnOldDocument(sourceDocument);
@ -64,7 +64,8 @@ public class CropController {
contentStream.saveGraphicsState(); contentStream.saveGraphicsState();
// Define the crop area // Define the crop area
contentStream.addRect(form.getX(), form.getY(), form.getWidth(), form.getHeight()); contentStream.addRect(
request.getX(), request.getY(), request.getWidth(), request.getHeight());
contentStream.clip(); contentStream.clip();
// Draw the entire formXObject // Draw the entire formXObject
@ -76,7 +77,11 @@ public class CropController {
// Now, set the new page's media box to the cropped size // Now, set the new page's media box to the cropped size
newPage.setMediaBox( newPage.setMediaBox(
new PDRectangle(form.getX(), form.getY(), form.getWidth(), form.getHeight())); new PDRectangle(
request.getX(),
request.getY(),
request.getWidth(),
request.getHeight()));
} }
ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream();
@ -87,7 +92,7 @@ public class CropController {
byte[] pdfContent = baos.toByteArray(); byte[] pdfContent = baos.toByteArray();
return WebResponseUtils.bytesToWebResponse( return WebResponseUtils.bytesToWebResponse(
pdfContent, pdfContent,
form.getFileInput().getOriginalFilename().replaceFirst("[.][^.]+$", "") request.getFileInput().getOriginalFilename().replaceFirst("[.][^.]+$", "")
+ "_cropped.pdf"); + "_cropped.pdf");
} }
} }

View File

@ -8,6 +8,7 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.mail.MessagingException; import jakarta.mail.MessagingException;
@ -41,7 +42,13 @@ public class EmailController {
* @return ResponseEntity with success or error message. * @return ResponseEntity with success or error message.
*/ */
@PostMapping(consumes = "multipart/form-data", value = "/send-email") @PostMapping(consumes = "multipart/form-data", value = "/send-email")
@Operation(
summary = "Send an email with an attachment",
description =
"This endpoint sends an email with an attachment. Input:PDF"
+ " Output:Success/Failure Type:MISO")
public ResponseEntity<String> sendEmailWithAttachment(@Valid @ModelAttribute Email email) { public ResponseEntity<String> sendEmailWithAttachment(@Valid @ModelAttribute Email email) {
log.info("Sending email to: {}", email.toString());
try { try {
// Calls the service to send the email with attachment // Calls the service to send the email with attachment
emailService.sendEmailWithAttachment(email); emailService.sendEmailWithAttachment(email);

View File

@ -117,20 +117,20 @@ public class MergeController {
"This endpoint merges multiple PDF files into a single PDF file. The merged" "This endpoint merges multiple PDF files into a single PDF file. The merged"
+ " file will contain all pages from the input files in the order they were" + " file will contain all pages from the input files in the order they were"
+ " provided. Input:PDF Output:PDF Type:MISO") + " provided. Input:PDF Output:PDF Type:MISO")
public ResponseEntity<byte[]> mergePdfs(@ModelAttribute MergePdfsRequest form) public ResponseEntity<byte[]> mergePdfs(@ModelAttribute MergePdfsRequest request)
throws IOException { throws IOException {
List<File> filesToDelete = new ArrayList<>(); // List of temporary files to delete List<File> filesToDelete = new ArrayList<>(); // List of temporary files to delete
File mergedTempFile = null; File mergedTempFile = null;
PDDocument mergedDocument = null; PDDocument mergedDocument = null;
boolean removeCertSign = form.isRemoveCertSign(); boolean removeCertSign = Boolean.TRUE.equals(request.getRemoveCertSign());
try { try {
MultipartFile[] files = form.getFileInput(); MultipartFile[] files = request.getFileInput();
Arrays.sort( Arrays.sort(
files, files,
getSortComparator( getSortComparator(
form.getSortType())); // Sort files based on the given sort type request.getSortType())); // Sort files based on the given sort type
PDFMergerUtility mergerUtility = new PDFMergerUtility(); PDFMergerUtility mergerUtility = new PDFMergerUtility();
long totalSize = 0; long totalSize = 0;

View File

@ -47,7 +47,7 @@ public class MultiPageLayoutController {
int pagesPerSheet = request.getPagesPerSheet(); int pagesPerSheet = request.getPagesPerSheet();
MultipartFile file = request.getFileInput(); MultipartFile file = request.getFileInput();
boolean addBorder = request.isAddBorder(); boolean addBorder = Boolean.TRUE.equals(request.getAddBorder());
if (pagesPerSheet != 2 if (pagesPerSheet != 2
&& pagesPerSheet != 3 && pagesPerSheet != 3

View File

@ -127,7 +127,7 @@ public class SplitPdfByChaptersController {
Path zipFile = null; Path zipFile = null;
try { try {
boolean includeMetadata = request.getIncludeMetadata(); boolean includeMetadata = Boolean.TRUE.equals(request.getIncludeMetadata());
Integer bookmarkLevel = Integer bookmarkLevel =
request.getBookmarkLevel(); // levels start from 0 (top most bookmarks) request.getBookmarkLevel(); // levels start from 0 (top most bookmarks)
if (bookmarkLevel < 0) { if (bookmarkLevel < 0) {
@ -161,7 +161,7 @@ public class SplitPdfByChaptersController {
.body("Unable to extract outline items".getBytes()); .body("Unable to extract outline items".getBytes());
} }
boolean allowDuplicates = request.getAllowDuplicates(); boolean allowDuplicates = Boolean.TRUE.equals(request.getAllowDuplicates());
if (!allowDuplicates) { if (!allowDuplicates) {
/* /*
duplicates are generated when multiple bookmarks correspond to the same page, duplicates are generated when multiple bookmarks correspond to the same page,

View File

@ -60,7 +60,7 @@ public class SplitPdfBySectionsController {
// Process the PDF based on split parameters // Process the PDF based on split parameters
int horiz = request.getHorizontalDivisions() + 1; int horiz = request.getHorizontalDivisions() + 1;
int verti = request.getVerticalDivisions() + 1; int verti = request.getVerticalDivisions() + 1;
boolean merge = request.isMerge(); boolean merge = Boolean.TRUE.equals(request.getMerge());
List<PDDocument> splitDocuments = splitPdfPages(sourceDocument, verti, horiz); List<PDDocument> splitDocuments = splitPdfPages(sourceDocument, verti, horiz);
String filename = String filename =

View File

@ -58,7 +58,7 @@ public class ConvertImgPDFController {
String imageFormat = request.getImageFormat(); String imageFormat = request.getImageFormat();
String singleOrMultiple = request.getSingleOrMultiple(); String singleOrMultiple = request.getSingleOrMultiple();
String colorType = request.getColorType(); String colorType = request.getColorType();
String dpi = request.getDpi(); int dpi = request.getDpi();
String pageNumbers = request.getPageNumbers(); String pageNumbers = request.getPageNumbers();
Path tempFile = null; Path tempFile = null;
Path tempOutputDir = null; Path tempOutputDir = null;
@ -94,7 +94,7 @@ public class ConvertImgPDFController {
: imageFormat.toUpperCase(), : imageFormat.toUpperCase(),
colorTypeResult, colorTypeResult,
singleImage, singleImage,
Integer.valueOf(dpi), dpi,
filename); filename);
if (result == null || result.length == 0) { if (result == null || result.length == 0) {
log.error("resultant bytes for {} is null, error converting ", filename); log.error("resultant bytes for {} is null, error converting ", filename);
@ -132,7 +132,7 @@ public class ConvertImgPDFController {
command.add(tempOutputDir.toString()); command.add(tempOutputDir.toString());
} }
command.add("--dpi"); command.add("--dpi");
command.add(dpi); command.add(String.valueOf(dpi));
ProcessExecutorResult resultProcess = ProcessExecutorResult resultProcess =
ProcessExecutor.getInstance(ProcessExecutor.Processes.PYTHON_OPENCV) ProcessExecutor.getInstance(ProcessExecutor.Processes.PYTHON_OPENCV)
.runCommandWithOutputHandling(command); .runCommandWithOutputHandling(command);
@ -213,7 +213,7 @@ public class ConvertImgPDFController {
MultipartFile[] file = request.getFileInput(); MultipartFile[] file = request.getFileInput();
String fitOption = request.getFitOption(); String fitOption = request.getFitOption();
String colorType = request.getColorType(); String colorType = request.getColorType();
boolean autoRotate = request.isAutoRotate(); boolean autoRotate = Boolean.TRUE.equals(request.getAutoRotate());
// Handle Null entries for formdata // Handle Null entries for formdata
if (colorType == null || colorType.isBlank()) { if (colorType == null || colorType.isBlank()) {
colorType = "color"; colorType = "color";

View File

@ -47,9 +47,8 @@ public class ConvertMarkdownToPdf {
description = description =
"This endpoint takes a Markdown file input, converts it to HTML, and then to" "This endpoint takes a Markdown file input, converts it to HTML, and then to"
+ " PDF format. Input:MARKDOWN Output:PDF Type:SISO") + " PDF format. Input:MARKDOWN Output:PDF Type:SISO")
public ResponseEntity<byte[]> markdownToPdf(@ModelAttribute GeneralFile request) public ResponseEntity<byte[]> markdownToPdf(@ModelAttribute GeneralFile generalFile) throws Exception {
throws Exception { MultipartFile fileInput = generalFile.getFileInput();
MultipartFile fileInput = request.getFileInput();
if (fileInput == null) { if (fileInput == null) {
throw new IllegalArgumentException("Please provide a Markdown file for conversion."); throw new IllegalArgumentException("Please provide a Markdown file for conversion.");

View File

@ -90,9 +90,9 @@ public class ConvertOfficeController {
description = description =
"This endpoint converts a given file to a PDF using LibreOffice API Input:ANY" "This endpoint converts a given file to a PDF using LibreOffice API Input:ANY"
+ " Output:PDF Type:SISO") + " Output:PDF Type:SISO")
public ResponseEntity<byte[]> processFileToPDF(@ModelAttribute GeneralFile request) public ResponseEntity<byte[]> processFileToPDF(@ModelAttribute GeneralFile generalFile)
throws Exception { throws Exception {
MultipartFile inputFile = request.getFileInput(); MultipartFile inputFile = generalFile.getFileInput();
// unused but can start server instance if startup time is to long // unused but can start server instance if startup time is to long
// LibreOfficeListener.getInstance().start(); // LibreOfficeListener.getInstance().start();
File file = null; File file = null;

View File

@ -23,9 +23,8 @@ public class ConvertPDFToHtml {
summary = "Convert PDF to HTML", summary = "Convert PDF to HTML",
description = description =
"This endpoint converts a PDF file to HTML format. Input:PDF Output:HTML Type:SISO") "This endpoint converts a PDF file to HTML format. Input:PDF Output:HTML Type:SISO")
public ResponseEntity<byte[]> processPdfToHTML(@ModelAttribute PDFFile request) public ResponseEntity<byte[]> processPdfToHTML(@ModelAttribute PDFFile file) throws Exception {
throws Exception { MultipartFile inputFile = file.getFileInput();
MultipartFile inputFile = request.getFileInput();
PDFToFile pdfToFile = new PDFToFile(); PDFToFile pdfToFile = new PDFToFile();
return pdfToFile.processPdfToHtml(inputFile); return pdfToFile.processPdfToHtml(inputFile);
} }

View File

@ -97,9 +97,8 @@ public class ConvertPDFToOffice {
description = description =
"This endpoint converts a PDF file to an XML file. Input:PDF Output:XML" "This endpoint converts a PDF file to an XML file. Input:PDF Output:XML"
+ " Type:SISO") + " Type:SISO")
public ResponseEntity<byte[]> processPdfToXML(@ModelAttribute PDFFile request) public ResponseEntity<byte[]> processPdfToXML(@ModelAttribute PDFFile file) throws Exception {
throws Exception { MultipartFile inputFile = file.getFileInput();
MultipartFile inputFile = request.getFileInput();
PDFToFile pdfToFile = new PDFToFile(); PDFToFile pdfToFile = new PDFToFile();
return pdfToFile.processPdfToOfficeFormat(inputFile, "xml", "writer_pdf_import"); return pdfToFile.processPdfToOfficeFormat(inputFile, "xml", "writer_pdf_import");

View File

@ -52,12 +52,12 @@ public class ExtractCSVController {
description = description =
"This operation takes an input PDF file and returns CSV file of whole page." "This operation takes an input PDF file and returns CSV file of whole page."
+ " Input:PDF Output:CSV Type:SISO") + " Input:PDF Output:CSV Type:SISO")
public ResponseEntity<?> pdfToCsv(@ModelAttribute PDFWithPageNums form) throws Exception { public ResponseEntity<?> pdfToCsv(@ModelAttribute PDFWithPageNums request) throws Exception {
String baseName = getBaseName(form.getFileInput().getOriginalFilename()); String baseName = getBaseName(request.getFileInput().getOriginalFilename());
List<CsvEntry> csvEntries = new ArrayList<>(); List<CsvEntry> csvEntries = new ArrayList<>();
try (PDDocument document = pdfDocumentFactory.load(form)) { try (PDDocument document = pdfDocumentFactory.load(request)) {
List<Integer> pages = form.getPageNumbersList(document, true); List<Integer> pages = request.getPageNumbersList(document, true);
SpreadsheetExtractionAlgorithm sea = new SpreadsheetExtractionAlgorithm(); SpreadsheetExtractionAlgorithm sea = new SpreadsheetExtractionAlgorithm();
CSVFormat format = CSVFormat format =
CSVFormat.EXCEL.builder().setEscape('"').setQuoteMode(QuoteMode.ALL).build(); CSVFormat.EXCEL.builder().setEscape('"').setQuoteMode(QuoteMode.ALL).build();

View File

@ -56,9 +56,10 @@ public class ExtractImageScansController {
+ " parameters. Users can specify angle threshold, tolerance, minimum area," + " parameters. Users can specify angle threshold, tolerance, minimum area,"
+ " minimum contour area, and border size. Input:PDF Output:IMAGE/ZIP" + " minimum contour area, and border size. Input:PDF Output:IMAGE/ZIP"
+ " Type:SIMO") + " Type:SIMO")
public ResponseEntity<byte[]> extractImageScans(@ModelAttribute ExtractImageScansRequest form) public ResponseEntity<byte[]> extractImageScans(
@ModelAttribute ExtractImageScansRequest request)
throws IOException, InterruptedException { throws IOException, InterruptedException {
MultipartFile inputFile = form.getFileInput(); MultipartFile inputFile = request.getFileInput();
String fileName = inputFile.getOriginalFilename(); String fileName = inputFile.getOriginalFilename();
String extension = fileName.substring(fileName.lastIndexOf(".") + 1); String extension = fileName.substring(fileName.lastIndexOf(".") + 1);
@ -121,15 +122,15 @@ public class ExtractImageScansController {
images.get(i), images.get(i),
tempDir.toString(), tempDir.toString(),
"--angle_threshold", "--angle_threshold",
String.valueOf(form.getAngleThreshold()), String.valueOf(request.getAngleThreshold()),
"--tolerance", "--tolerance",
String.valueOf(form.getTolerance()), String.valueOf(request.getTolerance()),
"--min_area", "--min_area",
String.valueOf(form.getMinArea()), String.valueOf(request.getMinArea()),
"--min_contour_area", "--min_contour_area",
String.valueOf(form.getMinContourArea()), String.valueOf(request.getMinContourArea()),
"--border_size", "--border_size",
String.valueOf(form.getBorderSize()))); String.valueOf(request.getBorderSize())));
// Run CLI command // Run CLI command
ProcessExecutorResult returnCode = ProcessExecutorResult returnCode =

View File

@ -65,7 +65,7 @@ public class MetadataController {
MultipartFile pdfFile = request.getFileInput(); MultipartFile pdfFile = request.getFileInput();
// Extract metadata information // Extract metadata information
Boolean deleteAll = request.isDeleteAll(); boolean deleteAll = Boolean.TRUE.equals(request.getDeleteAll());
String author = request.getAuthor(); String author = request.getAuthor();
String creationDate = request.getCreationDate(); String creationDate = request.getCreationDate();
String creator = request.getCreator(); String creator = request.getCreator();

View File

@ -43,7 +43,7 @@ public class OverlayImageController {
MultipartFile imageFile = request.getImageFile(); MultipartFile imageFile = request.getImageFile();
float x = request.getX(); float x = request.getX();
float y = request.getY(); float y = request.getY();
boolean everyPage = request.isEveryPage(); boolean everyPage = Boolean.TRUE.equals(request.getEveryPage());
try { try {
byte[] pdfBytes = pdfFile.getBytes(); byte[] pdfBytes = pdfFile.getBytes();
byte[] imageBytes = imageFile.getBytes(); byte[] imageBytes = imageFile.getBytes();

View File

@ -40,9 +40,9 @@ public class RepairController {
"This endpoint repairs a given PDF file by running qpdf command. The PDF is" "This endpoint repairs a given PDF file by running qpdf command. The PDF is"
+ " first saved to a temporary location, repaired, read back, and then" + " first saved to a temporary location, repaired, read back, and then"
+ " returned as a response. Input:PDF Output:PDF Type:SISO") + " returned as a response. Input:PDF Output:PDF Type:SISO")
public ResponseEntity<byte[]> repairPdf(@ModelAttribute PDFFile request) public ResponseEntity<byte[]> repairPdf(@ModelAttribute PDFFile file)
throws IOException, InterruptedException { throws IOException, InterruptedException {
MultipartFile inputFile = request.getFileInput(); MultipartFile inputFile = file.getFileInput();
// Save the uploaded file to a temporary location // Save the uploaded file to a temporary location
Path tempInputFile = Files.createTempFile("input_", ".pdf"); Path tempInputFile = Files.createTempFile("input_", ".pdf");
byte[] pdfBytes = null; byte[] pdfBytes = null;

View File

@ -31,18 +31,18 @@ public class ReplaceAndInvertColorController {
@Operation( @Operation(
summary = "Replace-Invert Color PDF", summary = "Replace-Invert Color PDF",
description = description =
"This endpoint accepts a PDF file and option of invert all colors or replace text and background colors. Input:PDF Output:PDF Type:SISO") "This endpoint accepts a PDF file and option of invert all colors or replace"
+ " text and background colors. Input:PDF Output:PDF Type:SISO")
public ResponseEntity<InputStreamResource> replaceAndInvertColor( public ResponseEntity<InputStreamResource> replaceAndInvertColor(
@ModelAttribute ReplaceAndInvertColorRequest replaceAndInvertColorRequest) @ModelAttribute ReplaceAndInvertColorRequest request) throws IOException {
throws IOException {
InputStreamResource resource = InputStreamResource resource =
replaceAndInvertColorService.replaceAndInvertColor( replaceAndInvertColorService.replaceAndInvertColor(
replaceAndInvertColorRequest.getFileInput(), request.getFileInput(),
replaceAndInvertColorRequest.getReplaceAndInvertOption(), request.getReplaceAndInvertOption(),
replaceAndInvertColorRequest.getHighContrastColorCombination(), request.getHighContrastColorCombination(),
replaceAndInvertColorRequest.getBackGroundColor(), request.getBackGroundColor(),
replaceAndInvertColorRequest.getTextColor()); request.getTextColor());
// Return the modified PDF as a downloadable file // Return the modified PDF as a downloadable file
return ResponseEntity.ok() return ResponseEntity.ok()

View File

@ -36,8 +36,8 @@ public class ShowJavascript {
@Operation( @Operation(
summary = "Grabs all JS from a PDF and returns a single JS file with all code", summary = "Grabs all JS from a PDF and returns a single JS file with all code",
description = "desc. Input:PDF Output:JS Type:SISO") description = "desc. Input:PDF Output:JS Type:SISO")
public ResponseEntity<byte[]> extractHeader(@ModelAttribute PDFFile request) throws Exception { public ResponseEntity<byte[]> extractHeader(@ModelAttribute PDFFile file) throws Exception {
MultipartFile inputFile = request.getFileInput(); MultipartFile inputFile = file.getFileInput();
String script = ""; String script = "";
try (PDDocument document = pdfDocumentFactory.load(inputFile)) { try (PDDocument document = pdfDocumentFactory.load(inputFile)) {

View File

@ -75,7 +75,7 @@ public class RedactController {
redactPages(request, document, allPages); redactPages(request, document, allPages);
redactAreas(redactionAreas, document, allPages); redactAreas(redactionAreas, document, allPages);
if (request.isConvertPDFToImage()) { if (Boolean.TRUE.equals(request.getConvertPDFToImage())) {
PDDocument convertedPdf = PdfUtils.convertPdfToPdfImage(document); PDDocument convertedPdf = PdfUtils.convertPdfToPdfImage(document);
document.close(); document.close();
document = convertedPdf; document = convertedPdf;
@ -180,7 +180,6 @@ public class RedactController {
} }
} }
private List<Integer> getPageNumbers(ManualRedactPdfRequest request, int pagesCount) { private List<Integer> getPageNumbers(ManualRedactPdfRequest request, int pagesCount) {
String pageNumbersInput = request.getPageNumbers(); String pageNumbersInput = request.getPageNumbers();
String[] parsedPageNumbers = String[] parsedPageNumbers =
@ -201,11 +200,11 @@ public class RedactController {
throws Exception { throws Exception {
MultipartFile file = request.getFileInput(); MultipartFile file = request.getFileInput();
String listOfTextString = request.getListOfText(); String listOfTextString = request.getListOfText();
boolean useRegex = request.isUseRegex(); boolean useRegex = Boolean.TRUE.equals(request.getUseRegex());
boolean wholeWordSearchBool = request.isWholeWordSearch(); boolean wholeWordSearchBool = Boolean.TRUE.equals(request.getWholeWordSearch());
String colorString = request.getRedactColor(); String colorString = request.getRedactColor();
float customPadding = request.getCustomPadding(); float customPadding = request.getCustomPadding();
boolean convertPDFToImage = request.isConvertPDFToImage(); boolean convertPDFToImage = Boolean.TRUE.equals(request.getConvertPDFToImage());
String[] listOfText = listOfTextString.split("\n"); String[] listOfText = listOfTextString.split("\n");
PDDocument document = pdfDocumentFactory.load(file); PDDocument document = pdfDocumentFactory.load(file);

View File

@ -46,12 +46,12 @@ public class SanitizeController {
public ResponseEntity<byte[]> sanitizePDF(@ModelAttribute SanitizePdfRequest request) public ResponseEntity<byte[]> sanitizePDF(@ModelAttribute SanitizePdfRequest request)
throws IOException { throws IOException {
MultipartFile inputFile = request.getFileInput(); MultipartFile inputFile = request.getFileInput();
boolean removeJavaScript = request.isRemoveJavaScript(); boolean removeJavaScript = Boolean.TRUE.equals(request.getRemoveJavaScript());
boolean removeEmbeddedFiles = request.isRemoveEmbeddedFiles(); boolean removeEmbeddedFiles = Boolean.TRUE.equals(request.getRemoveEmbeddedFiles());
boolean removeXMPMetadata = request.isRemoveXMPMetadata(); boolean removeXMPMetadata = Boolean.TRUE.equals(request.getRemoveXMPMetadata());
boolean removeMetadata = request.isRemoveMetadata(); boolean removeMetadata = Boolean.TRUE.equals(request.getRemoveMetadata());
boolean removeLinks = request.isRemoveLinks(); boolean removeLinks = Boolean.TRUE.equals(request.getRemoveLinks());
boolean removeFonts = request.isRemoveFonts(); boolean removeFonts = Boolean.TRUE.equals(request.getRemoveFonts());
PDDocument document = pdfDocumentFactory.load(inputFile, true); PDDocument document = pdfDocumentFactory.load(inputFile, true);
if (removeJavaScript) { if (removeJavaScript) {

View File

@ -84,7 +84,7 @@ public class WatermarkController {
int widthSpacer = request.getWidthSpacer(); int widthSpacer = request.getWidthSpacer();
int heightSpacer = request.getHeightSpacer(); int heightSpacer = request.getHeightSpacer();
String customColor = request.getCustomColor(); String customColor = request.getCustomColor();
boolean convertPdfToImage = request.isConvertPDFToImage(); boolean convertPdfToImage = Boolean.TRUE.equals(request.getConvertPDFToImage());
// Load the input PDF // Load the input PDF
PDDocument document = pdfDocumentFactory.load(pdfFile); PDDocument document = pdfDocumentFactory.load(pdfFile);

View File

@ -4,7 +4,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;

View File

@ -15,6 +15,7 @@ public class PDFFile {
@Schema( @Schema(
description = "The input PDF file", description = "The input PDF file",
requiredMode = Schema.RequiredMode.REQUIRED, requiredMode = Schema.RequiredMode.REQUIRED,
contentMediaType = "application/pdf",
format = "binary") format = "binary")
private MultipartFile fileInput; private MultipartFile fileInput;
} }

View File

@ -11,7 +11,9 @@ public class PDFWithPageSize extends PDFFile {
@Schema( @Schema(
description = description =
"The scale of pages in the output PDF. Acceptable values are A0-A6, LETTER, LEGAL, KEEP.", "The scale of pages in the output PDF. Acceptable values are A0-A6, LETTER,"
+ " LEGAL, KEEP.",
requiredMode = Schema.RequiredMode.REQUIRED,
allowableValues = {"A0", "A1", "A2", "A3", "A4", "A5", "A6", "LETTER", "LEGAL", "KEEP"}) allowableValues = {"A0", "A1", "A2", "A3", "A4", "A5", "A6", "LETTER", "LEGAL", "KEEP"})
private String pageSize; private String pageSize;
} }

View File

@ -8,12 +8,22 @@ import lombok.EqualsAndHashCode;
@Data @Data
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
public class SplitPdfByChaptersRequest extends PDFFile { public class SplitPdfByChaptersRequest extends PDFFile {
@Schema(description = "Whether to include Metadata or not", example = "true") @Schema(
description = "Whether to include Metadata or not",
defaultValue = "true",
requiredMode = Schema.RequiredMode.REQUIRED)
private Boolean includeMetadata; private Boolean includeMetadata;
@Schema(description = "Whether to allow duplicates or not", example = "true") @Schema(
description = "Whether to allow duplicates or not",
defaultValue = "true",
requiredMode = Schema.RequiredMode.REQUIRED)
private Boolean allowDuplicates; private Boolean allowDuplicates;
@Schema(description = "Maximum bookmark level required", example = "2") @Schema(
description = "Maximum bookmark level required",
minimum = "0",
defaultValue = "2",
requiredMode = Schema.RequiredMode.REQUIRED)
private Integer bookmarkLevel; private Integer bookmarkLevel;
} }

View File

@ -8,12 +8,23 @@ import lombok.EqualsAndHashCode;
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public class SplitPdfBySectionsRequest extends PDFFile { public class SplitPdfBySectionsRequest extends PDFFile {
@Schema(description = "Number of horizontal divisions for each PDF page", example = "2") @Schema(
description = "Number of horizontal divisions for each PDF page",
defaultValue = "0",
minimum = "0",
requiredMode = Schema.RequiredMode.REQUIRED)
private int horizontalDivisions; private int horizontalDivisions;
@Schema(description = "Number of vertical divisions for each PDF page", example = "2") @Schema(
description = "Number of vertical divisions for each PDF page",
defaultValue = "1",
minimum = "0",
requiredMode = Schema.RequiredMode.REQUIRED)
private int verticalDivisions; private int verticalDivisions;
@Schema(description = "Merge the split documents into a single PDF", example = "true") @Schema(
private boolean merge; description = "Merge the split documents into a single PDF",
defaultValue = "true",
requiredMode = Schema.RequiredMode.REQUIRED)
private Boolean merge;
} }

View File

@ -23,9 +23,9 @@ public class ConvertPDFToMarkdown {
summary = "Convert PDF to Markdown", summary = "Convert PDF to Markdown",
description = description =
"This endpoint converts a PDF file to Markdown format. Input:PDF Output:Markdown Type:SISO") "This endpoint converts a PDF file to Markdown format. Input:PDF Output:Markdown Type:SISO")
public ResponseEntity<byte[]> processPdfToMarkdown(@ModelAttribute PDFFile request) public ResponseEntity<byte[]> processPdfToMarkdown(@ModelAttribute PDFFile file)
throws Exception { throws Exception {
MultipartFile inputFile = request.getFileInput(); MultipartFile inputFile = file.getFileInput();
PDFToFile pdfToFile = new PDFToFile(); PDFToFile pdfToFile = new PDFToFile();
return pdfToFile.processPdfToMarkdown(inputFile); return pdfToFile.processPdfToMarkdown(inputFile);
} }

View File

@ -13,21 +13,30 @@ public class ConvertToImageRequest extends PDFWithPageNums {
@Schema( @Schema(
description = "The output image format", description = "The output image format",
allowableValues = {"png", "jpeg", "jpg", "gif", "webp"}) defaultValue = "png",
allowableValues = {"png", "jpeg", "jpg", "gif", "webp"},
requiredMode = Schema.RequiredMode.REQUIRED)
private String imageFormat; private String imageFormat;
@Schema( @Schema(
description = description =
"Choose between a single image containing all pages or separate images for each" "Choose between a single image containing all pages or separate images for each"
+ " page", + " page",
allowableValues = {"single", "multiple"}) defaultValue = "multiple",
allowableValues = {"single", "multiple"},
requiredMode = Schema.RequiredMode.REQUIRED)
private String singleOrMultiple; private String singleOrMultiple;
@Schema( @Schema(
description = "The color type of the output image(s)", description = "The color type of the output image(s)",
allowableValues = {"color", "greyscale", "blackwhite"}) defaultValue = "color",
allowableValues = {"color", "greyscale", "blackwhite"},
requiredMode = Schema.RequiredMode.REQUIRED)
private String colorType; private String colorType;
@Schema(description = "The DPI (dots per inch) for the output image(s)") @Schema(
private String dpi; description = "The DPI (dots per inch) for the output image(s)",
defaultValue = "300",
requiredMode = Schema.RequiredMode.REQUIRED)
private Integer dpi;
} }

View File

@ -18,16 +18,21 @@ public class ConvertToPdfRequest {
@Schema( @Schema(
description = "Option to determine how the image will fit onto the page", description = "Option to determine how the image will fit onto the page",
requiredMode = Schema.RequiredMode.REQUIRED,
defaultValue = "fillPage",
allowableValues = {"fillPage", "fitDocumentToImage", "maintainAspectRatio"}) allowableValues = {"fillPage", "fitDocumentToImage", "maintainAspectRatio"})
private String fitOption; private String fitOption;
@Schema( @Schema(
description = "The color type of the output image(s)", description = "The color type of the output image(s)",
defaultValue = "color",
requiredMode = Schema.RequiredMode.REQUIRED,
allowableValues = {"color", "greyscale", "blackwhite"}) allowableValues = {"color", "greyscale", "blackwhite"})
private String colorType; private String colorType;
@Schema( @Schema(
description = "Whether to automatically rotate the images to better fit the PDF page", description = "Whether to automatically rotate the images to better fit the PDF page",
example = "true") requiredMode = Schema.RequiredMode.REQUIRED,
private boolean autoRotate; defaultValue = "false")
private Boolean autoRotate;
} }

View File

@ -13,6 +13,7 @@ public class HTMLToPdfRequest extends PDFFile {
@Schema( @Schema(
description = "Zoom level for displaying the website. Default is '1'.", description = "Zoom level for displaying the website. Default is '1'.",
requiredMode = Schema.RequiredMode.REQUIRED,
defaultValue = "1") defaultValue = "1")
private float zoom; private float zoom;
} }

View File

@ -13,6 +13,7 @@ public class PdfToBookRequest extends PDFFile {
@Schema( @Schema(
description = "The output Ebook format", description = "The output Ebook format",
requiredMode = Schema.RequiredMode.REQUIRED,
allowableValues = { allowableValues = {
"epub", "mobi", "azw3", "docx", "rtf", "txt", "html", "lit", "fb2", "pdb", "lrf" "epub", "mobi", "azw3", "docx", "rtf", "txt", "html", "lit", "fb2", "pdb", "lrf"
}) })

View File

@ -13,6 +13,7 @@ public class PdfToPdfARequest extends PDFFile {
@Schema( @Schema(
description = "The output PDF/A type", description = "The output PDF/A type",
requiredMode = Schema.RequiredMode.REQUIRED,
allowableValues = {"pdfa", "pdfa-1"}) allowableValues = {"pdfa", "pdfa-1"})
private String outputFormat; private String outputFormat;
} }

View File

@ -13,6 +13,7 @@ public class PdfToPresentationRequest extends PDFFile {
@Schema( @Schema(
description = "The output Presentation format", description = "The output Presentation format",
requiredMode = Schema.RequiredMode.REQUIRED,
allowableValues = {"ppt", "pptx", "odp"}) allowableValues = {"ppt", "pptx", "odp"})
private String outputFormat; private String outputFormat;
} }

View File

@ -13,6 +13,7 @@ public class PdfToTextOrRTFRequest extends PDFFile {
@Schema( @Schema(
description = "The output Text or RTF format", description = "The output Text or RTF format",
requiredMode = Schema.RequiredMode.REQUIRED,
allowableValues = {"rtf", "txt"}) allowableValues = {"rtf", "txt"})
private String outputFormat; private String outputFormat;
} }

View File

@ -13,6 +13,7 @@ public class PdfToWordRequest extends PDFFile {
@Schema( @Schema(
description = "The output Word document format", description = "The output Word document format",
requiredMode = Schema.RequiredMode.REQUIRED,
allowableValues = {"doc", "docx", "odt"}) allowableValues = {"doc", "docx", "odt"})
private String outputFormat; private String outputFormat;
} }

View File

@ -13,10 +13,12 @@ public class MergeMultiplePagesRequest extends PDFFile {
@Schema( @Schema(
description = "The number of pages to fit onto a single sheet in the output PDF.", description = "The number of pages to fit onto a single sheet in the output PDF.",
type = "integer", type = "number",
defaultValue = "2",
requiredMode = Schema.RequiredMode.REQUIRED,
allowableValues = {"2", "3", "4", "9", "16"}) allowableValues = {"2", "3", "4", "9", "16"})
private int pagesPerSheet; private int pagesPerSheet;
@Schema(description = "Boolean for if you wish to add border around the pages") @Schema(description = "Boolean for if you wish to add border around the pages")
private boolean addBorder; private Boolean addBorder;
} }

View File

@ -20,12 +20,16 @@ public class MergePdfsRequest extends MultiplePDFFiles {
"byDateCreated", "byDateCreated",
"byPDFTitle" "byPDFTitle"
}, },
requiredMode = Schema.RequiredMode.REQUIRED,
defaultValue = "orderProvided") defaultValue = "orderProvided")
private String sortType = "orderProvided"; private String sortType = "orderProvided";
@Schema( @Schema(
description = description =
"Flag indicating whether to remove certification signatures from the merged PDF. If true, all certification signatures will be removed from the final merged document.", "Flag indicating whether to remove certification signatures from the merged"
example = "true") + " PDF. If true, all certification signatures will be removed from the"
private boolean isRemoveCertSign; + " final merged document.",
requiredMode = Schema.RequiredMode.REQUIRED,
defaultValue = "true")
private Boolean removeCertSign;
} }

View File

@ -41,6 +41,6 @@ public class OverlayPdfsRequest extends PDFFile {
description = "Overlay position 0 is Foregound, 1 is Background", description = "Overlay position 0 is Foregound, 1 is Background",
allowableValues = {"0", "1"}, allowableValues = {"0", "1"},
requiredMode = Schema.RequiredMode.REQUIRED, requiredMode = Schema.RequiredMode.REQUIRED,
type = "integer") type = "number")
private int overlayPosition; private int overlayPosition;
} }

View File

@ -15,7 +15,7 @@ public class RotatePDFRequest extends PDFFile {
description = description =
"The angle by which to rotate the PDF file. This should be a multiple of 90.", "The angle by which to rotate the PDF file. This should be a multiple of 90.",
requiredMode = Schema.RequiredMode.REQUIRED, requiredMode = Schema.RequiredMode.REQUIRED,
allowableValues = "0, 90, 180, 270", allowableValues = {"0", "90", "180", "270"},
example = "90") defaultValue = "90")
private Integer angle; private Integer angle;
} }

View File

@ -12,7 +12,11 @@ import stirling.software.SPDF.model.api.PDFWithPageSize;
public class ScalePagesRequest extends PDFWithPageSize { public class ScalePagesRequest extends PDFWithPageSize {
@Schema( @Schema(
minimum = "0",
defaultValue = "1",
requiredMode = Schema.RequiredMode.REQUIRED,
description = description =
"The scale of the content on the pages of the output PDF. Acceptable values are floats.") "The scale of the content on the pages of the output PDF. Acceptable values are"
+ " floats.")
private float scaleFactor; private float scaleFactor;
} }

View File

@ -17,7 +17,7 @@ public class MetadataRequest extends PDFFile {
description = "Delete all metadata if set to true", description = "Delete all metadata if set to true",
defaultValue = "false", defaultValue = "false",
requiredMode = Schema.RequiredMode.REQUIRED) requiredMode = Schema.RequiredMode.REQUIRED)
private boolean deleteAll; private Boolean deleteAll;
@Schema( @Schema(
description = "The author of the document", description = "The author of the document",

View File

@ -35,5 +35,5 @@ public class OverlayImageRequest extends PDFFile {
description = "Whether to overlay the image onto every page of the PDF.", description = "Whether to overlay the image onto every page of the PDF.",
requiredMode = Schema.RequiredMode.REQUIRED, requiredMode = Schema.RequiredMode.REQUIRED,
defaultValue = "false") defaultValue = "false")
private boolean everyPage; private Boolean everyPage;
} }

View File

@ -14,18 +14,16 @@ public class RemoveBlankPagesRequest extends PDFFile {
@Schema( @Schema(
description = "The threshold value to determine blank pages", description = "The threshold value to determine blank pages",
requiredMode = Schema.RequiredMode.REQUIRED, requiredMode = Schema.RequiredMode.REQUIRED,
example = "10",
minimum = "0", minimum = "0",
maximum = "255", maximum = "255",
defaultValue = "10") defaultValue = "10")
private int threshold = 10; private int threshold;
@Schema( @Schema(
description = "The percentage of white color on a page to consider it as blank", description = "The percentage of white color on a page to consider it as blank",
requiredMode = Schema.RequiredMode.REQUIRED, requiredMode = Schema.RequiredMode.REQUIRED,
minimum = "0.1", minimum = "0.1",
maximum = "100", maximum = "100",
example = "99.9",
defaultValue = "99.9") defaultValue = "99.9")
private float whitePercent = 99.9f; private float whitePercent;
} }

View File

@ -29,29 +29,29 @@ public class AddWatermarkRequest extends PDFFile {
description = "The selected alphabet", description = "The selected alphabet",
allowableValues = {"roman", "arabic", "japanese", "korean", "chinese"}, allowableValues = {"roman", "arabic", "japanese", "korean", "chinese"},
defaultValue = "roman") defaultValue = "roman")
private String alphabet = "roman"; private String alphabet;
@Schema(description = "The font size of the watermark text", example = "30") @Schema(description = "The font size of the watermark text", defaultValue = "30")
private float fontSize = 30; private float fontSize;
@Schema(description = "The rotation of the watermark in degrees", example = "0") @Schema(description = "The rotation of the watermark in degrees", defaultValue = "0")
private float rotation = 0; private float rotation;
@Schema(description = "The opacity of the watermark (0.0 - 1.0)", example = "0.5") @Schema(description = "The opacity of the watermark (0.0 - 1.0)", defaultValue = "0.5")
private float opacity; private float opacity;
@Schema(description = "The width spacer between watermark elements", example = "50") @Schema(description = "The width spacer between watermark elements", defaultValue = "50")
private int widthSpacer; private int widthSpacer;
@Schema(description = "The height spacer between watermark elements", example = "50") @Schema(description = "The height spacer between watermark elements", defaultValue = "50")
private int heightSpacer; private int heightSpacer;
@Schema(description = "The color for watermark", defaultValue = "#d3d3d3") @Schema(description = "The color for watermark", defaultValue = "#d3d3d3")
private String customColor = "#d3d3d3"; private String customColor;
@Schema( @Schema(
description = "Convert the redacted PDF to an image", description = "Convert the redacted PDF to an image",
defaultValue = "false", defaultValue = "false",
requiredMode = Schema.RequiredMode.REQUIRED) requiredMode = Schema.RequiredMode.REQUIRED)
private boolean convertPDFToImage; private Boolean convertPDFToImage;
} }

View File

@ -21,7 +21,7 @@ public class ManualRedactPdfRequest extends PDFWithPageNums {
description = "Convert the redacted PDF to an image", description = "Convert the redacted PDF to an image",
defaultValue = "false", defaultValue = "false",
requiredMode = Schema.RequiredMode.REQUIRED) requiredMode = Schema.RequiredMode.REQUIRED)
private boolean convertPDFToImage; private Boolean convertPDFToImage;
@Schema( @Schema(
description = "The color used to fully redact certain pages", description = "The color used to fully redact certain pages",

View File

@ -13,7 +13,6 @@ public class RedactPdfRequest extends PDFFile {
@Schema( @Schema(
description = "List of text to redact from the PDF", description = "List of text to redact from the PDF",
type = "string",
defaultValue = "text,text2", defaultValue = "text,text2",
requiredMode = Schema.RequiredMode.REQUIRED) requiredMode = Schema.RequiredMode.REQUIRED)
private String listOfText; private String listOfText;
@ -22,13 +21,13 @@ public class RedactPdfRequest extends PDFFile {
description = "Whether to use regex for the listOfText", description = "Whether to use regex for the listOfText",
defaultValue = "false", defaultValue = "false",
requiredMode = Schema.RequiredMode.REQUIRED) requiredMode = Schema.RequiredMode.REQUIRED)
private boolean useRegex; private Boolean useRegex;
@Schema( @Schema(
description = "Whether to use whole word search", description = "Whether to use whole word search",
defaultValue = "false", defaultValue = "false",
requiredMode = Schema.RequiredMode.REQUIRED) requiredMode = Schema.RequiredMode.REQUIRED)
private boolean wholeWordSearch; private Boolean wholeWordSearch;
@Schema( @Schema(
description = "The color for redaction", description = "The color for redaction",
@ -46,5 +45,5 @@ public class RedactPdfRequest extends PDFFile {
description = "Convert the redacted PDF to an image", description = "Convert the redacted PDF to an image",
defaultValue = "false", defaultValue = "false",
requiredMode = Schema.RequiredMode.REQUIRED) requiredMode = Schema.RequiredMode.REQUIRED)
private boolean convertPDFToImage; private Boolean convertPDFToImage;
} }

View File

@ -13,37 +13,37 @@ public class SanitizePdfRequest extends PDFFile {
@Schema( @Schema(
description = "Remove JavaScript actions from the PDF", description = "Remove JavaScript actions from the PDF",
defaultValue = "false", defaultValue = "true",
requiredMode = Schema.RequiredMode.REQUIRED) requiredMode = Schema.RequiredMode.REQUIRED)
private boolean removeJavaScript; private Boolean removeJavaScript;
@Schema( @Schema(
description = "Remove embedded files from the PDF", description = "Remove embedded files from the PDF",
defaultValue = "false", defaultValue = "true",
requiredMode = Schema.RequiredMode.REQUIRED) requiredMode = Schema.RequiredMode.REQUIRED)
private boolean removeEmbeddedFiles; private Boolean removeEmbeddedFiles;
@Schema( @Schema(
description = "Remove XMP metadata from the PDF", description = "Remove XMP metadata from the PDF",
defaultValue = "false", defaultValue = "false",
requiredMode = Schema.RequiredMode.REQUIRED) requiredMode = Schema.RequiredMode.REQUIRED)
private boolean removeXMPMetadata; private Boolean removeXMPMetadata;
@Schema( @Schema(
description = "Remove document info metadata from the PDF", description = "Remove document info metadata from the PDF",
defaultValue = "false", defaultValue = "false",
requiredMode = Schema.RequiredMode.REQUIRED) requiredMode = Schema.RequiredMode.REQUIRED)
private boolean removeMetadata; private Boolean removeMetadata;
@Schema( @Schema(
description = "Remove links from the PDF", description = "Remove links from the PDF",
defaultValue = "false", defaultValue = "false",
requiredMode = Schema.RequiredMode.REQUIRED) requiredMode = Schema.RequiredMode.REQUIRED)
private boolean removeLinks; private Boolean removeLinks;
@Schema( @Schema(
description = "Remove fonts from the PDF", description = "Remove fonts from the PDF",
defaultValue = "false", defaultValue = "false",
requiredMode = Schema.RequiredMode.REQUIRED) requiredMode = Schema.RequiredMode.REQUIRED)
private boolean removeFonts; private Boolean removeFonts;
} }

View File

@ -25,11 +25,13 @@ import com.vladsch.flexmark.util.data.MutableDataSet;
import io.github.pixee.security.Filenames; import io.github.pixee.security.Filenames;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult;
@Slf4j @Slf4j
@NoArgsConstructor
public class PDFToFile { public class PDFToFile {
public ResponseEntity<byte[]> processPdfToMarkdown(MultipartFile inputFile) public ResponseEntity<byte[]> processPdfToMarkdown(MultipartFile inputFile)