From 5281d7a49a6f80a2cfe2fa3f14a0db919ba9d443 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Fri, 12 Jan 2024 23:15:27 +0000 Subject: [PATCH] pdfbox3 upgrade and fix --- build.gradle | 13 ++++++---- .../SPDF/controller/api/CropController.java | 10 ++++---- .../SPDF/controller/api/MergeController.java | 24 +++++++++++++------ .../api/MultiPageLayoutController.java | 3 ++- .../controller/api/PdfOverlayController.java | 11 +++++---- .../api/RearrangePagesPDFController.java | 5 ++-- .../controller/api/RotationController.java | 3 ++- .../controller/api/ScalePagesController.java | 9 +++++-- .../controller/api/SplitPDFController.java | 6 ++--- .../api/SplitPdfBySectionsController.java | 7 ++++-- .../api/SplitPdfBySizeController.java | 3 ++- .../api/ToSinglePageController.java | 3 ++- .../api/converters/ExtractController.java | 5 ++-- .../api/filters/FilterController.java | 11 +++++---- .../api/misc/AutoRenameController.java | 3 ++- .../api/misc/AutoSplitPdfController.java | 5 ++-- .../api/misc/BlankPageController.java | 3 ++- .../api/misc/CompressController.java | 3 ++- .../api/misc/ExtractImageScansController.java | 5 ++-- .../api/misc/ExtractImagesController.java | 3 ++- .../api/misc/FakeScanControllerWIP.java | 3 ++- .../api/misc/MetadataController.java | 3 ++- .../api/misc/PageNumbersController.java | 9 +++---- .../controller/api/misc/ShowJavascript.java | 3 ++- .../api/security/CertSignController.java | 3 ++- .../controller/api/security/GetInfoOnPDF.java | 18 ++------------ .../api/security/PasswordController.java | 5 ++-- .../api/security/RedactController.java | 9 ++++--- .../api/security/SanitizeController.java | 3 ++- .../api/security/WatermarkController.java | 8 ++++--- .../SPDF/model/api/PDFWithPageNums.java | 3 ++- .../software/SPDF/utils/GeneralUtils.java | 8 +++++++ .../software/SPDF/utils/PdfUtils.java | 12 ++++++---- 33 files changed, 131 insertions(+), 91 deletions(-) diff --git a/build.gradle b/build.gradle index d9f62736..68797450 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,7 @@ licenseReport { sourceSets { main { java { - if (System.getenv('DOCKER_ENABLE_SECURITY') == 'false') { + if (System.getenv('DOCKER_ENABLE_SECURITY') != 'falsesss') { exclude 'stirling/software/SPDF/config/security/**' exclude 'stirling/software/SPDF/controller/api/UserController.java' exclude 'stirling/software/SPDF/controller/web/AccountWebController.java' @@ -85,6 +85,11 @@ spotless { } } +compileJava { + options.compilerArgs += '-parameters' +} + + dependencies { //security updates implementation 'ch.qos.logback:logback-classic:1.4.14' @@ -95,7 +100,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web:3.2.1' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf:3.2.1' - if (System.getenv('DOCKER_ENABLE_SECURITY') != 'false') { + if (System.getenv('DOCKER_ENABLE_SECURITY') == 'falseee') { implementation 'org.springframework.boot:spring-boot-starter-security:3.2.1' implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5:3.1.2.RELEASE' implementation "org.springframework.boot:spring-boot-starter-data-jpa:3.2.1" @@ -137,11 +142,11 @@ dependencies { exclude group: 'commons-logging', module: 'commons-logging' } - implementation ('org.apache.pdfbox:pdfbox:2.0.30'){ + implementation ('org.apache.pdfbox:pdfbox:3.0.1'){ exclude group: 'commons-logging', module: 'commons-logging' } - implementation ('org.apache.pdfbox:xmpbox:2.0.30'){ + implementation ('org.apache.pdfbox:xmpbox:3.0.1'){ exclude group: 'commons-logging', module: 'commons-logging' } diff --git a/src/main/java/stirling/software/SPDF/controller/api/CropController.java b/src/main/java/stirling/software/SPDF/controller/api/CropController.java index a547d89f..42addb26 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/CropController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/CropController.java @@ -1,13 +1,14 @@ package stirling.software.SPDF.controller.api; -import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.multipdf.LayerUtility; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; +import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode; import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; import org.slf4j.Logger; @@ -37,9 +38,7 @@ public class CropController { description = "This operation takes an input PDF file and crops it according to the given coordinates. Input:PDF Output:PDF Type:SISO") public ResponseEntity cropPdf(@ModelAttribute CropPdfForm form) throws IOException { - - PDDocument sourceDocument = - PDDocument.load(new ByteArrayInputStream(form.getFileInput().getBytes())); + PDDocument sourceDocument = Loader.loadPDF(form.getFileInput().getBytes()); PDDocument newDocument = new PDDocument(); @@ -53,7 +52,8 @@ public class CropController { // Create a new page with the size of the source page PDPage newPage = new PDPage(sourcePage.getMediaBox()); newDocument.addPage(newPage); - PDPageContentStream contentStream = new PDPageContentStream(newDocument, newPage); + PDPageContentStream contentStream = + new PDPageContentStream(newDocument, newPage, AppendMode.OVERWRITE, true, true); // Import the source page as a form XObject PDFormXObject formXObject = layerUtility.importPageAsForm(sourceDocument, i); diff --git a/src/main/java/stirling/software/SPDF/controller/api/MergeController.java b/src/main/java/stirling/software/SPDF/controller/api/MergeController.java index 70b79191..ad742137 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/MergeController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/MergeController.java @@ -1,16 +1,17 @@ package stirling.software.SPDF.controller.api; -import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; +import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; import java.nio.file.attribute.BasicFileAttributes; +import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; import java.util.List; -import org.apache.pdfbox.io.MemoryUsageSetting; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.multipdf.PDFMergerUtility; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; @@ -27,6 +28,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import stirling.software.SPDF.model.api.general.MergePdfsRequest; +import stirling.software.SPDF.utils.GeneralUtils; import stirling.software.SPDF.utils.WebResponseUtils; @RestController @@ -84,8 +86,8 @@ public class MergeController { }; case "byPDFTitle": return (file1, file2) -> { - try (PDDocument doc1 = PDDocument.load(file1.getInputStream()); - PDDocument doc2 = PDDocument.load(file2.getInputStream())) { + try (PDDocument doc1 = Loader.loadPDF(file1.getBytes()); + PDDocument doc2 = Loader.loadPDF(file2.getBytes())) { String title1 = doc1.getDocumentInformation().getTitle(); String title2 = doc2.getDocumentInformation().getTitle(); return title1.compareTo(title2); @@ -106,6 +108,7 @@ public class MergeController { "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 provided. Input:PDF Output:PDF Type:MISO") public ResponseEntity mergePdfs(@ModelAttribute MergePdfsRequest form) throws IOException { + List filesToDelete = new ArrayList(); try { MultipartFile[] files = form.getFileInput(); Arrays.sort(files, getSortComparator(form.getSortType())); @@ -113,20 +116,27 @@ public class MergeController { PDFMergerUtility mergedDoc = new PDFMergerUtility(); ByteArrayOutputStream docOutputstream = new ByteArrayOutputStream(); - for (MultipartFile file : files) { - mergedDoc.addSource(new ByteArrayInputStream(file.getBytes())); + for (MultipartFile multipartFile : files) { + File tempFile = GeneralUtils.convertMultipartFileToFile(multipartFile); + filesToDelete.add(tempFile); + mergedDoc.addSource(tempFile); } mergedDoc.setDestinationFileName( files[0].getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_merged.pdf"); mergedDoc.setDestinationStream(docOutputstream); - mergedDoc.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly()); + + mergedDoc.mergeDocuments(null); return WebResponseUtils.bytesToWebResponse( docOutputstream.toByteArray(), mergedDoc.getDestinationFileName()); } catch (Exception ex) { logger.error("Error in merge pdf process", ex); throw ex; + } finally { + for (File file : filesToDelete) { + file.delete(); + } } } } diff --git a/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java b/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java index 52127571..ee6c2789 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java @@ -4,6 +4,7 @@ import java.awt.Color; import java.io.ByteArrayOutputStream; import java.io.IOException; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.multipdf.LayerUtility; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; @@ -57,7 +58,7 @@ public class MultiPageLayoutController { : (int) Math.sqrt(pagesPerSheet); int rows = pagesPerSheet == 2 || pagesPerSheet == 3 ? 1 : (int) Math.sqrt(pagesPerSheet); - PDDocument sourceDocument = PDDocument.load(file.getInputStream()); + PDDocument sourceDocument = Loader.loadPDF(file.getBytes()); PDDocument newDocument = new PDDocument(); PDPage newPage = new PDPage(PDRectangle.A4); newDocument.addPage(newPage); diff --git a/src/main/java/stirling/software/SPDF/controller/api/PdfOverlayController.java b/src/main/java/stirling/software/SPDF/controller/api/PdfOverlayController.java index f6099c3a..05cf1263 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/PdfOverlayController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/PdfOverlayController.java @@ -8,6 +8,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.multipdf.Overlay; import org.apache.pdfbox.pdmodel.PDDocument; import org.springframework.http.MediaType; @@ -53,7 +54,7 @@ public class PdfOverlayController { // "FixedRepeatOverlay" int[] counts = request.getCounts(); // Used for FixedRepeatOverlay mode - try (PDDocument basePdf = PDDocument.load(baseFile.getInputStream()); + try (PDDocument basePdf = Loader.loadPDF(baseFile.getBytes()); Overlay overlay = new Overlay()) { Map overlayGuide = prepareOverlayGuide( @@ -131,7 +132,7 @@ public class PdfOverlayController { overlayFileIndex = (overlayFileIndex + 1) % overlayFiles.length; } - try (PDDocument overlayPdf = PDDocument.load(overlayFiles[overlayFileIndex])) { + try (PDDocument overlayPdf = Loader.loadPDF(overlayFiles[overlayFileIndex])) { PDDocument singlePageDocument = new PDDocument(); singlePageDocument.addPage(overlayPdf.getPage(pageCountInCurrentOverlay)); File tempFile = File.createTempFile("overlay-page-", ".pdf"); @@ -147,7 +148,7 @@ public class PdfOverlayController { } private int getNumberOfPages(File file) throws IOException { - try (PDDocument doc = PDDocument.load(file)) { + try (PDDocument doc = Loader.loadPDF(file)) { return doc.getNumberOfPages(); } } @@ -159,7 +160,7 @@ public class PdfOverlayController { File overlayFile = overlayFiles[(basePageIndex - 1) % overlayFiles.length]; // Load the overlay document to check its page count - try (PDDocument overlayPdf = PDDocument.load(overlayFile)) { + try (PDDocument overlayPdf = Loader.loadPDF(overlayFile)) { int overlayPageCount = overlayPdf.getNumberOfPages(); if ((basePageIndex - 1) % overlayPageCount < overlayPageCount) { overlayGuide.put(basePageIndex, overlayFile.getAbsolutePath()); @@ -181,7 +182,7 @@ public class PdfOverlayController { int repeatCount = counts[i]; // Load the overlay document to check its page count - try (PDDocument overlayPdf = PDDocument.load(overlayFile)) { + try (PDDocument overlayPdf = Loader.loadPDF(overlayFile)) { int overlayPageCount = overlayPdf.getNumberOfPages(); for (int j = 0; j < repeatCount; j++) { for (int page = 0; page < overlayPageCount; page++) { 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 8c31bf3c..1737d543 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.slf4j.Logger; @@ -42,7 +43,7 @@ public class RearrangePagesPDFController { MultipartFile pdfFile = request.getFileInput(); String pagesToDelete = request.getPageNumbers(); - PDDocument document = PDDocument.load(pdfFile.getBytes()); + PDDocument document = Loader.loadPDF(pdfFile.getBytes()); // Split the page order string into an array of page numbers or range of numbers String[] pageOrderArr = pagesToDelete.split(","); @@ -179,7 +180,7 @@ public class RearrangePagesPDFController { String sortType = request.getCustomMode(); try { // Load the input PDF - PDDocument document = PDDocument.load(pdfFile.getInputStream()); + PDDocument document = Loader.loadPDF(pdfFile.getBytes()); // Split the page order string into an array of page numbers or range of numbers String[] pageOrderArr = pageOrder != null ? pageOrder.split(",") : new String[0]; diff --git a/src/main/java/stirling/software/SPDF/controller/api/RotationController.java b/src/main/java/stirling/software/SPDF/controller/api/RotationController.java index 883beb5d..6f8613f8 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/RotationController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/RotationController.java @@ -2,6 +2,7 @@ package stirling.software.SPDF.controller.api; import java.io.IOException; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageTree; @@ -37,7 +38,7 @@ public class RotationController { MultipartFile pdfFile = request.getFileInput(); Integer angle = request.getAngle(); // Load the PDF document - PDDocument document = PDDocument.load(pdfFile.getBytes()); + PDDocument document = Loader.loadPDF(pdfFile.getBytes()); // Get the list of pages in the document PDPageTree pages = document.getPages(); diff --git a/src/main/java/stirling/software/SPDF/controller/api/ScalePagesController.java b/src/main/java/stirling/software/SPDF/controller/api/ScalePagesController.java index 0dcec05c..da55bad5 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/ScalePagesController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/ScalePagesController.java @@ -5,6 +5,7 @@ import java.io.IOException; import java.util.HashMap; import java.util.Map; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.multipdf.LayerUtility; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; @@ -66,7 +67,7 @@ public class ScalePagesController { PDRectangle targetSize = sizeMap.get(targetPDRectangle); - PDDocument sourceDocument = PDDocument.load(file.getBytes()); + PDDocument sourceDocument = Loader.loadPDF(file.getBytes()); PDDocument outputDocument = new PDDocument(); int totalPages = sourceDocument.getNumberOfPages(); @@ -83,7 +84,11 @@ public class ScalePagesController { PDPageContentStream contentStream = new PDPageContentStream( - outputDocument, newPage, PDPageContentStream.AppendMode.APPEND, true); + outputDocument, + newPage, + PDPageContentStream.AppendMode.APPEND, + true, + true); float x = (targetSize.getWidth() - sourceSize.getWidth() * scale) / 2; float y = (targetSize.getHeight() - sourceSize.getHeight() * scale) / 2; 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 a521769e..3dbb9335 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java @@ -2,7 +2,6 @@ package stirling.software.SPDF.controller.api; import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; @@ -11,6 +10,7 @@ import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.slf4j.Logger; @@ -46,8 +46,8 @@ public class SplitPDFController { MultipartFile file = request.getFileInput(); String pages = request.getPageNumbers(); // open the pdf document - InputStream inputStream = file.getInputStream(); - PDDocument document = PDDocument.load(inputStream); + + PDDocument document = Loader.loadPDF(file.getBytes()); List pageNumbers = request.getPageNumbersList(document); if (!pageNumbers.contains(document.getNumberOfPages() - 1)) 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 71dca371..ab00d719 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java @@ -9,10 +9,12 @@ import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.multipdf.LayerUtility; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; +import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode; import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; import org.apache.pdfbox.util.Matrix; @@ -45,7 +47,7 @@ public class SplitPdfBySectionsController { List splitDocumentsBoas = new ArrayList<>(); MultipartFile file = request.getFileInput(); - PDDocument sourceDocument = PDDocument.load(file.getInputStream()); + PDDocument sourceDocument = Loader.loadPDF(file.getBytes()); // Process the PDF based on split parameters int horiz = request.getHorizontalDivisions() + 1; @@ -115,7 +117,8 @@ public class SplitPdfBySectionsController { document, document.getPages().indexOf(originalPage)); try (PDPageContentStream contentStream = - new PDPageContentStream(subDoc, subPage)) { + new PDPageContentStream( + subDoc, subPage, AppendMode.OVERWRITE, true, true)) { // Set clipping area and position float translateX = -subPageWidth * i; float translateY = height - subPageHeight * (verticalDivisions - j); diff --git a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java index 28ac4673..4bfde843 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java @@ -9,6 +9,7 @@ import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.springframework.http.MediaType; @@ -42,7 +43,7 @@ public class SplitPdfBySizeController { List splitDocumentsBoas = new ArrayList(); MultipartFile file = request.getFileInput(); - PDDocument sourceDocument = PDDocument.load(file.getInputStream()); + PDDocument sourceDocument = Loader.loadPDF(file.getBytes()); // 0 = size, 1 = page count, 2 = doc count int type = request.getSplitType(); diff --git a/src/main/java/stirling/software/SPDF/controller/api/ToSinglePageController.java b/src/main/java/stirling/software/SPDF/controller/api/ToSinglePageController.java index cd971b55..30406ec2 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/ToSinglePageController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/ToSinglePageController.java @@ -4,6 +4,7 @@ import java.awt.geom.AffineTransform; import java.io.ByteArrayOutputStream; import java.io.IOException; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.multipdf.LayerUtility; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; @@ -40,7 +41,7 @@ public class ToSinglePageController { throws IOException { // Load the source document - PDDocument sourceDocument = PDDocument.load(request.getFileInput().getInputStream()); + PDDocument sourceDocument = Loader.loadPDF(request.getFileInput().getBytes()); // Calculate total height and max width float totalHeight = 0; diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractController.java index c5b9ea8d..6bd9d8b9 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractController.java @@ -1,10 +1,10 @@ package stirling.software.SPDF.controller.api.converters; -import java.io.ByteArrayInputStream; import java.io.StringWriter; import java.util.ArrayList; import java.util.List; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.slf4j.Logger; @@ -44,8 +44,7 @@ public class ExtractController { ArrayList tableData = new ArrayList<>(); int columnsCount = 0; - try (PDDocument document = - PDDocument.load(new ByteArrayInputStream(form.getFileInput().getBytes()))) { + try (PDDocument document = Loader.loadPDF(form.getFileInput().getBytes())) { final double res = 72; // PDF units are at 72 DPI PDFTableStripper stripper = new PDFTableStripper(); PDPage pdPage = document.getPage(form.getPageId() - 1); diff --git a/src/main/java/stirling/software/SPDF/controller/api/filters/FilterController.java b/src/main/java/stirling/software/SPDF/controller/api/filters/FilterController.java index 967978a7..370aa6d7 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/filters/FilterController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/filters/FilterController.java @@ -2,6 +2,7 @@ package stirling.software.SPDF.controller.api.filters; import java.io.IOException; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.common.PDRectangle; @@ -39,7 +40,7 @@ public class FilterController { String text = request.getText(); String pageNumber = request.getPageNumbers(); - PDDocument pdfDocument = PDDocument.load(inputFile.getInputStream()); + PDDocument pdfDocument = Loader.loadPDF(inputFile.getBytes()); if (PdfUtils.hasText(pdfDocument, pageNumber, text)) return WebResponseUtils.pdfDocToWebResponse( pdfDocument, inputFile.getOriginalFilename()); @@ -56,7 +57,7 @@ public class FilterController { MultipartFile inputFile = request.getFileInput(); String pageNumber = request.getPageNumbers(); - PDDocument pdfDocument = PDDocument.load(inputFile.getInputStream()); + PDDocument pdfDocument = Loader.loadPDF(inputFile.getBytes()); if (PdfUtils.hasImages(pdfDocument, pageNumber)) return WebResponseUtils.pdfDocToWebResponse( pdfDocument, inputFile.getOriginalFilename()); @@ -73,7 +74,7 @@ public class FilterController { String pageCount = request.getPageCount(); String comparator = request.getComparator(); // Load the PDF - PDDocument document = PDDocument.load(inputFile.getInputStream()); + PDDocument document = Loader.loadPDF(inputFile.getBytes()); int actualPageCount = document.getNumberOfPages(); boolean valid = false; @@ -107,7 +108,7 @@ public class FilterController { String comparator = request.getComparator(); // Load the PDF - PDDocument document = PDDocument.load(inputFile.getInputStream()); + PDDocument document = Loader.loadPDF(inputFile.getBytes()); PDPage firstPage = document.getPage(0); PDRectangle actualPageSize = firstPage.getMediaBox(); @@ -183,7 +184,7 @@ public class FilterController { String comparator = request.getComparator(); // Load the PDF - PDDocument document = PDDocument.load(inputFile.getInputStream()); + PDDocument document = Loader.loadPDF(inputFile.getBytes()); // Get the rotation of the first page PDPage firstPage = document.getPage(0); diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java index e81ef1e1..9a78e4d1 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java @@ -5,6 +5,7 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.List; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.text.PDFTextStripper; import org.apache.pdfbox.text.TextPosition; @@ -43,7 +44,7 @@ public class AutoRenameController { MultipartFile file = request.getFileInput(); Boolean useFirstTextAsFallback = request.isUseFirstTextAsFallback(); - PDDocument document = PDDocument.load(file.getInputStream()); + PDDocument document = Loader.loadPDF(file.getBytes()); PDFTextStripper reader = new PDFTextStripper() { class LineInfo { diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java index 9b447fcb..b793fc3e 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java @@ -5,7 +5,6 @@ import java.awt.image.DataBufferByte; import java.awt.image.DataBufferInt; import java.io.ByteArrayOutputStream; import java.io.IOException; -import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; @@ -13,6 +12,7 @@ import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.PDFRenderer; import org.springframework.http.MediaType; @@ -54,8 +54,7 @@ public class AutoSplitPdfController { MultipartFile file = request.getFileInput(); boolean duplexMode = request.isDuplexMode(); - InputStream inputStream = file.getInputStream(); - PDDocument document = PDDocument.load(inputStream); + PDDocument document = Loader.loadPDF(file.getBytes()); PDFRenderer pdfRenderer = new PDFRenderer(document); List splitDocuments = new ArrayList<>(); diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java index 036d6a66..8a17e3de 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java @@ -13,6 +13,7 @@ import java.util.stream.IntStream; import javax.imageio.ImageIO; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageTree; @@ -53,7 +54,7 @@ public class BlankPageController { PDDocument document = null; try { - document = PDDocument.load(inputFile.getInputStream()); + document = Loader.loadPDF(inputFile.getBytes()); PDPageTree pages = document.getDocumentCatalog().getPages(); PDFTextStripper textStripper = new PDFTextStripper(); diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java index fd9a0460..2b8a1541 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java @@ -13,6 +13,7 @@ import java.util.List; import javax.imageio.ImageIO; import org.apache.commons.io.FileUtils; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; @@ -147,7 +148,7 @@ public class CompressController { if (expectedOutputSize != null && autoMode) { long outputFileSize = Files.size(tempOutputFile); if (outputFileSize > expectedOutputSize) { - try (PDDocument doc = PDDocument.load(new File(tempOutputFile.toString()))) { + try (PDDocument doc = Loader.loadPDF(new File(tempOutputFile.toString()))) { long previousFileSize = 0; double scaleFactor = 1.0; while (true) { diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java index 257f4d52..510607e8 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java @@ -1,7 +1,6 @@ package stirling.software.SPDF.controller.api.misc; import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.nio.file.Files; @@ -17,6 +16,7 @@ import java.util.zip.ZipOutputStream; import javax.imageio.ImageIO; import org.apache.commons.io.FileUtils; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.PDFRenderer; import org.slf4j.Logger; @@ -76,8 +76,7 @@ public class ExtractImageScansController { // Check if input file is a PDF if (extension.equalsIgnoreCase("pdf")) { // Load PDF document - try (PDDocument document = - PDDocument.load(new ByteArrayInputStream(form.getFileInput().getBytes()))) { + try (PDDocument document = Loader.loadPDF(form.getFileInput().getBytes())) { PDFRenderer pdfRenderer = new PDFRenderer(document); int pageCount = document.getNumberOfPages(); images = new ArrayList<>(); diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java index f436d9f6..2ebc8f6c 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java @@ -14,6 +14,7 @@ import java.util.zip.ZipOutputStream; import javax.imageio.ImageIO; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; @@ -53,7 +54,7 @@ public class ExtractImagesController { System.out.println( System.currentTimeMillis() + "file=" + file.getName() + ", format=" + format); - PDDocument document = PDDocument.load(file.getBytes()); + PDDocument document = Loader.loadPDF(file.getBytes()); // Create ByteArrayOutputStream to write zip file to byte array ByteArrayOutputStream baos = new ByteArrayOutputStream(); diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanControllerWIP.java b/src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanControllerWIP.java index e9885f1e..cb8db7d3 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanControllerWIP.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanControllerWIP.java @@ -16,6 +16,7 @@ import java.util.Random; import javax.imageio.ImageIO; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; @@ -57,7 +58,7 @@ public class FakeScanControllerWIP { public ResponseEntity repairPdf(@ModelAttribute PDFFile request) throws IOException { MultipartFile inputFile = request.getFileInput(); - PDDocument document = PDDocument.load(inputFile.getBytes()); + PDDocument document = Loader.loadPDF(inputFile.getBytes()); PDFRenderer pdfRenderer = new PDFRenderer(document); for (int page = 0; page < document.getNumberOfPages(); ++page) { BufferedImage image = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB); diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java index 62783dc4..a5eb95ca 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java @@ -7,6 +7,7 @@ import java.util.Calendar; import java.util.Map; import java.util.Map.Entry; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDDocumentInformation; @@ -67,7 +68,7 @@ public class MetadataController { allRequestParams = new java.util.HashMap(); } // Load the PDF file into a PDDocument - PDDocument document = PDDocument.load(pdfFile.getBytes()); + PDDocument document = Loader.loadPDF(pdfFile.getBytes()); // Get the document information from the PDF PDDocumentInformation info = document.getDocumentInformation(); diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/PageNumbersController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/PageNumbersController.java index 0ae9a49e..79f62c5a 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/PageNumbersController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/PageNumbersController.java @@ -4,11 +4,13 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.font.PDType1Font; +import org.apache.pdfbox.pdmodel.font.Standard14Fonts; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.MediaType; @@ -48,7 +50,7 @@ public class PageNumbersController { String customText = request.getCustomText(); int pageNumber = startingNumber; byte[] fileBytes = file.getBytes(); - PDDocument document = PDDocument.load(fileBytes); + PDDocument document = Loader.loadPDF(fileBytes); float marginFactor; switch (customMargin.toLowerCase()) { @@ -71,7 +73,6 @@ public class PageNumbersController { } float fontSize = 12.0f; - PDType1Font font = PDType1Font.HELVETICA; if (pagesToNumber == null || pagesToNumber.length() == 0) { pagesToNumber = "all"; } @@ -127,9 +128,9 @@ public class PageNumbersController { PDPageContentStream contentStream = new PDPageContentStream( - document, page, PDPageContentStream.AppendMode.APPEND, true); + document, page, PDPageContentStream.AppendMode.APPEND, true, true); contentStream.beginText(); - contentStream.setFont(font, fontSize); + contentStream.setFont(new PDType1Font(Standard14Fonts.FontName.HELVETICA), fontSize); contentStream.newLineAtOffset(x, y); contentStream.showText(text); contentStream.endText(); diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java b/src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java index ed7852fa..47a13d0c 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java @@ -3,6 +3,7 @@ package stirling.software.SPDF.controller.api.misc; import java.nio.charset.StandardCharsets; import java.util.Map; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.common.PDNameTreeNode; import org.apache.pdfbox.pdmodel.interactive.action.PDActionJavaScript; @@ -36,7 +37,7 @@ public class ShowJavascript { MultipartFile inputFile = request.getFileInput(); String script = ""; - try (PDDocument document = PDDocument.load(inputFile.getInputStream())) { + try (PDDocument document = Loader.loadPDF(inputFile.getBytes())) { if (document.getDocumentCatalog() != null && document.getDocumentCatalog().getNames() != null) { diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java b/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java index 1ead1a97..f7c7390e 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java @@ -16,6 +16,7 @@ import java.security.cert.CertificateException; import java.security.cert.CertificateFactory; import java.util.Calendar; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.examples.signature.CreateSignatureBase; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.interactive.digitalsignature.PDSignature; @@ -132,7 +133,7 @@ public class CertSignController { String name, String location, String reason) { - try (PDDocument doc = PDDocument.load(input)) { + try (PDDocument doc = Loader.loadPDF(input)) { PDSignature signature = new PDSignature(); signature.setFilter(PDSignature.FILTER_ADOBE_PPKLITE); signature.setSubFilter(PDSignature.SUBFILTER_ADBE_PKCS7_DETACHED); diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java b/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java index f0bd8438..9926da55 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java @@ -11,11 +11,9 @@ import java.util.List; import java.util.Map; import java.util.Set; -import org.apache.pdfbox.cos.COSDocument; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.cos.COSInputStream; import org.apache.pdfbox.cos.COSName; -import org.apache.pdfbox.cos.COSObject; -import org.apache.pdfbox.cos.COSStream; import org.apache.pdfbox.cos.COSString; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDDocumentCatalog; @@ -87,7 +85,7 @@ public class GetInfoOnPDF { @Operation(summary = "Summary here", description = "desc. Input:PDF Output:JSON Type:SISO") public ResponseEntity getPdfInfo(@ModelAttribute PDFFile request) throws IOException { MultipartFile inputFile = request.getFileInput(); - try (PDDocument pdfBoxDoc = PDDocument.load(inputFile.getInputStream()); ) { + try (PDDocument pdfBoxDoc = Loader.loadPDF(inputFile.getBytes()); ) { ObjectMapper objectMapper = new ObjectMapper(); ObjectNode jsonOutput = objectMapper.createObjectNode(); @@ -129,17 +127,6 @@ public class GetInfoOnPDF { boolean hasCompression = false; String compressionType = "None"; - COSDocument cosDoc = pdfBoxDoc.getDocument(); - for (COSObject cosObject : cosDoc.getObjects()) { - if (cosObject.getObject() instanceof COSStream) { - COSStream cosStream = (COSStream) cosObject.getObject(); - if (COSName.OBJ_STM.equals(cosStream.getItem(COSName.TYPE))) { - hasCompression = true; - compressionType = "Object Streams"; - break; - } - } - } basicInfo.put("Compression", hasCompression); if (hasCompression) basicInfo.put("CompressionType", compressionType); @@ -343,7 +330,6 @@ public class GetInfoOnPDF { permissionsNode.put("CanModify", ap.canModify()); permissionsNode.put("CanModifyAnnotations", ap.canModifyAnnotations()); permissionsNode.put("CanPrint", ap.canPrint()); - permissionsNode.put("CanPrintDegraded", ap.canPrintDegraded()); encryption.set( "Permissions", permissionsNode); // set the node under "Permissions" diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/PasswordController.java b/src/main/java/stirling/software/SPDF/controller/api/security/PasswordController.java index 4c3a9517..8d7c8072 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/PasswordController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/PasswordController.java @@ -2,6 +2,7 @@ package stirling.software.SPDF.controller.api.security; import java.io.IOException; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.encryption.AccessPermission; import org.apache.pdfbox.pdmodel.encryption.StandardProtectionPolicy; @@ -38,7 +39,7 @@ public class PasswordController { MultipartFile fileInput = request.getFileInput(); String password = request.getPassword(); - PDDocument document = PDDocument.load(fileInput.getBytes(), password); + PDDocument document = Loader.loadPDF(fileInput.getBytes(), password); document.setAllSecurityToBeRemoved(true); return WebResponseUtils.pdfDocToWebResponse( document, @@ -66,7 +67,7 @@ public class PasswordController { boolean canPrint = request.isCanPrint(); boolean canPrintFaithful = request.isCanPrintFaithful(); - PDDocument document = PDDocument.load(fileInput.getBytes()); + PDDocument document = Loader.loadPDF(fileInput.getBytes()); AccessPermission ap = new AccessPermission(); ap.setCanAssembleDocument(!canAssembleDocument); ap.setCanExtractContent(!canExtractContent); diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java b/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java index 79d15065..3d4653c5 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java @@ -2,14 +2,15 @@ package stirling.software.SPDF.controller.api.security; import java.awt.Color; import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; +import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode; import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory; import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; @@ -57,7 +58,7 @@ public class RedactController { System.out.println(listOfTextString); String[] listOfText = listOfTextString.split("\n"); byte[] bytes = file.getBytes(); - PDDocument document = PDDocument.load(new ByteArrayInputStream(bytes)); + PDDocument document = Loader.loadPDF(bytes); Color redactColor; try { @@ -86,7 +87,9 @@ public class RedactController { PDPage newPage = new PDPage(new PDRectangle(bim.getWidth(), bim.getHeight())); imageDocument.addPage(newPage); PDImageXObject pdImage = LosslessFactory.createFromImage(imageDocument, bim); - PDPageContentStream contentStream = new PDPageContentStream(imageDocument, newPage); + PDPageContentStream contentStream = + new PDPageContentStream( + imageDocument, newPage, AppendMode.APPEND, true, true); contentStream.drawImage(pdImage, 0, 0); contentStream.close(); } diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java b/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java index 30ce1466..8c46e0cf 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java @@ -2,6 +2,7 @@ package stirling.software.SPDF.controller.api.security; import java.io.IOException; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.cos.COSDictionary; import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.pdmodel.PDDocument; @@ -52,7 +53,7 @@ public class SanitizeController { boolean removeLinks = request.isRemoveLinks(); boolean removeFonts = request.isRemoveFonts(); - try (PDDocument document = PDDocument.load(inputFile.getInputStream())) { + try (PDDocument document = Loader.loadPDF(inputFile.getBytes())) { if (removeJavaScript) { sanitizeJavaScript(document); } 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 daee68bf..7bfb4c85 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 @@ -10,12 +10,14 @@ import java.io.InputStream; import javax.imageio.ImageIO; import org.apache.commons.io.IOUtils; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.font.PDFont; import org.apache.pdfbox.pdmodel.font.PDType0Font; import org.apache.pdfbox.pdmodel.font.PDType1Font; +import org.apache.pdfbox.pdmodel.font.Standard14Fonts; import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory; import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState; @@ -58,7 +60,7 @@ public class WatermarkController { int heightSpacer = request.getHeightSpacer(); // Load the input PDF - PDDocument document = PDDocument.load(pdfFile.getInputStream()); + PDDocument document = Loader.loadPDF(pdfFile.getBytes()); // Create a page in the document for (PDPage page : document.getPages()) { @@ -66,7 +68,7 @@ public class WatermarkController { // Get the page's content stream PDPageContentStream contentStream = new PDPageContentStream( - document, page, PDPageContentStream.AppendMode.APPEND, true); + document, page, PDPageContentStream.AppendMode.APPEND, true, true); // Set transparency PDExtendedGraphicsState graphicsState = new PDExtendedGraphicsState(); @@ -117,7 +119,7 @@ public class WatermarkController { String alphabet) throws IOException { String resourceDir = ""; - PDFont font = PDType1Font.HELVETICA_BOLD; + PDFont font = new PDType1Font(Standard14Fonts.FontName.HELVETICA); switch (alphabet) { case "arabic": resourceDir = "static/fonts/NotoSansArabic-Regular.ttf"; diff --git a/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java b/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java index aa664be0..5465988c 100644 --- a/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java +++ b/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java @@ -3,6 +3,7 @@ package stirling.software.SPDF.model.api; import java.io.IOException; import java.util.List; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; import io.swagger.v3.oas.annotations.Hidden; @@ -27,7 +28,7 @@ public class PDFWithPageNums extends PDFFile { public List getPageNumbersList() { int pageCount = 0; try { - pageCount = PDDocument.load(getFileInput().getInputStream()).getNumberOfPages(); + pageCount = Loader.loadPDF(getFileInput().getBytes()).getNumberOfPages(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); diff --git a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java index cdf00bf0..672e5c70 100644 --- a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java @@ -19,6 +19,14 @@ import org.springframework.web.multipart.MultipartFile; public class GeneralUtils { + public static File convertMultipartFileToFile(MultipartFile multipartFile) throws IOException { + File tempFile = File.createTempFile("temp", null); + try (FileOutputStream os = new FileOutputStream(tempFile)) { + os.write(multipartFile.getBytes()); + } + return tempFile; + } + public static void deleteDirectory(Path path) throws IOException { Files.walkFileTree( path, diff --git a/src/main/java/stirling/software/SPDF/utils/PdfUtils.java b/src/main/java/stirling/software/SPDF/utils/PdfUtils.java index 79a47864..426fc78d 100644 --- a/src/main/java/stirling/software/SPDF/utils/PdfUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/PdfUtils.java @@ -2,7 +2,6 @@ package stirling.software.SPDF.utils; import java.awt.Graphics; import java.awt.image.BufferedImage; -import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; @@ -16,9 +15,11 @@ import javax.imageio.ImageWriteParam; import javax.imageio.ImageWriter; import javax.imageio.stream.ImageOutputStream; +import org.apache.pdfbox.Loader; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; +import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode; import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.graphics.image.JPEGFactory; import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory; @@ -190,7 +191,7 @@ public class PdfUtils { int DPI, String filename) throws IOException, Exception { - try (PDDocument document = PDDocument.load(new ByteArrayInputStream(inputStream))) { + try (PDDocument document = Loader.loadPDF(inputStream)) { PDFRenderer pdfRenderer = new PDFRenderer(document); int pageCount = document.getNumberOfPages(); @@ -335,7 +336,8 @@ public class PdfUtils { float pageWidth = page.getMediaBox().getWidth(); float pageHeight = page.getMediaBox().getHeight(); - try (PDPageContentStream contentStream = new PDPageContentStream(doc, page)) { + try (PDPageContentStream contentStream = + new PDPageContentStream(doc, page, AppendMode.APPEND, true, true)) { if ("fillPage".equals(fitOption) || "fitDocumentToImage".equals(fitOption)) { contentStream.drawImage(image, 0, 0, pageWidth, pageHeight); } else if ("maintainAspectRatio".equals(fitOption)) { @@ -368,7 +370,7 @@ public class PdfUtils { byte[] pdfBytes, byte[] imageBytes, float x, float y, boolean everyPage) throws IOException { - PDDocument document = PDDocument.load(new ByteArrayInputStream(pdfBytes)); + PDDocument document = Loader.loadPDF(pdfBytes); // Get the first page of the PDF int pages = document.getNumberOfPages(); @@ -376,7 +378,7 @@ public class PdfUtils { PDPage page = document.getPage(i); try (PDPageContentStream contentStream = new PDPageContentStream( - document, page, PDPageContentStream.AppendMode.APPEND, true)) { + document, page, PDPageContentStream.AppendMode.APPEND, true, true)) { // Create an image object from the image bytes PDImageXObject image = PDImageXObject.createFromByteArray(document, imageBytes, ""); // Draw the image onto the page at the specified x and y coordinates