diff --git a/src/main/java/stirling/software/SPDF/config/OpenApiConfig.java b/src/main/java/stirling/software/SPDF/config/OpenApiConfig.java index 6935f60f..0ab63952 100644 --- a/src/main/java/stirling/software/SPDF/config/OpenApiConfig.java +++ b/src/main/java/stirling/software/SPDF/config/OpenApiConfig.java @@ -6,15 +6,17 @@ import org.springframework.context.annotation.Configuration; import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.info.Info; -import io.swagger.v3.oas.models.info.License; @Configuration public class OpenApiConfig { @Bean public OpenAPI customOpenAPI() { + String version = getClass().getPackage().getImplementationVersion(); + version = (version != null) ? version : "1.0.0"; + return new OpenAPI().components(new Components()).info( - new Info().title("Your API Title").version("1.0.0").description("Your API Description").license(new License().name("Your License Name").url("Your License URL"))); + new Info().title("Stirling PDF API").version(version).description("API documentation for all Server-Side processing.\nPlease note some functionality might be UI only and missing from here.")); } } diff --git a/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java b/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java index 4ed72e92..9fdf2d0b 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java @@ -15,6 +15,8 @@ import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import stirling.software.SPDF.utils.PdfUtils; @RestController @@ -22,9 +24,17 @@ public class RearrangePagesPDFController { private static final Logger logger = LoggerFactory.getLogger(RearrangePagesPDFController.class); + @PostMapping(consumes = "multipart/form-data", value = "/remove-pages") - public ResponseEntity deletePages(@RequestPart(required = true, value = "fileInput") MultipartFile pdfFile, @RequestParam("pagesToDelete") String pagesToDelete) - throws IOException { + @Operation(summary = "Remove pages from a PDF file", + description = "This endpoint removes specified pages from a given PDF file. Users can provide a comma-separated list of page numbers or ranges to delete.") + public ResponseEntity deletePages( + @RequestPart(required = true, value = "fileInput") + @Parameter(description = "The input PDF file from which pages will be removed") + MultipartFile pdfFile, + @RequestParam("pagesToDelete") + @Parameter(description = "Comma-separated list of pages or page ranges to delete, e.g., '1,3,5-8'") + String pagesToDelete) throws IOException { PDDocument document = PDDocument.load(pdfFile.getBytes()); @@ -70,7 +80,15 @@ public class RearrangePagesPDFController { } @PostMapping(consumes = "multipart/form-data", value = "/rearrange-pages") - public ResponseEntity rearrangePages(@RequestPart(required = true, value = "fileInput") MultipartFile pdfFile, @RequestParam("pageOrder") String pageOrder) { + @Operation(summary = "Rearrange pages in a PDF file", + description = "This endpoint rearranges pages in a given PDF file based on the specified page order. Users can provide a page order as a comma-separated list of page numbers or page ranges.") + public ResponseEntity rearrangePages( + @RequestPart(required = true, value = "fileInput") + @Parameter(description = "The input PDF file to rearrange pages") + MultipartFile pdfFile, + @RequestParam("pageOrder") + @Parameter(description = "The new page order as a comma-separated list of page numbers or page ranges (e.g., '1,3,5-7')") + String pageOrder) { try { // Load the input PDF PDDocument document = PDDocument.load(pdfFile.getInputStream()); diff --git a/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java b/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java index f6deb80c..99152e69 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java @@ -27,13 +27,24 @@ import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; + @RestController public class SplitPDFController { private static final Logger logger = LoggerFactory.getLogger(SplitPDFController.class); @PostMapping(consumes = "multipart/form-data", value = "/split-pages") - public ResponseEntity splitPdf(@RequestPart(required = true, value = "fileInput") MultipartFile file, @RequestParam("pages") String pages) throws IOException { + @Operation(summary = "Split a PDF file into separate documents", + description = "This endpoint splits a given PDF file into separate documents based on the specified page numbers or ranges. Users can specify pages using individual numbers, ranges, or 'all' for every page.") + public ResponseEntity splitPdf( + @RequestPart(required = true, value = "fileInput") + @Parameter(description = "The input PDF file to be split") + MultipartFile file, + @RequestParam("pages") + @Parameter(description = "The pages to be included in separate documents. Specify individual page numbers (e.g., '1,3,5'), ranges (e.g., '1-3,5-7'), or 'all' for every page.") + String pages) throws IOException { // parse user input // open the pdf document diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java index 12172127..33fae21e 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java @@ -17,16 +17,34 @@ import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Schema; import stirling.software.SPDF.utils.PdfUtils; - @RestController public class ConvertImgPDFController { private static final Logger logger = LoggerFactory.getLogger(ConvertImgPDFController.class); @PostMapping(consumes = "multipart/form-data", value = "/pdf-to-img") - public ResponseEntity convertToImage(@RequestPart(required = true, value = "fileInput") MultipartFile file, @RequestParam("imageFormat") String imageFormat, - @RequestParam("singleOrMultiple") String singleOrMultiple, @RequestParam("colorType") String colorType, @RequestParam("dpi") String dpi) throws IOException { + @Operation(summary = "Convert PDF to image(s)", + description = "This endpoint converts a PDF file to image(s) with the specified image format, color type, and DPI. Users can choose to get a single image or multiple images.") + public ResponseEntity convertToImage( + @RequestPart(required = true, value = "fileInput") + @Parameter(description = "The input PDF file to be converted") + MultipartFile file, + @RequestParam("imageFormat") + @Parameter(description = "The output image format", schema = @Schema(allowableValues = {"png", "jpeg", "jpg", "gif"})) + String imageFormat, + @RequestParam("singleOrMultiple") + @Parameter(description = "Choose between a single image containing all pages or separate images for each page", schema = @Schema(allowableValues = {"single", "multiple"})) + String singleOrMultiple, + @RequestParam("colorType") + @Parameter(description = "The color type of the output image(s)", schema = @Schema(allowableValues = {"rgb", "greyscale", "blackwhite"})) + String colorType, + @RequestParam("dpi") + @Parameter(description = "The DPI (dots per inch) for the output image(s)") + String dpi) throws IOException { byte[] pdfBytes = file.getBytes(); ImageType colorTypeResult = ImageType.RGB; @@ -62,9 +80,18 @@ public class ConvertImgPDFController { } @PostMapping(consumes = "multipart/form-data", value = "/img-to-pdf") - public ResponseEntity convertToPdf(@RequestPart(required = true, value = "fileInput") MultipartFile[] file, - @RequestParam(defaultValue = "false", name = "stretchToFit") boolean stretchToFit, @RequestParam(defaultValue = "true", name = "autoRotate") boolean autoRotate) - throws IOException { + @Operation(summary = "Convert images to a PDF file", + description = "This endpoint converts one or more images to a PDF file. Users can specify whether to stretch the images to fit the PDF page, and whether to automatically rotate the images.") + public ResponseEntity convertToPdf( + @RequestPart(required = true, value = "fileInput") + @Parameter(description = "The input images to be converted to a PDF file") + MultipartFile[] file, + @RequestParam(defaultValue = "false", name = "stretchToFit") + @Parameter(description = "Whether to stretch the images to fit the PDF page or maintain the aspect ratio", example = "false") + boolean stretchToFit, + @RequestParam(defaultValue = "true", name = "autoRotate") + @Parameter(description = "Whether to automatically rotate the images to better fit the PDF page", example = "true") + boolean autoRotate) throws IOException { // Convert the file to PDF and get the resulting bytes System.out.println(stretchToFit); byte[] bytes = PdfUtils.imageToPdf(file, stretchToFit, autoRotate); diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToOffice.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToOffice.java index 29d16495..153e5fdf 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToOffice.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToOffice.java @@ -9,8 +9,10 @@ import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Schema; import stirling.software.SPDF.utils.PDFToFile; - @RestController public class ConvertPDFToOffice { @@ -23,22 +25,43 @@ public class ConvertPDFToOffice { } @PostMapping(consumes = "multipart/form-data", value = "/pdf-to-presentation") - public ResponseEntity processPdfToPresentation(@RequestPart(required = true, value = "fileInput") MultipartFile inputFile, - @RequestParam("outputFormat") String outputFormat) throws IOException, InterruptedException { + @Operation(summary = "Convert PDF to Presentation format", + description = "This endpoint converts a given PDF file to a Presentation format.") + public ResponseEntity processPdfToPresentation( + @RequestPart(required = true, value = "fileInput") + @Parameter(description = "The input PDF file") + MultipartFile inputFile, + @RequestParam("outputFormat") + @Parameter(description = "The output Presentation format", schema = @Schema(allowableValues = {"ppt", "pptx", "odp"})) + String outputFormat) throws IOException, InterruptedException { PDFToFile pdfToFile = new PDFToFile(); return pdfToFile.processPdfToOfficeFormat(inputFile, outputFormat, "impress_pdf_import"); } @PostMapping(consumes = "multipart/form-data", value = "/pdf-to-text") - public ResponseEntity processPdfToRTForTXT(@RequestPart(required = true, value = "fileInput") MultipartFile inputFile, - @RequestParam("outputFormat") String outputFormat) throws IOException, InterruptedException { + @Operation(summary = "Convert PDF to Text or RTF format", + description = "This endpoint converts a given PDF file to Text or RTF format.") + public ResponseEntity processPdfToRTForTXT( + @RequestPart(required = true, value = "fileInput") + @Parameter(description = "The input PDF file") + MultipartFile inputFile, + @RequestParam("outputFormat") + @Parameter(description = "The output Text or RTF format", schema = @Schema(allowableValues = {"rtf", "txt:Text"})) + String outputFormat) throws IOException, InterruptedException { PDFToFile pdfToFile = new PDFToFile(); return pdfToFile.processPdfToOfficeFormat(inputFile, outputFormat, "writer_pdf_import"); } @PostMapping(consumes = "multipart/form-data", value = "/pdf-to-word") - public ResponseEntity processPdfToWord(@RequestPart(required = true, value = "fileInput") MultipartFile inputFile, @RequestParam("outputFormat") String outputFormat) - throws IOException, InterruptedException { + @Operation(summary = "Convert PDF to Word document", + description = "This endpoint converts a given PDF file to a Word document format.") + public ResponseEntity processPdfToWord( + @RequestPart(required = true, value = "fileInput") + @Parameter(description = "The input PDF file") + MultipartFile inputFile, + @RequestParam("outputFormat") + @Parameter(description = "The output Word document format", schema = @Schema(allowableValues = {"doc", "docx", "odt"})) + String outputFormat) throws IOException, InterruptedException { PDFToFile pdfToFile = new PDFToFile(); return pdfToFile.processPdfToOfficeFormat(inputFile, outputFormat, "writer_pdf_import"); } diff --git a/src/main/java/stirling/software/SPDF/controller/api/other/BlankPageController.java b/src/main/java/stirling/software/SPDF/controller/api/other/BlankPageController.java index d84ea78c..b8cb651b 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/other/BlankPageController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/other/BlankPageController.java @@ -1,4 +1,14 @@ package stirling.software.SPDF.controller.api.other; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import javax.imageio.ImageIO; + import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageTree; @@ -10,21 +20,11 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; + import stirling.software.SPDF.utils.ImageFinder; import stirling.software.SPDF.utils.PdfUtils; import stirling.software.SPDF.utils.ProcessExecutor; -import java.awt.image.BufferedImage; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import javax.imageio.ImageIO; - @RestController public class BlankPageController { diff --git a/src/main/java/stirling/software/SPDF/controller/api/other/ExtractImageScansController.java b/src/main/java/stirling/software/SPDF/controller/api/other/ExtractImageScansController.java index bb15eee9..89ca7064 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/other/ExtractImageScansController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/other/ExtractImageScansController.java @@ -29,6 +29,8 @@ import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import stirling.software.SPDF.utils.PdfUtils; import stirling.software.SPDF.utils.ProcessExecutor; @@ -38,10 +40,27 @@ public class ExtractImageScansController { private static final Logger logger = LoggerFactory.getLogger(ExtractImageScansController.class); @PostMapping(consumes = "multipart/form-data", value = "/extract-image-scans") - public ResponseEntity extractImageScans(@RequestPart(required = true, value = "fileInput") MultipartFile inputFile, - @RequestParam(name = "angle_threshold", defaultValue = "5") int angleThreshold, @RequestParam(name = "tolerance", defaultValue = "20") int tolerance, - @RequestParam(name = "min_area", defaultValue = "8000") int minArea, @RequestParam(name = "min_contour_area", defaultValue = "500") int minContourArea, - @RequestParam(name = "border_size", defaultValue = "1") int borderSize) throws IOException, InterruptedException { + @Operation(summary = "Extract image scans from an input file", + description = "This endpoint extracts image scans from a given file based on certain parameters. Users can specify angle threshold, tolerance, minimum area, minimum contour area, and border size.") + public ResponseEntity extractImageScans( + @RequestPart(required = true, value = "fileInput") + @Parameter(description = "The input file containing image scans") + MultipartFile inputFile, + @RequestParam(name = "angle_threshold", defaultValue = "5") + @Parameter(description = "The angle threshold for the image scan extraction", example = "5") + int angleThreshold, + @RequestParam(name = "tolerance", defaultValue = "20") + @Parameter(description = "The tolerance for the image scan extraction", example = "20") + int tolerance, + @RequestParam(name = "min_area", defaultValue = "8000") + @Parameter(description = "The minimum area for the image scan extraction", example = "8000") + int minArea, + @RequestParam(name = "min_contour_area", defaultValue = "500") + @Parameter(description = "The minimum contour area for the image scan extraction", example = "500") + int minContourArea, + @RequestParam(name = "border_size", defaultValue = "1") + @Parameter(description = "The border size for the image scan extraction", example = "1") + int borderSize) throws IOException, InterruptedException { String fileName = inputFile.getOriginalFilename(); String extension = fileName.substring(fileName.lastIndexOf(".") + 1); diff --git a/src/main/java/stirling/software/SPDF/controller/api/other/ExtractImagesController.java b/src/main/java/stirling/software/SPDF/controller/api/other/ExtractImagesController.java index d935bd39..cf31dda7 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/other/ExtractImagesController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/other/ExtractImagesController.java @@ -26,15 +26,25 @@ import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Schema; import stirling.software.SPDF.utils.PdfUtils; - @RestController public class ExtractImagesController { private static final Logger logger = LoggerFactory.getLogger(ExtractImagesController.class); @PostMapping(consumes = "multipart/form-data", value = "/extract-images") - public ResponseEntity extractImages(@RequestPart(required = true, value = "fileInput") MultipartFile file, @RequestParam("format") String format) throws IOException { + @Operation(summary = "Extract images from a PDF file", + description = "This endpoint extracts images from a given PDF file and returns them in a zip file. Users can specify the output image format.") + public ResponseEntity extractImages( + @RequestPart(required = true, value = "fileInput") + @Parameter(description = "The input PDF file containing images") + MultipartFile file, + @RequestParam("format") + @Parameter(description = "The output image format e.g., 'png', 'jpeg', or 'gif'", schema = @Schema(allowableValues = {"png", "jpeg", "gif"})) + String format) throws IOException { System.out.println(System.currentTimeMillis() + "file=" + file.getName() + ", format=" + format); PDDocument document = PDDocument.load(file.getBytes()); diff --git a/src/main/java/stirling/software/SPDF/controller/api/other/MetadataController.java b/src/main/java/stirling/software/SPDF/controller/api/other/MetadataController.java index 42309c39..5840cd64 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/other/MetadataController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/other/MetadataController.java @@ -17,6 +17,8 @@ import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import stirling.software.SPDF.utils.PdfUtils; @RestController @@ -35,13 +37,44 @@ public class MetadataController { } @PostMapping(consumes = "multipart/form-data", value = "/update-metadata") - public ResponseEntity metadata(@RequestPart(required = true, value = "fileInput") MultipartFile pdfFile, - @RequestParam(value = "deleteAll", required = false, defaultValue = "false") Boolean deleteAll, @RequestParam(value = "author", required = false) String author, - @RequestParam(value = "creationDate", required = false) String creationDate, @RequestParam(value = "creator", required = false) String creator, - @RequestParam(value = "keywords", required = false) String keywords, @RequestParam(value = "modificationDate", required = false) String modificationDate, - @RequestParam(value = "producer", required = false) String producer, @RequestParam(value = "subject", required = false) String subject, - @RequestParam(value = "title", required = false) String title, @RequestParam(value = "trapped", required = false) String trapped, - @RequestParam Map allRequestParams) throws IOException { + @Operation(summary = "Update metadata of a PDF file", + description = "This endpoint allows you to update the metadata of a given PDF file. You can add, modify, or delete standard and custom metadata fields.") + public ResponseEntity metadata( + @RequestPart(required = true, value = "fileInput") + @Parameter(description = "The input PDF file to update metadata") + MultipartFile pdfFile, + @RequestParam(value = "deleteAll", required = false, defaultValue = "false") + @Parameter(description = "Delete all metadata if set to true") + Boolean deleteAll, + @RequestParam(value = "author", required = false) + @Parameter(description = "The author of the document") + String author, + @RequestParam(value = "creationDate", required = false) + @Parameter(description = "The creation date of the document (format: yyyy/MM/dd HH:mm:ss)") + String creationDate, + @RequestParam(value = "creator", required = false) + @Parameter(description = "The creator of the document") + String creator, + @RequestParam(value = "keywords", required = false) + @Parameter(description = "The keywords for the document") + String keywords, + @RequestParam(value = "modificationDate", required = false) + @Parameter(description = "The modification date of the document (format: yyyy/MM/dd HH:mm:ss)") + String modificationDate, + @RequestParam(value = "producer", required = false) + @Parameter(description = "The producer of the document") + String producer, + @RequestParam(value = "subject", required = false) + @Parameter(description = "The subject of the document") + String subject, + @RequestParam(value = "title", required = false) + @Parameter(description = "The title of the document") + String title, + @RequestParam(value = "trapped", required = false) + @Parameter(description = "The trapped status of the document") + String trapped, + @RequestParam Map allRequestParams) + throws IOException { // Load the PDF file into a PDDocument PDDocument document = PDDocument.load(pdfFile.getBytes()); diff --git a/src/main/java/stirling/software/SPDF/controller/api/other/OCRController.java b/src/main/java/stirling/software/SPDF/controller/api/other/OCRController.java index 5c7f2553..f1769dce 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/other/OCRController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/other/OCRController.java @@ -24,6 +24,9 @@ import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Schema; import stirling.software.SPDF.utils.PdfUtils; import stirling.software.SPDF.utils.ProcessExecutor; @@ -43,13 +46,36 @@ public class OCRController { } @PostMapping(consumes = "multipart/form-data", value = "/ocr-pdf") - public ResponseEntity processPdfWithOCR(@RequestPart(required = true, value = "fileInput") MultipartFile inputFile, - @RequestParam("languages") List selectedLanguages, @RequestParam(name = "sidecar", required = false) Boolean sidecar, - @RequestParam(name = "deskew", required = false) Boolean deskew, @RequestParam(name = "clean", required = false) Boolean clean, - @RequestParam(name = "clean-final", required = false) Boolean cleanFinal, @RequestParam(name = "ocrType", required = false) String ocrType, - @RequestParam(name = "ocrRenderType", required = false, defaultValue = "hocr") String ocrRenderType, - @RequestParam(name = "removeImagesAfter", required = false) Boolean removeImagesAfter) - throws IOException, InterruptedException { + @Operation(summary = "Process a PDF file with OCR", + description = "This endpoint processes a PDF file using OCR (Optical Character Recognition). Users can specify languages, sidecar, deskew, clean, cleanFinal, ocrType, ocrRenderType, and removeImagesAfter options.") + public ResponseEntity processPdfWithOCR( + @RequestPart(required = true, value = "fileInput") + @Parameter(description = "The input PDF file to be processed with OCR") + MultipartFile inputFile, + @RequestParam("languages") + @Parameter(description = "List of languages to use in OCR processing") + List selectedLanguages, + @RequestParam(name = "sidecar", required = false) + @Parameter(description = "Include OCR text in a sidecar text file if set to true") + Boolean sidecar, + @RequestParam(name = "deskew", required = false) + @Parameter(description = "Deskew the input file if set to true") + Boolean deskew, + @RequestParam(name = "clean", required = false) + @Parameter(description = "Clean the input file if set to true") + Boolean clean, + @RequestParam(name = "clean-final", required = false) + @Parameter(description = "Clean the final output if set to true") + Boolean cleanFinal, + @RequestParam(name = "ocrType", required = false) + @Parameter(description = "Specify the OCR type, e.g., 'skip-text', 'force-ocr', or 'Normal'", schema = @Schema(allowableValues = {"skip-text", "force-ocr", "Normal"})) + String ocrType, + @RequestParam(name = "ocrRenderType", required = false, defaultValue = "hocr") + @Parameter(description = "Specify the OCR render type, either 'hocr' or 'sandwich'", schema = @Schema(allowableValues = {"hocr", "sandwich"})) + String ocrRenderType, + @RequestParam(name = "removeImagesAfter", required = false) + @Parameter(description = "Remove images from the output PDF if set to true") + Boolean removeImagesAfter) throws IOException, InterruptedException { // --output-type pdfa if (selectedLanguages == null || selectedLanguages.isEmpty()) { diff --git a/src/main/java/stirling/software/SPDF/controller/api/other/RepairController.java b/src/main/java/stirling/software/SPDF/controller/api/other/RepairController.java index 28f87efa..08fe65c5 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/other/RepairController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/other/RepairController.java @@ -10,7 +10,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java b/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java index 8f9203b1..88955197 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java @@ -24,6 +24,8 @@ import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; import stirling.software.SPDF.utils.PdfUtils; import stirling.software.SPDF.utils.WatermarkRemover; @@ -31,10 +33,30 @@ import stirling.software.SPDF.utils.WatermarkRemover; public class WatermarkController { @PostMapping(consumes = "multipart/form-data", value = "/add-watermark") - public ResponseEntity addWatermark(@RequestPart(required = true, value = "fileInput") MultipartFile pdfFile, @RequestParam("watermarkText") String watermarkText, - @RequestParam(defaultValue = "30", name = "fontSize") float fontSize, @RequestParam(defaultValue = "0", name = "rotation") float rotation, - @RequestParam(defaultValue = "0.5", name = "opacity") float opacity, @RequestParam(defaultValue = "50", name = "widthSpacer") int widthSpacer, - @RequestParam(defaultValue = "50", name = "heightSpacer") int heightSpacer) throws IOException { + @Operation(summary = "Add watermark to a PDF file", + description = "This endpoint adds a watermark to a given PDF file. Users can specify the watermark text, font size, rotation, opacity, width spacer, and height spacer.") + public ResponseEntity addWatermark( + @RequestPart(required = true, value = "fileInput") + @Parameter(description = "The input PDF file to add a watermark") + MultipartFile pdfFile, + @RequestParam("watermarkText") + @Parameter(description = "The watermark text to add to the PDF file") + String watermarkText, + @RequestParam(defaultValue = "30", name = "fontSize") + @Parameter(description = "The font size of the watermark text", example = "30") + float fontSize, + @RequestParam(defaultValue = "0", name = "rotation") + @Parameter(description = "The rotation of the watermark text in degrees", example = "0") + float rotation, + @RequestParam(defaultValue = "0.5", name = "opacity") + @Parameter(description = "The opacity of the watermark text (0.0 - 1.0)", example = "0.5") + float opacity, + @RequestParam(defaultValue = "50", name = "widthSpacer") + @Parameter(description = "The width spacer between watermark texts", example = "50") + int widthSpacer, + @RequestParam(defaultValue = "50", name = "heightSpacer") + @Parameter(description = "The height spacer between watermark texts", example = "50") + int heightSpacer) throws IOException { // Load the input PDF PDDocument document = PDDocument.load(pdfFile.getInputStream()); diff --git a/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java b/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java index 3f26aceb..c5184abe 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java @@ -78,6 +78,7 @@ public class GeneralWebController { @GetMapping(value = "/robots.txt", produces = MediaType.TEXT_PLAIN_VALUE) @ResponseBody + @Hidden public String getRobotsTxt() { String allowGoogleVisibility = System.getProperty("ALLOW_GOOGLE_VISABILITY"); if (allowGoogleVisibility == null) diff --git a/src/main/java/stirling/software/SPDF/utils/ImageFinder.java b/src/main/java/stirling/software/SPDF/utils/ImageFinder.java index b8eb4f59..9d5ad08e 100644 --- a/src/main/java/stirling/software/SPDF/utils/ImageFinder.java +++ b/src/main/java/stirling/software/SPDF/utils/ImageFinder.java @@ -1,5 +1,9 @@ package stirling.software.SPDF.utils; +import java.awt.geom.Point2D; +import java.io.IOException; +import java.util.List; + import org.apache.pdfbox.contentstream.operator.Operator; import org.apache.pdfbox.contentstream.operator.OperatorName; import org.apache.pdfbox.cos.COSBase; @@ -10,10 +14,6 @@ import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; import org.apache.pdfbox.pdmodel.graphics.image.PDImage; import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; -import java.awt.geom.Point2D; -import java.io.IOException; -import java.util.List; - public class ImageFinder extends org.apache.pdfbox.contentstream.PDFGraphicsStreamEngine { private boolean hasImages = false;