From 56afd35c823c863f7c936d037017b6d8c705d354 Mon Sep 17 00:00:00 2001 From: Peter Dave Hello Date: Thu, 4 Jan 2024 20:14:07 +0800 Subject: [PATCH 01/81] Refactor DockerfileBase to clean up apt cache after package installation Changes include: - Cleaning up the apt cache by adding `rm -rf /var/lib/apt/lists/*` after each package installation within the same RUN statement. - Ensuring the Docker image size is minimized by removing unnecessary files immediately after use. These adjustments will result in a more space-efficient Docker image. --- DockerfileBase | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/DockerfileBase b/DockerfileBase index c913635f..4e41d3e8 100644 --- a/DockerfileBase +++ b/DockerfileBase @@ -6,7 +6,8 @@ FROM ubuntu:latest AS base # JDK for app RUN apt-get update && \ apt-get install -y --no-install-recommends \ - openjdk-17-jre + openjdk-17-jre && \ + rm -rf /var/lib/apt/lists/* # Doc conversion RUN apt-get update && \ @@ -18,7 +19,8 @@ RUN apt-get update && \ libreoffice-impress \ python3-uno \ curl \ - unoconv + unoconv && \ + rm -rf /var/lib/apt/lists/* # OCR MY PDF (unpaper for descew and other advanced featues) @@ -30,6 +32,7 @@ apt-get update && \ python3-pip \ ocrmypdf \ unpaper && \ + rm -rf /var/lib/apt/lists/* && \ pip install --upgrade pip && \ pip install --no-cache-dir --upgrade ocrmypdf && \ pip install --no-cache-dir --upgrade pillow==10.0.1 reportlab==3.6.13 wheel==0.38.1 setuptools==65.5.1 pyjwt==2.4.0 cryptography==39.0.1 @@ -40,8 +43,7 @@ RUN pip install --no-cache-dir opencv-python-headless WeasyPrint # cleanup and etc -RUN rm -rf /var/lib/apt/lists/* && \ - mkdir /usr/share/tesseract-ocr-original && \ +RUN mkdir /usr/share/tesseract-ocr-original && \ cp -r /usr/share/tesseract-ocr/* /usr/share/tesseract-ocr-original && \ rm -rf /usr/share/tesseract-ocr From 846ebe6dda3b5b907231f214ce96e74d300e6dd2 Mon Sep 17 00:00:00 2001 From: Peter Dave Hello Date: Thu, 4 Jan 2024 20:30:55 +0800 Subject: [PATCH 02/81] Refine Tesseract-OCR file backup process in DockerfileBase --- DockerfileBase | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/DockerfileBase b/DockerfileBase index 4e41d3e8..ffc8a89e 100644 --- a/DockerfileBase +++ b/DockerfileBase @@ -33,6 +33,7 @@ apt-get update && \ ocrmypdf \ unpaper && \ rm -rf /var/lib/apt/lists/* && \ + mv /usr/share/tesseract-ocr /usr/share/tesseract-ocr-original && \ pip install --upgrade pip && \ pip install --no-cache-dir --upgrade ocrmypdf && \ pip install --no-cache-dir --upgrade pillow==10.0.1 reportlab==3.6.13 wheel==0.38.1 setuptools==65.5.1 pyjwt==2.4.0 cryptography==39.0.1 @@ -40,13 +41,3 @@ apt-get update && \ #CV and HTML RUN pip install --no-cache-dir opencv-python-headless WeasyPrint - - -# cleanup and etc -RUN mkdir /usr/share/tesseract-ocr-original && \ - cp -r /usr/share/tesseract-ocr/* /usr/share/tesseract-ocr-original && \ - rm -rf /usr/share/tesseract-ocr - - - - \ No newline at end of file From ecb62e0c94bc6711ed6afdb71ccbdd575081988e Mon Sep 17 00:00:00 2001 From: Peter Dave Hello Date: Thu, 4 Jan 2024 20:56:24 +0800 Subject: [PATCH 03/81] Apply `--no-cache-dir` to pip upgrade in DockerfileBase Aligned pip upgrade command with others by adding the `--no-cache-dir` flag to reduce image layer size. --- DockerfileBase | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DockerfileBase b/DockerfileBase index ffc8a89e..b37050c7 100644 --- a/DockerfileBase +++ b/DockerfileBase @@ -34,7 +34,7 @@ apt-get update && \ unpaper && \ rm -rf /var/lib/apt/lists/* && \ mv /usr/share/tesseract-ocr /usr/share/tesseract-ocr-original && \ - pip install --upgrade pip && \ + pip install --no-cache-dir --upgrade pip && \ pip install --no-cache-dir --upgrade ocrmypdf && \ pip install --no-cache-dir --upgrade pillow==10.0.1 reportlab==3.6.13 wheel==0.38.1 setuptools==65.5.1 pyjwt==2.4.0 cryptography==39.0.1 From 572f9f728ff10abccb4b3dd21c3fb709f8e27b64 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Fri, 5 Jan 2024 18:00:30 +0000 Subject: [PATCH 04/81] lang --- FolderScanning.md | 41 ++++ PipelineUsage.md | 0 src/main/resources/messages_ar_AR.properties | 2 +- src/main/resources/messages_bg_BG.properties | 2 +- src/main/resources/messages_ca_CA.properties | 2 +- src/main/resources/messages_de_DE.properties | 2 +- src/main/resources/messages_el_GR.properties | 2 +- src/main/resources/messages_en_GB.properties | 3 +- src/main/resources/messages_en_US.properties | 2 +- src/main/resources/messages_es_ES.properties | 2 +- src/main/resources/messages_eu_ES.properties | 2 +- src/main/resources/messages_fr_FR.properties | 2 +- src/main/resources/messages_hi_IN.properties | 2 +- src/main/resources/messages_hu_HU.properties | 2 +- src/main/resources/messages_id_ID.properties | 2 +- src/main/resources/messages_ja_JP.properties | 2 +- src/main/resources/messages_ko_KR.properties | 2 +- src/main/resources/messages_nl_NL.properties | 2 +- src/main/resources/messages_pl_PL.properties | 2 +- src/main/resources/messages_pt_BR.properties | 2 +- src/main/resources/messages_ro_RO.properties | 2 +- src/main/resources/messages_ru_RU.properties | 2 +- src/main/resources/messages_sv_SE.properties | 2 +- src/main/resources/messages_tr_TR.properties | 2 +- src/main/resources/messages_zh_CN.properties | 2 +- src/main/resources/messages_zh_TW.properties | 2 +- .../resources/static/js/languageSelection.js | 4 +- .../templates/fragments/languages.html | 182 ++++++++++-------- src/main/resources/templates/pipeline.html | 5 +- 29 files changed, 174 insertions(+), 107 deletions(-) create mode 100644 FolderScanning.md create mode 100644 PipelineUsage.md diff --git a/FolderScanning.md b/FolderScanning.md new file mode 100644 index 00000000..309b063c --- /dev/null +++ b/FolderScanning.md @@ -0,0 +1,41 @@ +## User Guide for Local Directory Scanning and File Processing + +### Whilst Pipelines are in alpha... +You must enable this alpha functionality by setting +``` +system: + enableAlphaFunctionality: true +``` +To true like in the above for your `/config/settings.yml` file, after restarting Stirling-PDF you should see both UI and folder scanning enabled. + +### Setting Up Watched Folders: +- Create a folder where you want your files to be monitored. This is your 'watched folder'. +- The default directory for this is `./pipeline/watchedFolders/` +- Place any directories you want to be scanned into this folder, this folder should contain multiple folders each for their own tasks and pipelines. + +### Configuring Processing with JSON Files: +- In each directory you want processed (e.g `./pipeline/watchedFolders/officePrinter`), include a JSON configuration file. +- This JSON file should specify how you want the files in the directory to be handled (e.g., what operations to perform on them) which can be made, configured and downloaded from Stirling-PDF Pipeline interface.r + +### Automatic Scanning and Processing: +- The system automatically checks the watched folder every minute for new directories and files to process. +- When a directory with a valid JSON configuration file is found, it begins processing the files inside as per the configuration. + +### Processing Steps: +- Files in each directory are processed according to the instructions in the JSON file. +- This might involve file conversions, data filtering, renaming files, etc. If the output of a step is a zip, this zip will be automatically unzipped as it passes to next process. + +### Results and Output: +- After processing, the results are saved in a specified output location. This could be a different folder or location as defined in the JSON file or the default location `./pipeline/finishedFolders/`. +- Each processed file is named and organized according to the rules set in the JSON configuration. + +### Completion and Cleanup: +- Once processing is complete, the original files in the watched folder's directory are removed. +- You can find the processed files in the designated output location. + +### Error Handling: +- If there's an error during processing, the system will not delete the original files, allowing you to check and retry if necessary. + +### User Interaction: +- As a user, your main tasks are to set up the watched folders, place directories with files for processing, and create the corresponding JSON configuration files. +- The system handles the rest, including scanning, processing, and outputting results. diff --git a/PipelineUsage.md b/PipelineUsage.md new file mode 100644 index 00000000..e69de29b diff --git a/src/main/resources/messages_ar_AR.properties b/src/main/resources/messages_ar_AR.properties index 1af763de..cac25052 100644 --- a/src/main/resources/messages_ar_AR.properties +++ b/src/main/resources/messages_ar_AR.properties @@ -66,7 +66,7 @@ pipeline.submitButton=Submit ###################### pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Settings +pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: diff --git a/src/main/resources/messages_bg_BG.properties b/src/main/resources/messages_bg_BG.properties index af661698..e31749ca 100644 --- a/src/main/resources/messages_bg_BG.properties +++ b/src/main/resources/messages_bg_BG.properties @@ -66,7 +66,7 @@ pipeline.submitButton=Submit ###################### pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Settings +pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: diff --git a/src/main/resources/messages_ca_CA.properties b/src/main/resources/messages_ca_CA.properties index a8b78d38..406eee89 100644 --- a/src/main/resources/messages_ca_CA.properties +++ b/src/main/resources/messages_ca_CA.properties @@ -66,7 +66,7 @@ pipeline.submitButton=Submit ###################### pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Settings +pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties index 2d17a376..082918c3 100644 --- a/src/main/resources/messages_de_DE.properties +++ b/src/main/resources/messages_de_DE.properties @@ -66,7 +66,7 @@ pipeline.submitButton=Submit ###################### pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Settings +pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: diff --git a/src/main/resources/messages_el_GR.properties b/src/main/resources/messages_el_GR.properties index cbfa8e0c..83bf96b4 100644 --- a/src/main/resources/messages_el_GR.properties +++ b/src/main/resources/messages_el_GR.properties @@ -66,7 +66,7 @@ pipeline.submitButton=Submit ###################### pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Settings +pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: diff --git a/src/main/resources/messages_en_GB.properties b/src/main/resources/messages_en_GB.properties index 21fcf4de..c6da18c2 100644 --- a/src/main/resources/messages_en_GB.properties +++ b/src/main/resources/messages_en_GB.properties @@ -66,8 +66,9 @@ pipeline.submitButton=Submit ###################### pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Settings +pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here +pipelineOptions.selectOperation=Select Operation pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.saveButton=Download diff --git a/src/main/resources/messages_en_US.properties b/src/main/resources/messages_en_US.properties index bb432428..d6f7ef71 100644 --- a/src/main/resources/messages_en_US.properties +++ b/src/main/resources/messages_en_US.properties @@ -66,7 +66,7 @@ pipeline.submitButton=Submit ###################### pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Settings +pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: diff --git a/src/main/resources/messages_es_ES.properties b/src/main/resources/messages_es_ES.properties index b363db4b..887b14de 100644 --- a/src/main/resources/messages_es_ES.properties +++ b/src/main/resources/messages_es_ES.properties @@ -66,7 +66,7 @@ pipeline.submitButton=Submit ###################### pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Settings +pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: diff --git a/src/main/resources/messages_eu_ES.properties b/src/main/resources/messages_eu_ES.properties index 57bf53e7..ef9b628a 100644 --- a/src/main/resources/messages_eu_ES.properties +++ b/src/main/resources/messages_eu_ES.properties @@ -66,7 +66,7 @@ pipeline.submitButton=Submit ###################### pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Settings +pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: diff --git a/src/main/resources/messages_fr_FR.properties b/src/main/resources/messages_fr_FR.properties index e74a5b77..80da3038 100644 --- a/src/main/resources/messages_fr_FR.properties +++ b/src/main/resources/messages_fr_FR.properties @@ -66,7 +66,7 @@ pipeline.submitButton=Submit ###################### pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Settings +pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: diff --git a/src/main/resources/messages_hi_IN.properties b/src/main/resources/messages_hi_IN.properties index 5e1df2e5..a44f3c5b 100644 --- a/src/main/resources/messages_hi_IN.properties +++ b/src/main/resources/messages_hi_IN.properties @@ -66,7 +66,7 @@ pipeline.submitButton=Submit ###################### pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Settings +pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: diff --git a/src/main/resources/messages_hu_HU.properties b/src/main/resources/messages_hu_HU.properties index f25f07c1..7a43b8ce 100644 --- a/src/main/resources/messages_hu_HU.properties +++ b/src/main/resources/messages_hu_HU.properties @@ -66,7 +66,7 @@ pipeline.submitButton=Submit ###################### pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Settings +pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: diff --git a/src/main/resources/messages_id_ID.properties b/src/main/resources/messages_id_ID.properties index 10003570..b3ed56a9 100644 --- a/src/main/resources/messages_id_ID.properties +++ b/src/main/resources/messages_id_ID.properties @@ -66,7 +66,7 @@ pipeline.submitButton=Submit ###################### pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Settings +pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: diff --git a/src/main/resources/messages_ja_JP.properties b/src/main/resources/messages_ja_JP.properties index 429eb87a..7ba8b206 100644 --- a/src/main/resources/messages_ja_JP.properties +++ b/src/main/resources/messages_ja_JP.properties @@ -66,7 +66,7 @@ pipeline.submitButton=Submit ###################### pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Settings +pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: diff --git a/src/main/resources/messages_ko_KR.properties b/src/main/resources/messages_ko_KR.properties index 881803da..0213dc79 100644 --- a/src/main/resources/messages_ko_KR.properties +++ b/src/main/resources/messages_ko_KR.properties @@ -66,7 +66,7 @@ pipeline.submitButton=Submit ###################### pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Settings +pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: diff --git a/src/main/resources/messages_nl_NL.properties b/src/main/resources/messages_nl_NL.properties index 88a162cb..bcfa528c 100644 --- a/src/main/resources/messages_nl_NL.properties +++ b/src/main/resources/messages_nl_NL.properties @@ -66,7 +66,7 @@ pipeline.submitButton=Submit ###################### pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Settings +pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: diff --git a/src/main/resources/messages_pl_PL.properties b/src/main/resources/messages_pl_PL.properties index 9a17999a..5d08a346 100644 --- a/src/main/resources/messages_pl_PL.properties +++ b/src/main/resources/messages_pl_PL.properties @@ -66,7 +66,7 @@ pipeline.submitButton=Submit ###################### pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Settings +pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: diff --git a/src/main/resources/messages_pt_BR.properties b/src/main/resources/messages_pt_BR.properties index a7c1aa06..5002f064 100644 --- a/src/main/resources/messages_pt_BR.properties +++ b/src/main/resources/messages_pt_BR.properties @@ -66,7 +66,7 @@ pipeline.submitButton=Submit ###################### pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Settings +pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: diff --git a/src/main/resources/messages_ro_RO.properties b/src/main/resources/messages_ro_RO.properties index 6dfe1052..dbbd73d2 100644 --- a/src/main/resources/messages_ro_RO.properties +++ b/src/main/resources/messages_ro_RO.properties @@ -66,7 +66,7 @@ pipeline.submitButton=Submit ###################### pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Settings +pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: diff --git a/src/main/resources/messages_ru_RU.properties b/src/main/resources/messages_ru_RU.properties index 7caaf442..1b6fa7f0 100644 --- a/src/main/resources/messages_ru_RU.properties +++ b/src/main/resources/messages_ru_RU.properties @@ -66,7 +66,7 @@ pipeline.submitButton=Submit ###################### pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Settings +pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: diff --git a/src/main/resources/messages_sv_SE.properties b/src/main/resources/messages_sv_SE.properties index cf26689b..85e2559c 100644 --- a/src/main/resources/messages_sv_SE.properties +++ b/src/main/resources/messages_sv_SE.properties @@ -66,7 +66,7 @@ pipeline.submitButton=Submit ###################### pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Settings +pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: diff --git a/src/main/resources/messages_tr_TR.properties b/src/main/resources/messages_tr_TR.properties index d5530226..f3071b00 100644 --- a/src/main/resources/messages_tr_TR.properties +++ b/src/main/resources/messages_tr_TR.properties @@ -66,7 +66,7 @@ pipeline.submitButton=Submit ###################### pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Settings +pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: diff --git a/src/main/resources/messages_zh_CN.properties b/src/main/resources/messages_zh_CN.properties index 737b221d..7498b0c9 100644 --- a/src/main/resources/messages_zh_CN.properties +++ b/src/main/resources/messages_zh_CN.properties @@ -66,7 +66,7 @@ pipeline.submitButton=Submit ###################### pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Settings +pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: diff --git a/src/main/resources/messages_zh_TW.properties b/src/main/resources/messages_zh_TW.properties index 4caa4e84..b6a8811c 100644 --- a/src/main/resources/messages_zh_TW.properties +++ b/src/main/resources/messages_zh_TW.properties @@ -66,7 +66,7 @@ pipeline.submitButton=Submit ###################### pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Settings +pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: diff --git a/src/main/resources/static/js/languageSelection.js b/src/main/resources/static/js/languageSelection.js index c554c2a7..a5e7be2a 100644 --- a/src/main/resources/static/js/languageSelection.js +++ b/src/main/resources/static/js/languageSelection.js @@ -61,9 +61,7 @@ document.addEventListener('DOMContentLoaded', function() { //Sort languages by alphabet const list = Array.from(document.querySelector('.dropdown-menu[aria-labelledby="languageDropdown"]').children).filter(child => child.matches('a')); list.sort(function(a, b) { - var A = a.textContent.toUpperCase(); - var B = b.textContent.toUpperCase(); - return (A < B) ? -1 : (A > B) ? 1 : 0; + return a.textContent.toUpperCase().localeCompare(b.textContent.toUpperCase()); }).forEach(node => document.querySelector('.dropdown-menu[aria-labelledby="languageDropdown"]').appendChild(node)); }); \ No newline at end of file diff --git a/src/main/resources/templates/fragments/languages.html b/src/main/resources/templates/fragments/languages.html index fba197f5..3ca0092f 100644 --- a/src/main/resources/templates/fragments/languages.html +++ b/src/main/resources/templates/fragments/languages.html @@ -1,81 +1,107 @@ - - icon Български - - - icon العربية - - - icon Català - - - icon 简体中文 - - - icon 正體中文 - - - icon Deutsch - - - icon English (GB) - - - icon English (US) - - - icon Euskara - - - icon Español - - - icon Français - - - icon Indonesia - - - icon Italiano - - - icon Nederlands - - - icon Polski - - - icon Português (BR) - - - icon Romanian - - - icon Svenska - - - icon Türkçe - - - icon Русский - - - icon 한국어 - - - icon 日本語 - - - icon Ελληνικά - - - icon Hungarian - - - icon हिन्दी - - - icon Srpski - + icon Български + + icon العربية + + icon Català + + icon 简体中文 + + icon 正體中文 + + icon Deutsch + + icon English (GB) + + icon English (US) + + icon Euskara + + icon Español + + icon Français + + icon Indonesia + + icon Italiano + + icon Nederlands + + icon Polski + + icon Português (BR) + + icon Romanian + + icon Svenska + + icon Türkçe + + icon Русский + + icon 한국어 + + icon 日本語 + + icon Ελληνικά + + icon Hungarian + + icon हिन्दी + + icon Srpski + diff --git a/src/main/resources/templates/pipeline.html b/src/main/resources/templates/pipeline.html index 1d976e09..36535a9b 100644 --- a/src/main/resources/templates/pipeline.html +++ b/src/main/resources/templates/pipeline.html @@ -80,6 +80,7 @@ +

Below info is Alpha only, will be removed and hence not translated

Current Limitations

  • Cannot have more than one of the same operation
  • @@ -106,9 +107,8 @@

    Todo

      -
    • Translation support
    • Save to browser/Account
    • -
    • offline mode checks and testing
    • +
    • offline folder scan mode checks and testing for unique usecases
    • Improve operation config settings UI
    @@ -203,6 +203,7 @@ th:placeholder="#{pipelineOptions.pipelineNamePrompt}">
    + From c8458ffe50e67b1f53d005bf9e632984a22d858a Mon Sep 17 00:00:00 2001 From: albanobattistella <34811668+albanobattistella@users.noreply.github.com> Date: Fri, 5 Jan 2024 20:39:01 +0100 Subject: [PATCH 05/81] Update messages_it_IT.properties --- src/main/resources/messages_it_IT.properties | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index bd881472..7ef311ba 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -43,7 +43,7 @@ green=Verde blue=Blu custom=Personalizzato WorkInProgess=Lavori in corso, potrebbe non funzionare o essere difettoso, segnalare eventuali problemi! -poweredBy=Powered by +poweredBy=Alimentato da changedCredsMessage=Credenziali cambiate! notAuthenticatedMessage=Utente non autenticato. @@ -547,11 +547,11 @@ scalePages.submit=Invia certSign.title=Firma del certificato certSign.header=Firma un PDF con il tuo certificato (Lavoro in corso) certSign.selectPDF=Seleziona un file PDF per la firma: -certSign.jksNote=Note: If your certificate type is not listed below, please convert it to a Java Keystore (.jks) file using the keytool command line tool. Then, choose the .jks file option below. +certSign.jksNote=Nota: se il tipo di certificato non è elencato di seguito, convertilo in un file Java Keystore (.jks) utilizzando lo strumento da riga di comando keytool. Quindi, scegli l'opzione del file .jks di seguito. certSign.selectKey=Seleziona il file della tua chiave privata (formato PKCS#8, potrebbe essere .pem o .der): certSign.selectCert=Seleziona il tuo file di certificato (formato X.509, potrebbe essere .pem o .der): certSign.selectP12=Selezionare il file keystore PKCS#12 (.p12 o .pfx) (facoltativo, se fornito, dovrebbe contenere la chiave privata e il certificato): -certSign.selectJKS=Select Your Java Keystore File (.jks or .keystore): +certSign.selectJKS=Seleziona il tuo file Java Keystore (.jks o .keystore): certSign.certType=Tipo di certificato certSign.password=Inserisci la tua password dell'archivio chiavi o della chiave privata (se presente): certSign.showSig=Mostra firma @@ -924,11 +924,11 @@ split-by-sections.submit=Dividi PDF #licenses -licenses.nav=Licenses -licenses.title=3rd Party Licenses -licenses.header=3rd Party Licenses -licenses.module=Module -licenses.version=Version -licenses.license=License +licenses.nav=Licenze +licenses.title=Licenze di terze parti +licenses.header=Licenze di terze parti +licenses.module=Modulo +licenses.version=Versione +licenses.license=Licenza From 863b48b5a984db318886fa502512491b45fdda4c Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Sat, 6 Jan 2024 21:09:37 +0000 Subject: [PATCH 06/81] Delete CNAME --- CNAME | 1 - 1 file changed, 1 deletion(-) delete mode 100644 CNAME diff --git a/CNAME b/CNAME deleted file mode 100644 index 736e5893..00000000 --- a/CNAME +++ /dev/null @@ -1 +0,0 @@ -stirlingtools.com \ No newline at end of file From 164d1abdbbb2103452b6f4f68194a020b8930ade Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Sat, 6 Jan 2024 22:17:03 +0000 Subject: [PATCH 07/81] Delete PipelineUsage.md --- PipelineUsage.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 PipelineUsage.md diff --git a/PipelineUsage.md b/PipelineUsage.md deleted file mode 100644 index e69de29b..00000000 From d76752d7f6f855f97f83835749a450445f728019 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Sat, 6 Jan 2024 22:53:07 +0000 Subject: [PATCH 08/81] Create PipelineFeature.md --- PipelineFeature.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 PipelineFeature.md diff --git a/PipelineFeature.md b/PipelineFeature.md new file mode 100644 index 00000000..001c3f22 --- /dev/null +++ b/PipelineFeature.md @@ -0,0 +1,33 @@ +# Pipeline Configuration and Usage Tutorial + +## Steps to Configure and Use Your Pipeline + +1. **Access Configuration** + - Upon entering the screen, click on the **Configure** button. + +2. **Enter Pipeline Name** + - Provide a name for your pipeline in the designated field. + +3. **Select Operations** + - Choose the operations for your pipeline (e.g., **Split Pages**), then click **Add Operation**. + +4. **Configure Operation Settings** + - Input the necessary settings for each added operation. Settings are highlighted in yellow if customization is needed. + +5. **Add More Operations** + - You can add and adjust the order of multiple operations. Ensure each operation's settings are customized. + +6. **Save Settings** + - Click **Save Operation Settings** after customizing settings for each operation. + +7. **Validate Pipeline** + - Use the **Validation** button to check your pipeline. A green indicator signifies correct setup; a pop-out error indicates issues. + +8. **Download Pipeline Configuration** + - To use the configuration for folder scanning (or save it for future use and reupload it), you can also download a JSON file in this menu. You can also pre-load this for future use by placing it in ``/pipeline/defaultWebUIConfigs/``. It will then appear in the dropdown menu for all users to use. + +9. **Submit Files for Processing** + - If your pipeline is correctly set up close the configure menu, input the files and hit **Submit**. + +10. **Note on Web UI Limitations** + - The current web UI version does not support operations that require multiple different types of inputs, such as adding a separate image to a PDF. From 624e0153152c2e1b080866af5c2147ea6a2a934b Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Sat, 6 Jan 2024 22:56:56 +0000 Subject: [PATCH 09/81] Update PipelineFeature.md --- PipelineFeature.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/PipelineFeature.md b/PipelineFeature.md index 001c3f22..c2c935b4 100644 --- a/PipelineFeature.md +++ b/PipelineFeature.md @@ -1,5 +1,14 @@ # Pipeline Configuration and Usage Tutorial +## Whilst Pipelines are in alpha... +You must enable this alpha functionality by setting +``` +system: + enableAlphaFunctionality: true +``` +To true like in the above for your `/config/settings.yml` file, after restarting Stirling-PDF you should see both UI and folder scanning enabled. + + ## Steps to Configure and Use Your Pipeline 1. **Access Configuration** From 362a7ff434b404eb6220831baa6f04d361850b3c Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Sat, 6 Jan 2024 23:06:58 +0000 Subject: [PATCH 10/81] Update releaseArtifacts.yml --- .github/workflows/releaseArtifacts.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/releaseArtifacts.yml b/.github/workflows/releaseArtifacts.yml index 9514ec36..e1473cd9 100644 --- a/.github/workflows/releaseArtifacts.yml +++ b/.github/workflows/releaseArtifacts.yml @@ -4,7 +4,7 @@ on: release: types: [created] permissions: - contents: read + contents: write packages: write jobs: push: From ef12c2f892f655d06d50af99bdaf6ec6825ee242 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Tue, 9 Jan 2024 22:39:21 +0000 Subject: [PATCH 11/81] Add ebook support --- .../software/SPDF/config/AppConfig.java | 37 +++++++ .../SPDF/config/EndpointConfiguration.java | 21 +++- .../SPDF/config/PostStartupProcesses.java | 95 ++++++++++++++++ .../security/UserAuthenticationFilter.java | 55 ++++++++-- .../ConvertBookToPDFController.java | 68 ++++++++++++ .../api/converters/ConvertHtmlToPDF.java | 10 +- .../api/converters/ConvertMarkdownToPdf.java | 10 +- .../ConvertPDFToBookController.java | 101 ++++++++++++++++++ .../api/converters/ConvertWebsiteToPDF.java | 12 ++- .../web/ConverterWebController.java | 17 +++ .../controller/web/HomeWebController.java | 6 +- .../SPDF/model/ApplicationProperties.java | 41 +++++++ .../api/converters/PdfToBookRequest.java | 19 ++++ .../software/SPDF/utils/FileToPdf.java | 49 ++++++++- .../software/SPDF/utils/ProcessExecutor.java | 54 ++++++---- src/main/resources/settings.yml.template | 4 +- src/main/resources/static/images/book.svg | 3 + .../static/js/multitool/PdfContainer.js | 29 ++--- .../templates/convert/book-to-pdf.html | 30 ++++++ .../templates/convert/pdf-to-book.html | 55 ++++++++++ .../resources/templates/fragments/navbar.html | 2 + src/main/resources/templates/home.html | 2 + 22 files changed, 668 insertions(+), 52 deletions(-) create mode 100644 src/main/java/stirling/software/SPDF/config/PostStartupProcesses.java create mode 100644 src/main/java/stirling/software/SPDF/controller/api/converters/ConvertBookToPDFController.java create mode 100644 src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToBookController.java create mode 100644 src/main/java/stirling/software/SPDF/model/api/converters/PdfToBookRequest.java create mode 100644 src/main/resources/static/images/book.svg create mode 100644 src/main/resources/templates/convert/book-to-pdf.html create mode 100644 src/main/resources/templates/convert/pdf-to-book.html diff --git a/src/main/java/stirling/software/SPDF/config/AppConfig.java b/src/main/java/stirling/software/SPDF/config/AppConfig.java index 0411715f..b740707a 100644 --- a/src/main/java/stirling/software/SPDF/config/AppConfig.java +++ b/src/main/java/stirling/software/SPDF/config/AppConfig.java @@ -1,5 +1,8 @@ package stirling.software.SPDF.config; +import java.nio.file.Files; +import java.nio.file.Paths; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -57,4 +60,38 @@ public class AppConfig { if (appName == null) appName = System.getenv("rateLimit"); return (appName != null) ? Boolean.valueOf(appName) : false; } + + @Bean(name = "RunningInDocker") + public boolean runningInDocker() { + return Files.exists(Paths.get("/.dockerenv")); + } + + @Bean(name = "bookFormatsInstalled") + public boolean bookFormatsInstalled() { + System.out.println("astirli " + applicationProperties.getSystem()); + System.out.println("astirli2 " + applicationProperties.getSystem().getCustomApplications()); + System.out.println( + "astirli3 " + + applicationProperties + .getSystem() + .getCustomApplications() + .isInstallBookFormats()); + return applicationProperties.getSystem().getCustomApplications().isInstallBookFormats(); + } + + @Bean(name = "htmlFormatsInstalled") + public boolean htmlFormatsInstalled() { + System.out.println("astirli4 " + applicationProperties.getSystem()); + System.out.println("astirli5 " + applicationProperties.getSystem().getCustomApplications()); + System.out.println( + "astirli6 " + + applicationProperties + .getSystem() + .getCustomApplications() + .isInstallAdvancedHtmlToPDF()); + return applicationProperties + .getSystem() + .getCustomApplications() + .isInstallAdvancedHtmlToPDF(); + } } diff --git a/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java b/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java index 593b70b4..a56949ae 100644 --- a/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java +++ b/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java @@ -9,11 +9,14 @@ import java.util.concurrent.ConcurrentHashMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.context.annotation.DependsOn; import org.springframework.stereotype.Service; import stirling.software.SPDF.model.ApplicationProperties; @Service +@DependsOn({"bookFormatsInstalled"}) public class EndpointConfiguration { private static final Logger logger = LoggerFactory.getLogger(EndpointConfiguration.class); private Map endpointStatuses = new ConcurrentHashMap<>(); @@ -21,9 +24,14 @@ public class EndpointConfiguration { private final ApplicationProperties applicationProperties; + private boolean bookFormatsInstalled; + @Autowired - public EndpointConfiguration(ApplicationProperties applicationProperties) { + public EndpointConfiguration( + ApplicationProperties applicationProperties, + @Qualifier("bookFormatsInstalled") boolean bookFormatsInstalled) { this.applicationProperties = applicationProperties; + this.bookFormatsInstalled = bookFormatsInstalled; init(); processEnvironmentConfigs(); } @@ -145,6 +153,12 @@ public class EndpointConfiguration { addEndpointToGroup("CLI", "ocr-pdf"); addEndpointToGroup("CLI", "html-to-pdf"); addEndpointToGroup("CLI", "url-to-pdf"); + addEndpointToGroup("CLI", "book-to-pdf"); + addEndpointToGroup("CLI", "pdf-to-book"); + + // Calibre + addEndpointToGroup("Calibre", "book-to-pdf"); + addEndpointToGroup("Calibre", "pdf-to-book"); // python addEndpointToGroup("Python", "extract-image-scans"); @@ -215,7 +229,10 @@ public class EndpointConfiguration { private void processEnvironmentConfigs() { List endpointsToRemove = applicationProperties.getEndpoints().getToRemove(); List groupsToRemove = applicationProperties.getEndpoints().getGroupsToRemove(); - + System.out.println("ASTIRLI7 bookFormatsInstalled=" + bookFormatsInstalled); + if (!bookFormatsInstalled) { + groupsToRemove.add("Calibre"); + } if (endpointsToRemove != null) { for (String endpoint : endpointsToRemove) { disableEndpoint(endpoint.trim()); diff --git a/src/main/java/stirling/software/SPDF/config/PostStartupProcesses.java b/src/main/java/stirling/software/SPDF/config/PostStartupProcesses.java new file mode 100644 index 00000000..09216a76 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/config/PostStartupProcesses.java @@ -0,0 +1,95 @@ +package stirling.software.SPDF.config; + +import java.io.IOException; +import java.util.*; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +import jakarta.annotation.PostConstruct; +import stirling.software.SPDF.model.ApplicationProperties; +import stirling.software.SPDF.utils.ProcessExecutor; +import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; + +@Component +public class PostStartupProcesses { + + @Autowired ApplicationProperties applicationProperties; + + @Autowired + @Qualifier("RunningInDocker") + private boolean runningInDocker; + + @Autowired + @Qualifier("bookFormatsInstalled") + private boolean bookFormatsInstalled; + + @Autowired + @Qualifier("htmlFormatsInstalled") + private boolean htmlFormatsInstalled; + + @PostConstruct + public void runInstallCommandBasedOnEnvironment() throws IOException, InterruptedException { + List> commands = new ArrayList<>(); + System.out.println("astirli bookFormatsInstalled=" + bookFormatsInstalled); + System.out.println("astirli htmlFormatsInstalled=" + htmlFormatsInstalled); + // Checking for DOCKER_INSTALL_BOOK_FORMATS environment variable + if (bookFormatsInstalled) { + List tmpList = new ArrayList<>(); + // Set up the timezone configuration commands + tmpList.addAll( + Arrays.asList( + "sh", + "-c", + "echo 'tzdata tzdata/Areas select Europe' | debconf-set-selections; " + + "echo 'tzdata tzdata/Zones/Europe select Berlin' | debconf-set-selections")); + commands.add(tmpList); + + // Install calibre with DEBIAN_FRONTEND set to noninteractive + tmpList = new ArrayList<>(); + tmpList.addAll( + Arrays.asList( + "sh", + "-c", + "DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends calibre")); + commands.add(tmpList); + } + + // Checking for DOCKER_INSTALL_HTML_FORMATS environment variable + if (htmlFormatsInstalled) { + List tmpList = new ArrayList<>(); + // Add -y flag for automatic yes to prompts and --no-install-recommends to reduce size + tmpList.addAll( + Arrays.asList( + "apt-get", "install", "wkhtmltopdf", "-y", "--no-install-recommends")); + commands.add(tmpList); + } + + if (!commands.isEmpty()) { + // Run the command + if (runningInDocker) { + List tmpList = new ArrayList<>(); + tmpList.addAll(Arrays.asList("apt-get", "update")); + commands.add(0, tmpList); + + for (List list : commands) { + ProcessExecutorResult returnCode = + ProcessExecutor.getInstance(ProcessExecutor.Processes.INSTALL_APP, true) + .runCommandWithOutputHandling(list); + System.out.println("astirli RC for app installs " + returnCode.getRc()); + } + } else { + System.out.println( + "astirli Not running inside Docker so skipping automated install process with command."); + } + + } else { + if (runningInDocker) { + System.out.println("astirli No custom apps to install."); + } else { + System.out.println("astirli No custom apps to install. and not docker"); + } + } + } +} diff --git a/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java b/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java index 47423eb6..a6e8eff3 100644 --- a/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java +++ b/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java @@ -1,9 +1,12 @@ package stirling.software.SPDF.config.security; import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URL; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.http.HttpStatus; import org.springframework.security.core.Authentication; @@ -18,6 +21,7 @@ import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import jakarta.servlet.http.HttpServletResponseWrapper; import stirling.software.SPDF.model.ApiKeyAuthenticationToken; @Component @@ -31,14 +35,28 @@ public class UserAuthenticationFilter extends OncePerRequestFilter { @Qualifier("loginEnabled") public boolean loginEnabledValue; + @Value("${redirect.port:}") // Default to empty if not set + private String redirectPort; + @Override protected void doFilterInternal( HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { + // Custom response wrapper to modify the redirect location + HttpServletResponseWrapper responseWrapper = + new HttpServletResponseWrapper(response) { + @Override + public void sendRedirect(String location) throws IOException { + // Modify the location to include the correct port + String modifiedLocation = modifyLocation(location, request); + super.sendRedirect(modifiedLocation); + } + }; + if (!loginEnabledValue) { // If login is not enabled, just pass all requests without authentication - filterChain.doFilter(request, response); + filterChain.doFilter(request, responseWrapper); return; } String requestURI = request.getRequestURI(); @@ -53,8 +71,8 @@ public class UserAuthenticationFilter extends OncePerRequestFilter { // provider for API keys. UserDetails userDetails = userService.loadUserByApiKey(apiKey); if (userDetails == null) { - response.setStatus(HttpStatus.UNAUTHORIZED.value()); - response.getWriter().write("Invalid API Key."); + responseWrapper.setStatus(HttpStatus.UNAUTHORIZED.value()); + responseWrapper.getWriter().write("Invalid API Key."); return; } authentication = @@ -63,8 +81,8 @@ public class UserAuthenticationFilter extends OncePerRequestFilter { SecurityContextHolder.getContext().setAuthentication(authentication); } catch (AuthenticationException e) { // If API key authentication fails, deny the request - response.setStatus(HttpStatus.UNAUTHORIZED.value()); - response.getWriter().write("Invalid API Key."); + responseWrapper.setStatus(HttpStatus.UNAUTHORIZED.value()); + responseWrapper.getWriter().write("Invalid API Key."); return; } } @@ -76,18 +94,37 @@ public class UserAuthenticationFilter extends OncePerRequestFilter { String contextPath = request.getContextPath(); if ("GET".equalsIgnoreCase(method) && !(contextPath + "/login").equals(requestURI)) { - response.sendRedirect(contextPath + "/login"); // redirect to the login page + responseWrapper.sendRedirect(contextPath + "/login"); // redirect to the login page return; } else { - response.setStatus(HttpStatus.UNAUTHORIZED.value()); - response.getWriter() + responseWrapper.setStatus(HttpStatus.UNAUTHORIZED.value()); + responseWrapper + .getWriter() .write( "Authentication required. Please provide a X-API-KEY in request header.\nThis is found in Settings -> Account Settings -> API Key\nAlternativly you can disable authentication if this is unexpected"); return; } } - filterChain.doFilter(request, response); + filterChain.doFilter(request, responseWrapper); + } + + private String modifyLocation(String location, HttpServletRequest request) { + if (!location.matches("https?://[^/]+:\\d+.*") + && redirectPort != null + && redirectPort.length() > 0) { + try { + int port = Integer.parseInt(redirectPort); // Parse the port + URL url = new URL(location); + String modifiedUrl = + new URL(url.getProtocol(), url.getHost(), port, url.getFile()).toString(); + return modifiedUrl; + } catch (MalformedURLException | NumberFormatException e) { + // Log error and return the original location if URL parsing fails + e.printStackTrace(); + } + } + return location; } @Override diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertBookToPDFController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertBookToPDFController.java new file mode 100644 index 00000000..453f8e6e --- /dev/null +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertBookToPDFController.java @@ -0,0 +1,68 @@ +package stirling.software.SPDF.controller.api.converters; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +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.tags.Tag; + +import stirling.software.SPDF.model.api.GeneralFile; +import stirling.software.SPDF.utils.FileToPdf; +import stirling.software.SPDF.utils.WebResponseUtils; + +@RestController +@Tag(name = "Convert", description = "Convert APIs") +@RequestMapping("/api/v1/convert") +public class ConvertBookToPDFController { + + @Autowired + @Qualifier("bookFormatsInstalled") + private boolean bookFormatsInstalled; + + @PostMapping(consumes = "multipart/form-data", value = "/book/pdf") + @Operation( + summary = + "Convert a BOOK/comic (*.epub | *.mobi | *.azw3 | *.fb2 | *.txt | *.docx) to PDF", + description = + "(Requires bookFormatsInstalled flag and Calibre installed) This endpoint takes an BOOK/comic (*.epub | *.mobi | *.azw3 | *.fb2 | *.txt | *.docx) input and converts it to PDF format.") + public ResponseEntity HtmlToPdf(@ModelAttribute GeneralFile request) throws Exception { + MultipartFile fileInput = request.getFileInput(); + + if (!bookFormatsInstalled) { + throw new IllegalArgumentException( + "bookFormatsInstalled flag is False, this functionality is not avaiable"); + } + + if (fileInput == null) { + throw new IllegalArgumentException("Please provide a file for conversion."); + } + + String originalFilename = fileInput.getOriginalFilename(); + + if (originalFilename != null) { + String originalFilenameLower = originalFilename.toLowerCase(); + if (!originalFilenameLower.endsWith(".epub") + && !originalFilenameLower.endsWith(".mobi") + && !originalFilenameLower.endsWith(".azw3") + && !originalFilenameLower.endsWith(".fb2") + && !originalFilenameLower.endsWith(".txt") + && !originalFilenameLower.endsWith(".docx")) { + throw new IllegalArgumentException( + "File must be in .epub, .mobi, .azw3, .fb2, .txt, or .docx format."); + } + } + byte[] pdfBytes = FileToPdf.convertBookTypeToPdf(fileInput.getBytes(), originalFilename); + + String outputFilename = + originalFilename.replaceFirst("[.][^.]+$", "") + + ".pdf"; // Remove file extension and append .pdf + + return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename); + } +} diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java index bec09040..fdcd114a 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java @@ -1,5 +1,7 @@ package stirling.software.SPDF.controller.api.converters; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -19,6 +21,10 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RequestMapping("/api/v1/convert") public class ConvertHtmlToPDF { + @Autowired + @Qualifier("htmlFormatsInstalled") + private boolean htmlFormatsInstalled; + @PostMapping(consumes = "multipart/form-data", value = "/html/pdf") @Operation( summary = "Convert an HTML or ZIP (containing HTML and CSS) to PDF", @@ -37,7 +43,9 @@ public class ConvertHtmlToPDF { || (!originalFilename.endsWith(".html") && !originalFilename.endsWith(".zip"))) { throw new IllegalArgumentException("File must be either .html or .zip format."); } - byte[] pdfBytes = FileToPdf.convertHtmlToPdf(fileInput.getBytes(), originalFilename); + byte[] pdfBytes = + FileToPdf.convertHtmlToPdf( + fileInput.getBytes(), originalFilename, htmlFormatsInstalled); String outputFilename = originalFilename.replaceFirst("[.][^.]+$", "") diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java index 8bdc5049..d0fd632d 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java @@ -3,6 +3,8 @@ package stirling.software.SPDF.controller.api.converters; import org.commonmark.node.Node; import org.commonmark.parser.Parser; import org.commonmark.renderer.html.HtmlRenderer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -22,6 +24,10 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RequestMapping("/api/v1/convert") public class ConvertMarkdownToPdf { + @Autowired + @Qualifier("htmlFormatsInstalled") + private boolean htmlFormatsInstalled; + @PostMapping(consumes = "multipart/form-data", value = "/markdown/pdf") @Operation( summary = "Convert a Markdown file to PDF", @@ -46,7 +52,9 @@ public class ConvertMarkdownToPdf { HtmlRenderer renderer = HtmlRenderer.builder().build(); String htmlContent = renderer.render(document); - byte[] pdfBytes = FileToPdf.convertHtmlToPdf(htmlContent.getBytes(), "converted.html"); + byte[] pdfBytes = + FileToPdf.convertHtmlToPdf( + htmlContent.getBytes(), "converted.html", htmlFormatsInstalled); String outputFilename = originalFilename.replaceFirst("[.][^.]+$", "") diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToBookController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToBookController.java new file mode 100644 index 00000000..1ee09d9e --- /dev/null +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToBookController.java @@ -0,0 +1,101 @@ +package stirling.software.SPDF.controller.api.converters; + +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +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.tags.Tag; + +import stirling.software.SPDF.model.api.converters.PdfToBookRequest; +import stirling.software.SPDF.utils.ProcessExecutor; +import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; +import stirling.software.SPDF.utils.WebResponseUtils; + +@RestController +@Tag(name = "Convert", description = "Convert APIs") +@RequestMapping("/api/v1/convert") +public class ConvertPDFToBookController { + + @Autowired + @Qualifier("bookFormatsInstalled") + private boolean bookFormatsInstalled; + + @PostMapping(consumes = "multipart/form-data", value = "/pdf/book") + @Operation( + summary = + "Convert a PDF to a Book/comic (*.epub | *.mobi | *.azw3 | *.fb2 | *.txt | *.docx .. (others to include by chatgpt) to PDF", + description = + "(Requires bookFormatsInstalled flag and Calibre installed) This endpoint Convert a PDF to a Book/comic (*.epub | *.mobi | *.azw3 | *.fb2 | *.txt | *.docx .. (others to include by chatgpt) to PDF") + public ResponseEntity HtmlToPdf(@ModelAttribute PdfToBookRequest request) + throws Exception { + MultipartFile fileInput = request.getFileInput(); + + if (!bookFormatsInstalled) { + throw new IllegalArgumentException( + "bookFormatsInstalled flag is False, this functionality is not avaiable"); + } + + if (fileInput == null) { + throw new IllegalArgumentException("Please provide a file for conversion."); + } + + // Validate the output format + String outputFormat = request.getOutputFormat().toLowerCase(); + List allowedFormats = + Arrays.asList( + "epub", "mobi", "azw3", "docx", "rtf", "txt", "html", "lit", "fb2", "pdb", + "lrf"); + if (!allowedFormats.contains(outputFormat)) { + throw new IllegalArgumentException("Invalid output format: " + outputFormat); + } + + byte[] outputFileBytes; + List command = new ArrayList<>(); + Path tempOutputFile = + Files.createTempFile( + "output_", + "." + outputFormat); // Use the output format for the file extension + Path tempInputFile = null; + + try { + // Create temp input file from the provided PDF + tempInputFile = Files.createTempFile("input_", ".pdf"); // Assuming input is always PDF + Files.write(tempInputFile, fileInput.getBytes()); + + command.add("ebook-convert"); + command.add(tempInputFile.toString()); + command.add(tempOutputFile.toString()); + + ProcessExecutorResult returnCode = + ProcessExecutor.getInstance(ProcessExecutor.Processes.CALIBRE) + .runCommandWithOutputHandling(command); + + outputFileBytes = Files.readAllBytes(tempOutputFile); + } finally { + // Clean up temporary files + if (tempInputFile != null) { + Files.deleteIfExists(tempInputFile); + } + Files.deleteIfExists(tempOutputFile); + } + + String outputFilename = + fileInput.getOriginalFilename().replaceFirst("[.][^.]+$", "") + + "." + + outputFormat; // Remove file extension and append .pdf + + return WebResponseUtils.bytesToWebResponse(outputFileBytes, outputFilename); + } +} diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java index 815018e8..a6cd439b 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java @@ -6,6 +6,8 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.List; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -26,6 +28,10 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RequestMapping("/api/v1/convert") public class ConvertWebsiteToPDF { + @Autowired + @Qualifier("htmlFormatsInstalled") + private boolean htmlFormatsInstalled; + @PostMapping(consumes = "multipart/form-data", value = "/url/pdf") @Operation( summary = "Convert a URL to a PDF", @@ -47,7 +53,11 @@ public class ConvertWebsiteToPDF { // Prepare the OCRmyPDF command List command = new ArrayList<>(); - command.add("weasyprint"); + if (!htmlFormatsInstalled) { + command.add("weasyprint"); + } else { + command.add("wkhtmltopdf"); + } command.add(URL); command.add(tempOutputFile.toString()); diff --git a/src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java b/src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java index 16e42dec..55ebcb91 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.web; +import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @@ -12,6 +13,22 @@ import io.swagger.v3.oas.annotations.tags.Tag; @Tag(name = "Convert", description = "Convert APIs") public class ConverterWebController { + @ConditionalOnExpression("#{bookFormatsInstalled}") + @GetMapping("/book-to-pdf") + @Hidden + public String convertBookToPdfForm(Model model) { + model.addAttribute("currentPage", "book-to-pdf"); + return "convert/book-to-pdf"; + } + + @ConditionalOnExpression("#{bookFormatsInstalled}") + @GetMapping("/pdf-to-book") + @Hidden + public String convertPdfToBookForm(Model model) { + model.addAttribute("currentPage", "pdf-to-book"); + return "convert/pdf-to-book"; + } + @GetMapping("/img-to-pdf") @Hidden public String convertImgToPdfForm(Model model) { diff --git a/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java b/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java index 2426d523..94e83342 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java @@ -1,7 +1,8 @@ package stirling.software.SPDF.controller.web; import java.io.IOException; -import java.nio.file.Files; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; import java.util.List; import java.util.Map; @@ -38,7 +39,8 @@ public class HomeWebController { model.addAttribute("currentPage", "licenses"); Resource resource = new ClassPathResource("static/3rdPartyLicenses.json"); try { - String json = new String(Files.readAllBytes(resource.getFile().toPath())); + InputStream is = resource.getInputStream(); + String json = new String(is.readAllBytes(), StandardCharsets.UTF_8); ObjectMapper mapper = new ObjectMapper(); Map> data = mapper.readValue(json, new TypeReference>>() {}); diff --git a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java b/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java index a41d641c..3258d8b1 100644 --- a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java +++ b/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java @@ -210,6 +210,7 @@ public class ApplicationProperties { private String rootURIPath; private String customStaticFilePath; private Integer maxFileSize; + private CustomApplications customApplications; private Boolean enableAlphaFunctionality; @@ -261,6 +262,14 @@ public class ApplicationProperties { this.maxFileSize = maxFileSize; } + public CustomApplications getCustomApplications() { + return customApplications != null ? customApplications : new CustomApplications(); + } + + public void setCustomApplications(CustomApplications customApplications) { + this.customApplications = customApplications; + } + @Override public String toString() { return "System [defaultLocale=" @@ -273,10 +282,42 @@ public class ApplicationProperties { + customStaticFilePath + ", maxFileSize=" + maxFileSize + + ", customApplications=" + + customApplications + ", enableAlphaFunctionality=" + enableAlphaFunctionality + "]"; } + + public static class CustomApplications { + private boolean installBookFormats; + private boolean installAdvancedHtmlToPDF; + + public boolean isInstallBookFormats() { + return installBookFormats; + } + + public void setInstallBookFormats(boolean installBookFormats) { + this.installBookFormats = installBookFormats; + } + + public boolean isInstallAdvancedHtmlToPDF() { + return installAdvancedHtmlToPDF; + } + + public void setInstallAdvancedHtmlToPDF(boolean installAdvancedHtmlToPDF) { + this.installAdvancedHtmlToPDF = installAdvancedHtmlToPDF; + } + + @Override + public String toString() { + return "CustomApplications [installBookFormats=" + + installBookFormats + + ", installAdvancedHtmlToPDF=" + + installAdvancedHtmlToPDF + + "]"; + } + } } public static class Ui { diff --git a/src/main/java/stirling/software/SPDF/model/api/converters/PdfToBookRequest.java b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToBookRequest.java new file mode 100644 index 00000000..b3454afb --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/converters/PdfToBookRequest.java @@ -0,0 +1,19 @@ +package stirling.software.SPDF.model.api.converters; + +import io.swagger.v3.oas.annotations.media.Schema; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import stirling.software.SPDF.model.api.PDFFile; + +@Data +@EqualsAndHashCode(callSuper = true) +public class PdfToBookRequest extends PDFFile { + + @Schema( + description = "The output Ebook format", + allowableValues = { + "epub", "mobi", "azw3", "docx", "rtf", "txt", "html", "lit", "fb2", "pdb", "lrf" + }) + private String outputFormat; +} diff --git a/src/main/java/stirling/software/SPDF/utils/FileToPdf.java b/src/main/java/stirling/software/SPDF/utils/FileToPdf.java index 5e6825dd..ca06c5c2 100644 --- a/src/main/java/stirling/software/SPDF/utils/FileToPdf.java +++ b/src/main/java/stirling/software/SPDF/utils/FileToPdf.java @@ -14,7 +14,9 @@ import java.util.zip.ZipInputStream; import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; public class FileToPdf { - public static byte[] convertHtmlToPdf(byte[] fileBytes, String fileName) + + public static byte[] convertHtmlToPdf( + byte[] fileBytes, String fileName, boolean htmlFormatsInstalled) throws IOException, InterruptedException { Path tempOutputFile = Files.createTempFile("output_", ".pdf"); @@ -29,11 +31,20 @@ public class FileToPdf { } List command = new ArrayList<>(); - command.add("weasyprint"); + if (!htmlFormatsInstalled) { + command.add("weasyprint"); + } else { + command.add("wkhtmltopdf"); + } command.add(tempInputFile.toString()); command.add(tempOutputFile.toString()); ProcessExecutorResult returnCode; if (fileName.endsWith(".zip")) { + + if (htmlFormatsInstalled) { + command.add("--allow"); + command.add(tempOutputFile.getParent().toString()); + } returnCode = ProcessExecutor.getInstance(ProcessExecutor.Processes.WEASYPRINT) .runCommandWithOutputHandling( @@ -97,4 +108,38 @@ public class FileToPdf { return htmlFiles.get(0); } } + + public static byte[] convertBookTypeToPdf(byte[] bytes, String originalFilename) + throws IOException, InterruptedException { + if (originalFilename == null || originalFilename.lastIndexOf('.') == -1) { + throw new IllegalArgumentException("Invalid original filename."); + } + + String fileExtension = originalFilename.substring(originalFilename.lastIndexOf('.')); + List command = new ArrayList<>(); + Path tempOutputFile = Files.createTempFile("output_", ".pdf"); + Path tempInputFile = null; + + try { + // Create temp file with appropriate extension + tempInputFile = Files.createTempFile("input_", fileExtension); + Files.write(tempInputFile, bytes); + + command.add("ebook-convert"); + command.add(tempInputFile.toString()); + command.add(tempOutputFile.toString()); + + ProcessExecutorResult returnCode = + ProcessExecutor.getInstance(ProcessExecutor.Processes.CALIBRE) + .runCommandWithOutputHandling(command); + + return Files.readAllBytes(tempOutputFile); + } finally { + // Clean up temporary files + if (tempInputFile != null) { + Files.deleteIfExists(tempInputFile); + } + Files.deleteIfExists(tempOutputFile); + } + } } diff --git a/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java b/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java index 385f3b80..18bc925a 100644 --- a/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java +++ b/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java @@ -18,12 +18,18 @@ public class ProcessExecutor { OCR_MY_PDF, PYTHON_OPENCV, GHOSTSCRIPT, - WEASYPRINT + WEASYPRINT, + INSTALL_APP, + CALIBRE } private static final Map instances = new ConcurrentHashMap<>(); public static ProcessExecutor getInstance(Processes processType) { + return getInstance(processType, false); + } + + public static ProcessExecutor getInstance(Processes processType, boolean liveUpdates) { return instances.computeIfAbsent( processType, key -> { @@ -34,15 +40,19 @@ public class ProcessExecutor { case PYTHON_OPENCV -> 8; case GHOSTSCRIPT -> 16; case WEASYPRINT -> 16; + case INSTALL_APP -> 1; + case CALIBRE -> 1; }; - return new ProcessExecutor(semaphoreLimit); + return new ProcessExecutor(semaphoreLimit, liveUpdates); }); } private final Semaphore semaphore; + private final boolean liveUpdates; - private ProcessExecutor(int semaphoreLimit) { + private ProcessExecutor(int semaphoreLimit, boolean liveUpdates) { this.semaphore = new Semaphore(semaphoreLimit); + this.liveUpdates = liveUpdates; } public ProcessExecutorResult runCommandWithOutputHandling(List command) @@ -81,6 +91,7 @@ public class ProcessExecutor { String line; while ((line = errorReader.readLine()) != null) { errorLines.add(line); + if (liveUpdates) System.out.println(line); } } catch (IOException e) { e.printStackTrace(); @@ -98,6 +109,7 @@ public class ProcessExecutor { String line; while ((line = outputReader.readLine()) != null) { outputLines.add(line); + if (liveUpdates) System.out.println(line); } } catch (IOException e) { e.printStackTrace(); @@ -114,23 +126,27 @@ public class ProcessExecutor { errorReaderThread.join(); outputReaderThread.join(); - if (outputLines.size() > 0) { - String outputMessage = String.join("\n", outputLines); - messages += outputMessage; - System.out.println("Command output:\n" + outputMessage); - } - - if (errorLines.size() > 0) { - String errorMessage = String.join("\n", errorLines); - messages += errorMessage; - System.out.println("Command error output:\n" + errorMessage); - if (exitCode != 0) { - throw new IOException( - "Command process failed with exit code " - + exitCode - + ". Error message: " - + errorMessage); + if (!liveUpdates) { + if (outputLines.size() > 0) { + String outputMessage = String.join("\n", outputLines); + messages += outputMessage; + System.out.println("Command output:\n" + outputMessage); } + + if (errorLines.size() > 0) { + String errorMessage = String.join("\n", errorLines); + messages += errorMessage; + System.out.println("Command error output:\n" + errorMessage); + if (exitCode != 0) { + throw new IOException( + "Command process failed with exit code " + + exitCode + + ". Error message: " + + errorMessage); + } + } + } else if (exitCode != 0) { + throw new IOException("Command process failed with exit code " + exitCode); } } finally { semaphore.release(); diff --git a/src/main/resources/settings.yml.template b/src/main/resources/settings.yml.template index 52d5e4de..1245c9e0 100644 --- a/src/main/resources/settings.yml.template +++ b/src/main/resources/settings.yml.template @@ -9,10 +9,12 @@ security: loginResetTimeMinutes : 120 # lock account for 2 hours after x attempts system: + defaultLocale: 'en-US' # Set the default language (e.g. 'de-DE', 'fr-FR', etc) googlevisibility: false # 'true' to allow Google visibility (via robots.txt), 'false' to disallow enableAlphaFunctionality: false # Set to enable functionality which might need more testing before it fully goes live (This feature might make no changes) - +# customExternalPort: 8000 used for when port mappings do not work correctly + #ui: # appName: exampleAppName # Application's visible name # homeDescription: I am a description # Short description or tagline shown on homepage. diff --git a/src/main/resources/static/images/book.svg b/src/main/resources/static/images/book.svg new file mode 100644 index 00000000..302acf09 --- /dev/null +++ b/src/main/resources/static/images/book.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/src/main/resources/static/js/multitool/PdfContainer.js b/src/main/resources/static/js/multitool/PdfContainer.js index 4c7c8497..4a53c961 100644 --- a/src/main/resources/static/js/multitool/PdfContainer.js +++ b/src/main/resources/static/js/multitool/PdfContainer.js @@ -209,20 +209,21 @@ class PdfContainer { async exportPdf() { const pdfDoc = await PDFLib.PDFDocument.create(); - for (var i=0; i + + + + + +
    +
    +
    +

    +
    +
    +
    +

    +
    +
    +
    + + +
    +

    +

    +
    +
    +
    +
    +
    +
    + + diff --git a/src/main/resources/templates/convert/pdf-to-book.html b/src/main/resources/templates/convert/pdf-to-book.html new file mode 100644 index 00000000..a136c5cf --- /dev/null +++ b/src/main/resources/templates/convert/pdf-to-book.html @@ -0,0 +1,55 @@ + + + + + + + +
    +
    +
    +

    +
    +
    +
    +

    +
    +
    + +
    + + +
    +
    + + +
    +

    +

    +
    +
    +
    +
    +
    +
    + + diff --git a/src/main/resources/templates/fragments/navbar.html b/src/main/resources/templates/fragments/navbar.html index 8e5ce732..b090b08c 100644 --- a/src/main/resources/templates/fragments/navbar.html +++ b/src/main/resources/templates/fragments/navbar.html @@ -77,6 +77,7 @@
    +
    @@ -86,6 +87,7 @@
    +
    diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html index 946cdd9c..52f945eb 100644 --- a/src/main/resources/templates/home.html +++ b/src/main/resources/templates/home.html @@ -99,6 +99,8 @@
    +
    +
    From e717d83f753305996cfc685207a14da070b90f79 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Wed, 10 Jan 2024 00:33:07 +0000 Subject: [PATCH 12/81] fixes and timeouts --- .../software/SPDF/utils/FileToPdf.java | 6 +- .../software/SPDF/utils/ProcessExecutor.java | 55 +++++++++++++++---- src/main/resources/settings.yml.template | 4 +- 3 files changed, 52 insertions(+), 13 deletions(-) diff --git a/src/main/java/stirling/software/SPDF/utils/FileToPdf.java b/src/main/java/stirling/software/SPDF/utils/FileToPdf.java index ca06c5c2..ebdbf4fa 100644 --- a/src/main/java/stirling/software/SPDF/utils/FileToPdf.java +++ b/src/main/java/stirling/software/SPDF/utils/FileToPdf.java @@ -35,15 +35,17 @@ public class FileToPdf { command.add("weasyprint"); } else { command.add("wkhtmltopdf"); + command.add("--enable-local-file-access"); } + command.add(tempInputFile.toString()); command.add(tempOutputFile.toString()); ProcessExecutorResult returnCode; if (fileName.endsWith(".zip")) { if (htmlFormatsInstalled) { - command.add("--allow"); - command.add(tempOutputFile.getParent().toString()); + // command.add(1, "--allow"); + // command.add(2, tempInputFile.getParent().toString()); } returnCode = ProcessExecutor.getInstance(ProcessExecutor.Processes.WEASYPRINT) diff --git a/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java b/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java index 18bc925a..23311bde 100644 --- a/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java +++ b/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java @@ -4,15 +4,22 @@ import java.io.BufferedReader; import java.io.File; import java.io.IOException; import java.io.InputStreamReader; +import java.io.InterruptedIOException; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Semaphore; +import java.util.concurrent.TimeUnit; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class ProcessExecutor { + private static final Logger logger = LoggerFactory.getLogger(ProcessExecutor.class); + public enum Processes { LIBRE_OFFICE, OCR_MY_PDF, @@ -26,7 +33,7 @@ public class ProcessExecutor { private static final Map instances = new ConcurrentHashMap<>(); public static ProcessExecutor getInstance(Processes processType) { - return getInstance(processType, false); + return getInstance(processType, true); } public static ProcessExecutor getInstance(Processes processType, boolean liveUpdates) { @@ -43,16 +50,29 @@ public class ProcessExecutor { case INSTALL_APP -> 1; case CALIBRE -> 1; }; - return new ProcessExecutor(semaphoreLimit, liveUpdates); + + long timeoutMinutes = + switch (key) { + case LIBRE_OFFICE -> 30; + case OCR_MY_PDF -> 30; + case PYTHON_OPENCV -> 30; + case GHOSTSCRIPT -> 5; + case WEASYPRINT -> 30; + case INSTALL_APP -> 60; + case CALIBRE -> 30; + }; + return new ProcessExecutor(semaphoreLimit, liveUpdates, timeoutMinutes); }); } private final Semaphore semaphore; private final boolean liveUpdates; + private long timeoutDuration; - private ProcessExecutor(int semaphoreLimit, boolean liveUpdates) { + private ProcessExecutor(int semaphoreLimit, boolean liveUpdates, long timeout) { this.semaphore = new Semaphore(semaphoreLimit); this.liveUpdates = liveUpdates; + this.timeoutDuration = timeout; } public ProcessExecutorResult runCommandWithOutputHandling(List command) @@ -62,12 +82,12 @@ public class ProcessExecutor { public ProcessExecutorResult runCommandWithOutputHandling( List command, File workingDirectory) throws IOException, InterruptedException { - int exitCode = 1; String messages = ""; + int exitCode = 1; semaphore.acquire(); try { - System.out.print("Running command: " + String.join(" ", command)); + logger.info("Running command: " + String.join(" ", command)); ProcessBuilder processBuilder = new ProcessBuilder(command); // Use the working directory if it's set @@ -91,8 +111,11 @@ public class ProcessExecutor { String line; while ((line = errorReader.readLine()) != null) { errorLines.add(line); - if (liveUpdates) System.out.println(line); + if (liveUpdates) logger.info(line); } + } catch (InterruptedIOException e) { + logger.warn( + "Error reader thread was interrupted due to timeout."); } catch (IOException e) { e.printStackTrace(); } @@ -109,8 +132,11 @@ public class ProcessExecutor { String line; while ((line = outputReader.readLine()) != null) { outputLines.add(line); - if (liveUpdates) System.out.println(line); + if (liveUpdates) logger.info(line); } + } catch (InterruptedIOException e) { + logger.warn( + "Error reader thread was interrupted due to timeout."); } catch (IOException e) { e.printStackTrace(); } @@ -120,8 +146,17 @@ public class ProcessExecutor { outputReaderThread.start(); // Wait for the conversion process to complete - exitCode = process.waitFor(); + boolean finished = process.waitFor(timeoutDuration, TimeUnit.MINUTES); + if (!finished) { + // Terminate the process + process.destroy(); + // Interrupt the reader threads + errorReaderThread.interrupt(); + outputReaderThread.interrupt(); + throw new IOException("Process timeout exceeded."); + } + exitCode = process.exitValue(); // Wait for the reader threads to finish errorReaderThread.join(); outputReaderThread.join(); @@ -130,13 +165,13 @@ public class ProcessExecutor { if (outputLines.size() > 0) { String outputMessage = String.join("\n", outputLines); messages += outputMessage; - System.out.println("Command output:\n" + outputMessage); + logger.info("Command output:\n" + outputMessage); } if (errorLines.size() > 0) { String errorMessage = String.join("\n", errorLines); messages += errorMessage; - System.out.println("Command error output:\n" + errorMessage); + logger.warn("Command error output:\n" + errorMessage); if (exitCode != 0) { throw new IOException( "Command process failed with exit code " diff --git a/src/main/resources/settings.yml.template b/src/main/resources/settings.yml.template index 1245c9e0..00c5998e 100644 --- a/src/main/resources/settings.yml.template +++ b/src/main/resources/settings.yml.template @@ -13,7 +13,9 @@ system: defaultLocale: 'en-US' # Set the default language (e.g. 'de-DE', 'fr-FR', etc) googlevisibility: false # 'true' to allow Google visibility (via robots.txt), 'false' to disallow enableAlphaFunctionality: false # Set to enable functionality which might need more testing before it fully goes live (This feature might make no changes) -# customExternalPort: 8000 used for when port mappings do not work correctly + customApplications: + installBookFormats: false # Installs Calibre for book format conversion (For non docker it must be manually downloaded but will need to be true to show in UI) + installAdvancedHtmlToPDF: false # DO NOT USE EXTERNALLY, NOT SAFE! Install wkHtmlToPDF (For non docker it must be manually downloaded but will need to be true to show in UI) #ui: # appName: exampleAppName # Application's visible name From 139c793b5e70f550bfd11c2e2b47fc623ad9aeec Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Wed, 10 Jan 2024 00:33:22 +0000 Subject: [PATCH 13/81] 0.19.1 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index f506ef01..40dda97f 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ plugins { import com.github.jk1.license.render.* group = 'stirling.software' -version = '0.19.0' +version = '0.19.1' sourceCompatibility = '17' repositories { From 32da14acbf85dd2f1f33cd67f3707ec820ffc392 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Wed, 10 Jan 2024 00:37:55 +0000 Subject: [PATCH 14/81] log removal --- .../software/SPDF/config/AppConfig.java | 16 -------------- .../SPDF/config/EndpointConfiguration.java | 1 - .../SPDF/config/PostStartupProcesses.java | 21 +++++++++++-------- 3 files changed, 12 insertions(+), 26 deletions(-) diff --git a/src/main/java/stirling/software/SPDF/config/AppConfig.java b/src/main/java/stirling/software/SPDF/config/AppConfig.java index b740707a..cf05fd1b 100644 --- a/src/main/java/stirling/software/SPDF/config/AppConfig.java +++ b/src/main/java/stirling/software/SPDF/config/AppConfig.java @@ -68,27 +68,11 @@ public class AppConfig { @Bean(name = "bookFormatsInstalled") public boolean bookFormatsInstalled() { - System.out.println("astirli " + applicationProperties.getSystem()); - System.out.println("astirli2 " + applicationProperties.getSystem().getCustomApplications()); - System.out.println( - "astirli3 " - + applicationProperties - .getSystem() - .getCustomApplications() - .isInstallBookFormats()); return applicationProperties.getSystem().getCustomApplications().isInstallBookFormats(); } @Bean(name = "htmlFormatsInstalled") public boolean htmlFormatsInstalled() { - System.out.println("astirli4 " + applicationProperties.getSystem()); - System.out.println("astirli5 " + applicationProperties.getSystem().getCustomApplications()); - System.out.println( - "astirli6 " - + applicationProperties - .getSystem() - .getCustomApplications() - .isInstallAdvancedHtmlToPDF()); return applicationProperties .getSystem() .getCustomApplications() diff --git a/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java b/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java index a56949ae..f1e328f9 100644 --- a/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java +++ b/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java @@ -229,7 +229,6 @@ public class EndpointConfiguration { private void processEnvironmentConfigs() { List endpointsToRemove = applicationProperties.getEndpoints().getToRemove(); List groupsToRemove = applicationProperties.getEndpoints().getGroupsToRemove(); - System.out.println("ASTIRLI7 bookFormatsInstalled=" + bookFormatsInstalled); if (!bookFormatsInstalled) { groupsToRemove.add("Calibre"); } diff --git a/src/main/java/stirling/software/SPDF/config/PostStartupProcesses.java b/src/main/java/stirling/software/SPDF/config/PostStartupProcesses.java index 09216a76..862e5f9e 100644 --- a/src/main/java/stirling/software/SPDF/config/PostStartupProcesses.java +++ b/src/main/java/stirling/software/SPDF/config/PostStartupProcesses.java @@ -1,8 +1,12 @@ package stirling.software.SPDF.config; import java.io.IOException; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; @@ -29,11 +33,11 @@ public class PostStartupProcesses { @Qualifier("htmlFormatsInstalled") private boolean htmlFormatsInstalled; + private static final Logger logger = LoggerFactory.getLogger(PostStartupProcesses.class); + @PostConstruct public void runInstallCommandBasedOnEnvironment() throws IOException, InterruptedException { List> commands = new ArrayList<>(); - System.out.println("astirli bookFormatsInstalled=" + bookFormatsInstalled); - System.out.println("astirli htmlFormatsInstalled=" + htmlFormatsInstalled); // Checking for DOCKER_INSTALL_BOOK_FORMATS environment variable if (bookFormatsInstalled) { List tmpList = new ArrayList<>(); @@ -77,18 +81,17 @@ public class PostStartupProcesses { ProcessExecutorResult returnCode = ProcessExecutor.getInstance(ProcessExecutor.Processes.INSTALL_APP, true) .runCommandWithOutputHandling(list); - System.out.println("astirli RC for app installs " + returnCode.getRc()); + logger.info("RC for app installs {}", returnCode.getRc()); } } else { - System.out.println( - "astirli Not running inside Docker so skipping automated install process with command."); + + logger.info( + "Not running inside Docker so skipping automated install process with command."); } } else { if (runningInDocker) { - System.out.println("astirli No custom apps to install."); - } else { - System.out.println("astirli No custom apps to install. and not docker"); + logger.info("No custom apps to install."); } } } From 873a4ecb7e8f6b9a33709c7945ab0c3043338b4a Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Wed, 10 Jan 2024 00:39:26 +0000 Subject: [PATCH 15/81] revert --- .../security/UserAuthenticationFilter.java | 57 ++++--------------- 1 file changed, 10 insertions(+), 47 deletions(-) diff --git a/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java b/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java index a6e8eff3..61b209de 100644 --- a/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java +++ b/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java @@ -1,12 +1,9 @@ package stirling.software.SPDF.config.security; import java.io.IOException; -import java.net.MalformedURLException; -import java.net.URL; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Lazy; import org.springframework.http.HttpStatus; import org.springframework.security.core.Authentication; @@ -21,7 +18,6 @@ import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import jakarta.servlet.http.HttpServletResponseWrapper; import stirling.software.SPDF.model.ApiKeyAuthenticationToken; @Component @@ -35,28 +31,14 @@ public class UserAuthenticationFilter extends OncePerRequestFilter { @Qualifier("loginEnabled") public boolean loginEnabledValue; - @Value("${redirect.port:}") // Default to empty if not set - private String redirectPort; - @Override protected void doFilterInternal( HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { - // Custom response wrapper to modify the redirect location - HttpServletResponseWrapper responseWrapper = - new HttpServletResponseWrapper(response) { - @Override - public void sendRedirect(String location) throws IOException { - // Modify the location to include the correct port - String modifiedLocation = modifyLocation(location, request); - super.sendRedirect(modifiedLocation); - } - }; - if (!loginEnabledValue) { // If login is not enabled, just pass all requests without authentication - filterChain.doFilter(request, responseWrapper); + filterChain.doFilter(request, response); return; } String requestURI = request.getRequestURI(); @@ -71,8 +53,8 @@ public class UserAuthenticationFilter extends OncePerRequestFilter { // provider for API keys. UserDetails userDetails = userService.loadUserByApiKey(apiKey); if (userDetails == null) { - responseWrapper.setStatus(HttpStatus.UNAUTHORIZED.value()); - responseWrapper.getWriter().write("Invalid API Key."); + response.setStatus(HttpStatus.UNAUTHORIZED.value()); + response.getWriter().write("Invalid API Key."); return; } authentication = @@ -81,8 +63,8 @@ public class UserAuthenticationFilter extends OncePerRequestFilter { SecurityContextHolder.getContext().setAuthentication(authentication); } catch (AuthenticationException e) { // If API key authentication fails, deny the request - responseWrapper.setStatus(HttpStatus.UNAUTHORIZED.value()); - responseWrapper.getWriter().write("Invalid API Key."); + response.setStatus(HttpStatus.UNAUTHORIZED.value()); + response.getWriter().write("Invalid API Key."); return; } } @@ -94,37 +76,18 @@ public class UserAuthenticationFilter extends OncePerRequestFilter { String contextPath = request.getContextPath(); if ("GET".equalsIgnoreCase(method) && !(contextPath + "/login").equals(requestURI)) { - responseWrapper.sendRedirect(contextPath + "/login"); // redirect to the login page + response.sendRedirect(contextPath + "/login"); // redirect to the login page return; } else { - responseWrapper.setStatus(HttpStatus.UNAUTHORIZED.value()); - responseWrapper - .getWriter() + response.setStatus(HttpStatus.UNAUTHORIZED.value()); + response.getWriter() .write( "Authentication required. Please provide a X-API-KEY in request header.\nThis is found in Settings -> Account Settings -> API Key\nAlternativly you can disable authentication if this is unexpected"); return; } } - filterChain.doFilter(request, responseWrapper); - } - - private String modifyLocation(String location, HttpServletRequest request) { - if (!location.matches("https?://[^/]+:\\d+.*") - && redirectPort != null - && redirectPort.length() > 0) { - try { - int port = Integer.parseInt(redirectPort); // Parse the port - URL url = new URL(location); - String modifiedUrl = - new URL(url.getProtocol(), url.getHost(), port, url.getFile()).toString(); - return modifiedUrl; - } catch (MalformedURLException | NumberFormatException e) { - // Log error and return the original location if URL parsing fails - e.printStackTrace(); - } - } - return location; + filterChain.doFilter(request, response); } @Override @@ -152,4 +115,4 @@ public class UserAuthenticationFilter extends OncePerRequestFilter { return false; } -} +} \ No newline at end of file From edde1a643651bf24924c05a5840535b2bbf50281 Mon Sep 17 00:00:00 2001 From: sbplat <71648843+sbplat@users.noreply.github.com> Date: Tue, 9 Jan 2024 21:13:35 -0500 Subject: [PATCH 16/81] fix: version showing as 0.0.0 --- .../stirling/software/SPDF/config/AppConfig.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/stirling/software/SPDF/config/AppConfig.java b/src/main/java/stirling/software/SPDF/config/AppConfig.java index 0411715f..8083f283 100644 --- a/src/main/java/stirling/software/SPDF/config/AppConfig.java +++ b/src/main/java/stirling/software/SPDF/config/AppConfig.java @@ -1,8 +1,13 @@ package stirling.software.SPDF.config; +import java.io.IOException; +import java.util.Properties; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; import stirling.software.SPDF.model.ApplicationProperties; @@ -24,8 +29,15 @@ public class AppConfig { @Bean(name = "appVersion") public String appVersion() { - String version = getClass().getPackage().getImplementationVersion(); - return (version != null) ? version : "0.0.0"; + Resource resource = new ClassPathResource("version.properties"); + Properties props = new Properties(); + try { + props.load(resource.getInputStream()); + return props.getProperty("version"); + } catch (IOException e) { + e.printStackTrace(); + } + return "0.0.0"; } @Bean(name = "homeText") From 52fe4c6aa682d109c5a3c0021bd915b0a79515cf Mon Sep 17 00:00:00 2001 From: Peter Dave Hello Date: Wed, 10 Jan 2024 19:17:09 +0800 Subject: [PATCH 17/81] Specify code block language in Markdown for syntax highlighting --- FolderScanning.md | 2 +- HowToAddNewLanguage.md | 2 +- PipelineFeature.md | 2 +- README.md | 8 ++++---- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/FolderScanning.md b/FolderScanning.md index 309b063c..6b743a7f 100644 --- a/FolderScanning.md +++ b/FolderScanning.md @@ -2,7 +2,7 @@ ### Whilst Pipelines are in alpha... You must enable this alpha functionality by setting -``` +```yaml system: enableAlphaFunctionality: true ``` diff --git a/HowToAddNewLanguage.md b/HowToAddNewLanguage.md index 4cdcedfe..1b218183 100644 --- a/HowToAddNewLanguage.md +++ b/HowToAddNewLanguage.md @@ -16,7 +16,7 @@ If your language isnt represented by a flag just find whichever closely matches For example to add Polish you would add -``` +```html icon Polski diff --git a/PipelineFeature.md b/PipelineFeature.md index c2c935b4..8d51c3c5 100644 --- a/PipelineFeature.md +++ b/PipelineFeature.md @@ -2,7 +2,7 @@ ## Whilst Pipelines are in alpha... You must enable this alpha functionality by setting -``` +```yaml system: enableAlphaFunctionality: true ``` diff --git a/README.md b/README.md index 4d79b6a3..00309036 100644 --- a/README.md +++ b/README.md @@ -109,7 +109,7 @@ For people that don't mind about space optimization just use the latest tag. ![Docker Image Size (tag)](https://img.shields.io/docker/image-size/frooodle/s-pdf/latest-ultra-lite?label=Stirling-PDF%20Ultra-Lite) Docker Run -``` +```bash docker run -d \ -p 8080:8080 \ -v /location/of/trainingData:/usr/share/tesseract-ocr/5/tessdata \ @@ -125,7 +125,7 @@ docker run -d \ -v /location/of/customFiles:/customFiles \ ``` Docker Compose -``` +```yaml version: '3.3' services: stirling-pdf: @@ -197,7 +197,7 @@ This file is located in the ``/configs`` directory and follows standard YAML for Environment variables are also supported and would override the settings file For example in the settings.yml you have -``` +```yaml system: defaultLocale: 'en-US' ``` @@ -205,7 +205,7 @@ system: To have this via an environment variable you would have ``SYSTEM_DEFAULTLOCALE`` The Current list of settings is -``` +```yaml security: enableLogin: false # set to 'true' to enable login csrfDisabled: true From 99050ad73e793d225ef97a2b98c0b25cd0385482 Mon Sep 17 00:00:00 2001 From: Stirling-PDF-Bot Date: Wed, 10 Jan 2024 12:56:05 +0000 Subject: [PATCH 18/81] Update 3rd Party Licenses --- src/main/resources/static/3rdPartyLicenses.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/resources/static/3rdPartyLicenses.json b/src/main/resources/static/3rdPartyLicenses.json index 25e8e91b..88263b1d 100644 --- a/src/main/resources/static/3rdPartyLicenses.json +++ b/src/main/resources/static/3rdPartyLicenses.json @@ -356,22 +356,22 @@ }, { "moduleName": "org.apache.pdfbox:fontbox", - "moduleUrl": "http://pdfbox.apache.org/", - "moduleVersion": "2.0.29", + "moduleUrl": "https://pdfbox.apache.org", + "moduleVersion": "2.0.30", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, { "moduleName": "org.apache.pdfbox:pdfbox", - "moduleUrl": "http://pdfbox.apache.org", - "moduleVersion": "2.0.29", + "moduleUrl": "https://pdfbox.apache.org", + "moduleVersion": "2.0.30", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, { "moduleName": "org.apache.pdfbox:xmpbox", - "moduleUrl": "http://pdfbox.apache.org", - "moduleVersion": "2.0.29", + "moduleUrl": "https://pdfbox.apache.org", + "moduleVersion": "2.0.30", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, From ee223d040574367e253aac622b65c6c01c584d0d Mon Sep 17 00:00:00 2001 From: TieStone <416138794@qq.com> Date: Mon, 8 Jan 2024 19:38:47 +0800 Subject: [PATCH 19/81] add table support --- build.gradle | 1 + .../controller/api/converters/ConvertMarkdownToPdf.java | 9 +++++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 40dda97f..2f3dad04 100644 --- a/build.gradle +++ b/build.gradle @@ -152,6 +152,7 @@ dependencies { implementation group: 'com.google.zxing', name: 'core', version: '3.5.2' // https://mvnrepository.com/artifact/org.commonmark/commonmark implementation 'org.commonmark:commonmark:0.21.0' + implementation 'org.commonmark:commonmark-ext-gfm-tables:0.17.2' // https://mvnrepository.com/artifact/com.github.vladimir-bukhtoyarov/bucket4j-core implementation 'com.github.vladimir-bukhtoyarov:bucket4j-core:7.6.0' diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java index d0fd632d..abfcb139 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java @@ -1,5 +1,9 @@ package stirling.software.SPDF.controller.api.converters; +import java.util.List; + +import org.commonmark.Extension; +import org.commonmark.ext.gfm.tables.TablesExtension; import org.commonmark.node.Node; import org.commonmark.parser.Parser; import org.commonmark.renderer.html.HtmlRenderer; @@ -47,9 +51,10 @@ public class ConvertMarkdownToPdf { } // Convert Markdown to HTML using CommonMark - Parser parser = Parser.builder().build(); + List extensions = List.of(TablesExtension.create()); + Parser parser = Parser.builder().extensions(extensions).build(); Node document = parser.parse(new String(fileInput.getBytes())); - HtmlRenderer renderer = HtmlRenderer.builder().build(); + HtmlRenderer renderer = HtmlRenderer.builder().extensions(extensions).build(); String htmlContent = renderer.render(document); byte[] pdfBytes = From ab9e7bbb8cbbd2f5dea44849c3d117cb40026f0d Mon Sep 17 00:00:00 2001 From: TieStone <416138794@qq.com> Date: Mon, 8 Jan 2024 20:29:42 +0800 Subject: [PATCH 20/81] add table support in md2pdf transport --- build.gradle | 2 +- .../api/converters/ConvertMarkdownToPdf.java | 21 ++++++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 2f3dad04..d9f62736 100644 --- a/build.gradle +++ b/build.gradle @@ -152,7 +152,7 @@ dependencies { implementation group: 'com.google.zxing', name: 'core', version: '3.5.2' // https://mvnrepository.com/artifact/org.commonmark/commonmark implementation 'org.commonmark:commonmark:0.21.0' - implementation 'org.commonmark:commonmark-ext-gfm-tables:0.17.2' + implementation 'org.commonmark:commonmark-ext-gfm-tables:0.21.0' // https://mvnrepository.com/artifact/com.github.vladimir-bukhtoyarov/bucket4j-core implementation 'com.github.vladimir-bukhtoyarov:bucket4j-core:7.6.0' diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java index abfcb139..67b8fdd9 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java @@ -1,11 +1,14 @@ package stirling.software.SPDF.controller.api.converters; import java.util.List; +import java.util.Map; import org.commonmark.Extension; +import org.commonmark.ext.gfm.tables.TableBlock; import org.commonmark.ext.gfm.tables.TablesExtension; import org.commonmark.node.Node; import org.commonmark.parser.Parser; +import org.commonmark.renderer.html.AttributeProvider; import org.commonmark.renderer.html.HtmlRenderer; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -53,9 +56,16 @@ public class ConvertMarkdownToPdf { // Convert Markdown to HTML using CommonMark List extensions = List.of(TablesExtension.create()); Parser parser = Parser.builder().extensions(extensions).build(); + Node document = parser.parse(new String(fileInput.getBytes())); - HtmlRenderer renderer = HtmlRenderer.builder().extensions(extensions).build(); + HtmlRenderer renderer = + HtmlRenderer.builder() + .attributeProviderFactory(context -> new TableAttributeProvider()) + .extensions(extensions) + .build(); + String htmlContent = renderer.render(document); + System.out.println(htmlContent); byte[] pdfBytes = FileToPdf.convertHtmlToPdf( @@ -67,3 +77,12 @@ public class ConvertMarkdownToPdf { return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename); } } + +class TableAttributeProvider implements AttributeProvider { + @Override + public void setAttributes(Node node, String tagName, Map attributes) { + if (node instanceof TableBlock) { + attributes.put("class", "table table-striped"); + } + } +} From 81d49b722bac2e223851407532083b21dfc600ac Mon Sep 17 00:00:00 2001 From: TieStone <416138794@qq.com> Date: Wed, 10 Jan 2024 21:29:43 +0800 Subject: [PATCH 21/81] add table support in md2pdf transport --- .../SPDF/controller/api/converters/ConvertMarkdownToPdf.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java index 67b8fdd9..fe590459 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java @@ -65,7 +65,6 @@ public class ConvertMarkdownToPdf { .build(); String htmlContent = renderer.render(document); - System.out.println(htmlContent); byte[] pdfBytes = FileToPdf.convertHtmlToPdf( From 45aead89e3bb4c414953648a2bc235b0d56f51bf Mon Sep 17 00:00:00 2001 From: sbplat <71648843+sbplat@users.noreply.github.com> Date: Thu, 11 Jan 2024 10:35:34 -0500 Subject: [PATCH 22/81] docs: add contributing guide --- CONTRIBUTING.md | 68 +++++++++++++++++++++++ README.md | 139 ++++++++++++++++++------------------------------ 2 files changed, 119 insertions(+), 88 deletions(-) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 00000000..f9902c41 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,68 @@ +# Contributing to Stirling-PDF + +Thank you for your interest in contributing to Stirling-PDF! There are many ways to contribute other than writing code. For example, reporting bugs, creating suggestions, and adding or modifying translations. + +## Issue Guidelines + +Issues can be used to report bugs, request features, or ask questions. If you have a question, you could also ask us in our [Discord](https://discord.gg/FJUSXUSYec). + +Before opening an issue, please check to make sure someone hasn't already opened an issue about it. + +## Pull Requests + +Before you start working on an issue, please comment on (or create) the issue and wait for it to be assigned to you. If someone has already been assigned but didn't have the time to work on it lately, please communicate with them and ask if they're still working on it. This is to avoid multiple people working on the same issue. + +Once you have been assigned an issue, you can start working on it. When you are ready to submit your changes, open a pull request. +For a detailed pull request tutorial, see [this guide](https://www.digitalocean.com/community/tutorials/how-to-create-a-pull-request-on-github). + +Please make sure your Pull Request adheres to the following guidelines: + +- Use the PR template provided. +- Keep your Pull Request title succinct, detailed and to the point. +- Keep commits atomic. One commit should contain one change. If you want to make multiple changes, submit multiple Pull Requests. +- Commits should be clear, concise and easy to understand. +- References to the Issue number in the Pull Request and/or Commit message. + +## Translations + +Stirling PDF currently supports 26! +- English (English) (en_GB) +- English (US) (en_US) +- Arabic (العربية) (ar_AR) +- German (Deutsch) (de_DE) +- French (Français) (fr_FR) +- Spanish (Español) (es_ES) +- Simplified Chinese (简体中文) (zh_CN) +- Traditional Chinese (繁體中文) (zh_TW) +- Catalan (Català) (ca_CA) +- Italian (Italiano) (it_IT) +- Swedish (Svenska) (sv_SE) +- Polish (Polski) (pl_PL) +- Romanian (Română) (ro_RO) +- Korean (한국어) (ko_KR) +- Portuguese Brazilian (Português) (pt_BR) +- Russian (Русский) (ru_RU) +- Basque (Euskara) (eu_ES) +- Japanese (日本語) (ja_JP) +- Dutch (Nederlands) (nl_NL) +- Greek (el_GR) +- Turkish (Türkçe) (tr_TR) +- Indonesia (Bahasa Indonesia) (id_ID) +- Hindi (हिंदी) (hi_IN) +- Hungarian (Magyar) (hu_HU) +- Bulgarian (Български) (bg_BG) +- Sebian Latin alphabet (Srpski) (sr-Latn-RS) + +If you would like to add or modify a translation, please see [How to add new languages to Stirling-PDF](HowToAddNewLanguage.md). Also, please create a Pull Request so others can use it! + +## Fixing Bugs or Adding a New Feature + +First, make sure you've read the section [Pull Requests](#pull-requests). + +To build from source, please follow this [Guide](LocalRunGuide.md). + +If, at any point of time, you have a question, please feel free to ask in the same issue thread or in our [Discord](https://discord.gg/FJUSXUSYec). + +## License + +By contributing to this project, you agree that your contributions will be licensed under the [GPL 3 License](LICENSE). You also acknowledge and agree that your contributions will be included in Stirling-PDF and that they can be relicensed in the future under the MPL 2.0 (Mozilla Public License Version 2.0) license. diff --git a/README.md b/README.md index 4d79b6a3..fa389cb0 100644 --- a/README.md +++ b/README.md @@ -16,15 +16,13 @@ Stirling PDF makes no outbound calls for any record keeping or tracking. All files and PDFs exist either exclusively on the client side, reside in server memory only during task execution, or temporarily reside in a file solely for the execution of the task. Any file downloaded by the user will have been deleted from the server by that point. -Please feel free to submit feature requests or report bugs either through GitHub issues or on our [Discord](https://discord.gg/Cn8pWhQRxZ) - ![stirling-home](images/stirling-home.png) ## Features - Dark mode support. - Custom download options (see [here](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/images/settings.png) for example) - Parallel file processing and downloads -- API for integration with external scripts +- API for integration with external scripts - Optional Login and Authentication support (see [here](https://github.com/Stirling-Tools/Stirling-PDF/tree/main#login-authentication) for documentation) @@ -32,52 +30,52 @@ Please feel free to submit feature requests or report bugs either through GitHub ### **Page Operations** - View and modify PDFs - View multi page PDFs with custom viewing sorting and searching. Plus on page edit features like annotate, draw and adding text and images. (Using PDF.js with Joxit and Liberation.Liberation fonts) -- Full interactive GUI for merging/splitting/rotating/moving PDFs and their pages. -- Merge multiple PDFs together into a single resultant file. -- Split PDFs into multiple files at specified page numbers or extract all pages as individual files. -- Reorganize PDF pages into different orders. -- Rotate PDFs in 90-degree increments. -- Remove pages. -- Multi-page layout (Format PDFs into a multi-paged page). -- Scale page contents size by set %. -- Adjust Contrast. -- Crop PDF. -- Auto Split PDF (With physically scanned page dividers). -- Extract page(s). -- Convert PDF to a single page. +- Full interactive GUI for merging/splitting/rotating/moving PDFs and their pages. +- Merge multiple PDFs together into a single resultant file. +- Split PDFs into multiple files at specified page numbers or extract all pages as individual files. +- Reorganize PDF pages into different orders. +- Rotate PDFs in 90-degree increments. +- Remove pages. +- Multi-page layout (Format PDFs into a multi-paged page). +- Scale page contents size by set %. +- Adjust Contrast. +- Crop PDF. +- Auto Split PDF (With physically scanned page dividers). +- Extract page(s). +- Convert PDF to a single page. ### **Conversion Operations** -- Convert PDFs to and from images. -- Convert any common file to PDF (using LibreOffice). -- Convert PDF to Word/Powerpoint/Others (using LibreOffice). -- Convert HTML to PDF. -- URL to PDF. -- Markdown to PDF. +- Convert PDFs to and from images. +- Convert any common file to PDF (using LibreOffice). +- Convert PDF to Word/Powerpoint/Others (using LibreOffice). +- Convert HTML to PDF. +- URL to PDF. +- Markdown to PDF. ### **Security & Permissions** -- Add and remove passwords. -- Change/set PDF Permissions. -- Add watermark(s). -- Certify/sign PDFs. -- Sanitize PDFs. -- Auto-redact text. +- Add and remove passwords. +- Change/set PDF Permissions. +- Add watermark(s). +- Certify/sign PDFs. +- Sanitize PDFs. +- Auto-redact text. ### **Other Operations** -- Add/Generate/Write signatures. -- Repair PDFs. -- Detect and remove blank pages. -- Compare 2 PDFs and show differences in text. -- Add images to PDFs. -- Compress PDFs to decrease their filesize (Using OCRMyPDF). -- Extract images from PDF. -- Extract images from Scans. -- Add page numbers. -- Auto rename file by detecting PDF header text. -- OCR on PDF (Using OCRMyPDF). -- PDF/A conversion (Using OCRMyPDF). -- Edit metadata. -- Flatten PDFs. -- Get all information on a PDF to view or export as JSON. +- Add/Generate/Write signatures. +- Repair PDFs. +- Detect and remove blank pages. +- Compare 2 PDFs and show differences in text. +- Add images to PDFs. +- Compress PDFs to decrease their filesize (Using OCRMyPDF). +- Extract images from PDF. +- Extract images from Scans. +- Add page numbers. +- Auto rename file by detecting PDF header text. +- OCR on PDF (Using OCRMyPDF). +- PDF/A conversion (Using OCRMyPDF). +- Edit metadata. +- Flatten PDFs. +- Get all information on a PDF to view or export as JSON. For a overview of the tasks and the technology each uses please view [Endpoint-groups.md](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/Endpoint-groups.md) @@ -118,10 +116,10 @@ docker run -d \ -e DOCKER_ENABLE_SECURITY=false \ --name stirling-pdf \ frooodle/s-pdf:latest - - + + Can also add these for customisation but are not required - + -v /location/of/customFiles:/customFiles \ ``` Docker Compose @@ -146,44 +144,9 @@ Note: Podman is CLI-compatible with Docker, so simply replace "docker" with "pod ## Enable OCR/Compression feature Please view https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToUseOCR.md -## Want to add your own language? -Stirling PDF currently supports 26! -- English (English) (en_GB) -- English (US) (en_US) -- Arabic (العربية) (ar_AR) -- German (Deutsch) (de_DE) -- French (Français) (fr_FR) -- Spanish (Español) (es_ES) -- Simplified Chinese (简体中文) (zh_CN) -- Traditional Chinese (繁體中文) (zh_TW) -- Catalan (Català) (ca_CA) -- Italian (Italiano) (it_IT) -- Swedish (Svenska) (sv_SE) -- Polish (Polski) (pl_PL) -- Romanian (Română) (ro_RO) -- Korean (한국어) (ko_KR) -- Portuguese Brazilian (Português) (pt_BR) -- Russian (Русский) (ru_RU) -- Basque (Euskara) (eu_ES) -- Japanese (日本語) (ja_JP) -- Dutch (Nederlands) (nl_NL) -- Greek (el_GR) -- Turkish (Türkçe) (tr_TR) -- Indonesia (Bahasa Indonesia) (id_ID) -- Hindi (हिंदी) (hi_IN) -- Hungarian (Magyar) (hu_HU) -- Bulgarian (Български) (bg_BG) -- Sebian Latin alphabet (Srpski) (sr-Latn-RS) - -If you want to add your own language to Stirling-PDF please refer -https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md - -And please create a PR to merge it back in so others can use it! - -## How to View -1. Open a web browser and navigate to `http://localhost:8080/` -2. Use the application by following the instructions on the website. +## Contributing (creating issues, translations, fixing bugs, etc.) +Please see our [Contributing Guide](CONTRIBUTING.md)! ## Customisation Stirling PDF allows easy customization of the app. @@ -243,9 +206,9 @@ For those wanting to use Stirling-PDFs backend API to link with their own custom ## Login authentication ![stirling-login](images/login-light.png) -### Prerequisites: +### Prerequisites: - User must have the folder ./configs volumed within docker so that it is retained during updates. -- Docker uses must download the security jar version by setting ``DOCKER_ENABLE_SECURITY`` to ``true`` in environment variables. +- Docker uses must download the security jar version by setting ``DOCKER_ENABLE_SECURITY`` to ``true`` in environment variables. - Then either enable login via the settings.yml file or via setting ``SECURITY_ENABLE_LOGIN`` to ``true`` - Now the initial user will be generated with username ``admin`` and password ``stirling``. On login you will be forced to change the password to a new one. You can also use the environment variables ``SECURITY_INITIALLOGIN_USERNAME`` and ``SECURITY_INITIALLOGIN_PASSWORD`` to set your own straight away (Recommended to remove them after user creation). @@ -266,10 +229,10 @@ For API usage you must provide a header with 'X-API-Key' and the associated API - Progress bar/Tracking - Full custom logic pipelines to combine multiple operations together. - Folder support with auto scanning to perform operations on -- Redact text (Via UI not just automated way) +- Redact text (Via UI not just automated way) - Add Forms -- Multi page layout (Stich PDF pages together) support x rows y columns and custom page sizing -- Fill forms mannual and automatic +- Multi page layout (Stich PDF pages together) support x rows y columns and custom page sizing +- Fill forms mannual and automatic ### Q2: Why is my application downloading .htm files? This is an issue caused commonly by your NGINX configuration. The default file upload size for NGINX is 1MB, you need to add the following in your Nginx sites-available file. ``client_max_body_size SIZE;`` Where "SIZE" is 50M for example for 50MB files. From 575e0b3e540916eb31d08347b9f693982102abcc Mon Sep 17 00:00:00 2001 From: Saud Fatayerji Date: Thu, 11 Jan 2024 22:07:56 +0300 Subject: [PATCH 23/81] Updated demo site --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4d79b6a3..882cb9a2 100644 --- a/README.md +++ b/README.md @@ -81,7 +81,7 @@ Please feel free to submit feature requests or report bugs either through GitHub For a overview of the tasks and the technology each uses please view [Endpoint-groups.md](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/Endpoint-groups.md) -Hosted instance/demo of the app can be seen [here](https://pdf.adminforge.de/) hosted by the team at adminforge.de +Demo of the app is available [here](https://stirlingpdf.io). username: demo, password: demo ## Technologies used - Spring Boot + Thymeleaf From 00487275a71461849adb40369176b197fad35731 Mon Sep 17 00:00:00 2001 From: sbplat <71648843+sbplat@users.noreply.github.com> Date: Thu, 11 Jan 2024 17:38:05 -0500 Subject: [PATCH 24/81] docs: list supported languages in readme --- CONTRIBUTING.md | 28 ---------------------------- README.md | 30 ++++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+), 28 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f9902c41..3befe050 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -25,34 +25,6 @@ Please make sure your Pull Request adheres to the following guidelines: ## Translations -Stirling PDF currently supports 26! -- English (English) (en_GB) -- English (US) (en_US) -- Arabic (العربية) (ar_AR) -- German (Deutsch) (de_DE) -- French (Français) (fr_FR) -- Spanish (Español) (es_ES) -- Simplified Chinese (简体中文) (zh_CN) -- Traditional Chinese (繁體中文) (zh_TW) -- Catalan (Català) (ca_CA) -- Italian (Italiano) (it_IT) -- Swedish (Svenska) (sv_SE) -- Polish (Polski) (pl_PL) -- Romanian (Română) (ro_RO) -- Korean (한국어) (ko_KR) -- Portuguese Brazilian (Português) (pt_BR) -- Russian (Русский) (ru_RU) -- Basque (Euskara) (eu_ES) -- Japanese (日本語) (ja_JP) -- Dutch (Nederlands) (nl_NL) -- Greek (el_GR) -- Turkish (Türkçe) (tr_TR) -- Indonesia (Bahasa Indonesia) (id_ID) -- Hindi (हिंदी) (hi_IN) -- Hungarian (Magyar) (hu_HU) -- Bulgarian (Български) (bg_BG) -- Sebian Latin alphabet (Srpski) (sr-Latn-RS) - If you would like to add or modify a translation, please see [How to add new languages to Stirling-PDF](HowToAddNewLanguage.md). Also, please create a Pull Request so others can use it! ## Fixing Bugs or Adding a New Feature diff --git a/README.md b/README.md index fa389cb0..da48ee05 100644 --- a/README.md +++ b/README.md @@ -144,6 +144,36 @@ Note: Podman is CLI-compatible with Docker, so simply replace "docker" with "pod ## Enable OCR/Compression feature Please view https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToUseOCR.md +## Supported Languages + +Stirling PDF currently supports 26! +- English (English) (en_GB) +- English (US) (en_US) +- Arabic (العربية) (ar_AR) +- German (Deutsch) (de_DE) +- French (Français) (fr_FR) +- Spanish (Español) (es_ES) +- Simplified Chinese (简体中文) (zh_CN) +- Traditional Chinese (繁體中文) (zh_TW) +- Catalan (Català) (ca_CA) +- Italian (Italiano) (it_IT) +- Swedish (Svenska) (sv_SE) +- Polish (Polski) (pl_PL) +- Romanian (Română) (ro_RO) +- Korean (한국어) (ko_KR) +- Portuguese Brazilian (Português) (pt_BR) +- Russian (Русский) (ru_RU) +- Basque (Euskara) (eu_ES) +- Japanese (日本語) (ja_JP) +- Dutch (Nederlands) (nl_NL) +- Greek (el_GR) +- Turkish (Türkçe) (tr_TR) +- Indonesia (Bahasa Indonesia) (id_ID) +- Hindi (हिंदी) (hi_IN) +- Hungarian (Magyar) (hu_HU) +- Bulgarian (Български) (bg_BG) +- Sebian Latin alphabet (Srpski) (sr-Latn-RS) + ## Contributing (creating issues, translations, fixing bugs, etc.) Please see our [Contributing Guide](CONTRIBUTING.md)! 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 25/81] 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 From c8e5023ec16d46fcc567957e31e5122f55260b67 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Sat, 13 Jan 2024 00:37:19 +0000 Subject: [PATCH 26/81] fix --- build.gradle | 12 ++++----- .../SPDF/controller/api/UserController.java | 25 ++++++++++++++----- .../model/api/user/UpdateUserDetails.java | 16 ++++++++++++ .../model/api/user/UpdateUserUsername.java | 16 ++++++++++++ .../SPDF/model/api/user/Username.java | 18 +++++++++++++ .../SPDF/model/api/user/UsernameAndPass.java | 16 ++++++++++++ .../resources/templates/change-creds.html | 8 +++--- 7 files changed, 94 insertions(+), 17 deletions(-) create mode 100644 src/main/java/stirling/software/SPDF/model/api/user/UpdateUserDetails.java create mode 100644 src/main/java/stirling/software/SPDF/model/api/user/UpdateUserUsername.java create mode 100644 src/main/java/stirling/software/SPDF/model/api/user/Username.java create mode 100644 src/main/java/stirling/software/SPDF/model/api/user/UsernameAndPass.java diff --git a/build.gradle b/build.gradle index 68797450..ebd73077 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,7 @@ licenseReport { sourceSets { main { java { - if (System.getenv('DOCKER_ENABLE_SECURITY') != 'falsesss') { + if (System.getenv('DOCKER_ENABLE_SECURITY') == 'false') { exclude 'stirling/software/SPDF/config/security/**' exclude 'stirling/software/SPDF/controller/api/UserController.java' exclude 'stirling/software/SPDF/controller/web/AccountWebController.java' @@ -85,11 +85,6 @@ spotless { } } -compileJava { - options.compilerArgs += '-parameters' -} - - dependencies { //security updates implementation 'ch.qos.logback:logback-classic:1.4.14' @@ -100,7 +95,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') == 'falseee') { + if (System.getenv('DOCKER_ENABLE_SECURITY') != 'false') { 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" @@ -169,6 +164,9 @@ dependencies { tasks.withType(JavaCompile) { dependsOn 'spotlessApply' } +compileJava { + options.compilerArgs << ' -parameters' +} task writeVersion { def propsFile = file('src/main/resources/version.properties') diff --git a/src/main/java/stirling/software/SPDF/controller/api/UserController.java b/src/main/java/stirling/software/SPDF/controller/api/UserController.java index 89e81c99..cece8c49 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/UserController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/UserController.java @@ -13,6 +13,7 @@ import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -20,13 +21,19 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import org.springframework.web.servlet.view.RedirectView; +import io.swagger.v3.oas.annotations.tags.Tag; + import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import stirling.software.SPDF.config.security.UserService; import stirling.software.SPDF.model.Role; import stirling.software.SPDF.model.User; +import stirling.software.SPDF.model.api.misc.OptimizePdfRequest; +import stirling.software.SPDF.model.api.user.UpdateUserDetails; +import stirling.software.SPDF.model.api.user.UsernameAndPass; @Controller +@Tag(name = "User", description = "User APIs") @RequestMapping("/api/v1/user") public class UserController { @@ -35,13 +42,13 @@ public class UserController { @PreAuthorize("!hasAuthority('ROLE_DEMO_USER')") @PostMapping("/register") public String register( - @RequestParam String username, @RequestParam String password, Model model) { - if (userService.usernameExists(username)) { + @ModelAttribute UsernameAndPass requestModel, Model model) { + if (userService.usernameExists(requestModel.getUsername())) { model.addAttribute("error", "Username already exists"); return "register"; } - userService.saveUser(username, password); + userService.saveUser(requestModel.getUsername(), requestModel.getPassword()); return "redirect:/login?registered=true"; } @@ -49,12 +56,18 @@ public class UserController { @PostMapping("/change-username-and-password") public RedirectView changeUsernameAndPassword( Principal principal, - @RequestParam String currentPassword, - @RequestParam String newUsername, - @RequestParam String newPassword, + @ModelAttribute UpdateUserDetails requestModel, HttpServletRequest request, HttpServletResponse response, RedirectAttributes redirectAttributes) { + + + String currentPassword = requestModel.getPassword(); + String newPassword = requestModel.getNewPassword(); + String newUsername = requestModel.getNewUsername(); + + System.out.println(currentPassword); + System.out.println(newPassword); if (principal == null) { return new RedirectView("/change-creds?messageType=notAuthenticated"); } diff --git a/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserDetails.java b/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserDetails.java new file mode 100644 index 00000000..d8cbf790 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserDetails.java @@ -0,0 +1,16 @@ +package stirling.software.SPDF.model.api.user; + +import io.swagger.v3.oas.annotations.media.Schema; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class UpdateUserDetails extends UpdateUserUsername { + + @Schema(description = "new password for user") + private String newPassword; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserUsername.java b/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserUsername.java new file mode 100644 index 00000000..8b457605 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserUsername.java @@ -0,0 +1,16 @@ +package stirling.software.SPDF.model.api.user; + +import io.swagger.v3.oas.annotations.media.Schema; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class UpdateUserUsername extends UsernameAndPass { + + @Schema(description = "new password for user") + private String newUsername; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/user/Username.java b/src/main/java/stirling/software/SPDF/model/api/user/Username.java new file mode 100644 index 00000000..3460745d --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/user/Username.java @@ -0,0 +1,18 @@ +package stirling.software.SPDF.model.api.user; + +import org.springframework.web.multipart.MultipartFile; + +import io.swagger.v3.oas.annotations.media.Schema; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Data +@EqualsAndHashCode +@NoArgsConstructor +public class Username { + + @Schema(description = "username of user") + private String username; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/user/UsernameAndPass.java b/src/main/java/stirling/software/SPDF/model/api/user/UsernameAndPass.java new file mode 100644 index 00000000..d925eef1 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/user/UsernameAndPass.java @@ -0,0 +1,16 @@ +package stirling.software.SPDF.model.api.user; + +import io.swagger.v3.oas.annotations.media.Schema; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +public class UsernameAndPass extends Username { + + @Schema(description = "password of user") + private String password; +} diff --git a/src/main/resources/templates/change-creds.html b/src/main/resources/templates/change-creds.html index a954e862..32a61e16 100644 --- a/src/main/resources/templates/change-creds.html +++ b/src/main/resources/templates/change-creds.html @@ -39,12 +39,12 @@

    Change Username and password

    - - + +
    - - + +
    From c4ad442ec350fceca683d56255332fcb473a0313 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Sat, 13 Jan 2024 00:46:17 +0000 Subject: [PATCH 27/81] remove logs --- .../stirling/software/SPDF/controller/api/UserController.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/stirling/software/SPDF/controller/api/UserController.java b/src/main/java/stirling/software/SPDF/controller/api/UserController.java index cece8c49..a27c8331 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/UserController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/UserController.java @@ -66,8 +66,6 @@ public class UserController { String newPassword = requestModel.getNewPassword(); String newUsername = requestModel.getNewUsername(); - System.out.println(currentPassword); - System.out.println(newPassword); if (principal == null) { return new RedirectView("/change-creds?messageType=notAuthenticated"); } From d8cf7e81b9d338976178030b73a48095437f573a Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Sat, 13 Jan 2024 00:55:43 +0000 Subject: [PATCH 28/81] fixes --- build.gradle | 2 +- .../SPDF/controller/api/UserController.java | 13 +++++-------- .../software/SPDF/model/api/user/Username.java | 2 -- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/build.gradle b/build.gradle index ebd73077..32922021 100644 --- a/build.gradle +++ b/build.gradle @@ -165,7 +165,7 @@ tasks.withType(JavaCompile) { dependsOn 'spotlessApply' } compileJava { - options.compilerArgs << ' -parameters' + options.compilerArgs << '-parameters' } task writeVersion { diff --git a/src/main/java/stirling/software/SPDF/controller/api/UserController.java b/src/main/java/stirling/software/SPDF/controller/api/UserController.java index a27c8331..ce15d19c 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/UserController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/UserController.java @@ -28,7 +28,6 @@ import jakarta.servlet.http.HttpServletResponse; import stirling.software.SPDF.config.security.UserService; import stirling.software.SPDF.model.Role; import stirling.software.SPDF.model.User; -import stirling.software.SPDF.model.api.misc.OptimizePdfRequest; import stirling.software.SPDF.model.api.user.UpdateUserDetails; import stirling.software.SPDF.model.api.user.UsernameAndPass; @@ -41,8 +40,7 @@ public class UserController { @PreAuthorize("!hasAuthority('ROLE_DEMO_USER')") @PostMapping("/register") - public String register( - @ModelAttribute UsernameAndPass requestModel, Model model) { + public String register(@ModelAttribute UsernameAndPass requestModel, Model model) { if (userService.usernameExists(requestModel.getUsername())) { model.addAttribute("error", "Username already exists"); return "register"; @@ -61,11 +59,10 @@ public class UserController { HttpServletResponse response, RedirectAttributes redirectAttributes) { - - String currentPassword = requestModel.getPassword(); - String newPassword = requestModel.getNewPassword(); - String newUsername = requestModel.getNewUsername(); - + String currentPassword = requestModel.getPassword(); + String newPassword = requestModel.getNewPassword(); + String newUsername = requestModel.getNewUsername(); + if (principal == null) { return new RedirectView("/change-creds?messageType=notAuthenticated"); } diff --git a/src/main/java/stirling/software/SPDF/model/api/user/Username.java b/src/main/java/stirling/software/SPDF/model/api/user/Username.java index 3460745d..167df1b1 100644 --- a/src/main/java/stirling/software/SPDF/model/api/user/Username.java +++ b/src/main/java/stirling/software/SPDF/model/api/user/Username.java @@ -1,7 +1,5 @@ package stirling.software.SPDF.model.api.user; -import org.springframework.web.multipart.MultipartFile; - import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; From c8acddb251ca3fd55bbea48f7d3259135fc68ebc Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Sat, 13 Jan 2024 01:05:43 +0000 Subject: [PATCH 29/81] Resolve split sections --- .../controller/api/SplitPdfBySectionsController.java | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java index ab00d719..de3e5a4b 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java @@ -118,13 +118,12 @@ public class SplitPdfBySectionsController { try (PDPageContentStream contentStream = new PDPageContentStream( - subDoc, subPage, AppendMode.OVERWRITE, true, true)) { + subDoc, subPage, AppendMode.APPEND, true, true)) { // Set clipping area and position float translateX = -subPageWidth * i; - float translateY = height - subPageHeight * (verticalDivisions - j); - - // Code for google Docs pdfs.. - // float translateY = -subPageHeight * (verticalDivisions - 1 - j); + + //float translateY = height - subPageHeight * (verticalDivisions - j); + float translateY = -subPageHeight * (verticalDivisions - 1 - j); contentStream.saveGraphicsState(); contentStream.addRect(0, 0, subPageWidth, subPageHeight); From 801e3070052b3932aba751409499ef2290061e63 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Sat, 13 Jan 2024 01:09:41 +0000 Subject: [PATCH 30/81] 0.20 bump --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 32922021..e12cbd33 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ plugins { import com.github.jk1.license.render.* group = 'stirling.software' -version = '0.19.1' +version = '0.20.0' sourceCompatibility = '17' repositories { From 3912f4212854297d42da0d8b9a4ecbbfa1ea9e27 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Sat, 13 Jan 2024 10:08:42 +0000 Subject: [PATCH 31/81] changeCreds message --- src/main/resources/templates/change-creds.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/templates/change-creds.html b/src/main/resources/templates/change-creds.html index 32a61e16..79d82e04 100644 --- a/src/main/resources/templates/change-creds.html +++ b/src/main/resources/templates/change-creds.html @@ -39,7 +39,7 @@

    Change Username and password

    - +
    From e69ed06b4f3b1169cae8bef0b6252dcdb7ff1e6e Mon Sep 17 00:00:00 2001 From: cloud-erik <67910530+cloud-erik@users.noreply.github.com> Date: Sun, 14 Jan 2024 10:29:21 +0100 Subject: [PATCH 32/81] Update docker-compose-latest.yml Exemple DEFAULTLOCALE formating --- exampleYmlFiles/docker-compose-latest.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exampleYmlFiles/docker-compose-latest.yml b/exampleYmlFiles/docker-compose-latest.yml index a9dc1f31..d506e424 100644 --- a/exampleYmlFiles/docker-compose-latest.yml +++ b/exampleYmlFiles/docker-compose-latest.yml @@ -21,7 +21,7 @@ services: environment: DOCKER_ENABLE_SECURITY: "false" SECURITY_ENABLELOGIN: "false" - SYSTEM_DEFAULTLOCALE: en_US + SYSTEM_DEFAULTLOCALE: en-US UI_APPNAME: Stirling-PDF UI_HOMEDESCRIPTION: Demo site for Stirling-PDF Latest UI_APPNAMENAVBAR: Stirling-PDF Latest From 490acddc6569ba3688c03ad4832ed36e562d3a23 Mon Sep 17 00:00:00 2001 From: cloud-erik <67910530+cloud-erik@users.noreply.github.com> Date: Sun, 14 Jan 2024 10:31:45 +0100 Subject: [PATCH 33/81] Update docker-compose-latest-ultra-lite.yml Exemple DEFAULTLOCALE formating --- exampleYmlFiles/docker-compose-latest-ultra-lite.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exampleYmlFiles/docker-compose-latest-ultra-lite.yml b/exampleYmlFiles/docker-compose-latest-ultra-lite.yml index 31fec67b..710c0072 100644 --- a/exampleYmlFiles/docker-compose-latest-ultra-lite.yml +++ b/exampleYmlFiles/docker-compose-latest-ultra-lite.yml @@ -20,7 +20,7 @@ services: environment: DOCKER_ENABLE_SECURITY: "false" SECURITY_ENABLELOGIN: "false" - SYSTEM_DEFAULTLOCALE: en_US + SYSTEM_DEFAULTLOCALE: en-US UI_APPNAME: Stirling-PDF-Ultra-lite UI_HOMEDESCRIPTION: Demo site for Stirling-PDF-Ultra-lite Latest UI_APPNAMENAVBAR: Stirling-PDF-Ultra-lite Latest From 1b83fda3494d19d4b1a5b0613367d0a1cf5e3f3b Mon Sep 17 00:00:00 2001 From: cloud-erik <67910530+cloud-erik@users.noreply.github.com> Date: Sun, 14 Jan 2024 10:32:00 +0100 Subject: [PATCH 34/81] Update docker-compose-latest-ultra-lite-security.yml Exemple DEFAULTLOCALE formating --- exampleYmlFiles/docker-compose-latest-ultra-lite-security.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exampleYmlFiles/docker-compose-latest-ultra-lite-security.yml b/exampleYmlFiles/docker-compose-latest-ultra-lite-security.yml index 7971eeb7..b7848696 100644 --- a/exampleYmlFiles/docker-compose-latest-ultra-lite-security.yml +++ b/exampleYmlFiles/docker-compose-latest-ultra-lite-security.yml @@ -21,7 +21,7 @@ services: environment: DOCKER_ENABLE_SECURITY: "true" SECURITY_ENABLELOGIN: "true" - SYSTEM_DEFAULTLOCALE: en_US + SYSTEM_DEFAULTLOCALE: en-US UI_APPNAME: Stirling-PDF-Lite UI_HOMEDESCRIPTION: Demo site for Stirling-PDF-Lite Latest with Security UI_APPNAMENAVBAR: Stirling-PDF-Lite Latest From 219dd7834f9293fdad46d82c0f460ca2f811f4a2 Mon Sep 17 00:00:00 2001 From: cloud-erik <67910530+cloud-erik@users.noreply.github.com> Date: Sun, 14 Jan 2024 10:32:12 +0100 Subject: [PATCH 35/81] Update docker-compose-latest-security.yml Exemple DEFAULTLOCALE formating --- exampleYmlFiles/docker-compose-latest-security.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exampleYmlFiles/docker-compose-latest-security.yml b/exampleYmlFiles/docker-compose-latest-security.yml index 807a755e..513bb582 100644 --- a/exampleYmlFiles/docker-compose-latest-security.yml +++ b/exampleYmlFiles/docker-compose-latest-security.yml @@ -21,7 +21,7 @@ services: environment: DOCKER_ENABLE_SECURITY: "true" SECURITY_ENABLELOGIN: "true" - SYSTEM_DEFAULTLOCALE: en_US + SYSTEM_DEFAULTLOCALE: en-US UI_APPNAME: Stirling-PDF UI_HOMEDESCRIPTION: Demo site for Stirling-PDF Latest with Security UI_APPNAMENAVBAR: Stirling-PDF Latest From 686af16cf5620ab56d63352069247362df1a81af Mon Sep 17 00:00:00 2001 From: cloud-erik <67910530+cloud-erik@users.noreply.github.com> Date: Sun, 14 Jan 2024 10:32:23 +0100 Subject: [PATCH 36/81] Update docker-compose-latest-lite.yml Exemple DEFAULTLOCALE formating --- exampleYmlFiles/docker-compose-latest-lite.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exampleYmlFiles/docker-compose-latest-lite.yml b/exampleYmlFiles/docker-compose-latest-lite.yml index 7b374688..e40f873d 100644 --- a/exampleYmlFiles/docker-compose-latest-lite.yml +++ b/exampleYmlFiles/docker-compose-latest-lite.yml @@ -20,7 +20,7 @@ services: environment: DOCKER_ENABLE_SECURITY: "false" SECURITY_ENABLELOGIN: "false" - SYSTEM_DEFAULTLOCALE: en_US + SYSTEM_DEFAULTLOCALE: en-US UI_APPNAME: Stirling-PDF-Lite UI_HOMEDESCRIPTION: Demo site for Stirling-PDF-Lite Latest UI_APPNAMENAVBAR: Stirling-PDF-Lite Latest From c807d20590effdd70abcb64bf3ed8ec1a360aa47 Mon Sep 17 00:00:00 2001 From: cloud-erik <67910530+cloud-erik@users.noreply.github.com> Date: Sun, 14 Jan 2024 10:32:34 +0100 Subject: [PATCH 37/81] Update docker-compose-latest-lite-security.yml Exemple DEFAULTLOCALE formating --- exampleYmlFiles/docker-compose-latest-lite-security.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/exampleYmlFiles/docker-compose-latest-lite-security.yml b/exampleYmlFiles/docker-compose-latest-lite-security.yml index 41dc4567..90e4c5bf 100644 --- a/exampleYmlFiles/docker-compose-latest-lite-security.yml +++ b/exampleYmlFiles/docker-compose-latest-lite-security.yml @@ -21,7 +21,7 @@ services: environment: DOCKER_ENABLE_SECURITY: "true" SECURITY_ENABLELOGIN: "true" - SYSTEM_DEFAULTLOCALE: en_US + SYSTEM_DEFAULTLOCALE: en-US UI_APPNAME: Stirling-PDF-Lite UI_HOMEDESCRIPTION: Demo site for Stirling-PDF-Lite Latest with Security UI_APPNAMENAVBAR: Stirling-PDF-Lite Latest From 89c0e721b8ccd633f6abd5e16ea202355fee5e89 Mon Sep 17 00:00:00 2001 From: Stirling-PDF-Bot Date: Mon, 15 Jan 2024 00:13:30 +0000 Subject: [PATCH 38/81] Update 3rd Party Licenses --- .../resources/static/3rdPartyLicenses.json | 78 +++++++++++++++++-- 1 file changed, 72 insertions(+), 6 deletions(-) diff --git a/src/main/resources/static/3rdPartyLicenses.json b/src/main/resources/static/3rdPartyLicenses.json index 88263b1d..699be591 100644 --- a/src/main/resources/static/3rdPartyLicenses.json +++ b/src/main/resources/static/3rdPartyLicenses.json @@ -357,22 +357,29 @@ { "moduleName": "org.apache.pdfbox:fontbox", "moduleUrl": "https://pdfbox.apache.org", - "moduleVersion": "2.0.30", - "moduleLicense": "Apache License, Version 2.0", + "moduleVersion": "3.0.1", + "moduleLicense": "Apache-2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, { "moduleName": "org.apache.pdfbox:pdfbox", "moduleUrl": "https://pdfbox.apache.org", - "moduleVersion": "2.0.30", - "moduleLicense": "Apache License, Version 2.0", + "moduleVersion": "3.0.1", + "moduleLicense": "Apache-2.0", + "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" + }, + { + "moduleName": "org.apache.pdfbox:pdfbox-io", + "moduleUrl": "https://pdfbox.apache.org", + "moduleVersion": "3.0.1", + "moduleLicense": "Apache-2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, { "moduleName": "org.apache.pdfbox:xmpbox", "moduleUrl": "https://pdfbox.apache.org", - "moduleVersion": "2.0.30", - "moduleLicense": "Apache License, Version 2.0", + "moduleVersion": "3.0.1", + "moduleLicense": "Apache-2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, { @@ -450,6 +457,12 @@ "moduleLicense": "BSD 2-Clause License", "moduleLicenseUrl": "https://opensource.org/licenses/BSD-2-Clause" }, + { + "moduleName": "org.commonmark:commonmark-ext-gfm-tables", + "moduleVersion": "0.21.0", + "moduleLicense": "BSD 2-Clause License", + "moduleLicenseUrl": "https://opensource.org/licenses/BSD-2-Clause" + }, { "moduleName": "org.eclipse.angus:angus-activation", "moduleUrl": "https://www.eclipse.org", @@ -506,6 +519,52 @@ "moduleLicense": "Public Domain", "moduleLicenseUrl": "http://repository.jboss.org/licenses/cc0-1.0.txt" }, + { + "moduleName": "org.junit.jupiter:junit-jupiter", + "moduleUrl": "https://junit.org/junit5/", + "moduleVersion": "5.10.1", + "moduleLicense": "Eclipse Public License v2.0", + "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-v20.html" + }, + { + "moduleName": "org.junit.jupiter:junit-jupiter-api", + "moduleUrl": "https://junit.org/junit5/", + "moduleVersion": "5.10.1", + "moduleLicense": "Eclipse Public License v2.0", + "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-v20.html" + }, + { + "moduleName": "org.junit.jupiter:junit-jupiter-engine", + "moduleUrl": "https://junit.org/junit5/", + "moduleVersion": "5.10.1", + "moduleLicense": "Eclipse Public License v2.0", + "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-v20.html" + }, + { + "moduleName": "org.junit.jupiter:junit-jupiter-params", + "moduleUrl": "https://junit.org/junit5/", + "moduleVersion": "5.10.1", + "moduleLicense": "Eclipse Public License v2.0", + "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-v20.html" + }, + { + "moduleName": "org.junit.platform:junit-platform-commons", + "moduleUrl": "https://junit.org/junit5/", + "moduleVersion": "1.10.1", + "moduleLicense": "Eclipse Public License v2.0", + "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-v20.html" + }, + { + "moduleName": "org.junit.platform:junit-platform-engine", + "moduleUrl": "https://junit.org/junit5/", + "moduleVersion": "1.10.1", + "moduleLicense": "Eclipse Public License v2.0", + "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-v20.html" + }, + { + "moduleName": "org.junit:junit-bom", + "moduleVersion": "5.10.1" + }, { "moduleName": "org.latencyutils:LatencyUtils", "moduleUrl": "http://latencyutils.github.io/LatencyUtils/", @@ -513,6 +572,13 @@ "moduleLicense": "Public Domain, per Creative Commons CC0", "moduleLicenseUrl": "http://creativecommons.org/publicdomain/zero/1.0/" }, + { + "moduleName": "org.opentest4j:opentest4j", + "moduleUrl": "https://github.com/ota4j-team/opentest4j", + "moduleVersion": "1.3.0", + "moduleLicense": "The Apache License, Version 2.0", + "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" + }, { "moduleName": "org.slf4j:jul-to-slf4j", "moduleUrl": "http://www.slf4j.org", From ec5a3c59481b3272bc4ca887bca53c91510dad46 Mon Sep 17 00:00:00 2001 From: tkymmm <136296842+tkymmm@users.noreply.github.com> Date: Mon, 15 Jan 2024 10:16:46 +0900 Subject: [PATCH 39/81] Update messages_ja_JP.properties Updated Japanese translation. --- src/main/resources/messages_ja_JP.properties | 125 +++++++++---------- 1 file changed, 62 insertions(+), 63 deletions(-) diff --git a/src/main/resources/messages_ja_JP.properties b/src/main/resources/messages_ja_JP.properties index 7ba8b206..7600209e 100644 --- a/src/main/resources/messages_ja_JP.properties +++ b/src/main/resources/messages_ja_JP.properties @@ -55,23 +55,23 @@ usernameExistsMessage=新しいユーザー名はすでに存在します。 ############### # Pipeline # ############### -pipeline.header=Pipeline Menu (Alpha) +pipeline.header=パイプラインメニュー (Alpha) pipeline.uploadButton=Upload Custom -pipeline.configureButton=Configure -pipeline.defaultOption=Custom -pipeline.submitButton=Submit +pipeline.configureButton=設定 +pipeline.defaultOption=カスタム +pipeline.submitButton=送信 ###################### # Pipeline Options # ###################### -pipelineOptions.header=Pipeline Configuration -pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Operation Settings -pipelineOptions.pipelineNamePrompt=Enter pipeline name here -pipelineOptions.addOperationButton=Add operation -pipelineOptions.pipelineHeader=Pipeline: -pipelineOptions.saveButton=Download -pipelineOptions.validateButton=Validate +pipelineOptions.header=パイプライン設定 +pipelineOptions.pipelineNameLabel=パイプライン名 +pipelineOptions.saveSettings=動作設定の保存 +pipelineOptions.pipelineNamePrompt=ここにパイプライン名を入力 +pipelineOptions.addOperationButton=動作の追加 +pipelineOptions.pipelineHeader=パイプライン: +pipelineOptions.saveButton=ダウンロード +pipelineOptions.validateButton=検証 @@ -281,8 +281,8 @@ home.removeBlanks.title=空白ページの削除 home.removeBlanks.desc=ドキュメントから空白ページを検出して削除します。 removeBlanks.tags=cleanup,streamline,non-content,organize -home.removeAnnotations.title=Remove Annotations -home.removeAnnotations.desc=Removes all comments/annotations from a PDF +home.removeAnnotations.title=注釈の削除 +home.removeAnnotations.desc=PDFからすべてのコメント・注釈を削除します。 removeAnnotations.tags=comments,highlight,notes,markup,remove home.compare.title=比較 @@ -366,22 +366,22 @@ home.autoRedact.title=自動塗りつぶし home.autoRedact.desc=入力したテキストに基づいてPDF内のテキストを自動で塗りつぶし(黒塗り)します。 showJS.tags=JS -home.tableExtraxt.title=PDF to CSV -home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV +home.tableExtraxt.title=PDFをCSVに変換 +home.tableExtraxt.desc=PDFから表を抽出しCSVに変換します。 tableExtraxt.tags=CSV,Table Extraction,extract,convert -home.autoSizeSplitPDF.title=Auto Split by Size/Count -home.autoSizeSplitPDF.desc=Split a single PDF into multiple documents based on size, page count, or document count +home.autoSizeSplitPDF.title=サイズ・数による自動分割 +home.autoSizeSplitPDF.desc=サイズ・ページ数またはドキュメント数に基づいて、1つのPDFを複数のドキュメントに分割します。 autoSizeSplitPDF.tags=pdf,split,document,organization -home.overlay-pdfs.title=Overlay PDFs -home.overlay-pdfs.desc=Overlays PDFs on-top of another PDF +home.overlay-pdfs.title=PDFのオーバーレイ +home.overlay-pdfs.desc=PDFの上に別のPDFを重ねます。 overlay-pdfs.tags=Overlay -home.split-by-sections.title=Split PDF by Sections -home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections +home.split-by-sections.title=PDFをセクションで分割 +home.split-by-sections.desc=PDFの各ページを縦横に分割します。 split-by-sections.tags=Section Split, Divide, Customize ########################### @@ -572,8 +572,8 @@ removeBlanks.submit=空白ページの削除 #removeAnnotations -removeAnnotations.title=Remove Annotations -removeAnnotations.header=Remove Annotations +removeAnnotations.title=注釈の削除 +removeAnnotations.header=注釈の削除 removeAnnotations.submit=Remove @@ -881,54 +881,53 @@ PDFToXML.credit=本サービスはファイル変換にLibreOfficeを使用し PDFToXML.submit=変換 #PDFToCSV -PDFToCSV.title=PDF??CSV? -PDFToCSV.header=PDF??CSV? -PDFToCSV.prompt=Choose page to extract table -PDFToCSV.submit=???? +PDFToCSV.title=PDFをCSVに変換 +PDFToCSV.header=PDFをCSVに変換 +PDFToCSV.prompt=表を抽出するページを選択 +PDFToCSV.submit=変換 #split-by-size-or-count -split-by-size-or-count.header=Split PDF by Size or Count -split-by-size-or-count.type.label=Select Split Type -split-by-size-or-count.type.size=By Size -split-by-size-or-count.type.pageCount=By Page Count -split-by-size-or-count.type.docCount=By Document Count -split-by-size-or-count.value.label=Enter Value -split-by-size-or-count.value.placeholder=Enter size (e.g., 2MB or 3KB) or count (e.g., 5) -split-by-size-or-count.submit=Submit +split-by-size-or-count.header=サイズまたは数で分割 +split-by-size-or-count.type.label=分割タイプの選択 +split-by-size-or-count.type.size=サイズ +split-by-size-or-count.type.pageCount=ページ数 +split-by-size-or-count.type.docCount=ドキュメント数 +split-by-size-or-count.value.label=値の入力 +split-by-size-or-count.value.placeholder=サイズ (例、2MB または 3KB) または数値 (例、5) を入力 +split-by-size-or-count.submit=分割 #overlay-pdfs -overlay-pdfs.header=Overlay PDF Files -overlay-pdfs.baseFile.label=Select Base PDF File -overlay-pdfs.overlayFiles.label=Select Overlay PDF Files -overlay-pdfs.mode.label=Select Overlay Mode -overlay-pdfs.mode.sequential=Sequential Overlay -overlay-pdfs.mode.interleaved=Interleaved Overlay -overlay-pdfs.mode.fixedRepeat=Fixed Repeat Overlay -overlay-pdfs.counts.label=Overlay Counts (for Fixed Repeat Mode) -overlay-pdfs.counts.placeholder=Enter comma-separated counts (e.g., 2,3,1) -overlay-pdfs.position.label=Select Overlay Position -overlay-pdfs.position.foreground=Foreground -overlay-pdfs.position.background=Background -overlay-pdfs.submit=Submit +overlay-pdfs.header=PDFのオーバーレイ +overlay-pdfs.baseFile.label=ベースのPDFを選択 +overlay-pdfs.overlayFiles.label=重ねるPDFを選択 +overlay-pdfs.mode.label=オーバーレイモードの選択 +overlay-pdfs.mode.sequential=シーケンシャル・オーバーレイ +overlay-pdfs.mode.interleaved=インターリーブ・オーバーレイ +overlay-pdfs.mode.fixedRepeat=固定リピート・オーバーレイ +overlay-pdfs.counts.label=オーバーレイ回数 (固定リピートモード用) +overlay-pdfs.counts.placeholder=カンマ区切りでカウントを入力 (例、2,3,1) +overlay-pdfs.position.label=重ね位置の選択 +overlay-pdfs.position.foreground=前面 +overlay-pdfs.position.background=背面 +overlay-pdfs.submit=重ねる #split-by-sections -split-by-sections.title=Split PDF by Sections -split-by-sections.header=Split PDF into Sections -split-by-sections.horizontal.label=Horizontal Divisions -split-by-sections.vertical.label=Vertical Divisions -split-by-sections.horizontal.placeholder=Enter number of horizontal divisions -split-by-sections.vertical.placeholder=Enter number of vertical divisions -split-by-sections.submit=Split PDF +split-by-sections.title=セクションごとにPDFを分割する +split-by-sections.header=PDFをセクションに分割 +split-by-sections.horizontal.label=水平方向 +split-by-sections.vertical.label=垂直方向 +split-by-sections.horizontal.placeholder=水平方向の分割数を選択 +split-by-sections.vertical.placeholder=垂直方向の分割数を選択 +split-by-sections.submit=分割 #licenses -licenses.nav=Licenses -licenses.title=3rd Party Licenses -licenses.header=3rd Party Licenses -licenses.module=Module -licenses.version=Version -licenses.license=License - +licenses.nav=ライセンス +licenses.title=サードパーティライセンス +licenses.header=サードパーティライセンス +licenses.module=モジュール +licenses.version=バージョン +licenses.license=ライセンス From e43e6d18b99e7c41baf2c9d744998e11ebfb11a7 Mon Sep 17 00:00:00 2001 From: Stirling-PDF-Bot Date: Wed, 17 Jan 2024 23:52:12 +0000 Subject: [PATCH 40/81] Update 3rd Party Licenses --- .../resources/static/3rdPartyLicenses.json | 78 +++++++++++++++++-- 1 file changed, 72 insertions(+), 6 deletions(-) diff --git a/src/main/resources/static/3rdPartyLicenses.json b/src/main/resources/static/3rdPartyLicenses.json index 88263b1d..699be591 100644 --- a/src/main/resources/static/3rdPartyLicenses.json +++ b/src/main/resources/static/3rdPartyLicenses.json @@ -357,22 +357,29 @@ { "moduleName": "org.apache.pdfbox:fontbox", "moduleUrl": "https://pdfbox.apache.org", - "moduleVersion": "2.0.30", - "moduleLicense": "Apache License, Version 2.0", + "moduleVersion": "3.0.1", + "moduleLicense": "Apache-2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, { "moduleName": "org.apache.pdfbox:pdfbox", "moduleUrl": "https://pdfbox.apache.org", - "moduleVersion": "2.0.30", - "moduleLicense": "Apache License, Version 2.0", + "moduleVersion": "3.0.1", + "moduleLicense": "Apache-2.0", + "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" + }, + { + "moduleName": "org.apache.pdfbox:pdfbox-io", + "moduleUrl": "https://pdfbox.apache.org", + "moduleVersion": "3.0.1", + "moduleLicense": "Apache-2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, { "moduleName": "org.apache.pdfbox:xmpbox", "moduleUrl": "https://pdfbox.apache.org", - "moduleVersion": "2.0.30", - "moduleLicense": "Apache License, Version 2.0", + "moduleVersion": "3.0.1", + "moduleLicense": "Apache-2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, { @@ -450,6 +457,12 @@ "moduleLicense": "BSD 2-Clause License", "moduleLicenseUrl": "https://opensource.org/licenses/BSD-2-Clause" }, + { + "moduleName": "org.commonmark:commonmark-ext-gfm-tables", + "moduleVersion": "0.21.0", + "moduleLicense": "BSD 2-Clause License", + "moduleLicenseUrl": "https://opensource.org/licenses/BSD-2-Clause" + }, { "moduleName": "org.eclipse.angus:angus-activation", "moduleUrl": "https://www.eclipse.org", @@ -506,6 +519,52 @@ "moduleLicense": "Public Domain", "moduleLicenseUrl": "http://repository.jboss.org/licenses/cc0-1.0.txt" }, + { + "moduleName": "org.junit.jupiter:junit-jupiter", + "moduleUrl": "https://junit.org/junit5/", + "moduleVersion": "5.10.1", + "moduleLicense": "Eclipse Public License v2.0", + "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-v20.html" + }, + { + "moduleName": "org.junit.jupiter:junit-jupiter-api", + "moduleUrl": "https://junit.org/junit5/", + "moduleVersion": "5.10.1", + "moduleLicense": "Eclipse Public License v2.0", + "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-v20.html" + }, + { + "moduleName": "org.junit.jupiter:junit-jupiter-engine", + "moduleUrl": "https://junit.org/junit5/", + "moduleVersion": "5.10.1", + "moduleLicense": "Eclipse Public License v2.0", + "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-v20.html" + }, + { + "moduleName": "org.junit.jupiter:junit-jupiter-params", + "moduleUrl": "https://junit.org/junit5/", + "moduleVersion": "5.10.1", + "moduleLicense": "Eclipse Public License v2.0", + "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-v20.html" + }, + { + "moduleName": "org.junit.platform:junit-platform-commons", + "moduleUrl": "https://junit.org/junit5/", + "moduleVersion": "1.10.1", + "moduleLicense": "Eclipse Public License v2.0", + "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-v20.html" + }, + { + "moduleName": "org.junit.platform:junit-platform-engine", + "moduleUrl": "https://junit.org/junit5/", + "moduleVersion": "1.10.1", + "moduleLicense": "Eclipse Public License v2.0", + "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-v20.html" + }, + { + "moduleName": "org.junit:junit-bom", + "moduleVersion": "5.10.1" + }, { "moduleName": "org.latencyutils:LatencyUtils", "moduleUrl": "http://latencyutils.github.io/LatencyUtils/", @@ -513,6 +572,13 @@ "moduleLicense": "Public Domain, per Creative Commons CC0", "moduleLicenseUrl": "http://creativecommons.org/publicdomain/zero/1.0/" }, + { + "moduleName": "org.opentest4j:opentest4j", + "moduleUrl": "https://github.com/ota4j-team/opentest4j", + "moduleVersion": "1.3.0", + "moduleLicense": "The Apache License, Version 2.0", + "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" + }, { "moduleName": "org.slf4j:jul-to-slf4j", "moduleUrl": "http://www.slf4j.org", From 18d289d3b7d6c1f4ecf57be383f125df3385cace Mon Sep 17 00:00:00 2001 From: Dan Henry Date: Thu, 18 Jan 2024 12:07:02 +1100 Subject: [PATCH 41/81] Move filename input logic to its own function --- .../static/js/multitool/PdfContainer.js | 45 ++++++++++--------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/src/main/resources/static/js/multitool/PdfContainer.js b/src/main/resources/static/js/multitool/PdfContainer.js index 4a53c961..4ae7f434 100644 --- a/src/main/resources/static/js/multitool/PdfContainer.js +++ b/src/main/resources/static/js/multitool/PdfContainer.js @@ -74,26 +74,7 @@ class PdfContainer { input.onchange = async(e) => { const files = e.target.files; if (files.length > 0) { - const filenameInput = document.getElementById('filename-input'); - const pagesContainer = document.getElementById('pages-container'); - const downloadBtn = document.getElementById('export-button'); - - filenameInput.disabled = false; - - if (pagesContainer.childElementCount === 0) { - filenameInput.value = ""; - this.filename = null; - downloadBtn.disabled = true; - } else { - this.filename = filenameInput.value; - } - - if (this.filename === null || this.filename === undefined) { - filenameInput.value = files[0].name; - } else { - filenameInput.value = this.filename; - } - + updateFilenameInput() } this.addPdfsFromFiles(files, nextSiblingElement); @@ -102,6 +83,28 @@ class PdfContainer { input.click(); } + updateFilenameInput() { + const filenameInput = document.getElementById('filename-input'); + const pagesContainer = document.getElementById('pages-container'); + const downloadBtn = document.getElementById('export-button'); + + filenameInput.disabled = false; + + if (pagesContainer.childElementCount === 0) { + filenameInput.value = ""; + this.filename = null; + downloadBtn.disabled = true; + } else { + this.filename = filenameInput.value; + } + + if (this.filename === null || this.filename === undefined) { + filenameInput.value = files[0].name; + } else { + filenameInput.value = this.filename; + } + } + async addPdfsFromFiles(files, nextSiblingElement) { this.fileName = files[0].name; for (var i=0; i < files.length; i++) { @@ -275,7 +278,7 @@ class PdfContainer { } updateFilename() { - const filenameInput = document.getElementById('filename-input'); + const filenameInput = document.getElementById('filename-input'); const downloadBtn = document.getElementById('export-button'); if (filenameInput.value === "") { From 1bd17eded6c1c25c4b2caa2fad731b92668aaeb4 Mon Sep 17 00:00:00 2001 From: Dan Henry Date: Thu, 18 Jan 2024 12:08:32 +1100 Subject: [PATCH 42/81] call updateFilenameInput on file drop --- src/main/resources/static/js/multitool/fileInput.js | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/resources/static/js/multitool/fileInput.js b/src/main/resources/static/js/multitool/fileInput.js index 1a76bd48..fa64d47b 100644 --- a/src/main/resources/static/js/multitool/fileInput.js +++ b/src/main/resources/static/js/multitool/fileInput.js @@ -1,3 +1,5 @@ +import PdfContainer from "./PdfContainer"; + const addFileDragListener = (callback) => { let overlay; let dragCounter = 0; @@ -43,10 +45,14 @@ const addFileDragListener = (callback) => { console.error(err); //maybe }).finally(() => { + // Hide and remove the overlay if (overlay) { overlay.remove(); overlay = null; } + + // Enable/disable filename input + PdfContainer.updateFilenameInput() }); }; From a5165b04cd48d70ee161203a62daf2b933e7f17d Mon Sep 17 00:00:00 2001 From: sbplat <71648843+sbplat@users.noreply.github.com> Date: Thu, 18 Jan 2024 01:08:31 -0500 Subject: [PATCH 43/81] fix(multi-tool): refactor fileInput.js into a class, fix filename variable typos, and update updateFilename logic for dropping files --- .../security/UserAuthenticationFilter.java | 2 +- .../api/SplitPdfBySectionsController.java | 4 +- .../static/js/multitool/PdfContainer.js | 60 +++------ .../static/js/multitool/fileInput.js | 121 ++++++++++-------- src/main/resources/templates/multi-tool.html | 13 +- 5 files changed, 100 insertions(+), 100 deletions(-) diff --git a/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java b/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java index 61b209de..47423eb6 100644 --- a/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java +++ b/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java @@ -115,4 +115,4 @@ public class UserAuthenticationFilter extends OncePerRequestFilter { return false; } -} \ No newline at end of file +} 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 de3e5a4b..90418169 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java @@ -121,8 +121,8 @@ public class SplitPdfBySectionsController { subDoc, subPage, AppendMode.APPEND, true, true)) { // Set clipping area and position float translateX = -subPageWidth * i; - - //float translateY = height - subPageHeight * (verticalDivisions - j); + + // float translateY = height - subPageHeight * (verticalDivisions - j); float translateY = -subPageHeight * (verticalDivisions - 1 - j); contentStream.saveGraphicsState(); diff --git a/src/main/resources/static/js/multitool/PdfContainer.js b/src/main/resources/static/js/multitool/PdfContainer.js index 4ae7f434..7ff2e945 100644 --- a/src/main/resources/static/js/multitool/PdfContainer.js +++ b/src/main/resources/static/js/multitool/PdfContainer.js @@ -26,6 +26,7 @@ class PdfContainer { movePageTo: this.movePageTo, addPdfs: this.addPdfs, rotateElement: this.rotateElement, + updateFilename: this.updateFilename }) }) @@ -38,7 +39,7 @@ class PdfContainer { filenameInput.onkeyup = this.updateFilename; filenameInput.onkeydown = this.preventIllegalChars; - filenameInput.disabled = true; + filenameInput.disabled = false; filenameInput.innerText = ""; downloadBtn.disabled = true; } @@ -59,7 +60,7 @@ class PdfContainer { const vector = (endIndex !== -1 && startIndex > endIndex) ? 0-width : width; - + this.pagesContainerWrapper.scroll({ left: this.pagesContainerWrapper.scrollLeft + vector, }) @@ -73,38 +74,14 @@ class PdfContainer { input.setAttribute("accept", "application/pdf"); input.onchange = async(e) => { const files = e.target.files; - if (files.length > 0) { - updateFilenameInput() - } this.addPdfsFromFiles(files, nextSiblingElement); + this.updateFilename(files ? files[0].name : ""); } input.click(); } - updateFilenameInput() { - const filenameInput = document.getElementById('filename-input'); - const pagesContainer = document.getElementById('pages-container'); - const downloadBtn = document.getElementById('export-button'); - - filenameInput.disabled = false; - - if (pagesContainer.childElementCount === 0) { - filenameInput.value = ""; - this.filename = null; - downloadBtn.disabled = true; - } else { - this.filename = filenameInput.value; - } - - if (this.filename === null || this.filename === undefined) { - filenameInput.value = files[0].name; - } else { - filenameInput.value = this.filename; - } - } - async addPdfsFromFiles(files, nextSiblingElement) { this.fileName = files[0].name; for (var i=0; i < files.length; i++) { @@ -200,7 +177,7 @@ class PdfContainer { return pdfDoc; } - + rotateAll(deg) { for (var i=0; i { - let overlay; - let dragCounter = 0; + constructor(cb = null) { + this.dragCounter = 0; + this.setCallback(cb); - const dragenterListener = function() { - dragCounter++; - if (!overlay) { + // Prevent default behavior for drag events + ['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => { + document.body.addEventListener(eventName, preventDefaults, false); + }); + + function preventDefaults(e) { + e.preventDefault(); + e.stopPropagation(); + } + + this.dragenterListener = this.dragenterListener.bind(this); + this.dragleaveListener = this.dragleaveListener.bind(this); + this.dropListener = this.dropListener.bind(this); + + document.body.addEventListener('dragenter', this.dragenterListener); + document.body.addEventListener('dragleave', this.dragleaveListener); + // Add drop event listener + document.body.addEventListener('drop', this.dropListener); + } + + setActions({ updateFilename }) { + this.updateFilename = updateFilename; + } + + setCallback(cb) { + if (cb) { + this.callback = cb; + } else { + this.callback = (files) => console.warn("FileDragManager not set"); + } + } + + dragenterListener() { + this.dragCounter++; + if (!this.overlay) { // Create and show the overlay - overlay = document.createElement('div'); - overlay.style.position = 'fixed'; - overlay.style.top = 0; - overlay.style.left = 0; - overlay.style.width = '100%'; - overlay.style.height = '100%'; - overlay.style.background = 'rgba(0, 0, 0, 0.5)'; - overlay.style.color = '#fff'; - overlay.style.zIndex = '1000'; - overlay.style.display = 'flex'; - overlay.style.alignItems = 'center'; - overlay.style.justifyContent = 'center'; - overlay.style.pointerEvents = 'none'; - overlay.innerHTML = '

    Drop files anywhere to upload

    '; - document.getElementById('content-wrap').appendChild(overlay); + this.overlay = document.createElement('div'); + this.overlay.style.position = 'fixed'; + this.overlay.style.top = 0; + this.overlay.style.left = 0; + this.overlay.style.width = '100%'; + this.overlay.style.height = '100%'; + this.overlay.style.background = 'rgba(0, 0, 0, 0.5)'; + this.overlay.style.color = '#fff'; + this.overlay.style.zIndex = '1000'; + this.overlay.style.display = 'flex'; + this.overlay.style.alignItems = 'center'; + this.overlay.style.justifyContent = 'center'; + this.overlay.style.pointerEvents = 'none'; + this.overlay.innerHTML = '

    Drop files anywhere to upload

    '; + document.getElementById('content-wrap').appendChild(this.overlay); } }; - const dragleaveListener = function() { - dragCounter--; - if (dragCounter === 0) { + dragleaveListener() { + this.dragCounter--; + if (this.dragCounter === 0) { // Hide and remove the overlay - if (overlay) { - overlay.remove(); - overlay = null; + if (this.overlay) { + this.overlay.remove(); + this.overlay = null; } } }; - const dropListener = function(e) { + dropListener(e) { const dt = e.dataTransfer; const files = dt.files; - callback(files).catch((err) => { + this.callback(files).catch((err) => { console.error(err); //maybe }).finally(() => { // Hide and remove the overlay - if (overlay) { - overlay.remove(); - overlay = null; + if (this.overlay) { + this.overlay.remove(); + this.overlay = null; } - // Enable/disable filename input - PdfContainer.updateFilenameInput() + this.updateFilename(files ? files[0].name : ""); }); }; - - // Prevent default behavior for drag events - ['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => { - document.body.addEventListener(eventName, preventDefaults, false); - }); - - function preventDefaults(e) { - e.preventDefault(); - e.stopPropagation(); - } - - document.body.addEventListener('dragenter', dragenterListener); - document.body.addEventListener('dragleave', dragleaveListener); - // Add drop event listener - document.body.addEventListener('drop', dropListener); } -export default addFileDragListener; \ No newline at end of file +export default FileDragManager; diff --git a/src/main/resources/templates/multi-tool.html b/src/main/resources/templates/multi-tool.html index d602cbe9..d49b7f83 100644 --- a/src/main/resources/templates/multi-tool.html +++ b/src/main/resources/templates/multi-tool.html @@ -49,7 +49,7 @@ - +

-
+
diff --git a/src/main/resources/templates/convert/html-to-pdf.html b/src/main/resources/templates/convert/html-to-pdf.html index ab6c5324..cbb22b99 100644 --- a/src/main/resources/templates/convert/html-to-pdf.html +++ b/src/main/resources/templates/convert/html-to-pdf.html @@ -10,10 +10,73 @@

-
+

-
+
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+ + +
+ +
diff --git a/src/main/resources/templates/convert/markdown-to-pdf.html b/src/main/resources/templates/convert/markdown-to-pdf.html index c8193112..4606d2b5 100644 --- a/src/main/resources/templates/convert/markdown-to-pdf.html +++ b/src/main/resources/templates/convert/markdown-to-pdf.html @@ -13,7 +13,7 @@

-
+

diff --git a/src/main/resources/templates/fragments/navbar.html b/src/main/resources/templates/fragments/navbar.html index b090b08c..aec6b826 100644 --- a/src/main/resources/templates/fragments/navbar.html +++ b/src/main/resources/templates/fragments/navbar.html @@ -133,6 +133,7 @@
+
diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html index 52f945eb..d42ccb4a 100644 --- a/src/main/resources/templates/home.html +++ b/src/main/resources/templates/home.html @@ -101,8 +101,10 @@
+
+
diff --git a/src/main/resources/templates/misc/show-javascript.html b/src/main/resources/templates/misc/show-javascript.html index 36f1bb80..0614a2c2 100644 --- a/src/main/resources/templates/misc/show-javascript.html +++ b/src/main/resources/templates/misc/show-javascript.html @@ -18,7 +18,7 @@
+ th:replace="~{fragments/common :: fileSelector(name='fileInput', multiple=false, remoteCall='false', accept='application/pdf')}">

diff --git a/src/main/resources/templates/misc/stamp.html b/src/main/resources/templates/misc/stamp.html new file mode 100644 index 00000000..a05e9717 --- /dev/null +++ b/src/main/resources/templates/misc/stamp.html @@ -0,0 +1,216 @@ + + + + + + + + +
+
+
+

+
+
+
+

+ +
+
+
+ + +
+ + + +
+ +
+
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+
+
+ + + + + +
+ + +
+ +
+ + +
+ + + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+ + +
+ +
+ + +
+ +
+ + +
+ + + + +
+
+
+ +
+
+
+ + diff --git a/src/main/resources/templates/pdf-to-single-page.html b/src/main/resources/templates/pdf-to-single-page.html index c8dedca5..6c26ace5 100644 --- a/src/main/resources/templates/pdf-to-single-page.html +++ b/src/main/resources/templates/pdf-to-single-page.html @@ -14,7 +14,7 @@

-
+
diff --git a/src/main/resources/templates/security/get-info-on-pdf.html b/src/main/resources/templates/security/get-info-on-pdf.html index 41ff4be7..84bf8692 100644 --- a/src/main/resources/templates/security/get-info-on-pdf.html +++ b/src/main/resources/templates/security/get-info-on-pdf.html @@ -16,7 +16,7 @@
+ th:replace="~{fragments/common :: fileSelector(name='fileInput', multiple=false, remoteCall='false', accept='application/pdf')}">

From ba4ad1aff91500578dd6f93c4b617ed473c1f468 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Sun, 28 Jan 2024 17:37:02 +0000 Subject: [PATCH 53/81] langs --- src/main/resources/messages_ar_AR.properties | 39 ++++++++++++++++++- src/main/resources/messages_bg_BG.properties | 39 ++++++++++++++++++- src/main/resources/messages_ca_CA.properties | 39 ++++++++++++++++++- src/main/resources/messages_de_DE.properties | 39 ++++++++++++++++++- src/main/resources/messages_el_GR.properties | 39 ++++++++++++++++++- src/main/resources/messages_en_US.properties | 39 ++++++++++++++++++- src/main/resources/messages_es_ES.properties | 39 ++++++++++++++++++- src/main/resources/messages_eu_ES.properties | 39 ++++++++++++++++++- src/main/resources/messages_fr_FR.properties | 39 ++++++++++++++++++- src/main/resources/messages_hi_IN.properties | 39 ++++++++++++++++++- src/main/resources/messages_hu_HU.properties | 39 ++++++++++++++++++- src/main/resources/messages_id_ID.properties | 39 ++++++++++++++++++- src/main/resources/messages_it_IT.properties | 39 ++++++++++++++++++- src/main/resources/messages_ja_JP.properties | 39 ++++++++++++++++++- src/main/resources/messages_ko_KR.properties | 39 ++++++++++++++++++- src/main/resources/messages_nl_NL.properties | 39 ++++++++++++++++++- src/main/resources/messages_pl_PL.properties | 39 ++++++++++++++++++- src/main/resources/messages_pt_BR.properties | 39 ++++++++++++++++++- src/main/resources/messages_ro_RO.properties | 39 ++++++++++++++++++- src/main/resources/messages_ru_RU.properties | 39 ++++++++++++++++++- .../resources/messages_sr-Latn-RS.properties | 39 ++++++++++++++++++- src/main/resources/messages_sv_SE.properties | 39 ++++++++++++++++++- src/main/resources/messages_tr_TR.properties | 39 ++++++++++++++++++- src/main/resources/messages_zh_CN.properties | 39 ++++++++++++++++++- src/main/resources/messages_zh_TW.properties | 39 ++++++++++++++++++- 25 files changed, 950 insertions(+), 25 deletions(-) diff --git a/src/main/resources/messages_ar_AR.properties b/src/main/resources/messages_ar_AR.properties index cac25052..f37a67a5 100644 --- a/src/main/resources/messages_ar_AR.properties +++ b/src/main/resources/messages_ar_AR.properties @@ -44,7 +44,8 @@ blue=Blue custom=Custom... WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! poweredBy=Powered by - +yes=Yes +no=No changedCredsMessage=Credentials changed! notAuthenticatedMessage=User not authenticated. userNotFoundMessage=User not found. @@ -68,6 +69,7 @@ pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here +pipelineOptions.selectOperation=Select Operation pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.saveButton=Download @@ -384,6 +386,11 @@ home.split-by-sections.title=Split PDF by Sections home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections split-by-sections.tags=Section Split, Divide, Customize +home.AddStampRequest.title=Add Stamp to PDF +home.AddStampRequest.desc=Add text or add image stamps at set locations +AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize + + ########################### # # # WEB PAGES # @@ -459,8 +466,38 @@ HTMLToPDF.header=HTML To PDF HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required HTMLToPDF.submit=Convert HTMLToPDF.credit=Uses WeasyPrint +HTMLToPDF.zoom=Zoom level for displaying the website. +HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) +HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) +HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) +HTMLToPDF.printBackground=Render the background of websites. +HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) +HTMLToPDF.cssMediaType=Change the CSS media type of the page. +HTMLToPDF.none=None +HTMLToPDF.print=Print +HTMLToPDF.screen=Screen +#AddStampRequest +AddStampRequest.header=Stamp PDF +AddStampRequest.title=Stamp PDF +AddStampRequest.stampType=Stamp Type +AddStampRequest.stampText=Stamp Text +AddStampRequest.stampImage=Stamp Image +AddStampRequest.alphabet=Alphabet +AddStampRequest.fontSize=Font/Image Size +AddStampRequest.rotation=Rotation +AddStampRequest.opacity=Opacity +AddStampRequest.position=Position +AddStampRequest.overrideX=Override X Coordinate +AddStampRequest.overrideY=Override Y Coordinate +AddStampRequest.customMargin=Custom Margin +AddStampRequest.customColor=Custom Text Color +AddStampRequest.submit=Submit + #sanitizePDF sanitizePDF.title=Sanitize PDF sanitizePDF.header=Sanitize a PDF file diff --git a/src/main/resources/messages_bg_BG.properties b/src/main/resources/messages_bg_BG.properties index e31749ca..13dce03c 100644 --- a/src/main/resources/messages_bg_BG.properties +++ b/src/main/resources/messages_bg_BG.properties @@ -44,7 +44,8 @@ blue=Синьо custom=Персонализиране... WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! poweredBy=Powered by - +yes=Yes +no=No changedCredsMessage=Идентификационните данни са променени! notAuthenticatedMessage=Потребителят не е автентикиран. userNotFoundMessage=Потребителят не е намерен @@ -68,6 +69,7 @@ pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here +pipelineOptions.selectOperation=Select Operation pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.saveButton=Download @@ -384,6 +386,11 @@ home.split-by-sections.title=Split PDF by Sections home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections split-by-sections.tags=Section Split, Divide, Customize +home.AddStampRequest.title=Add Stamp to PDF +home.AddStampRequest.desc=Add text or add image stamps at set locations +AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize + + ########################### # # # WEB PAGES # @@ -459,8 +466,38 @@ HTMLToPDF.header=HTML към PDF HTMLToPDF.help=Приема HTML файлове и ZIP файлове, съдържащи html/css/изображения и т.н HTMLToPDF.submit=Преобразуване HTMLToPDF.credit=Използва WeasyPrint +HTMLToPDF.zoom=Zoom level for displaying the website. +HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) +HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) +HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) +HTMLToPDF.printBackground=Render the background of websites. +HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) +HTMLToPDF.cssMediaType=Change the CSS media type of the page. +HTMLToPDF.none=None +HTMLToPDF.print=Print +HTMLToPDF.screen=Screen +#AddStampRequest +AddStampRequest.header=Stamp PDF +AddStampRequest.title=Stamp PDF +AddStampRequest.stampType=Stamp Type +AddStampRequest.stampText=Stamp Text +AddStampRequest.stampImage=Stamp Image +AddStampRequest.alphabet=Alphabet +AddStampRequest.fontSize=Font/Image Size +AddStampRequest.rotation=Rotation +AddStampRequest.opacity=Opacity +AddStampRequest.position=Position +AddStampRequest.overrideX=Override X Coordinate +AddStampRequest.overrideY=Override Y Coordinate +AddStampRequest.customMargin=Custom Margin +AddStampRequest.customColor=Custom Text Color +AddStampRequest.submit=Submit + #sanitizePDF sanitizePDF.title=Дезинфектирай PDF sanitizePDF.header=Дезинфектира PDF файл diff --git a/src/main/resources/messages_ca_CA.properties b/src/main/resources/messages_ca_CA.properties index 406eee89..8e6dd4fa 100644 --- a/src/main/resources/messages_ca_CA.properties +++ b/src/main/resources/messages_ca_CA.properties @@ -44,7 +44,8 @@ blue=Blau custom=Personalitzat... WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! poweredBy=Powered by - +yes=Yes +no=No changedCredsMessage=Credentials changed! notAuthenticatedMessage=User not authenticated. userNotFoundMessage=User not found. @@ -68,6 +69,7 @@ pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here +pipelineOptions.selectOperation=Select Operation pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.saveButton=Download @@ -384,6 +386,11 @@ home.split-by-sections.title=Split PDF by Sections home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections split-by-sections.tags=Section Split, Divide, Customize +home.AddStampRequest.title=Add Stamp to PDF +home.AddStampRequest.desc=Add text or add image stamps at set locations +AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize + + ########################### # # # WEB PAGES # @@ -459,8 +466,38 @@ HTMLToPDF.header=HTML To PDF HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required HTMLToPDF.submit=Convert HTMLToPDF.credit=Uses WeasyPrint +HTMLToPDF.zoom=Zoom level for displaying the website. +HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) +HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) +HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) +HTMLToPDF.printBackground=Render the background of websites. +HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) +HTMLToPDF.cssMediaType=Change the CSS media type of the page. +HTMLToPDF.none=None +HTMLToPDF.print=Print +HTMLToPDF.screen=Screen +#AddStampRequest +AddStampRequest.header=Stamp PDF +AddStampRequest.title=Stamp PDF +AddStampRequest.stampType=Stamp Type +AddStampRequest.stampText=Stamp Text +AddStampRequest.stampImage=Stamp Image +AddStampRequest.alphabet=Alphabet +AddStampRequest.fontSize=Font/Image Size +AddStampRequest.rotation=Rotation +AddStampRequest.opacity=Opacity +AddStampRequest.position=Position +AddStampRequest.overrideX=Override X Coordinate +AddStampRequest.overrideY=Override Y Coordinate +AddStampRequest.customMargin=Custom Margin +AddStampRequest.customColor=Custom Text Color +AddStampRequest.submit=Submit + #sanitizePDF sanitizePDF.title=Sanitize PDF sanitizePDF.header=Sanitize a PDF file diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties index 082918c3..cac32d58 100644 --- a/src/main/resources/messages_de_DE.properties +++ b/src/main/resources/messages_de_DE.properties @@ -44,7 +44,8 @@ blue=Blau custom=benutzerdefiniert... WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! poweredBy=Powered by - +yes=Yes +no=No changedCredsMessage=Anmeldedaten geändert! notAuthenticatedMessage=Benutzer nicht authentifiziert. userNotFoundMessage=Benutzer nicht gefunden. @@ -68,6 +69,7 @@ pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here +pipelineOptions.selectOperation=Select Operation pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.saveButton=Download @@ -384,6 +386,11 @@ home.split-by-sections.title=Split PDF by Sections home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections split-by-sections.tags=Section Split, Divide, Customize +home.AddStampRequest.title=Add Stamp to PDF +home.AddStampRequest.desc=Add text or add image stamps at set locations +AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize + + ########################### # # # WEB PAGES # @@ -459,8 +466,38 @@ HTMLToPDF.header=HTML zu PDF HTMLToPDF.help=Akzeptiert HTML-Dateien und ZIPs mit html/css/images etc. HTMLToPDF.submit=Konvertieren HTMLToPDF.credit=Verwendet WeasyPrint +HTMLToPDF.zoom=Zoom level for displaying the website. +HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) +HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) +HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) +HTMLToPDF.printBackground=Render the background of websites. +HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) +HTMLToPDF.cssMediaType=Change the CSS media type of the page. +HTMLToPDF.none=None +HTMLToPDF.print=Print +HTMLToPDF.screen=Screen +#AddStampRequest +AddStampRequest.header=Stamp PDF +AddStampRequest.title=Stamp PDF +AddStampRequest.stampType=Stamp Type +AddStampRequest.stampText=Stamp Text +AddStampRequest.stampImage=Stamp Image +AddStampRequest.alphabet=Alphabet +AddStampRequest.fontSize=Font/Image Size +AddStampRequest.rotation=Rotation +AddStampRequest.opacity=Opacity +AddStampRequest.position=Position +AddStampRequest.overrideX=Override X Coordinate +AddStampRequest.overrideY=Override Y Coordinate +AddStampRequest.customMargin=Custom Margin +AddStampRequest.customColor=Custom Text Color +AddStampRequest.submit=Submit + #sanitizePDF sanitizePDF.title=PDF Bereinigen sanitizePDF.header=PDF Bereinigen diff --git a/src/main/resources/messages_el_GR.properties b/src/main/resources/messages_el_GR.properties index 83bf96b4..2e45c141 100644 --- a/src/main/resources/messages_el_GR.properties +++ b/src/main/resources/messages_el_GR.properties @@ -44,7 +44,8 @@ blue=\u039C\u03C0\u03BB\u03AD custom=\u03A0\u03C1\u03BF\u03C3\u03B1\u03C1\u03BC\u03BF\u03B3\u03AE... WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! poweredBy=Powered by - +yes=Yes +no=No changedCredsMessage=\u03A4\u03B1 \u03B4\u03B9\u03B1\u03C0\u03B9\u03C3\u03C4\u03B5\u03C5\u03C4\u03AE\u03C1\u03B9\u03B1 \u03AD\u03C7\u03BF\u03C5\u03BD \u03B1\u03BB\u03BB\u03AC\u03BE\u03B5\u03B9! notAuthenticatedMessage=\u039F \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7\u03C2 \u03B4\u03B5\u03BD \u03AD\u03C7\u03B5\u03B9 \u03B1\u03C5\u03B8\u03B5\u03BD\u03C4\u03B9\u03BA\u03BF\u03C0\u03BF\u03B9\u03B7\u03B8\u03B5\u03AF. userNotFoundMessage=\u039F \u03C7\u03C1\u03AE\u03C3\u03C4\u03B7\u03C2 \u03B4\u03B5\u03BD \u03B2\u03C1\u03AD\u03B8\u03B7\u03BA\u03B5. @@ -68,6 +69,7 @@ pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here +pipelineOptions.selectOperation=Select Operation pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.saveButton=Download @@ -384,6 +386,11 @@ home.split-by-sections.title=Split PDF by Sections home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections split-by-sections.tags=Section Split, Divide, Customize +home.AddStampRequest.title=Add Stamp to PDF +home.AddStampRequest.desc=Add text or add image stamps at set locations +AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize + + ########################### # # # WEB PAGES # @@ -459,8 +466,38 @@ HTMLToPDF.header=HTML \u03C3\u03B5 PDF HTMLToPDF.help=\u0394\u03AD\u03C7\u03B5\u03C4\u03B1\u03B9 \u03B1\u03C1\u03C7\u03B5\u03AF\u03B1 \u03C4\u03CD\u03C0\u03BF\u03C5 HTML \u03BA\u03B1\u03B9 \u03C4\u03CD\u03C0\u03BF\u03C5 ZIP \u03C0\u03BF\u03C5 \u03C0\u03B5\u03C1\u03B9\u03AD\u03C7\u03BF\u03C5\u03BD html/css/\u03B5\u03B9\u03BA\u03CC\u03BD\u03B5\u03C2 \u03BA.\u03BB\u03C0. \u03C0\u03BF\u03C5 \u03B1\u03C0\u03B1\u03B9\u03C4\u03BF\u03CD\u03BD\u03C4\u03B1\u03B9 HTMLToPDF.submit=\u039C\u03B5\u03C4\u03B1\u03C4\u03C1\u03BF\u03C0\u03AE HTMLToPDF.credit=\u03A7\u03C1\u03B7\u03C3\u03B9\u03BC\u03BF\u03C0\u03BF\u03B9\u03B5\u03AF WeasyPrint +HTMLToPDF.zoom=Zoom level for displaying the website. +HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) +HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) +HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) +HTMLToPDF.printBackground=Render the background of websites. +HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) +HTMLToPDF.cssMediaType=Change the CSS media type of the page. +HTMLToPDF.none=None +HTMLToPDF.print=Print +HTMLToPDF.screen=Screen +#AddStampRequest +AddStampRequest.header=Stamp PDF +AddStampRequest.title=Stamp PDF +AddStampRequest.stampType=Stamp Type +AddStampRequest.stampText=Stamp Text +AddStampRequest.stampImage=Stamp Image +AddStampRequest.alphabet=Alphabet +AddStampRequest.fontSize=Font/Image Size +AddStampRequest.rotation=Rotation +AddStampRequest.opacity=Opacity +AddStampRequest.position=Position +AddStampRequest.overrideX=Override X Coordinate +AddStampRequest.overrideY=Override Y Coordinate +AddStampRequest.customMargin=Custom Margin +AddStampRequest.customColor=Custom Text Color +AddStampRequest.submit=Submit + #sanitizePDF sanitizePDF.title=\u0391\u03C0\u03BF\u03BB\u03CD\u03BC\u03B1\u03BD\u03C3\u03B7 PDF sanitizePDF.header=\u0391\u03C0\u03BF\u03BB\u03CD\u03BC\u03B1\u03BD\u03C3\u03B7 \u03B5\u03BD\u03CC\u03C2 PDF \u03B1\u03C1\u03C7\u03B5\u03AF\u03BF\u03C5 diff --git a/src/main/resources/messages_en_US.properties b/src/main/resources/messages_en_US.properties index d6f7ef71..58bdafda 100644 --- a/src/main/resources/messages_en_US.properties +++ b/src/main/resources/messages_en_US.properties @@ -44,7 +44,8 @@ blue=Blue custom=Custom... WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! poweredBy=Powered by - +yes=Yes +no=No changedCredsMessage=Credentials changed! notAuthenticatedMessage=User not authenticated. userNotFoundMessage=User not found. @@ -68,6 +69,7 @@ pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here +pipelineOptions.selectOperation=Select Operation pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.saveButton=Download @@ -384,6 +386,11 @@ home.split-by-sections.title=Split PDF by Sections home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections split-by-sections.tags=Section Split, Divide, Customize +home.AddStampRequest.title=Add Stamp to PDF +home.AddStampRequest.desc=Add text or add image stamps at set locations +AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize + + ########################### # # # WEB PAGES # @@ -459,8 +466,38 @@ HTMLToPDF.header=HTML To PDF HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required HTMLToPDF.submit=Convert HTMLToPDF.credit=Uses WeasyPrint +HTMLToPDF.zoom=Zoom level for displaying the website. +HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) +HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) +HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) +HTMLToPDF.printBackground=Render the background of websites. +HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) +HTMLToPDF.cssMediaType=Change the CSS media type of the page. +HTMLToPDF.none=None +HTMLToPDF.print=Print +HTMLToPDF.screen=Screen +#AddStampRequest +AddStampRequest.header=Stamp PDF +AddStampRequest.title=Stamp PDF +AddStampRequest.stampType=Stamp Type +AddStampRequest.stampText=Stamp Text +AddStampRequest.stampImage=Stamp Image +AddStampRequest.alphabet=Alphabet +AddStampRequest.fontSize=Font/Image Size +AddStampRequest.rotation=Rotation +AddStampRequest.opacity=Opacity +AddStampRequest.position=Position +AddStampRequest.overrideX=Override X Coordinate +AddStampRequest.overrideY=Override Y Coordinate +AddStampRequest.customMargin=Custom Margin +AddStampRequest.customColor=Custom Text Color +AddStampRequest.submit=Submit + #sanitizePDF sanitizePDF.title=Sanitize PDF sanitizePDF.header=Sanitize a PDF file diff --git a/src/main/resources/messages_es_ES.properties b/src/main/resources/messages_es_ES.properties index 887b14de..538cc776 100644 --- a/src/main/resources/messages_es_ES.properties +++ b/src/main/resources/messages_es_ES.properties @@ -44,7 +44,8 @@ blue=Azul custom=Personalizado... WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! poweredBy=Powered by - +yes=Yes +no=No changedCredsMessage=Se cambiaron las credenciales! notAuthenticatedMessage=Usuario no autentificado. userNotFoundMessage=Usuario no encontrado. @@ -68,6 +69,7 @@ pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here +pipelineOptions.selectOperation=Select Operation pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.saveButton=Download @@ -384,6 +386,11 @@ home.split-by-sections.title=Dividir PDF por Secciones home.split-by-sections.desc=Dividir cada página de un PDF en secciones verticales y horizontales más pequeñas split-by-sections.tags=Dividir sección, Dividir, Personalizar +home.AddStampRequest.title=Add Stamp to PDF +home.AddStampRequest.desc=Add text or add image stamps at set locations +AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize + + ########################### # # # WEB PAGES # @@ -459,8 +466,38 @@ HTMLToPDF.header=HTML a PDF HTMLToPDF.help=Acepta archivos HTML y ZIPs conteniendo los html/css/imágenes, etc, requeridas HTMLToPDF.submit=Convertir HTMLToPDF.credit=Utiliza WeasyPrint +HTMLToPDF.zoom=Zoom level for displaying the website. +HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) +HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) +HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) +HTMLToPDF.printBackground=Render the background of websites. +HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) +HTMLToPDF.cssMediaType=Change the CSS media type of the page. +HTMLToPDF.none=None +HTMLToPDF.print=Print +HTMLToPDF.screen=Screen +#AddStampRequest +AddStampRequest.header=Stamp PDF +AddStampRequest.title=Stamp PDF +AddStampRequest.stampType=Stamp Type +AddStampRequest.stampText=Stamp Text +AddStampRequest.stampImage=Stamp Image +AddStampRequest.alphabet=Alphabet +AddStampRequest.fontSize=Font/Image Size +AddStampRequest.rotation=Rotation +AddStampRequest.opacity=Opacity +AddStampRequest.position=Position +AddStampRequest.overrideX=Override X Coordinate +AddStampRequest.overrideY=Override Y Coordinate +AddStampRequest.customMargin=Custom Margin +AddStampRequest.customColor=Custom Text Color +AddStampRequest.submit=Submit + #sanitizePDF sanitizePDF.title=Desinfectar archivo PDF sanitizePDF.header=Desinfectar un archivo PDF diff --git a/src/main/resources/messages_eu_ES.properties b/src/main/resources/messages_eu_ES.properties index ef9b628a..4a3e8552 100644 --- a/src/main/resources/messages_eu_ES.properties +++ b/src/main/resources/messages_eu_ES.properties @@ -44,7 +44,8 @@ blue=Urdina custom=Pertsonalizatu... WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! poweredBy=Powered by - +yes=Yes +no=No changedCredsMessage=Credentials changed! notAuthenticatedMessage=User not authenticated. userNotFoundMessage=User not found. @@ -68,6 +69,7 @@ pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here +pipelineOptions.selectOperation=Select Operation pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.saveButton=Download @@ -384,6 +386,11 @@ home.split-by-sections.title=Split PDF by Sections home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections split-by-sections.tags=Section Split, Divide, Customize +home.AddStampRequest.title=Add Stamp to PDF +home.AddStampRequest.desc=Add text or add image stamps at set locations +AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize + + ########################### # # # WEB PAGES # @@ -459,8 +466,38 @@ HTMLToPDF.header=HTML bat PDF-ra HTMLToPDF.help=Html/css/images etab dituen HTML eta Zip fitxategiak onartzen ditu HTMLToPDF.submit=Bihurtu HTMLToPDF.credit=WeasyPrint darabil +HTMLToPDF.zoom=Zoom level for displaying the website. +HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) +HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) +HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) +HTMLToPDF.printBackground=Render the background of websites. +HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) +HTMLToPDF.cssMediaType=Change the CSS media type of the page. +HTMLToPDF.none=None +HTMLToPDF.print=Print +HTMLToPDF.screen=Screen +#AddStampRequest +AddStampRequest.header=Stamp PDF +AddStampRequest.title=Stamp PDF +AddStampRequest.stampType=Stamp Type +AddStampRequest.stampText=Stamp Text +AddStampRequest.stampImage=Stamp Image +AddStampRequest.alphabet=Alphabet +AddStampRequest.fontSize=Font/Image Size +AddStampRequest.rotation=Rotation +AddStampRequest.opacity=Opacity +AddStampRequest.position=Position +AddStampRequest.overrideX=Override X Coordinate +AddStampRequest.overrideY=Override Y Coordinate +AddStampRequest.customMargin=Custom Margin +AddStampRequest.customColor=Custom Text Color +AddStampRequest.submit=Submit + #sanitizePDF sanitizePDF.title=PDF-a desinfektatu sanitizePDF.header=PDF fitxategi bat desinfektatu diff --git a/src/main/resources/messages_fr_FR.properties b/src/main/resources/messages_fr_FR.properties index 80da3038..d6462b66 100644 --- a/src/main/resources/messages_fr_FR.properties +++ b/src/main/resources/messages_fr_FR.properties @@ -44,7 +44,8 @@ blue=Bleu custom=Personnalisé\u2026 WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! poweredBy=Powered by - +yes=Yes +no=No changedCredsMessage=Les identifiants ont été mis à jour\u00a0! notAuthenticatedMessage=Utilisateur non authentifié. userNotFoundMessage=Utilisateur non trouvé. @@ -68,6 +69,7 @@ pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here +pipelineOptions.selectOperation=Select Operation pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.saveButton=Download @@ -384,6 +386,11 @@ home.split-by-sections.title=Split PDF by Sections home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections split-by-sections.tags=Section Split, Divide, Customize +home.AddStampRequest.title=Add Stamp to PDF +home.AddStampRequest.desc=Add text or add image stamps at set locations +AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize + + ########################### # # # WEB PAGES # @@ -459,8 +466,38 @@ HTMLToPDF.header=HTML en PDF HTMLToPDF.help=Accepte les fichiers HTML et les ZIP contenant du HTML, du CSS, des images, etc. (requis). HTMLToPDF.submit=Convertir HTMLToPDF.credit=Utilise WeasyPrint. +HTMLToPDF.zoom=Zoom level for displaying the website. +HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) +HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) +HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) +HTMLToPDF.printBackground=Render the background of websites. +HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) +HTMLToPDF.cssMediaType=Change the CSS media type of the page. +HTMLToPDF.none=None +HTMLToPDF.print=Print +HTMLToPDF.screen=Screen +#AddStampRequest +AddStampRequest.header=Stamp PDF +AddStampRequest.title=Stamp PDF +AddStampRequest.stampType=Stamp Type +AddStampRequest.stampText=Stamp Text +AddStampRequest.stampImage=Stamp Image +AddStampRequest.alphabet=Alphabet +AddStampRequest.fontSize=Font/Image Size +AddStampRequest.rotation=Rotation +AddStampRequest.opacity=Opacity +AddStampRequest.position=Position +AddStampRequest.overrideX=Override X Coordinate +AddStampRequest.overrideY=Override Y Coordinate +AddStampRequest.customMargin=Custom Margin +AddStampRequest.customColor=Custom Text Color +AddStampRequest.submit=Submit + #sanitizePDF sanitizePDF.title=Assainir sanitizePDF.header=Assainir diff --git a/src/main/resources/messages_hi_IN.properties b/src/main/resources/messages_hi_IN.properties index a44f3c5b..5b33891d 100644 --- a/src/main/resources/messages_hi_IN.properties +++ b/src/main/resources/messages_hi_IN.properties @@ -44,7 +44,8 @@ blue=नीला custom=कस्टम... WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! poweredBy=Powered by - +yes=Yes +no=No changedCredsMessage=क्रेडेंशियल्स बदल दी गईं! notAuthenticatedMessage=उपयोगकर्ता प्रमाणित नहीं है। userNotFoundMessage=उपयोगकर्ता नहीं मिला। @@ -68,6 +69,7 @@ pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here +pipelineOptions.selectOperation=Select Operation pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.saveButton=Download @@ -384,6 +386,11 @@ home.split-by-sections.title=खंडों से पीडीएफ़ वि home.split-by-sections.desc=पीडीएफ़ के प्रत्येक पृष्ठ को छोटे से छोटे क्षैतिज और ऊर्ध्वाधर खंडों में विभाजित करें split-by-sections.tags=खंड विभाजन, विभाजित करें, अनुकूलित +home.AddStampRequest.title=Add Stamp to PDF +home.AddStampRequest.desc=Add text or add image stamps at set locations +AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize + + ########################### # # # WEB PAGES # @@ -459,8 +466,38 @@ HTMLToPDF.header=HTML से पीडीएफ़ HTMLToPDF.help=HTML फ़ाइलों और html/css/images आदि को आत्मसात करने वाले ZIPs को स्वीकार करता है HTMLToPDF.submit=रूपांतरित करें HTMLToPDF.credit=WeasyPrint का प्रयोग होता है +HTMLToPDF.zoom=Zoom level for displaying the website. +HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) +HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) +HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) +HTMLToPDF.printBackground=Render the background of websites. +HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) +HTMLToPDF.cssMediaType=Change the CSS media type of the page. +HTMLToPDF.none=None +HTMLToPDF.print=Print +HTMLToPDF.screen=Screen +#AddStampRequest +AddStampRequest.header=Stamp PDF +AddStampRequest.title=Stamp PDF +AddStampRequest.stampType=Stamp Type +AddStampRequest.stampText=Stamp Text +AddStampRequest.stampImage=Stamp Image +AddStampRequest.alphabet=Alphabet +AddStampRequest.fontSize=Font/Image Size +AddStampRequest.rotation=Rotation +AddStampRequest.opacity=Opacity +AddStampRequest.position=Position +AddStampRequest.overrideX=Override X Coordinate +AddStampRequest.overrideY=Override Y Coordinate +AddStampRequest.customMargin=Custom Margin +AddStampRequest.customColor=Custom Text Color +AddStampRequest.submit=Submit + #sanitizePDF sanitizePDF.title=पीडीएफ़ को सफाई करें sanitizePDF.header=एक पीडीएफ़ फ़ाइल को सफाई करें diff --git a/src/main/resources/messages_hu_HU.properties b/src/main/resources/messages_hu_HU.properties index 7a43b8ce..c1364ce1 100644 --- a/src/main/resources/messages_hu_HU.properties +++ b/src/main/resources/messages_hu_HU.properties @@ -44,7 +44,8 @@ blue=Kék custom=Egyedi... WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! poweredBy=Powered by - +yes=Yes +no=No changedCredsMessage=A hitelek megváltoztak! notAuthenticatedMessage=Felhasználó nincs hitelesítve. userNotFoundMessage=A felhasználó nem található. @@ -68,6 +69,7 @@ pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here +pipelineOptions.selectOperation=Select Operation pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.saveButton=Download @@ -384,6 +386,11 @@ home.split-by-sections.title=PDF Szakaszokra osztása home.split-by-sections.desc=Minden oldal felosztása kisebb vízszintes és függőleges szakaszokra split-by-sections.tags=Szakasz elosztás, felosztás, testreszabás +home.AddStampRequest.title=Add Stamp to PDF +home.AddStampRequest.desc=Add text or add image stamps at set locations +AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize + + ########################### # # # WEB PAGES # @@ -459,8 +466,38 @@ HTMLToPDF.header=HTML >> PDF HTMLToPDF.help=Elfogad HTML fájlokat és ZIP-fájlokat, amelyek tartalmaznak html/css/képeket stb. HTMLToPDF.submit=Átalakítás HTMLToPDF.credit=WeasyPrint alkalmazása +HTMLToPDF.zoom=Zoom level for displaying the website. +HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) +HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) +HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) +HTMLToPDF.printBackground=Render the background of websites. +HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) +HTMLToPDF.cssMediaType=Change the CSS media type of the page. +HTMLToPDF.none=None +HTMLToPDF.print=Print +HTMLToPDF.screen=Screen +#AddStampRequest +AddStampRequest.header=Stamp PDF +AddStampRequest.title=Stamp PDF +AddStampRequest.stampType=Stamp Type +AddStampRequest.stampText=Stamp Text +AddStampRequest.stampImage=Stamp Image +AddStampRequest.alphabet=Alphabet +AddStampRequest.fontSize=Font/Image Size +AddStampRequest.rotation=Rotation +AddStampRequest.opacity=Opacity +AddStampRequest.position=Position +AddStampRequest.overrideX=Override X Coordinate +AddStampRequest.overrideY=Override Y Coordinate +AddStampRequest.customMargin=Custom Margin +AddStampRequest.customColor=Custom Text Color +AddStampRequest.submit=Submit + #sanitizePDF sanitizePDF.title=PDF tisztítása sanitizePDF.header=PDF fájl megtisztítása diff --git a/src/main/resources/messages_id_ID.properties b/src/main/resources/messages_id_ID.properties index b3ed56a9..926dcd1b 100644 --- a/src/main/resources/messages_id_ID.properties +++ b/src/main/resources/messages_id_ID.properties @@ -44,7 +44,8 @@ blue=Biru custom=Kustom... WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! poweredBy=Powered by - +yes=Yes +no=No changedCredsMessage=Kredensial berubah!! notAuthenticatedMessage=Pengguna tidak ter-autentikasi. userNotFoundMessage=Pengguna tidak ditemukan. @@ -68,6 +69,7 @@ pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here +pipelineOptions.selectOperation=Select Operation pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.saveButton=Download @@ -384,6 +386,11 @@ home.split-by-sections.title=Membagi PDF berdasarkan Bagian home.split-by-sections.desc=Membagi setiap halaman PDF menjadi beberapa bagian horizontal dan vertikal yang lebih kecil split-by-sections.tags=Membagi Bagian, Membagi, Menyesuaikan +home.AddStampRequest.title=Add Stamp to PDF +home.AddStampRequest.desc=Add text or add image stamps at set locations +AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize + + ########################### # # # WEB PAGES # @@ -459,8 +466,38 @@ HTMLToPDF.header=HTML Ke PDF HTMLToPDF.help=Menerima berkas HTML dan ZIP yang berisi html / css / gambar, dll yang diperlukan HTMLToPDF.submit=Konversi HTMLToPDF.credit=Menggunakan WeasyPrint +HTMLToPDF.zoom=Zoom level for displaying the website. +HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) +HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) +HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) +HTMLToPDF.printBackground=Render the background of websites. +HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) +HTMLToPDF.cssMediaType=Change the CSS media type of the page. +HTMLToPDF.none=None +HTMLToPDF.print=Print +HTMLToPDF.screen=Screen +#AddStampRequest +AddStampRequest.header=Stamp PDF +AddStampRequest.title=Stamp PDF +AddStampRequest.stampType=Stamp Type +AddStampRequest.stampText=Stamp Text +AddStampRequest.stampImage=Stamp Image +AddStampRequest.alphabet=Alphabet +AddStampRequest.fontSize=Font/Image Size +AddStampRequest.rotation=Rotation +AddStampRequest.opacity=Opacity +AddStampRequest.position=Position +AddStampRequest.overrideX=Override X Coordinate +AddStampRequest.overrideY=Override Y Coordinate +AddStampRequest.customMargin=Custom Margin +AddStampRequest.customColor=Custom Text Color +AddStampRequest.submit=Submit + #sanitizePDF sanitizePDF.title=Bersihkan PDF sanitizePDF.header=Membersihkan berkas PDF diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index 7ef311ba..b9d011bf 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -44,7 +44,8 @@ blue=Blu custom=Personalizzato WorkInProgess=Lavori in corso, potrebbe non funzionare o essere difettoso, segnalare eventuali problemi! poweredBy=Alimentato da - +yes=Yes +no=No changedCredsMessage=Credenziali cambiate! notAuthenticatedMessage=Utente non autenticato. userNotFoundMessage=Utente non trovato. @@ -68,6 +69,7 @@ pipelineOptions.header=Configurazione Pipeline pipelineOptions.pipelineNameLabel=Nome della Pipeline pipelineOptions.saveSettings=Salva Impostazioni pipelineOptions.pipelineNamePrompt=Inserisci qui il nome della pipeline +pipelineOptions.selectOperation=Select Operation pipelineOptions.addOperationButton=Aggiungi operazione pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.saveButton=Download @@ -384,6 +386,11 @@ home.split-by-sections.title=Dividi PDF per sezioni home.split-by-sections.desc=Dividi ciascuna pagina di un PDF in sezioni orizzontali e verticali più piccole split-by-sections.tags=Dividi sezione, dividi, personalizza +home.AddStampRequest.title=Add Stamp to PDF +home.AddStampRequest.desc=Add text or add image stamps at set locations +AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize + + ########################### # # # WEB PAGES # @@ -459,8 +466,38 @@ HTMLToPDF.header=HTML a PDF HTMLToPDF.help=Accetta file HTML e ZIP contenenti html/css/immagini ecc. richiesti HTMLToPDF.submit=Converti HTMLToPDF.credit=Utilizza WeasyPrint +HTMLToPDF.zoom=Zoom level for displaying the website. +HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) +HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) +HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) +HTMLToPDF.printBackground=Render the background of websites. +HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) +HTMLToPDF.cssMediaType=Change the CSS media type of the page. +HTMLToPDF.none=None +HTMLToPDF.print=Print +HTMLToPDF.screen=Screen +#AddStampRequest +AddStampRequest.header=Stamp PDF +AddStampRequest.title=Stamp PDF +AddStampRequest.stampType=Stamp Type +AddStampRequest.stampText=Stamp Text +AddStampRequest.stampImage=Stamp Image +AddStampRequest.alphabet=Alphabet +AddStampRequest.fontSize=Font/Image Size +AddStampRequest.rotation=Rotation +AddStampRequest.opacity=Opacity +AddStampRequest.position=Position +AddStampRequest.overrideX=Override X Coordinate +AddStampRequest.overrideY=Override Y Coordinate +AddStampRequest.customMargin=Custom Margin +AddStampRequest.customColor=Custom Text Color +AddStampRequest.submit=Submit + #sanitizePDF sanitizePDF.title=Pulire PDF sanitizePDF.header=Pulisci un file PDF diff --git a/src/main/resources/messages_ja_JP.properties b/src/main/resources/messages_ja_JP.properties index 7ba8b206..f369807b 100644 --- a/src/main/resources/messages_ja_JP.properties +++ b/src/main/resources/messages_ja_JP.properties @@ -44,7 +44,8 @@ blue=青 custom=カスタム... WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! poweredBy=Powered by - +yes=Yes +no=No changedCredsMessage=資格情報が変更されました! notAuthenticatedMessage=ユーザーが認証されていません。 userNotFoundMessage=ユーザーが見つかりません。 @@ -68,6 +69,7 @@ pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here +pipelineOptions.selectOperation=Select Operation pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.saveButton=Download @@ -384,6 +386,11 @@ home.split-by-sections.title=Split PDF by Sections home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections split-by-sections.tags=Section Split, Divide, Customize +home.AddStampRequest.title=Add Stamp to PDF +home.AddStampRequest.desc=Add text or add image stamps at set locations +AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize + + ########################### # # # WEB PAGES # @@ -459,8 +466,38 @@ HTMLToPDF.header=HTMLをPDFに変換 HTMLToPDF.help=HTMLファイルと必要なhtml/css/画像などを含むZIPを受け入れます HTMLToPDF.submit=変換 HTMLToPDF.credit=WeasyPrintを使用 +HTMLToPDF.zoom=Zoom level for displaying the website. +HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) +HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) +HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) +HTMLToPDF.printBackground=Render the background of websites. +HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) +HTMLToPDF.cssMediaType=Change the CSS media type of the page. +HTMLToPDF.none=None +HTMLToPDF.print=Print +HTMLToPDF.screen=Screen +#AddStampRequest +AddStampRequest.header=Stamp PDF +AddStampRequest.title=Stamp PDF +AddStampRequest.stampType=Stamp Type +AddStampRequest.stampText=Stamp Text +AddStampRequest.stampImage=Stamp Image +AddStampRequest.alphabet=Alphabet +AddStampRequest.fontSize=Font/Image Size +AddStampRequest.rotation=Rotation +AddStampRequest.opacity=Opacity +AddStampRequest.position=Position +AddStampRequest.overrideX=Override X Coordinate +AddStampRequest.overrideY=Override Y Coordinate +AddStampRequest.customMargin=Custom Margin +AddStampRequest.customColor=Custom Text Color +AddStampRequest.submit=Submit + #sanitizePDF sanitizePDF.title=PDFをサニタイズ sanitizePDF.header=PDFファイルをサニタイズ diff --git a/src/main/resources/messages_ko_KR.properties b/src/main/resources/messages_ko_KR.properties index 0213dc79..bebdb217 100644 --- a/src/main/resources/messages_ko_KR.properties +++ b/src/main/resources/messages_ko_KR.properties @@ -44,7 +44,8 @@ blue=Blue custom=Custom... WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! poweredBy=Powered by - +yes=Yes +no=No changedCredsMessage=계정 정보 변경 성공! notAuthenticatedMessage=User not authenticated. userNotFoundMessage=사용자를 찾을 수 없습니다. @@ -68,6 +69,7 @@ pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here +pipelineOptions.selectOperation=Select Operation pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.saveButton=Download @@ -384,6 +386,11 @@ home.split-by-sections.title=Split PDF by Sections home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections split-by-sections.tags=Section Split, Divide, Customize +home.AddStampRequest.title=Add Stamp to PDF +home.AddStampRequest.desc=Add text or add image stamps at set locations +AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize + + ########################### # # # WEB PAGES # @@ -459,8 +466,38 @@ HTMLToPDF.header=HTML 파일을 PDF 문서로 변환 HTMLToPDF.help=HTML 파일, 또는 html/css/이미지 등을 포함한 ZIP 파일을 받습니다. HTMLToPDF.submit=변환 HTMLToPDF.credit=이 기능은 WeasyPrint를 사용합니다. +HTMLToPDF.zoom=Zoom level for displaying the website. +HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) +HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) +HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) +HTMLToPDF.printBackground=Render the background of websites. +HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) +HTMLToPDF.cssMediaType=Change the CSS media type of the page. +HTMLToPDF.none=None +HTMLToPDF.print=Print +HTMLToPDF.screen=Screen +#AddStampRequest +AddStampRequest.header=Stamp PDF +AddStampRequest.title=Stamp PDF +AddStampRequest.stampType=Stamp Type +AddStampRequest.stampText=Stamp Text +AddStampRequest.stampImage=Stamp Image +AddStampRequest.alphabet=Alphabet +AddStampRequest.fontSize=Font/Image Size +AddStampRequest.rotation=Rotation +AddStampRequest.opacity=Opacity +AddStampRequest.position=Position +AddStampRequest.overrideX=Override X Coordinate +AddStampRequest.overrideY=Override Y Coordinate +AddStampRequest.customMargin=Custom Margin +AddStampRequest.customColor=Custom Text Color +AddStampRequest.submit=Submit + #sanitizePDF sanitizePDF.title=PDF 정제 sanitizePDF.header=PDF 문서 정제 diff --git a/src/main/resources/messages_nl_NL.properties b/src/main/resources/messages_nl_NL.properties index bcfa528c..bac726df 100644 --- a/src/main/resources/messages_nl_NL.properties +++ b/src/main/resources/messages_nl_NL.properties @@ -44,7 +44,8 @@ blue=Blue custom=Custom... WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! poweredBy=Powered by - +yes=Yes +no=No changedCredsMessage=Credentials changed! notAuthenticatedMessage=User not authenticated. userNotFoundMessage=User not found. @@ -68,6 +69,7 @@ pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here +pipelineOptions.selectOperation=Select Operation pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.saveButton=Download @@ -384,6 +386,11 @@ home.split-by-sections.title=Split PDF by Sections home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections split-by-sections.tags=Section Split, Divide, Customize +home.AddStampRequest.title=Add Stamp to PDF +home.AddStampRequest.desc=Add text or add image stamps at set locations +AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize + + ########################### # # # WEB PAGES # @@ -459,8 +466,38 @@ HTMLToPDF.header=HTML naar PDF HTMLToPDF.help=Accepteert HTML-bestanden en ZIP''s die html/css/afbeeldingen etc. bevatten HTMLToPDF.submit=Converteren HTMLToPDF.credit=Gebruikt WeasyPrint +HTMLToPDF.zoom=Zoom level for displaying the website. +HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) +HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) +HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) +HTMLToPDF.printBackground=Render the background of websites. +HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) +HTMLToPDF.cssMediaType=Change the CSS media type of the page. +HTMLToPDF.none=None +HTMLToPDF.print=Print +HTMLToPDF.screen=Screen +#AddStampRequest +AddStampRequest.header=Stamp PDF +AddStampRequest.title=Stamp PDF +AddStampRequest.stampType=Stamp Type +AddStampRequest.stampText=Stamp Text +AddStampRequest.stampImage=Stamp Image +AddStampRequest.alphabet=Alphabet +AddStampRequest.fontSize=Font/Image Size +AddStampRequest.rotation=Rotation +AddStampRequest.opacity=Opacity +AddStampRequest.position=Position +AddStampRequest.overrideX=Override X Coordinate +AddStampRequest.overrideY=Override Y Coordinate +AddStampRequest.customMargin=Custom Margin +AddStampRequest.customColor=Custom Text Color +AddStampRequest.submit=Submit + #sanitizePDF sanitizePDF.title=PDF opschonen sanitizePDF.header=Een PDF-bestand opschonen diff --git a/src/main/resources/messages_pl_PL.properties b/src/main/resources/messages_pl_PL.properties index 5d08a346..48411999 100644 --- a/src/main/resources/messages_pl_PL.properties +++ b/src/main/resources/messages_pl_PL.properties @@ -44,7 +44,8 @@ blue=Blue custom=Custom... WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! poweredBy=Powered by - +yes=Yes +no=No changedCredsMessage=Credentials changed! notAuthenticatedMessage=User not authenticated. userNotFoundMessage=User not found. @@ -68,6 +69,7 @@ pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here +pipelineOptions.selectOperation=Select Operation pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.saveButton=Download @@ -384,6 +386,11 @@ home.split-by-sections.title=Split PDF by Sections home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections split-by-sections.tags=Section Split, Divide, Customize +home.AddStampRequest.title=Add Stamp to PDF +home.AddStampRequest.desc=Add text or add image stamps at set locations +AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize + + ########################### # # # WEB PAGES # @@ -459,8 +466,38 @@ HTMLToPDF.header=HTML To PDF HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required HTMLToPDF.submit=Convert HTMLToPDF.credit=Uses WeasyPrint +HTMLToPDF.zoom=Zoom level for displaying the website. +HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) +HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) +HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) +HTMLToPDF.printBackground=Render the background of websites. +HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) +HTMLToPDF.cssMediaType=Change the CSS media type of the page. +HTMLToPDF.none=None +HTMLToPDF.print=Print +HTMLToPDF.screen=Screen +#AddStampRequest +AddStampRequest.header=Stamp PDF +AddStampRequest.title=Stamp PDF +AddStampRequest.stampType=Stamp Type +AddStampRequest.stampText=Stamp Text +AddStampRequest.stampImage=Stamp Image +AddStampRequest.alphabet=Alphabet +AddStampRequest.fontSize=Font/Image Size +AddStampRequest.rotation=Rotation +AddStampRequest.opacity=Opacity +AddStampRequest.position=Position +AddStampRequest.overrideX=Override X Coordinate +AddStampRequest.overrideY=Override Y Coordinate +AddStampRequest.customMargin=Custom Margin +AddStampRequest.customColor=Custom Text Color +AddStampRequest.submit=Submit + #sanitizePDF sanitizePDF.title=Sanitize PDF sanitizePDF.header=Sanitize a PDF file diff --git a/src/main/resources/messages_pt_BR.properties b/src/main/resources/messages_pt_BR.properties index 5002f064..0976d83f 100644 --- a/src/main/resources/messages_pt_BR.properties +++ b/src/main/resources/messages_pt_BR.properties @@ -44,7 +44,8 @@ blue=Blue custom=Custom... WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! poweredBy=Powered by - +yes=Yes +no=No changedCredsMessage=Credentials changed! notAuthenticatedMessage=User not authenticated. userNotFoundMessage=User not found. @@ -68,6 +69,7 @@ pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here +pipelineOptions.selectOperation=Select Operation pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.saveButton=Download @@ -384,6 +386,11 @@ home.split-by-sections.title=Split PDF by Sections home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections split-by-sections.tags=Section Split, Divide, Customize +home.AddStampRequest.title=Add Stamp to PDF +home.AddStampRequest.desc=Add text or add image stamps at set locations +AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize + + ########################### # # # WEB PAGES # @@ -459,8 +466,38 @@ HTMLToPDF.header=HTML para PDF HTMLToPDF.help=Aceita arquivos HTML e ZIPs contendo html/css/imagens etc necessários HTMLToPDF.submit=Converter HTMLToPDF.credit=Usa o WeasyPrint +HTMLToPDF.zoom=Zoom level for displaying the website. +HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) +HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) +HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) +HTMLToPDF.printBackground=Render the background of websites. +HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) +HTMLToPDF.cssMediaType=Change the CSS media type of the page. +HTMLToPDF.none=None +HTMLToPDF.print=Print +HTMLToPDF.screen=Screen +#AddStampRequest +AddStampRequest.header=Stamp PDF +AddStampRequest.title=Stamp PDF +AddStampRequest.stampType=Stamp Type +AddStampRequest.stampText=Stamp Text +AddStampRequest.stampImage=Stamp Image +AddStampRequest.alphabet=Alphabet +AddStampRequest.fontSize=Font/Image Size +AddStampRequest.rotation=Rotation +AddStampRequest.opacity=Opacity +AddStampRequest.position=Position +AddStampRequest.overrideX=Override X Coordinate +AddStampRequest.overrideY=Override Y Coordinate +AddStampRequest.customMargin=Custom Margin +AddStampRequest.customColor=Custom Text Color +AddStampRequest.submit=Submit + #sanitizePDF sanitizePDF.title=Sanitizar PDF sanitizePDF.header=Sanitizar um arquivo PDF diff --git a/src/main/resources/messages_ro_RO.properties b/src/main/resources/messages_ro_RO.properties index dbbd73d2..d6f3b97a 100644 --- a/src/main/resources/messages_ro_RO.properties +++ b/src/main/resources/messages_ro_RO.properties @@ -44,7 +44,8 @@ blue=Blue custom=Custom... WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! poweredBy=Powered by - +yes=Yes +no=No changedCredsMessage=Credentials changed! notAuthenticatedMessage=User not authenticated. userNotFoundMessage=User not found. @@ -68,6 +69,7 @@ pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here +pipelineOptions.selectOperation=Select Operation pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.saveButton=Download @@ -384,6 +386,11 @@ home.split-by-sections.title=Split PDF by Sections home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections split-by-sections.tags=Section Split, Divide, Customize +home.AddStampRequest.title=Add Stamp to PDF +home.AddStampRequest.desc=Add text or add image stamps at set locations +AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize + + ########################### # # # WEB PAGES # @@ -459,8 +466,38 @@ HTMLToPDF.header=HTML To PDF HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required HTMLToPDF.submit=Convert HTMLToPDF.credit=Uses WeasyPrint +HTMLToPDF.zoom=Zoom level for displaying the website. +HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) +HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) +HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) +HTMLToPDF.printBackground=Render the background of websites. +HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) +HTMLToPDF.cssMediaType=Change the CSS media type of the page. +HTMLToPDF.none=None +HTMLToPDF.print=Print +HTMLToPDF.screen=Screen +#AddStampRequest +AddStampRequest.header=Stamp PDF +AddStampRequest.title=Stamp PDF +AddStampRequest.stampType=Stamp Type +AddStampRequest.stampText=Stamp Text +AddStampRequest.stampImage=Stamp Image +AddStampRequest.alphabet=Alphabet +AddStampRequest.fontSize=Font/Image Size +AddStampRequest.rotation=Rotation +AddStampRequest.opacity=Opacity +AddStampRequest.position=Position +AddStampRequest.overrideX=Override X Coordinate +AddStampRequest.overrideY=Override Y Coordinate +AddStampRequest.customMargin=Custom Margin +AddStampRequest.customColor=Custom Text Color +AddStampRequest.submit=Submit + #sanitizePDF sanitizePDF.title=Sanitize PDF sanitizePDF.header=Sanitize a PDF file diff --git a/src/main/resources/messages_ru_RU.properties b/src/main/resources/messages_ru_RU.properties index 1b6fa7f0..289b0fa6 100644 --- a/src/main/resources/messages_ru_RU.properties +++ b/src/main/resources/messages_ru_RU.properties @@ -44,7 +44,8 @@ blue=Blue custom=Custom... WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! poweredBy=Powered by - +yes=Yes +no=No changedCredsMessage=Credentials changed! notAuthenticatedMessage=User not authenticated. userNotFoundMessage=User not found. @@ -68,6 +69,7 @@ pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here +pipelineOptions.selectOperation=Select Operation pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.saveButton=Download @@ -384,6 +386,11 @@ home.split-by-sections.title=Split PDF by Sections home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections split-by-sections.tags=Section Split, Divide, Customize +home.AddStampRequest.title=Add Stamp to PDF +home.AddStampRequest.desc=Add text or add image stamps at set locations +AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize + + ########################### # # # WEB PAGES # @@ -459,8 +466,38 @@ HTMLToPDF.header=HTML в PDF HTMLToPDF.help=Принимает файлы HTML и ZIP-файлы, содержащие html/css/изображения и т. д. HTMLToPDF.submit=Конвертировать HTMLToPDF.credit=Использует WeasyPrint +HTMLToPDF.zoom=Zoom level for displaying the website. +HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) +HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) +HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) +HTMLToPDF.printBackground=Render the background of websites. +HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) +HTMLToPDF.cssMediaType=Change the CSS media type of the page. +HTMLToPDF.none=None +HTMLToPDF.print=Print +HTMLToPDF.screen=Screen +#AddStampRequest +AddStampRequest.header=Stamp PDF +AddStampRequest.title=Stamp PDF +AddStampRequest.stampType=Stamp Type +AddStampRequest.stampText=Stamp Text +AddStampRequest.stampImage=Stamp Image +AddStampRequest.alphabet=Alphabet +AddStampRequest.fontSize=Font/Image Size +AddStampRequest.rotation=Rotation +AddStampRequest.opacity=Opacity +AddStampRequest.position=Position +AddStampRequest.overrideX=Override X Coordinate +AddStampRequest.overrideY=Override Y Coordinate +AddStampRequest.customMargin=Custom Margin +AddStampRequest.customColor=Custom Text Color +AddStampRequest.submit=Submit + #sanitizePDF sanitizePDF.title=Дезинфицировать PDF sanitizePDF.header=Дезинфицировать PDF файл diff --git a/src/main/resources/messages_sr-Latn-RS.properties b/src/main/resources/messages_sr-Latn-RS.properties index 620e7df8..9ff6d44a 100644 --- a/src/main/resources/messages_sr-Latn-RS.properties +++ b/src/main/resources/messages_sr-Latn-RS.properties @@ -44,7 +44,8 @@ blue=Plavo custom=Prilagođeno... WorkInProgess=Radovi u toku, možda neće raditi ili će biti grešaka, molimo prijavite sve probleme ! poweredBy=Powered by - +yes=Yes +no=No changedCredsMessage=Podaci za prijavu uspešno promenjeni! notAuthenticatedMessage=Korisnik nije autentifikovan. userNotFoundMessage=Korisnik nije pronađen. @@ -68,6 +69,7 @@ pipelineOptions.header=Konfiguracija Pipeline-a pipelineOptions.pipelineNameLabel=Ime Pipeline-a pipelineOptions.saveSettings=Sačuvaj podešavanja pipelineOptions.pipelineNamePrompt=Unesite ime pipeline-a ovde +pipelineOptions.selectOperation=Select Operation pipelineOptions.addOperationButton=Dodaj operaciju pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.saveButton=Preuzmi @@ -384,6 +386,11 @@ home.split-by-sections.title=Deljenje PDF-a po Odeljcima home.split-by-sections.desc=Deljenje svake stranice PDF-a na manje horizontalne i vertikalne odeljke split-by-sections.tags=Deljenje odeljaka,Deljenje,Podešavanje +home.AddStampRequest.title=Add Stamp to PDF +home.AddStampRequest.desc=Add text or add image stamps at set locations +AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize + + ########################### # # # WEB PAGES # @@ -459,8 +466,38 @@ HTMLToPDF.header=HTML u PDF HTMLToPDF.help=Prihvata HTML fajlove i ZIP-ove koji sadrže html/css/slike itd. potrebno HTMLToPDF.submit=Konvertuj HTMLToPDF.credit=Koristi WeasyPrint +HTMLToPDF.zoom=Zoom level for displaying the website. +HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) +HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) +HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) +HTMLToPDF.printBackground=Render the background of websites. +HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) +HTMLToPDF.cssMediaType=Change the CSS media type of the page. +HTMLToPDF.none=None +HTMLToPDF.print=Print +HTMLToPDF.screen=Screen +#AddStampRequest +AddStampRequest.header=Stamp PDF +AddStampRequest.title=Stamp PDF +AddStampRequest.stampType=Stamp Type +AddStampRequest.stampText=Stamp Text +AddStampRequest.stampImage=Stamp Image +AddStampRequest.alphabet=Alphabet +AddStampRequest.fontSize=Font/Image Size +AddStampRequest.rotation=Rotation +AddStampRequest.opacity=Opacity +AddStampRequest.position=Position +AddStampRequest.overrideX=Override X Coordinate +AddStampRequest.overrideY=Override Y Coordinate +AddStampRequest.customMargin=Custom Margin +AddStampRequest.customColor=Custom Text Color +AddStampRequest.submit=Submit + #sanitizePDF sanitizePDF.title=Sanitizacija PDF-a sanitizePDF.header=Sanitizacija PDF fajla diff --git a/src/main/resources/messages_sv_SE.properties b/src/main/resources/messages_sv_SE.properties index 85e2559c..85a934b2 100644 --- a/src/main/resources/messages_sv_SE.properties +++ b/src/main/resources/messages_sv_SE.properties @@ -44,7 +44,8 @@ blue=Blue custom=Custom... WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! poweredBy=Powered by - +yes=Yes +no=No changedCredsMessage=Credentials changed! notAuthenticatedMessage=User not authenticated. userNotFoundMessage=User not found. @@ -68,6 +69,7 @@ pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here +pipelineOptions.selectOperation=Select Operation pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.saveButton=Download @@ -384,6 +386,11 @@ home.split-by-sections.title=Split PDF by Sections home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections split-by-sections.tags=Section Split, Divide, Customize +home.AddStampRequest.title=Add Stamp to PDF +home.AddStampRequest.desc=Add text or add image stamps at set locations +AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize + + ########################### # # # WEB PAGES # @@ -459,8 +466,38 @@ HTMLToPDF.header=HTML To PDF HTMLToPDF.help=Accepts HTML files and ZIPs containing html/css/images etc required HTMLToPDF.submit=Convert HTMLToPDF.credit=Uses WeasyPrint +HTMLToPDF.zoom=Zoom level for displaying the website. +HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) +HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) +HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) +HTMLToPDF.printBackground=Render the background of websites. +HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) +HTMLToPDF.cssMediaType=Change the CSS media type of the page. +HTMLToPDF.none=None +HTMLToPDF.print=Print +HTMLToPDF.screen=Screen +#AddStampRequest +AddStampRequest.header=Stamp PDF +AddStampRequest.title=Stamp PDF +AddStampRequest.stampType=Stamp Type +AddStampRequest.stampText=Stamp Text +AddStampRequest.stampImage=Stamp Image +AddStampRequest.alphabet=Alphabet +AddStampRequest.fontSize=Font/Image Size +AddStampRequest.rotation=Rotation +AddStampRequest.opacity=Opacity +AddStampRequest.position=Position +AddStampRequest.overrideX=Override X Coordinate +AddStampRequest.overrideY=Override Y Coordinate +AddStampRequest.customMargin=Custom Margin +AddStampRequest.customColor=Custom Text Color +AddStampRequest.submit=Submit + #sanitizePDF sanitizePDF.title=Sanitize PDF sanitizePDF.header=Sanitize a PDF file diff --git a/src/main/resources/messages_tr_TR.properties b/src/main/resources/messages_tr_TR.properties index f3071b00..caae0867 100644 --- a/src/main/resources/messages_tr_TR.properties +++ b/src/main/resources/messages_tr_TR.properties @@ -44,7 +44,8 @@ blue=Mavi custom=Özel WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! poweredBy=Powered by - +yes=Yes +no=No changedCredsMessage=Bilgiler değiştirildi! notAuthenticatedMessage=Kullanıcı doğrulanmadı. userNotFoundMessage=Kullanıcı bulunamadı. @@ -68,6 +69,7 @@ pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here +pipelineOptions.selectOperation=Select Operation pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.saveButton=Download @@ -384,6 +386,11 @@ home.split-by-sections.title=Split PDF by Sections home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections split-by-sections.tags=Section Split, Divide, Customize +home.AddStampRequest.title=Add Stamp to PDF +home.AddStampRequest.desc=Add text or add image stamps at set locations +AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize + + ########################### # # # WEB PAGES # @@ -459,8 +466,38 @@ HTMLToPDF.header=HTML'den PDF'e HTMLToPDF.help=HTML dosyalarını ve html/css/görsel vb. içeren ZIP'leri kabul eder HTMLToPDF.submit=Dönüştür HTMLToPDF.credit=WeasyPrint Kullanıyor +HTMLToPDF.zoom=Zoom level for displaying the website. +HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) +HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) +HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) +HTMLToPDF.printBackground=Render the background of websites. +HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) +HTMLToPDF.cssMediaType=Change the CSS media type of the page. +HTMLToPDF.none=None +HTMLToPDF.print=Print +HTMLToPDF.screen=Screen +#AddStampRequest +AddStampRequest.header=Stamp PDF +AddStampRequest.title=Stamp PDF +AddStampRequest.stampType=Stamp Type +AddStampRequest.stampText=Stamp Text +AddStampRequest.stampImage=Stamp Image +AddStampRequest.alphabet=Alphabet +AddStampRequest.fontSize=Font/Image Size +AddStampRequest.rotation=Rotation +AddStampRequest.opacity=Opacity +AddStampRequest.position=Position +AddStampRequest.overrideX=Override X Coordinate +AddStampRequest.overrideY=Override Y Coordinate +AddStampRequest.customMargin=Custom Margin +AddStampRequest.customColor=Custom Text Color +AddStampRequest.submit=Submit + #sanitizePDF sanitizePDF.title=PDF'i Temizle sanitizePDF.header=PDF dosyasını temizle diff --git a/src/main/resources/messages_zh_CN.properties b/src/main/resources/messages_zh_CN.properties index 7498b0c9..46934cba 100644 --- a/src/main/resources/messages_zh_CN.properties +++ b/src/main/resources/messages_zh_CN.properties @@ -44,7 +44,8 @@ blue=Blue custom=Custom... WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! poweredBy=Powered by - +yes=Yes +no=No changedCredsMessage=凭证已更改! notAuthenticatedMessage=用户未经过身份验证。 userNotFoundMessage=未找到用户。 @@ -68,6 +69,7 @@ pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here +pipelineOptions.selectOperation=Select Operation pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.saveButton=Download @@ -384,6 +386,11 @@ home.split-by-sections.title=拆分PDF成小块 home.split-by-sections.desc=将PDF的每一页分割成更小的水平和垂直的部分 split-by-sections.tags=章节拆分、分割、自定义 +home.AddStampRequest.title=Add Stamp to PDF +home.AddStampRequest.desc=Add text or add image stamps at set locations +AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize + + ########################### # # # WEB PAGES # @@ -459,8 +466,38 @@ HTMLToPDF.header=HTML转PDF HTMLToPDF.help=接受HTML文件和包含所需的html/css/images等的ZIP文件 HTMLToPDF.submit=转换 HTMLToPDF.credit=使用WeasyPrint +HTMLToPDF.zoom=Zoom level for displaying the website. +HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) +HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) +HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) +HTMLToPDF.printBackground=Render the background of websites. +HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) +HTMLToPDF.cssMediaType=Change the CSS media type of the page. +HTMLToPDF.none=None +HTMLToPDF.print=Print +HTMLToPDF.screen=Screen +#AddStampRequest +AddStampRequest.header=Stamp PDF +AddStampRequest.title=Stamp PDF +AddStampRequest.stampType=Stamp Type +AddStampRequest.stampText=Stamp Text +AddStampRequest.stampImage=Stamp Image +AddStampRequest.alphabet=Alphabet +AddStampRequest.fontSize=Font/Image Size +AddStampRequest.rotation=Rotation +AddStampRequest.opacity=Opacity +AddStampRequest.position=Position +AddStampRequest.overrideX=Override X Coordinate +AddStampRequest.overrideY=Override Y Coordinate +AddStampRequest.customMargin=Custom Margin +AddStampRequest.customColor=Custom Text Color +AddStampRequest.submit=Submit + #sanitizePDF sanitizePDF.title=清理PDF sanitizePDF.header=清理PDF文件 diff --git a/src/main/resources/messages_zh_TW.properties b/src/main/resources/messages_zh_TW.properties index b6a8811c..e2f0e4d9 100644 --- a/src/main/resources/messages_zh_TW.properties +++ b/src/main/resources/messages_zh_TW.properties @@ -44,7 +44,8 @@ blue=藍色 custom=自訂... WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! poweredBy=Powered by - +yes=Yes +no=No changedCredsMessage=憑證已變更! notAuthenticatedMessage=使用者未認證。 userNotFoundMessage=找不到使用者。 @@ -68,6 +69,7 @@ pipelineOptions.header=Pipeline Configuration pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.pipelineNamePrompt=Enter pipeline name here +pipelineOptions.selectOperation=Select Operation pipelineOptions.addOperationButton=Add operation pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.saveButton=Download @@ -384,6 +386,11 @@ home.split-by-sections.title=依區段分割 PDF home.split-by-sections.desc=將 PDF 的每一頁分割為較小的水平和垂直區段 split-by-sections.tags=區段分割, 劃分, 自訂 +home.AddStampRequest.title=Add Stamp to PDF +home.AddStampRequest.desc=Add text or add image stamps at set locations +AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize + + ########################### # # # WEB PAGES # @@ -459,8 +466,38 @@ HTMLToPDF.header=HTML 轉 PDF HTMLToPDF.help=接受 HTML 文件和包含所需 html/css/images 等的 ZIP HTMLToPDF.submit=轉換 HTMLToPDF.credit=使用 WeasyPrint +HTMLToPDF.zoom=Zoom level for displaying the website. +HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) +HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) +HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) +HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) +HTMLToPDF.printBackground=Render the background of websites. +HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) +HTMLToPDF.cssMediaType=Change the CSS media type of the page. +HTMLToPDF.none=None +HTMLToPDF.print=Print +HTMLToPDF.screen=Screen +#AddStampRequest +AddStampRequest.header=Stamp PDF +AddStampRequest.title=Stamp PDF +AddStampRequest.stampType=Stamp Type +AddStampRequest.stampText=Stamp Text +AddStampRequest.stampImage=Stamp Image +AddStampRequest.alphabet=Alphabet +AddStampRequest.fontSize=Font/Image Size +AddStampRequest.rotation=Rotation +AddStampRequest.opacity=Opacity +AddStampRequest.position=Position +AddStampRequest.overrideX=Override X Coordinate +AddStampRequest.overrideY=Override Y Coordinate +AddStampRequest.customMargin=Custom Margin +AddStampRequest.customColor=Custom Text Color +AddStampRequest.submit=Submit + #sanitizePDF sanitizePDF.title=清理 PDF sanitizePDF.header=清理 PDF 檔案 From 89e461e4f63f19177c1c68f1b74e069cd0e01d31 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Sun, 28 Jan 2024 17:39:07 +0000 Subject: [PATCH 54/81] formats --- .../api/misc/FakeScanControllerWIP.java | 3 +- .../controller/api/misc/StampController.java | 28 +++++++++++++++---- .../api/pipeline/ApiDocService.java | 2 +- .../controller/web/OtherWebController.java | 3 +- 4 files changed, 25 insertions(+), 11 deletions(-) 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 99595049..cf719f56 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 @@ -29,7 +29,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; @@ -50,7 +49,7 @@ public class FakeScanControllerWIP { // TODO @Hidden - //@PostMapping(consumes = "multipart/form-data", value = "/fakeScan") + // @PostMapping(consumes = "multipart/form-data", value = "/fakeScan") @Operation( summary = "Repair a PDF file", description = diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/StampController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/StampController.java index 718c0ddd..0dd4200c 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/StampController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/StampController.java @@ -201,7 +201,15 @@ public class StampController { x = overrideX; y = overrideY; } else { - x = calculatePositionX(pageSize, position, fontSize, font, fontSize, watermarkText, marginFactor); + x = + calculatePositionX( + pageSize, + position, + fontSize, + font, + fontSize, + watermarkText, + marginFactor); y = calculatePositionY(pageSize, position, fontSize, marginFactor); } @@ -247,7 +255,9 @@ public class StampController { x = overrideX; y = overrideY; } else { - x = calculatePositionX(pageSize, position, desiredPhysicalWidth, null, 0, null, marginFactor); + x = + calculatePositionX( + pageSize, position, desiredPhysicalWidth, null, 0, null, marginFactor); y = calculatePositionY(pageSize, position, fontSize, marginFactor); } @@ -259,8 +269,16 @@ public class StampController { } private float calculatePositionX( - PDRectangle pageSize, int position, float contentWidth, PDFont font, float fontSize, String text, float marginFactor) throws IOException { - float actualWidth = (text != null) ? calculateTextWidth(text, font, fontSize) : contentWidth; + PDRectangle pageSize, + int position, + float contentWidth, + PDFont font, + float fontSize, + String text, + float marginFactor) + throws IOException { + float actualWidth = + (text != null) ? calculateTextWidth(text, font, fontSize) : contentWidth; switch (position % 3) { case 1: // Left return pageSize.getLowerLeftX() + marginFactor * pageSize.getWidth(); @@ -277,8 +295,6 @@ public class StampController { return font.getStringWidth(text) / 1000 * fontSize; } - - private float calculatePositionY( PDRectangle pageSize, int position, float height, float marginFactor) { switch ((position - 1) / 3) { diff --git a/src/main/java/stirling/software/SPDF/controller/api/pipeline/ApiDocService.java b/src/main/java/stirling/software/SPDF/controller/api/pipeline/ApiDocService.java index 25537ee2..27240b6f 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/pipeline/ApiDocService.java +++ b/src/main/java/stirling/software/SPDF/controller/api/pipeline/ApiDocService.java @@ -66,7 +66,7 @@ public class ApiDocService { "BOOK", Arrays.asList( "epub", "mobi", "azw3", "fb2", "txt", - "docx")); // As noted before, "Boolean" isn't a file type but a value + "docx")); // type. } diff --git a/src/main/java/stirling/software/SPDF/controller/web/OtherWebController.java b/src/main/java/stirling/software/SPDF/controller/web/OtherWebController.java index 69609536..a7c10908 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/OtherWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/OtherWebController.java @@ -38,14 +38,13 @@ public class OtherWebController { model.addAttribute("currentPage", "show-javascript"); return "misc/show-javascript"; } - + @GetMapping("/stamp") @Hidden public String stampForm(Model model) { model.addAttribute("currentPage", "stamp"); return "misc/stamp"; } - @GetMapping("/add-page-numbers") @Hidden From 80604517137406eb7cae316f933c0c46d5d61a7f Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Sun, 28 Jan 2024 18:16:59 +0000 Subject: [PATCH 55/81] Update AutoSplitPdfController.java --- .../controller/api/misc/AutoSplitPdfController.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) 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 b793fc3e..cf9b6220 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 @@ -43,6 +43,7 @@ import stirling.software.SPDF.utils.WebResponseUtils; public class AutoSplitPdfController { private static final String QR_CONTENT = "https://github.com/Stirling-Tools/Stirling-PDF"; + private static final String QR_CONTENT_OLD = "https://github.com/Frooodle/Stirling-PDF"; @PostMapping(value = "/auto-split-pdf", consumes = "multipart/form-data") @Operation( @@ -63,12 +64,14 @@ public class AutoSplitPdfController { for (int page = 0; page < document.getNumberOfPages(); ++page) { BufferedImage bim = pdfRenderer.renderImageWithDPI(page, 150); String result = decodeQRCode(bim); - - if (QR_CONTENT.equals(result) && page != 0) { + System.out.println("result = " + result); + if ((QR_CONTENT.equals(result) || QR_CONTENT_OLD.equals(result)) && page != 0) { + System.out.println("page " + (page + 1) + " is QR"); splitDocuments.add(new PDDocument()); } - if (!splitDocuments.isEmpty() && !QR_CONTENT.equals(result)) { + if (!splitDocuments.isEmpty() && !QR_CONTENT.equals(result) && !QR_CONTENT_OLD.equals(result)) { + System.out.println("page " + (page + 1) + " is NOT QR"); splitDocuments.get(splitDocuments.size() - 1).addPage(document.getPage(page)); } else if (page == 0) { PDDocument firstDocument = new PDDocument(); @@ -77,7 +80,7 @@ public class AutoSplitPdfController { } // If duplexMode is true and current page is a divider, then skip next page - if (duplexMode && QR_CONTENT.equals(result)) { + if (duplexMode && (QR_CONTENT.equals(result) || QR_CONTENT_OLD.equals(result))) { page++; } } From 6acb593411da56a1c05465f0f1cc0e9ec8f19571 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Sun, 28 Jan 2024 18:17:32 +0000 Subject: [PATCH 56/81] Update AutoSplitPdfController.java --- .../SPDF/controller/api/misc/AutoSplitPdfController.java | 3 --- 1 file changed, 3 deletions(-) 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 cf9b6220..4ca45762 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 @@ -64,14 +64,11 @@ public class AutoSplitPdfController { for (int page = 0; page < document.getNumberOfPages(); ++page) { BufferedImage bim = pdfRenderer.renderImageWithDPI(page, 150); String result = decodeQRCode(bim); - System.out.println("result = " + result); if ((QR_CONTENT.equals(result) || QR_CONTENT_OLD.equals(result)) && page != 0) { - System.out.println("page " + (page + 1) + " is QR"); splitDocuments.add(new PDDocument()); } if (!splitDocuments.isEmpty() && !QR_CONTENT.equals(result) && !QR_CONTENT_OLD.equals(result)) { - System.out.println("page " + (page + 1) + " is NOT QR"); splitDocuments.get(splitDocuments.size() - 1).addPage(document.getPage(page)); } else if (page == 0) { PDDocument firstDocument = new PDDocument(); From 589cb8d91fc85f5ccf827a149913fcb025e74298 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Sun, 28 Jan 2024 20:11:15 +0000 Subject: [PATCH 57/81] Add files via upload --- src/main/resources/static/images/stamp.svg | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 src/main/resources/static/images/stamp.svg diff --git a/src/main/resources/static/images/stamp.svg b/src/main/resources/static/images/stamp.svg new file mode 100644 index 00000000..aa35a6cb --- /dev/null +++ b/src/main/resources/static/images/stamp.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file From 3986858adb1fdc3ed166ea21bd177443f3ebfa34 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Sun, 28 Jan 2024 20:11:41 +0000 Subject: [PATCH 58/81] Update build.gradle --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index e12cbd33..987f9854 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ plugins { import com.github.jk1.license.render.* group = 'stirling.software' -version = '0.20.0' +version = '0.20.1' sourceCompatibility = '17' repositories { From 746f2d09490dc53787d2935d3e93f6070daef5a7 Mon Sep 17 00:00:00 2001 From: albanobattistella <34811668+albanobattistella@users.noreply.github.com> Date: Sun, 28 Jan 2024 21:18:57 +0100 Subject: [PATCH 59/81] Update messages_it_IT.properties --- src/main/resources/messages_it_IT.properties | 70 ++++++++++---------- 1 file changed, 35 insertions(+), 35 deletions(-) diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index b9d011bf..86485d20 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -44,7 +44,7 @@ blue=Blu custom=Personalizzato WorkInProgess=Lavori in corso, potrebbe non funzionare o essere difettoso, segnalare eventuali problemi! poweredBy=Alimentato da -yes=Yes +yes=Si no=No changedCredsMessage=Credenziali cambiate! notAuthenticatedMessage=Utente non autenticato. @@ -69,7 +69,7 @@ pipelineOptions.header=Configurazione Pipeline pipelineOptions.pipelineNameLabel=Nome della Pipeline pipelineOptions.saveSettings=Salva Impostazioni pipelineOptions.pipelineNamePrompt=Inserisci qui il nome della pipeline -pipelineOptions.selectOperation=Select Operation +pipelineOptions.selectOperation=Seleziona operazione pipelineOptions.addOperationButton=Aggiungi operazione pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.saveButton=Download @@ -236,7 +236,7 @@ ocr.tags=riconoscimento,testo,immagine,scansione,lettura,identificazione,rilevam home.extractImages.title=Estrai immagini home.extractImages.desc=Estrai tutte le immagini da un PDF e salvale come zip. -extractImages.tags=picture,photo,save,archive,zip,capture,grab +extractImages.tags=immagine,photo,save,archive,zip,capture,grab home.pdfToPDFA.title=Converti in PDF/A home.pdfToPDFA.desc=Converti un PDF nel formato PDF/A per archiviazione a lungo termine. @@ -313,7 +313,7 @@ add-page-numbers.tags=impaginare,etichettare,organizzare,indicizzare home.auto-rename.title=Rinomina automaticamente il file PDF home.auto-rename.desc=Rinomina automaticamente un file PDF in base all'intestazione rilevata -auto-rename.tags=arilevamento automatico,basato su intestazione,organizzazione,rietichettatura +auto-rename.tags=rilevamento automatico,basato su intestazione,organizzazione,rietichettatura home.adjust-contrast.title=Regola colori/contrasto home.adjust-contrast.desc=Regola contrasto, saturazione e luminosità di un PDF @@ -386,9 +386,9 @@ home.split-by-sections.title=Dividi PDF per sezioni home.split-by-sections.desc=Dividi ciascuna pagina di un PDF in sezioni orizzontali e verticali più piccole split-by-sections.tags=Dividi sezione, dividi, personalizza -home.AddStampRequest.title=Add Stamp to PDF -home.AddStampRequest.desc=Add text or add image stamps at set locations -AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize +home.AddStampRequest.title=Aggiungi timbro al PDF +home.AddStampRequest.desc=Aggiungi testo o aggiungi timbri immagine nelle posizioni prestabilite +AddStampRequest.tags=Timbro, Aggiungi immagine, Centra immagine, Filigrana, PDF, Incorpora, Personalizza ########################### @@ -466,37 +466,37 @@ HTMLToPDF.header=HTML a PDF HTMLToPDF.help=Accetta file HTML e ZIP contenenti html/css/immagini ecc. richiesti HTMLToPDF.submit=Converti HTMLToPDF.credit=Utilizza WeasyPrint -HTMLToPDF.zoom=Zoom level for displaying the website. -HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) -HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) -HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) -HTMLToPDF.printBackground=Render the background of websites. -HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) -HTMLToPDF.cssMediaType=Change the CSS media type of the page. -HTMLToPDF.none=None -HTMLToPDF.print=Print -HTMLToPDF.screen=Screen +HTMLToPDF.zoom=Livello di zoom per la visualizzazione del sito web. +HTMLToPDF.pageWidth=Larghezza della pagina in centimetri. (Vuoto per impostazione predefinita) +HTMLToPDF.pageHeight=Altezza della pagina in centimetri. (Vuoto per impostazione predefinita) +HTMLToPDF.marginTop=Margine superiore della pagina in millimetri. (Vuoto per impostazione predefinita) +HTMLToPDF.marginBottom=Margine inferiore della pagina in millimetri. (Vuoto per impostazione predefinita) +HTMLToPDF.marginLeft=Margine sinistro della pagina in millimetri. (Vuoto per impostazione predefinita) +HTMLToPDF.marginRight=Margine destro della pagina in millimetri. (Vuoto per impostazione predefinita) +HTMLToPDF.printBackground=Rendering dello sfondo dei siti Web. +HTMLToPDF.defaultHeader=Abilita intestazione predefinita (nome e numero di pagina) +HTMLToPDF.cssMediaType=Cambia il tipo di supporto CSS della pagina. +HTMLToPDF.none=Nessuno +HTMLToPDF.print=Stampa +HTMLToPDF.screen=Schermo #AddStampRequest -AddStampRequest.header=Stamp PDF -AddStampRequest.title=Stamp PDF -AddStampRequest.stampType=Stamp Type -AddStampRequest.stampText=Stamp Text -AddStampRequest.stampImage=Stamp Image -AddStampRequest.alphabet=Alphabet -AddStampRequest.fontSize=Font/Image Size -AddStampRequest.rotation=Rotation -AddStampRequest.opacity=Opacity -AddStampRequest.position=Position -AddStampRequest.overrideX=Override X Coordinate -AddStampRequest.overrideY=Override Y Coordinate -AddStampRequest.customMargin=Custom Margin -AddStampRequest.customColor=Custom Text Color -AddStampRequest.submit=Submit +AddStampRequest.header=Timbro PDF +AddStampRequest.title=Timbro PDF +AddStampRequest.stampType=Tipo di timbro +AddStampRequest.stampText=Testo del timbro +AddStampRequest.stampImage=Immagine del timbro +AddStampRequest.alphabet=Alfabeto +AddStampRequest.fontSize=Dimensione carattere/immagine +AddStampRequest.rotation=Rotazione +AddStampRequest.opacity=Opacità +AddStampRequest.position=Posizione +AddStampRequest.overrideX=Sostituisci la coordinata X +AddStampRequest.overrideY=Sostituisci la coordinata Y +AddStampRequest.customMargin=Margine personalizzato +AddStampRequest.customColor=Colore testo personalizzato +AddStampRequest.submit=Invia #sanitizePDF sanitizePDF.title=Pulire PDF From e77d2847ea89faf5478d8843097b3f1f845f73a0 Mon Sep 17 00:00:00 2001 From: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com> Date: Mon, 29 Jan 2024 07:49:02 +0100 Subject: [PATCH 60/81] add new translations --- src/main/resources/messages_nl_NL.properties | 64 ++++++++++---------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/src/main/resources/messages_nl_NL.properties b/src/main/resources/messages_nl_NL.properties index e1202b84..c56e988a 100644 --- a/src/main/resources/messages_nl_NL.properties +++ b/src/main/resources/messages_nl_NL.properties @@ -44,8 +44,8 @@ blue=Blauw custom=Aangepast... WorkInProgess=Werk in uitvoering. Werkt mogelijk niet of bevat fouten. Meld eventuele problemen! poweredBy=Mogelijk gemaakt door -yes=Yes -no=No +yes=Ja +no=Nee changedCredsMessage=Inloggegevens gewijzigd! notAuthenticatedMessage=Gebruiker niet ingelogd. userNotFoundMessage=Gebruiker niet gevonden. @@ -69,7 +69,7 @@ pipelineOptions.header=Pijplijn onfiguratie pipelineOptions.pipelineNameLabel=Pijplijn naam pipelineOptions.saveSettings=Instellingen voor bewerking opslaan pipelineOptions.pipelineNamePrompt=Voer hier de naam van de pijplijn in -pipelineOptions.selectOperation=Select Operation +pipelineOptions.selectOperation=Selecteer bewerking pipelineOptions.addOperationButton=Bewerking toevoegen pipelineOptions.pipelineHeader=Pijplijn: pipelineOptions.saveButton=Downloaden @@ -384,11 +384,11 @@ overlay-pdfs.tags=Overlappen home.split-by-sections.title=PDF in secties splitsen home.split-by-sections.desc=Verdeel elke pagina van een PDF in kleinere horizontale en verticale secties -split-by-sections.tags=Sectoe splitsen, Verdelen, Aanpassen +split-by-sections.tags=Sectie splitsen, Verdelen, Aanpassen -home.AddStampRequest.title=Add Stamp to PDF -home.AddStampRequest.desc=Add text or add image stamps at set locations -AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize +home.AddStampRequest.title=Stempel toevoegen aan PDF +home.AddStampRequest.desc=Voeg tekst of afbeeldingsstempels toe op vaste locaties +AddStampRequest.tags=Stempel, Afbeelding toevoegen, afbeelding centreren, watermerk, PDF, Insluiten, Aanpassen ########################### @@ -467,36 +467,36 @@ HTMLToPDF.help=Accepteert HTML-bestanden en ZIP's die html/css/afbeeldingen etc. HTMLToPDF.submit=Converteren HTMLToPDF.credit=Gebruikt WeasyPrint HTMLToPDF.zoom=Zoom level for displaying the website. -HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) -HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) -HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) -HTMLToPDF.printBackground=Render the background of websites. -HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) -HTMLToPDF.cssMediaType=Change the CSS media type of the page. -HTMLToPDF.none=None +HTMLToPDF.pageWidth=Breedte van de pagina in centimeters. (leeg voor standaard) +HTMLToPDF.pageHeight=Hoogte van de pagina in centimeters. (leeg voor standaard) +HTMLToPDF.marginTop=Marge bovenaan de pagina in millimeters. (leeg voor standaard) +HTMLToPDF.marginBottom=Marge onderaan de pagina in millimeters. (leeg voor standaard) +HTMLToPDF.marginLeft=Marge links van de pagina in millimeters. (leeg voor standaard) +HTMLToPDF.marginRight=Marge rechts van de pagina in millimeters. (leeg voor standaard) +HTMLToPDF.printBackground=De achtergrond van websites weergeven. +HTMLToPDF.defaultHeader=Standaard koptekst weergeven (naam en paginanummer) +HTMLToPDF.cssMediaType=Wijzig het CSS-mediatype van de pagina. +HTMLToPDF.none=Geen HTMLToPDF.print=Print HTMLToPDF.screen=Screen #AddStampRequest -AddStampRequest.header=Stamp PDF -AddStampRequest.title=Stamp PDF -AddStampRequest.stampType=Stamp Type -AddStampRequest.stampText=Stamp Text -AddStampRequest.stampImage=Stamp Image -AddStampRequest.alphabet=Alphabet -AddStampRequest.fontSize=Font/Image Size -AddStampRequest.rotation=Rotation -AddStampRequest.opacity=Opacity -AddStampRequest.position=Position -AddStampRequest.overrideX=Override X Coordinate -AddStampRequest.overrideY=Override Y Coordinate -AddStampRequest.customMargin=Custom Margin -AddStampRequest.customColor=Custom Text Color -AddStampRequest.submit=Submit +AddStampRequest.header=Stempel PDF +AddStampRequest.title=Stempel PDF +AddStampRequest.stampType=Soort stempel +AddStampRequest.stampText=Stempel tekst +AddStampRequest.stampImage=Stempel afbeelding +AddStampRequest.alphabet=Alfabet +AddStampRequest.fontSize=Tekst/afbeelding grootte +AddStampRequest.rotation=Rotatie +AddStampRequest.opacity=Transparantie +AddStampRequest.position=Positie +AddStampRequest.overrideX=X coördinaat overschrijven +AddStampRequest.overrideY=Y coördinaat overschrijven +AddStampRequest.customMargin=Aangepate marge +AddStampRequest.customColor=Aangepaste tekstkleur +AddStampRequest.submit=Indienen #sanitizePDF sanitizePDF.title=PDF opschonen From 53afb865c53b0a000afb50a9932f28e2563b5142 Mon Sep 17 00:00:00 2001 From: sbplat <71648843+sbplat@users.noreply.github.com> Date: Mon, 29 Jan 2024 11:23:58 -0500 Subject: [PATCH 61/81] refactor: replace ImageFinder with getAllImages using strategy behind ExtractImagesController --- .../api/misc/AutoSplitPdfController.java | 4 +- .../api/pipeline/ApiDocService.java | 5 +- .../software/SPDF/pdf/ImageFinder.java | 131 ------------------ .../software/SPDF/utils/PdfUtils.java | 29 +++- 4 files changed, 28 insertions(+), 141 deletions(-) delete mode 100644 src/main/java/stirling/software/SPDF/pdf/ImageFinder.java 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 4ca45762..8b095358 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 @@ -68,7 +68,9 @@ public class AutoSplitPdfController { splitDocuments.add(new PDDocument()); } - if (!splitDocuments.isEmpty() && !QR_CONTENT.equals(result) && !QR_CONTENT_OLD.equals(result)) { + if (!splitDocuments.isEmpty() + && !QR_CONTENT.equals(result) + && !QR_CONTENT_OLD.equals(result)) { splitDocuments.get(splitDocuments.size() - 1).addPage(document.getPage(page)); } else if (page == 0) { PDDocument firstDocument = new PDDocument(); diff --git a/src/main/java/stirling/software/SPDF/controller/api/pipeline/ApiDocService.java b/src/main/java/stirling/software/SPDF/controller/api/pipeline/ApiDocService.java index 27240b6f..02c37e5c 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/pipeline/ApiDocService.java +++ b/src/main/java/stirling/software/SPDF/controller/api/pipeline/ApiDocService.java @@ -63,10 +63,7 @@ public class ApiDocService { outputToFileTypes.put("PPT", Arrays.asList("ppt", "pptx", "odp")); outputToFileTypes.put("XML", Arrays.asList("xml", "xsd", "xsl")); outputToFileTypes.put( - "BOOK", - Arrays.asList( - "epub", "mobi", "azw3", "fb2", "txt", - "docx")); + "BOOK", Arrays.asList("epub", "mobi", "azw3", "fb2", "txt", "docx")); // type. } diff --git a/src/main/java/stirling/software/SPDF/pdf/ImageFinder.java b/src/main/java/stirling/software/SPDF/pdf/ImageFinder.java deleted file mode 100644 index a710dbd5..00000000 --- a/src/main/java/stirling/software/SPDF/pdf/ImageFinder.java +++ /dev/null @@ -1,131 +0,0 @@ -package stirling.software.SPDF.pdf; - -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; -import org.apache.pdfbox.cos.COSName; -import org.apache.pdfbox.pdmodel.PDPage; -import org.apache.pdfbox.pdmodel.graphics.PDXObject; -import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; -import org.apache.pdfbox.pdmodel.graphics.image.PDImage; -import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; - -public class ImageFinder extends org.apache.pdfbox.contentstream.PDFGraphicsStreamEngine { - private boolean hasImages = false; - - public ImageFinder(PDPage page) { - super(page); - } - - public boolean hasImages() { - return hasImages; - } - - @Override - protected void processOperator(Operator operator, List operands) throws IOException { - String operation = operator.getName(); - if (operation.equals(OperatorName.DRAW_OBJECT)) { - COSBase base = operands.get(0); - if (base instanceof COSName) { - COSName objectName = (COSName) base; - PDXObject xobject = getResources().getXObject(objectName); - if (xobject instanceof PDImageXObject) { - hasImages = true; - } else if (xobject instanceof PDFormXObject) { - PDFormXObject form = (PDFormXObject) xobject; - ImageFinder innerFinder = new ImageFinder(getPage()); - innerFinder.processPage(getPage()); - if (innerFinder.hasImages()) { - hasImages = true; - } - } - } - } - super.processOperator(operator, operands); - } - - @Override - public void appendRectangle(Point2D p0, Point2D p1, Point2D p2, Point2D p3) throws IOException { - // TODO Auto-generated method stub - - } - - @Override - public void drawImage(PDImage pdImage) throws IOException { - // TODO Auto-generated method stub - - } - - @Override - public void clip(int windingRule) throws IOException { - // TODO Auto-generated method stub - - } - - @Override - public void moveTo(float x, float y) throws IOException { - // TODO Auto-generated method stub - - } - - @Override - public void lineTo(float x, float y) throws IOException { - // TODO Auto-generated method stub - - } - - @Override - public void curveTo(float x1, float y1, float x2, float y2, float x3, float y3) - throws IOException { - // TODO Auto-generated method stub - - } - - @Override - public Point2D getCurrentPoint() throws IOException { - // TODO Auto-generated method stub - return null; - } - - @Override - public void closePath() throws IOException { - // TODO Auto-generated method stub - - } - - @Override - public void endPath() throws IOException { - // TODO Auto-generated method stub - - } - - @Override - public void strokePath() throws IOException { - // TODO Auto-generated method stub - - } - - @Override - public void fillPath(int windingRule) throws IOException { - // TODO Auto-generated method stub - - } - - @Override - public void fillAndStrokePath(int windingRule) throws IOException { - // TODO Auto-generated method stub - - } - - @Override - public void shadingFill(COSName shadingName) throws IOException { - // TODO Auto-generated method stub - - } - - // ... rest of the overridden methods -} diff --git a/src/main/java/stirling/software/SPDF/utils/PdfUtils.java b/src/main/java/stirling/software/SPDF/utils/PdfUtils.java index 426fc78d..1676ce85 100644 --- a/src/main/java/stirling/software/SPDF/utils/PdfUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/PdfUtils.java @@ -2,8 +2,10 @@ package stirling.software.SPDF.utils; import java.awt.Graphics; import java.awt.image.BufferedImage; +import java.awt.image.RenderedImage; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.util.ArrayList; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; @@ -16,11 +18,15 @@ import javax.imageio.ImageWriter; import javax.imageio.stream.ImageOutputStream; import org.apache.pdfbox.Loader; +import org.apache.pdfbox.cos.COSName; 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.PDResources; import org.apache.pdfbox.pdmodel.common.PDRectangle; +import org.apache.pdfbox.pdmodel.graphics.PDXObject; +import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; import org.apache.pdfbox.pdmodel.graphics.image.JPEGFactory; import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory; import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; @@ -31,8 +37,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.multipart.MultipartFile; -import stirling.software.SPDF.pdf.ImageFinder; - public class PdfUtils { private static final Logger logger = LoggerFactory.getLogger(PdfUtils.class); @@ -62,6 +66,23 @@ public class PdfUtils { } } + public static List getAllImages(PDResources resources) throws IOException { + List images = new ArrayList<>(); + + for (COSName name : resources.getXObjectNames()) { + PDXObject object = resources.getXObject(name); + + if (object instanceof PDImageXObject) { + images.add(((PDImageXObject) object).getImage()); + + } else if (object instanceof PDFormXObject) { + images.addAll(getAllImages(((PDFormXObject) object).getResources())); + } + } + + return images; + } + public static boolean hasImages(PDDocument document, String pagesToCheck) throws IOException { String[] pageOrderArr = pagesToCheck.split(","); List pageList = @@ -94,9 +115,7 @@ public class PdfUtils { } public static boolean hasImagesOnPage(PDPage page) throws IOException { - ImageFinder imageFinder = new ImageFinder(page); - imageFinder.processPage(page); - return imageFinder.hasImages(); + return getAllImages(page.getResources()).size() > 0; } public static boolean hasTextOnPage(PDPage page, String phrase) throws IOException { From b00f8c80ecc908b8e12e687f42939232d16b6056 Mon Sep 17 00:00:00 2001 From: ProvaTeams Date: Mon, 29 Jan 2024 19:13:57 +0100 Subject: [PATCH 62/81] Add required attribute to input file --- src/main/resources/templates/fragments/common.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/templates/fragments/common.html b/src/main/resources/templates/fragments/common.html index 924140e6..a07f483d 100644 --- a/src/main/resources/templates/fragments/common.html +++ b/src/main/resources/templates/fragments/common.html @@ -120,7 +120,7 @@ data-bs-files-selected=#{filesSelected}, data-bs-pdf-prompt=#{pdfPrompt}">
- +
From 2d37c707e2192550d57d2839f60725d1a7267b8b Mon Sep 17 00:00:00 2001 From: sbplat <71648843+sbplat@users.noreply.github.com> Date: Wed, 31 Jan 2024 00:54:51 -0500 Subject: [PATCH 63/81] feat: support '\n' literal in add watermark --- .../api/security/WatermarkController.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) 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 7bfb4c85..6630a200 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 @@ -155,9 +155,16 @@ public class WatermarkController { contentStream.setFont(font, fontSize); contentStream.setNonStrokingColor(Color.LIGHT_GRAY); + String[] textLines = watermarkText.split("\\\\n"); + float maxLineWidth = 0; + + for (int i = 0; i < textLines.length; ++i) { + maxLineWidth = Math.max(maxLineWidth, font.getStringWidth(textLines[i])); + } + // Set size and location of text watermark - float watermarkWidth = widthSpacer + font.getStringWidth(watermarkText) * fontSize / 1000; - float watermarkHeight = heightSpacer + fontSize; + float watermarkWidth = widthSpacer + maxLineWidth * fontSize / 1000; + float watermarkHeight = heightSpacer + fontSize * textLines.length; float pageWidth = page.getMediaBox().getWidth(); float pageHeight = page.getMediaBox().getHeight(); int watermarkRows = (int) (pageHeight / watermarkHeight + 1); @@ -172,7 +179,12 @@ public class WatermarkController { (float) Math.toRadians(rotation), j * watermarkWidth, i * watermarkHeight)); - contentStream.showText(watermarkText); + + for (int k = 0; k < textLines.length; ++k) { + contentStream.showText(textLines[k]); + contentStream.newLineAtOffset(0, -fontSize); + } + contentStream.endText(); } } From 55020d45f8cf3dab5dd886d9bb3e4ff930a10e33 Mon Sep 17 00:00:00 2001 From: ProvaTeams <142001287+ProvaTeams@users.noreply.github.com> Date: Wed, 31 Jan 2024 14:09:16 +0000 Subject: [PATCH 64/81] Using the flag logic --- src/main/resources/templates/fragments/common.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/templates/fragments/common.html b/src/main/resources/templates/fragments/common.html index a07f483d..cd2d47b7 100644 --- a/src/main/resources/templates/fragments/common.html +++ b/src/main/resources/templates/fragments/common.html @@ -120,7 +120,7 @@ data-bs-files-selected=#{filesSelected}, data-bs-pdf-prompt=#{pdfPrompt}">
- +
From 903faadff367e948cc0d97b99fb6e495357dac0b Mon Sep 17 00:00:00 2001 From: sbplat <71648843+sbplat@users.noreply.github.com> Date: Wed, 31 Jan 2024 11:04:40 -0500 Subject: [PATCH 65/81] misc: update pull request template --- .github/pull_request_template.md | 18 ++++++++++++++++-- .github/workflows/pull_request_template.md | 3 --- 2 files changed, 16 insertions(+), 5 deletions(-) delete mode 100644 .github/workflows/pull_request_template.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index e73caa3f..1fca1966 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,4 +1,18 @@ -# License Agreement for Contributions -By submitting this pull request, I acknowledge and agree that my contributions will be included in Stirling-PDF and that they can be relicensed in the future under MPL 2.0 (Mozilla Public License Version 2.0) license. +# Description + +Please provide a summary of the changes, including relevant motivation and context. + +Closes #(issue_number) + +## Checklist: + +- [ ] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) +- [ ] I have performed a self-review of my own code +- [ ] I have commented my code, particularly in hard-to-understand areas +- [ ] My changes generate no new warnings + +## Contributor License Agreement + +By submitting this pull request, I acknowledge and agree that my contributions will be included in Stirling-PDF and that they can be relicensed in the future under the MPL 2.0 (Mozilla Public License Version 2.0) license. (This does not change the general open-source nature of Stirling-PDF, simply moving from one license to another license) diff --git a/.github/workflows/pull_request_template.md b/.github/workflows/pull_request_template.md deleted file mode 100644 index bc8f5d04..00000000 --- a/.github/workflows/pull_request_template.md +++ /dev/null @@ -1,3 +0,0 @@ -# License Agreement for Contributions -By submitting this pull request, I acknowledge and agree that my contributions will be included in Stirling-PDF and that they can be relicensed in the future under MPL 2.0 (Mozilla Public License Version 2.0) license. -(This does not change the open-source nature of Stirling-PDF, simply moving from one license to another license) From bfee745ccaa7f53ef27eb0151fdcd9395024eadd Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Thu, 1 Feb 2024 22:40:36 +0000 Subject: [PATCH 66/81] Update build.gradle --- build.gradle | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/build.gradle b/build.gradle index 987f9854..af6a3092 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id 'java' - id 'org.springframework.boot' version '3.2.1' + id 'org.springframework.boot' version '3.2.2' id 'io.spring.dependency-management' version '1.1.3' id 'org.springdoc.openapi-gradle-plugin' version '1.8.0' id "io.swagger.swaggerhub" version "1.3.2" @@ -92,19 +92,19 @@ dependencies { implementation 'org.springframework:spring-webmvc:6.1.2' implementation 'org.yaml:snakeyaml:2.2' - implementation 'org.springframework.boot:spring-boot-starter-web:3.2.1' - implementation 'org.springframework.boot:spring-boot-starter-thymeleaf:3.2.1' + implementation 'org.springframework.boot:spring-boot-starter-web:3.2.2' + implementation 'org.springframework.boot:spring-boot-starter-thymeleaf:3.2.2' if (System.getenv('DOCKER_ENABLE_SECURITY') != 'false') { - implementation 'org.springframework.boot:spring-boot-starter-security:3.2.1' + implementation 'org.springframework.boot:spring-boot-starter-security:3.2.2' implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5:3.1.2.RELEASE' - implementation "org.springframework.boot:spring-boot-starter-data-jpa:3.2.1" + implementation "org.springframework.boot:spring-boot-starter-data-jpa:3.2.2" //2.2.x requires rebuild of DB file.. need migration path implementation "com.h2database:h2:2.1.214" } - testImplementation 'org.springframework.boot:spring-boot-starter-test:3.2.1' + testImplementation 'org.springframework.boot:spring-boot-starter-test:3.2.2' // Batik implementation 'org.apache.xmlgraphics:batik-all:1.17' @@ -147,8 +147,8 @@ dependencies { implementation 'org.bouncycastle:bcprov-jdk18on:1.77' implementation 'org.bouncycastle:bcpkix-jdk18on:1.77' - implementation 'org.springframework.boot:spring-boot-starter-actuator' - implementation 'io.micrometer:micrometer-core' + implementation 'org.springframework.boot:spring-boot-starter-actuator:3.2.2' + implementation 'io.micrometer:micrometer-core:1.12.2' implementation group: 'com.google.zxing', name: 'core', version: '3.5.2' // https://mvnrepository.com/artifact/org.commonmark/commonmark implementation 'org.commonmark:commonmark:0.21.0' @@ -156,7 +156,7 @@ dependencies { // https://mvnrepository.com/artifact/com.github.vladimir-bukhtoyarov/bucket4j-core implementation 'com.github.vladimir-bukhtoyarov:bucket4j-core:7.6.0' - developmentOnly("org.springframework.boot:spring-boot-devtools") + developmentOnly("org.springframework.boot:spring-boot-devtools:3.2.2") compileOnly 'org.projectlombok:lombok:1.18.30' annotationProcessor 'org.projectlombok:lombok:1.18.28' } From 2deb40bb6daaa93f983965c72d1f96adb84836ba Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Thu, 1 Feb 2024 22:41:13 +0000 Subject: [PATCH 67/81] Update build.gradle --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index af6a3092..694b7fd4 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ plugins { id 'org.springdoc.openapi-gradle-plugin' version '1.8.0' id "io.swagger.swaggerhub" version "1.3.2" id 'edu.sc.seis.launch4j' version '3.0.5' - id 'com.diffplug.spotless' version '6.23.3' + id 'com.diffplug.spotless' version '6.25.0' id 'com.github.jk1.dependency-license-report' version '2.5' } From e20f4fe31ac502e74a43d15c791968a256a2f61d Mon Sep 17 00:00:00 2001 From: "pixeebot[bot]" <23113631+pixeebot@users.noreply.github.com> Date: Thu, 1 Feb 2024 22:41:49 +0000 Subject: [PATCH 68/81] Introduced protections against "zip slip" attacks --- .../SPDF/controller/api/pipeline/PipelineProcessor.java | 3 ++- src/main/java/stirling/software/SPDF/utils/FileToPdf.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java index 5ff6842c..d84ea3c5 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java +++ b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api.pipeline; +import io.github.pixee.security.ZipSecurity; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; @@ -356,7 +357,7 @@ public class PipelineProcessor { List unzippedFiles = new ArrayList<>(); try (ByteArrayInputStream bais = new ByteArrayInputStream(data); - ZipInputStream zis = new ZipInputStream(bais)) { + ZipInputStream zis = ZipSecurity.createHardenedInputStream(bais)) { ZipEntry entry; while ((entry = zis.getNextEntry()) != null) { diff --git a/src/main/java/stirling/software/SPDF/utils/FileToPdf.java b/src/main/java/stirling/software/SPDF/utils/FileToPdf.java index bdf3ec61..816cdef6 100644 --- a/src/main/java/stirling/software/SPDF/utils/FileToPdf.java +++ b/src/main/java/stirling/software/SPDF/utils/FileToPdf.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.utils; +import io.github.pixee.security.ZipSecurity; import java.io.ByteArrayInputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -144,7 +145,7 @@ public class FileToPdf { private static Path unzipAndGetMainHtml(byte[] fileBytes) throws IOException { Path tempDirectory = Files.createTempDirectory("unzipped_"); - try (ZipInputStream zipIn = new ZipInputStream(new ByteArrayInputStream(fileBytes))) { + try (ZipInputStream zipIn = ZipSecurity.createHardenedInputStream(new ByteArrayInputStream(fileBytes))) { ZipEntry entry = zipIn.getNextEntry(); while (entry != null) { Path filePath = tempDirectory.resolve(entry.getName()); From d67690d99550c2a97f896693febe995d24aabbd5 Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Thu, 1 Feb 2024 22:43:25 +0000 Subject: [PATCH 69/81] Update build.gradle --- build.gradle | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.gradle b/build.gradle index 694b7fd4..a473e733 100644 --- a/build.gradle +++ b/build.gradle @@ -91,6 +91,8 @@ dependencies { implementation 'ch.qos.logback:logback-core:1.4.14' implementation 'org.springframework:spring-webmvc:6.1.2' + implementation("io.github.pixee:java-security-toolkit:1.1.2") + implementation 'org.yaml:snakeyaml:2.2' implementation 'org.springframework.boot:spring-boot-starter-web:3.2.2' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf:3.2.2' From 450e090252d911970f5c580a2b6ae4e71ce1fdd9 Mon Sep 17 00:00:00 2001 From: "pixeebot[bot]" <23113631+pixeebot@users.noreply.github.com> Date: Thu, 1 Feb 2024 23:01:04 +0000 Subject: [PATCH 70/81] Protect `readLine()` against DoS --- .../java/stirling/software/SPDF/utils/ProcessExecutor.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java b/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java index 23311bde..f75367a7 100644 --- a/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java +++ b/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.utils; +import io.github.pixee.security.BoundedLineReader; import java.io.BufferedReader; import java.io.File; import java.io.IOException; @@ -109,7 +110,7 @@ public class ProcessExecutor { process.getErrorStream(), StandardCharsets.UTF_8))) { String line; - while ((line = errorReader.readLine()) != null) { + while ((line = BoundedLineReader.readLine(errorReader, 5_000_000)) != null) { errorLines.add(line); if (liveUpdates) logger.info(line); } @@ -130,7 +131,7 @@ public class ProcessExecutor { process.getInputStream(), StandardCharsets.UTF_8))) { String line; - while ((line = outputReader.readLine()) != null) { + while ((line = BoundedLineReader.readLine(outputReader, 5_000_000)) != null) { outputLines.add(line); if (liveUpdates) logger.info(line); } From 91caa2a097f5784d7a501c9f40da8345841ca659 Mon Sep 17 00:00:00 2001 From: "pixeebot[bot]" <23113631+pixeebot@users.noreply.github.com> Date: Thu, 1 Feb 2024 23:18:24 +0000 Subject: [PATCH 71/81] Introduced protections against system command injection --- src/main/java/stirling/software/SPDF/LibreOfficeListener.java | 3 ++- src/main/java/stirling/software/SPDF/SPdfApplication.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/stirling/software/SPDF/LibreOfficeListener.java b/src/main/java/stirling/software/SPDF/LibreOfficeListener.java index 6d32adc3..d8196dcd 100644 --- a/src/main/java/stirling/software/SPDF/LibreOfficeListener.java +++ b/src/main/java/stirling/software/SPDF/LibreOfficeListener.java @@ -1,5 +1,6 @@ package stirling.software.SPDF; +import io.github.pixee.security.SystemCommand; import java.io.IOException; import java.net.InetSocketAddress; import java.net.Socket; @@ -44,7 +45,7 @@ public class LibreOfficeListener { } // Start the listener process - process = Runtime.getRuntime().exec("unoconv --listener"); + process = SystemCommand.runCommand(Runtime.getRuntime(), "unoconv --listener"); lastActivityTime = System.currentTimeMillis(); // Start a background thread to monitor the activity timeout diff --git a/src/main/java/stirling/software/SPDF/SPdfApplication.java b/src/main/java/stirling/software/SPDF/SPdfApplication.java index 7388b5e4..8cdcc701 100644 --- a/src/main/java/stirling/software/SPDF/SPdfApplication.java +++ b/src/main/java/stirling/software/SPDF/SPdfApplication.java @@ -1,5 +1,6 @@ package stirling.software.SPDF; +import io.github.pixee.security.SystemCommand; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Collections; @@ -34,7 +35,7 @@ public class SPdfApplication { Runtime rt = Runtime.getRuntime(); if (os.contains("win")) { // For Windows - rt.exec("rundll32 url.dll,FileProtocolHandler " + url); + SystemCommand.runCommand(rt, "rundll32 url.dll,FileProtocolHandler " + url); } } catch (Exception e) { e.printStackTrace(); From 8e0c02a1512c53395e6efbe7f39484315bc87432 Mon Sep 17 00:00:00 2001 From: "pixeebot[bot]" <23113631+pixeebot@users.noreply.github.com> Date: Thu, 1 Feb 2024 23:35:05 +0000 Subject: [PATCH 72/81] Sandboxed URL creation to prevent SSRF attacks --- src/main/java/stirling/software/SPDF/utils/GeneralUtils.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java index 672e5c70..1b0c315a 100644 --- a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java @@ -1,5 +1,7 @@ package stirling.software.SPDF.utils; +import io.github.pixee.security.HostValidator; +import io.github.pixee.security.Urls; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -57,7 +59,7 @@ public class GeneralUtils { public static boolean isValidURL(String urlStr) { try { - new URL(urlStr); + Urls.create(urlStr, Urls.HTTP_PROTOCOLS, HostValidator.DENY_COMMON_INFRASTRUCTURE_TARGETS); return true; } catch (MalformedURLException e) { return false; From c8dfe10a7c7cdc4a361565c8c566b7cf0159eae0 Mon Sep 17 00:00:00 2001 From: "pixeebot[bot]" <23113631+pixeebot@users.noreply.github.com> Date: Thu, 1 Feb 2024 23:48:27 +0000 Subject: [PATCH 73/81] Sanitized user-provided file names in HTTP multipart uploads --- .../SPDF/controller/api/MultiPageLayoutController.java | 3 ++- .../software/SPDF/controller/api/PdfOverlayController.java | 3 ++- .../SPDF/controller/api/RearrangePagesPDFController.java | 5 +++-- .../software/SPDF/controller/api/RotationController.java | 3 ++- .../software/SPDF/controller/api/ScalePagesController.java | 3 ++- .../software/SPDF/controller/api/SplitPDFController.java | 3 ++- .../SPDF/controller/api/SplitPdfBySectionsController.java | 3 ++- .../SPDF/controller/api/SplitPdfBySizeController.java | 3 ++- .../api/converters/ConvertBookToPDFController.java | 3 ++- .../SPDF/controller/api/converters/ConvertHtmlToPDF.java | 3 ++- .../controller/api/converters/ConvertImgPDFController.java | 3 ++- .../controller/api/converters/ConvertMarkdownToPdf.java | 3 ++- .../controller/api/converters/ConvertOfficeController.java | 5 +++-- .../api/converters/ConvertPDFToBookController.java | 3 ++- .../SPDF/controller/api/converters/ConvertPDFToPDFA.java | 3 ++- .../SPDF/controller/api/filters/FilterController.java | 5 +++-- .../SPDF/controller/api/misc/AutoRenameController.java | 3 ++- .../SPDF/controller/api/misc/AutoSplitPdfController.java | 3 ++- .../SPDF/controller/api/misc/BlankPageController.java | 3 ++- .../SPDF/controller/api/misc/CompressController.java | 3 ++- .../SPDF/controller/api/misc/ExtractImagesController.java | 3 ++- .../SPDF/controller/api/misc/FakeScanControllerWIP.java | 3 ++- .../SPDF/controller/api/misc/MetadataController.java | 3 ++- .../software/SPDF/controller/api/misc/OCRController.java | 5 +++-- .../SPDF/controller/api/misc/OverlayImageController.java | 3 ++- .../SPDF/controller/api/misc/PageNumbersController.java | 5 +++-- .../SPDF/controller/api/misc/RepairController.java | 3 ++- .../software/SPDF/controller/api/misc/ShowJavascript.java | 3 ++- .../software/SPDF/controller/api/misc/StampController.java | 3 ++- .../SPDF/controller/api/pipeline/PipelineProcessor.java | 3 ++- .../SPDF/controller/api/security/CertSignController.java | 3 ++- .../SPDF/controller/api/security/PasswordController.java | 7 ++++--- .../SPDF/controller/api/security/RedactController.java | 3 ++- .../SPDF/controller/api/security/SanitizeController.java | 3 ++- .../SPDF/controller/api/security/WatermarkController.java | 3 ++- src/main/java/stirling/software/SPDF/utils/PDFToFile.java | 3 ++- src/main/java/stirling/software/SPDF/utils/PdfUtils.java | 3 ++- .../stirling/software/SPDF/utils/WebResponseUtils.java | 3 ++- 38 files changed, 83 insertions(+), 45 deletions(-) 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 ee6c2789..b4949a58 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api; +import io.github.pixee.security.Filenames; import java.awt.Color; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -136,6 +137,6 @@ public class MultiPageLayoutController { byte[] result = baos.toByteArray(); return WebResponseUtils.bytesToWebResponse( result, - file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_layoutChanged.pdf"); + Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_layoutChanged.pdf"); } } 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 05cf1263..ab96d01e 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/PdfOverlayController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/PdfOverlayController.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api; +import io.github.pixee.security.Filenames; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; @@ -75,7 +76,7 @@ public class PdfOverlayController { overlay.overlay(overlayGuide).save(outputStream); byte[] data = outputStream.toByteArray(); String outputFilename = - baseFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + Filenames.toSimpleFileName(baseFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_overlayed.pdf"; // Remove file extension and append .pdf return WebResponseUtils.bytesToWebResponse( 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 1737d543..3074f9f8 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api; +import io.github.pixee.security.Filenames; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -57,7 +58,7 @@ public class RearrangePagesPDFController { } return WebResponseUtils.pdfDocToWebResponse( document, - pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_removed_pages.pdf"); + Filenames.toSimpleFileName(pdfFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_removed_pages.pdf"); } private List removeFirst(int totalPages) { @@ -211,7 +212,7 @@ public class RearrangePagesPDFController { return WebResponseUtils.pdfDocToWebResponse( document, - pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + Filenames.toSimpleFileName(pdfFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_rearranged.pdf"); } catch (IOException e) { logger.error("Failed rearranging documents", e); 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 6f8613f8..609e20f8 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/RotationController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/RotationController.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api; +import io.github.pixee.security.Filenames; import java.io.IOException; import org.apache.pdfbox.Loader; @@ -49,6 +50,6 @@ public class RotationController { return WebResponseUtils.pdfDocToWebResponse( document, - pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_rotated.pdf"); + Filenames.toSimpleFileName(pdfFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_rotated.pdf"); } } 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 da55bad5..03994321 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/ScalePagesController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/ScalePagesController.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api; +import io.github.pixee.security.Filenames; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.HashMap; @@ -112,6 +113,6 @@ public class ScalePagesController { return WebResponseUtils.bytesToWebResponse( baos.toByteArray(), - file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_scaled.pdf"); + Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_scaled.pdf"); } } 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 3dbb9335..c218788a 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api; +import io.github.pixee.security.Filenames; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.file.Files; @@ -83,7 +84,7 @@ public class SplitPDFController { Path zipFile = Files.createTempFile("split_documents", ".zip"); - String filename = file.getOriginalFilename().replaceFirst("[.][^.]+$", ""); + String filename = Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", ""); try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipFile))) { // loop through the split documents and write them to the zip file for (int i = 0; i < splitDocumentsBoas.size(); i++) { 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 90418169..2951a73e 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api; +import io.github.pixee.security.Filenames; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.file.Files; @@ -64,7 +65,7 @@ public class SplitPdfBySectionsController { sourceDocument.close(); Path zipFile = Files.createTempFile("split_documents", ".zip"); - String filename = file.getOriginalFilename().replaceFirst("[.][^.]+$", ""); + String filename = Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", ""); byte[] data; try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipFile))) { 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 4bfde843..eb2cfa28 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api; +import io.github.pixee.security.Filenames; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.file.Files; @@ -120,7 +121,7 @@ public class SplitPdfBySizeController { sourceDocument.close(); Path zipFile = Files.createTempFile("split_documents", ".zip"); - String filename = file.getOriginalFilename().replaceFirst("[.][^.]+$", ""); + String filename = Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", ""); byte[] data; try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipFile))) { diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertBookToPDFController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertBookToPDFController.java index 453f8e6e..a266e871 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertBookToPDFController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertBookToPDFController.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api.converters; +import io.github.pixee.security.Filenames; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.ResponseEntity; @@ -43,7 +44,7 @@ public class ConvertBookToPDFController { throw new IllegalArgumentException("Please provide a file for conversion."); } - String originalFilename = fileInput.getOriginalFilename(); + String originalFilename = Filenames.toSimpleFileName(fileInput.getOriginalFilename()); if (originalFilename != null) { String originalFilenameLower = originalFilename.toLowerCase(); diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java index 9e1d4fb9..2cf79992 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api.converters; +import io.github.pixee.security.Filenames; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.ResponseEntity; @@ -39,7 +40,7 @@ public class ConvertHtmlToPDF { "Please provide an HTML or ZIP file for conversion."); } - String originalFilename = fileInput.getOriginalFilename(); + String originalFilename = Filenames.toSimpleFileName(fileInput.getOriginalFilename()); if (originalFilename == null || (!originalFilename.endsWith(".html") && !originalFilename.endsWith(".zip"))) { throw new IllegalArgumentException("File must be either .html or .zip format."); 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 a4f8a98d..548e4937 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 @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api.converters; +import io.github.pixee.security.Filenames; import java.io.IOException; import java.net.URLConnection; @@ -56,7 +57,7 @@ public class ConvertImgPDFController { // returns bytes for image boolean singleImage = singleOrMultiple.equals("single"); byte[] result = null; - String filename = file.getOriginalFilename().replaceFirst("[.][^.]+$", ""); + String filename = Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", ""); try { result = PdfUtils.convertFromPdf( diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java index 12fc9097..39710ea0 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api.converters; +import io.github.pixee.security.Filenames; import java.util.List; import java.util.Map; @@ -48,7 +49,7 @@ public class ConvertMarkdownToPdf { throw new IllegalArgumentException("Please provide a Markdown file for conversion."); } - String originalFilename = fileInput.getOriginalFilename(); + String originalFilename = Filenames.toSimpleFileName(fileInput.getOriginalFilename()); if (originalFilename == null || !originalFilename.endsWith(".md")) { throw new IllegalArgumentException("File must be in .md format."); } diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java index ebc9f4f5..ce3d9fe9 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api.converters; +import io.github.pixee.security.Filenames; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -31,7 +32,7 @@ public class ConvertOfficeController { public byte[] convertToPdf(MultipartFile inputFile) throws IOException, InterruptedException { // Check for valid file extension - String originalFilename = inputFile.getOriginalFilename(); + String originalFilename = Filenames.toSimpleFileName(inputFile.getOriginalFilename()); if (originalFilename == null || !isValidFileExtension(FilenameUtils.getExtension(originalFilename))) { throw new IllegalArgumentException("Invalid file extension"); @@ -89,7 +90,7 @@ public class ConvertOfficeController { byte[] pdfByteArray = convertToPdf(inputFile); return WebResponseUtils.bytesToWebResponse( pdfByteArray, - inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + Filenames.toSimpleFileName(inputFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_convertedToPDF.pdf"); } } diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToBookController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToBookController.java index 1ee09d9e..9711fc5e 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToBookController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToBookController.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api.converters; +import io.github.pixee.security.Filenames; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; @@ -92,7 +93,7 @@ public class ConvertPDFToBookController { } String outputFilename = - fileInput.getOriginalFilename().replaceFirst("[.][^.]+$", "") + Filenames.toSimpleFileName(fileInput.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "." + outputFormat; // Remove file extension and append .pdf diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java index ac8ce031..5de8ee9a 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api.converters; +import io.github.pixee.security.Filenames; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; @@ -63,7 +64,7 @@ public class ConvertPDFToPDFA { // Return the optimized PDF as a response String outputFilename = - inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_PDFA.pdf"; + Filenames.toSimpleFileName(inputFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_PDFA.pdf"; return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename); } } 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 370aa6d7..6326cf19 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 @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api.filters; +import io.github.pixee.security.Filenames; import java.io.IOException; import org.apache.pdfbox.Loader; @@ -43,7 +44,7 @@ public class FilterController { PDDocument pdfDocument = Loader.loadPDF(inputFile.getBytes()); if (PdfUtils.hasText(pdfDocument, pageNumber, text)) return WebResponseUtils.pdfDocToWebResponse( - pdfDocument, inputFile.getOriginalFilename()); + pdfDocument, Filenames.toSimpleFileName(inputFile.getOriginalFilename())); return null; } @@ -60,7 +61,7 @@ public class FilterController { PDDocument pdfDocument = Loader.loadPDF(inputFile.getBytes()); if (PdfUtils.hasImages(pdfDocument, pageNumber)) return WebResponseUtils.pdfDocToWebResponse( - pdfDocument, inputFile.getOriginalFilename()); + pdfDocument, Filenames.toSimpleFileName(inputFile.getOriginalFilename())); return null; } 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 9a78e4d1..9000658c 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 @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api.misc; +import io.github.pixee.security.Filenames; import java.io.IOException; import java.util.ArrayList; import java.util.Comparator; @@ -133,7 +134,7 @@ public class AutoRenameController { return WebResponseUtils.pdfDocToWebResponse(document, header + ".pdf"); } else { logger.info("File has no good title to be found"); - return WebResponseUtils.pdfDocToWebResponse(document, file.getOriginalFilename()); + return WebResponseUtils.pdfDocToWebResponse(document, Filenames.toSimpleFileName(file.getOriginalFilename())); } } } 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 8b095358..da162d85 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 @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api.misc; +import io.github.pixee.security.Filenames; import java.awt.image.BufferedImage; import java.awt.image.DataBufferByte; import java.awt.image.DataBufferInt; @@ -97,7 +98,7 @@ public class AutoSplitPdfController { document.close(); Path zipFile = Files.createTempFile("split_documents", ".zip"); - String filename = file.getOriginalFilename().replaceFirst("[.][^.]+$", ""); + String filename = Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", ""); byte[] data; try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipFile))) { 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 21e5987b..34664a3b 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 @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api.misc; +import io.github.pixee.security.Filenames; import java.awt.image.BufferedImage; import java.io.IOException; import java.nio.file.Files; @@ -131,7 +132,7 @@ public class BlankPageController { return WebResponseUtils.pdfDocToWebResponse( document, - inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + Filenames.toSimpleFileName(inputFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_blanksRemoved.pdf"); } catch (IOException e) { e.printStackTrace(); 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 2b8a1541..c1b4a996 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 @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api.misc; +import io.github.pixee.security.Filenames; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; @@ -264,7 +265,7 @@ public class CompressController { // Return the optimized PDF as a response String outputFilename = - inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_Optimized.pdf"; + Filenames.toSimpleFileName(inputFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_Optimized.pdf"; return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename); } } 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 2ebc8f6c..24e7262c 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 @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api.misc; +import io.github.pixee.security.Filenames; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; @@ -66,7 +67,7 @@ public class ExtractImagesController { zos.setLevel(Deflater.BEST_COMPRESSION); int imageIndex = 1; - String filename = file.getOriginalFilename().replaceFirst("[.][^.]+$", ""); + String filename = Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", ""); int pageNum = 0; Set processedImages = new HashSet<>(); // Iterate over each page 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 cf719f56..8fb4af43 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 @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api.misc; +import io.github.pixee.security.Filenames; import java.awt.Color; import java.awt.geom.AffineTransform; import java.awt.image.AffineTransformOp; @@ -141,7 +142,7 @@ public class FakeScanControllerWIP { // Return the optimized PDF as a response String outputFilename = - inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_scanned.pdf"; + Filenames.toSimpleFileName(inputFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_scanned.pdf"; return WebResponseUtils.boasToWebResponse(baos, outputFilename); } } 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 a5eb95ca..97119404 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 @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api.misc; +import io.github.pixee.security.Filenames; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -164,6 +165,6 @@ public class MetadataController { document.setDocumentInformation(info); return WebResponseUtils.pdfDocToWebResponse( document, - pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_metadata.pdf"); + Filenames.toSimpleFileName(pdfFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_metadata.pdf"); } } diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java index 21cf2b1c..685a6526 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api.misc; +import io.github.pixee.security.Filenames; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -182,12 +183,12 @@ public class OCRController { // Return the OCR processed PDF as a response String outputFilename = - inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_OCR.pdf"; + Filenames.toSimpleFileName(inputFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_OCR.pdf"; if (sidecar != null && sidecar) { // Create a zip file containing both the PDF and the text file String outputZipFilename = - inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_OCR.zip"; + Filenames.toSimpleFileName(inputFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_OCR.zip"; Path tempZipFile = Files.createTempFile("output_", ".zip"); try (ZipOutputStream zipOut = diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java index caf2efaf..01da177d 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api.misc; +import io.github.pixee.security.Filenames; import java.io.IOException; import org.slf4j.Logger; @@ -44,7 +45,7 @@ public class OverlayImageController { return WebResponseUtils.bytesToWebResponse( result, - pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_overlayed.pdf"); + Filenames.toSimpleFileName(pdfFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_overlayed.pdf"); } catch (IOException e) { logger.error("Failed to add image to PDF", e); return new ResponseEntity<>(HttpStatus.BAD_REQUEST); 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 79f62c5a..cd99e9d0 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 @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api.misc; +import io.github.pixee.security.Filenames; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; @@ -93,7 +94,7 @@ public class PageNumbersController { .replace("{total}", String.valueOf(document.getNumberOfPages())) .replace( "{filename}", - file.getOriginalFilename() + Filenames.toSimpleFileName(file.getOriginalFilename()) .replaceFirst("[.][^.]+$", "")) : String.valueOf(pageNumber); @@ -145,7 +146,7 @@ public class PageNumbersController { return WebResponseUtils.bytesToWebResponse( baos.toByteArray(), - file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_numbersAdded.pdf", + Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_numbersAdded.pdf", MediaType.APPLICATION_PDF); } } diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/RepairController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/RepairController.java index 112985a3..caaaed5c 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/RepairController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/RepairController.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api.misc; +import io.github.pixee.security.Filenames; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -65,7 +66,7 @@ public class RepairController { // Return the optimized PDF as a response String outputFilename = - inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_repaired.pdf"; + Filenames.toSimpleFileName(inputFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_repaired.pdf"; return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename); } } 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 47a13d0c..0903a6e1 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 @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api.misc; +import io.github.pixee.security.Filenames; import java.nio.charset.StandardCharsets; import java.util.Map; @@ -54,7 +55,7 @@ public class ShowJavascript { script += "// File: " - + inputFile.getOriginalFilename() + + Filenames.toSimpleFileName(inputFile.getOriginalFilename()) + ", Script: " + name + "\n" diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/StampController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/StampController.java index 0dd4200c..83519094 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/StampController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/StampController.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api.misc; +import io.github.pixee.security.Filenames; import java.awt.Color; import java.awt.image.BufferedImage; import java.io.File; @@ -127,7 +128,7 @@ public class StampController { return WebResponseUtils.pdfDocToWebResponse( document, - pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_watermarked.pdf"); + Filenames.toSimpleFileName(pdfFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_watermarked.pdf"); } private void addTextStamp( diff --git a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java index d84ea3c5..4fbc2aa9 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java +++ b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api.pipeline; +import io.github.pixee.security.Filenames; import io.github.pixee.security.ZipSecurity; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; @@ -334,7 +335,7 @@ public class PipelineProcessor { new ByteArrayResource(file.getBytes()) { @Override public String getFilename() { - return file.getOriginalFilename(); + return Filenames.toSimpleFileName(file.getOriginalFilename()); } }; outputFiles.add(fileResource); 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 e7cccb44..658f68f3 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 @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api.security; +import io.github.pixee.security.Filenames; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -123,7 +124,7 @@ public class CertSignController { ByteArrayOutputStream baos = new ByteArrayOutputStream(); sign(pdf.getBytes(), baos, createSignature, name, location, reason); return WebResponseUtils.boasToWebResponse( - baos, pdf.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_signed.pdf"); + baos, Filenames.toSimpleFileName(pdf.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_signed.pdf"); } private static void sign( 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 8d7c8072..328b753c 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 @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api.security; +import io.github.pixee.security.Filenames; import java.io.IOException; import org.apache.pdfbox.Loader; @@ -43,7 +44,7 @@ public class PasswordController { document.setAllSecurityToBeRemoved(true); return WebResponseUtils.pdfDocToWebResponse( document, - fileInput.getOriginalFilename().replaceFirst("[.][^.]+$", "") + Filenames.toSimpleFileName(fileInput.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_password_removed.pdf"); } @@ -88,10 +89,10 @@ public class PasswordController { if ("".equals(ownerPassword) && "".equals(password)) return WebResponseUtils.pdfDocToWebResponse( document, - fileInput.getOriginalFilename().replaceFirst("[.][^.]+$", "") + Filenames.toSimpleFileName(fileInput.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_permissions.pdf"); return WebResponseUtils.pdfDocToWebResponse( document, - fileInput.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_passworded.pdf"); + Filenames.toSimpleFileName(fileInput.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_passworded.pdf"); } } 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 3d4653c5..82ff54dd 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 @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api.security; +import io.github.pixee.security.Filenames; import java.awt.Color; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; @@ -104,7 +105,7 @@ public class RedactController { byte[] pdfContent = baos.toByteArray(); return WebResponseUtils.bytesToWebResponse( pdfContent, - file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_redacted.pdf"); + Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_redacted.pdf"); } private void redactFoundText( 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 8c46e0cf..bbcfeeaa 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 @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api.security; +import io.github.pixee.security.Filenames; import java.io.IOException; import org.apache.pdfbox.Loader; @@ -76,7 +77,7 @@ public class SanitizeController { return WebResponseUtils.pdfDocToWebResponse( document, - inputFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + Filenames.toSimpleFileName(inputFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_sanitized.pdf"); } } 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 6630a200..f1d984fa 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 @@ -1,5 +1,6 @@ package stirling.software.SPDF.controller.api.security; +import io.github.pixee.security.Filenames; import java.awt.Color; import java.awt.image.BufferedImage; import java.io.File; @@ -104,7 +105,7 @@ public class WatermarkController { return WebResponseUtils.pdfDocToWebResponse( document, - pdfFile.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_watermarked.pdf"); + Filenames.toSimpleFileName(pdfFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_watermarked.pdf"); } private void addTextWatermark( diff --git a/src/main/java/stirling/software/SPDF/utils/PDFToFile.java b/src/main/java/stirling/software/SPDF/utils/PDFToFile.java index a7f751af..e210d8a9 100644 --- a/src/main/java/stirling/software/SPDF/utils/PDFToFile.java +++ b/src/main/java/stirling/software/SPDF/utils/PDFToFile.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.utils; +import io.github.pixee.security.Filenames; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; @@ -32,7 +33,7 @@ public class PDFToFile { } // Get the original PDF file name without the extension - String originalPdfFileName = inputFile.getOriginalFilename(); + String originalPdfFileName = Filenames.toSimpleFileName(inputFile.getOriginalFilename()); String pdfBaseName = originalPdfFileName.substring(0, originalPdfFileName.lastIndexOf('.')); // Validate output format diff --git a/src/main/java/stirling/software/SPDF/utils/PdfUtils.java b/src/main/java/stirling/software/SPDF/utils/PdfUtils.java index 1676ce85..03e03671 100644 --- a/src/main/java/stirling/software/SPDF/utils/PdfUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/PdfUtils.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.utils; +import io.github.pixee.security.Filenames; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.awt.image.RenderedImage; @@ -299,7 +300,7 @@ public class PdfUtils { try (PDDocument doc = new PDDocument()) { for (MultipartFile file : files) { String contentType = file.getContentType(); - String originalFilename = file.getOriginalFilename(); + String originalFilename = Filenames.toSimpleFileName(file.getOriginalFilename()); if (originalFilename != null && (originalFilename.toLowerCase().endsWith(".tiff") || originalFilename.toLowerCase().endsWith(".tif"))) { diff --git a/src/main/java/stirling/software/SPDF/utils/WebResponseUtils.java b/src/main/java/stirling/software/SPDF/utils/WebResponseUtils.java index 1114de64..a85720e7 100644 --- a/src/main/java/stirling/software/SPDF/utils/WebResponseUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/WebResponseUtils.java @@ -1,5 +1,6 @@ package stirling.software.SPDF.utils; +import io.github.pixee.security.Filenames; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.net.URLEncoder; @@ -26,7 +27,7 @@ public class WebResponseUtils { public static ResponseEntity multiPartFileToWebResponse(MultipartFile file) throws IOException { - String fileName = file.getOriginalFilename(); + String fileName = Filenames.toSimpleFileName(file.getOriginalFilename()); MediaType mediaType = MediaType.parseMediaType(file.getContentType()); byte[] bytes = file.getBytes(); From 734fff5618c15ae0798363265eb611fe21b1d9de Mon Sep 17 00:00:00 2001 From: "pixeebot[bot]" <23113631+pixeebot@users.noreply.github.com> Date: Fri, 2 Feb 2024 00:15:46 +0000 Subject: [PATCH 74/81] Modernize and secure temp file creation --- .../software/SPDF/controller/api/PdfOverlayController.java | 3 ++- .../software/SPDF/controller/api/misc/StampController.java | 3 ++- .../SPDF/controller/api/security/WatermarkController.java | 3 ++- src/main/java/stirling/software/SPDF/utils/GeneralUtils.java | 2 +- 4 files changed, 7 insertions(+), 4 deletions(-) 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 ab96d01e..f9938a39 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/PdfOverlayController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/PdfOverlayController.java @@ -4,6 +4,7 @@ import io.github.pixee.security.Filenames; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; +import java.nio.file.Files; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -136,7 +137,7 @@ public class PdfOverlayController { try (PDDocument overlayPdf = Loader.loadPDF(overlayFiles[overlayFileIndex])) { PDDocument singlePageDocument = new PDDocument(); singlePageDocument.addPage(overlayPdf.getPage(pageCountInCurrentOverlay)); - File tempFile = File.createTempFile("overlay-page-", ".pdf"); + File tempFile = Files.createTempFile("overlay-page-", ".pdf").toFile(); singlePageDocument.save(tempFile); singlePageDocument.close(); diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/StampController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/StampController.java index 83519094..9a01cf4d 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/StampController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/StampController.java @@ -7,6 +7,7 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.nio.file.Files; import javax.imageio.ImageIO; @@ -169,7 +170,7 @@ public class StampController { if (!resourceDir.equals("")) { ClassPathResource classPathResource = new ClassPathResource(resourceDir); String fileExtension = resourceDir.substring(resourceDir.lastIndexOf(".")); - File tempFile = File.createTempFile("NotoSansFont", fileExtension); + File tempFile = Files.createTempFile("NotoSansFont", fileExtension).toFile(); try (InputStream is = classPathResource.getInputStream(); FileOutputStream os = new FileOutputStream(tempFile)) { IOUtils.copy(is, os); 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 f1d984fa..469f32be 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 @@ -7,6 +7,7 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.nio.file.Files; import javax.imageio.ImageIO; @@ -143,7 +144,7 @@ public class WatermarkController { if (!resourceDir.equals("")) { ClassPathResource classPathResource = new ClassPathResource(resourceDir); String fileExtension = resourceDir.substring(resourceDir.lastIndexOf(".")); - File tempFile = File.createTempFile("NotoSansFont", fileExtension); + File tempFile = Files.createTempFile("NotoSansFont", fileExtension).toFile(); try (InputStream is = classPathResource.getInputStream(); FileOutputStream os = new FileOutputStream(tempFile)) { IOUtils.copy(is, os); diff --git a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java index 1b0c315a..7b6905db 100644 --- a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java @@ -22,7 +22,7 @@ import org.springframework.web.multipart.MultipartFile; public class GeneralUtils { public static File convertMultipartFileToFile(MultipartFile multipartFile) throws IOException { - File tempFile = File.createTempFile("temp", null); + File tempFile = Files.createTempFile("temp", null).toFile(); try (FileOutputStream os = new FileOutputStream(tempFile)) { os.write(multipartFile.getBytes()); } From 95471a2fba891a55ff0205cfcd9c64546296f6e1 Mon Sep 17 00:00:00 2001 From: "pixeebot[bot]" <23113631+pixeebot@users.noreply.github.com> Date: Fri, 2 Feb 2024 00:29:18 +0000 Subject: [PATCH 75/81] Switch order of literals to prevent NullPointerException --- scripts/PropSync.java | 2 +- .../software/SPDF/SPdfApplication.java | 2 +- .../SPDF/config/ConfigInitializer.java | 2 +- .../converters/ConvertImgPDFController.java | 4 ++-- .../api/misc/ExtractImageScansController.java | 2 +- .../api/misc/ExtractImagesController.java | 6 +++--- .../api/misc/MetadataController.java | 18 +++++++++--------- .../controller/api/misc/OCRController.java | 4 ++-- .../controller/api/misc/StampController.java | 6 +++--- .../api/pipeline/PipelineProcessor.java | 2 +- .../api/security/WatermarkController.java | 6 +++--- .../SPDF/controller/web/MetricsController.java | 8 ++++---- .../software/SPDF/utils/FileToPdf.java | 2 +- .../software/SPDF/utils/GeneralUtils.java | 6 +++--- .../software/SPDF/utils/PDFToFile.java | 2 +- .../stirling/software/SPDF/utils/PdfUtils.java | 8 ++++---- 16 files changed, 40 insertions(+), 40 deletions(-) diff --git a/scripts/PropSync.java b/scripts/PropSync.java index 741712b5..41228b5b 100644 --- a/scripts/PropSync.java +++ b/scripts/PropSync.java @@ -16,7 +16,7 @@ public class PropSync { Map enProps = linesToProps(enLines); for (File file : files) { - if (!file.getName().equals("messages_en_GB.properties")) { + if (!"messages_en_GB.properties".equals(file.getName())) { System.out.println("Processing file: " + file.getName()); List lines; try { diff --git a/src/main/java/stirling/software/SPDF/SPdfApplication.java b/src/main/java/stirling/software/SPDF/SPdfApplication.java index 8cdcc701..f37dfb6e 100644 --- a/src/main/java/stirling/software/SPDF/SPdfApplication.java +++ b/src/main/java/stirling/software/SPDF/SPdfApplication.java @@ -25,7 +25,7 @@ public class SPdfApplication { public void init() { // Check if the BROWSER_OPEN environment variable is set to true String browserOpenEnv = env.getProperty("BROWSER_OPEN"); - boolean browserOpen = browserOpenEnv != null && browserOpenEnv.equalsIgnoreCase("true"); + boolean browserOpen = browserOpenEnv != null && "true".equalsIgnoreCase(browserOpenEnv); if (browserOpen) { try { diff --git a/src/main/java/stirling/software/SPDF/config/ConfigInitializer.java b/src/main/java/stirling/software/SPDF/config/ConfigInitializer.java index 6435c955..a5d05999 100644 --- a/src/main/java/stirling/software/SPDF/config/ConfigInitializer.java +++ b/src/main/java/stirling/software/SPDF/config/ConfigInitializer.java @@ -84,7 +84,7 @@ public class ConfigInitializer for (String line : templateLines) { String key = extractKey.apply(line); - if (line.trim().equalsIgnoreCase("AutomaticallyGenerated:")) { + if ("AutomaticallyGenerated:".equalsIgnoreCase(line.trim())) { insideAutoGenerated = true; mergedLines.add(line); continue; 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 548e4937..c131d883 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 @@ -55,7 +55,7 @@ public class ConvertImgPDFController { colorTypeResult = ImageType.BINARY; } // returns bytes for image - boolean singleImage = singleOrMultiple.equals("single"); + boolean singleImage = "single".equals(singleOrMultiple); byte[] result = null; String filename = Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", ""); try { @@ -114,6 +114,6 @@ public class ConvertImgPDFController { private String getMediaType(String imageFormat) { String mimeType = URLConnection.guessContentTypeFromName("." + imageFormat); - return mimeType.equals("null") ? "application/octet-stream" : mimeType; + return "null".equals(mimeType) ? "application/octet-stream" : mimeType; } } 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 510607e8..da684280 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 @@ -74,7 +74,7 @@ public class ExtractImageScansController { List images = new ArrayList<>(); // Check if input file is a PDF - if (extension.equalsIgnoreCase("pdf")) { + if ("pdf".equalsIgnoreCase(extension)) { // Load PDF document try (PDDocument document = Loader.loadPDF(form.getFileInput().getBytes())) { PDFRenderer pdfRenderer = new PDFRenderer(document); 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 24e7262c..cb9071d8 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 @@ -86,19 +86,19 @@ public class ExtractImagesController { // Convert image to desired format RenderedImage renderedImage = image.getImage(); BufferedImage bufferedImage = null; - if (format.equalsIgnoreCase("png")) { + if ("png".equalsIgnoreCase(format)) { bufferedImage = new BufferedImage( renderedImage.getWidth(), renderedImage.getHeight(), BufferedImage.TYPE_INT_ARGB); - } else if (format.equalsIgnoreCase("jpeg") || format.equalsIgnoreCase("jpg")) { + } else if ("jpeg".equalsIgnoreCase(format) || "jpg".equalsIgnoreCase(format)) { bufferedImage = new BufferedImage( renderedImage.getWidth(), renderedImage.getHeight(), BufferedImage.TYPE_INT_RGB); - } else if (format.equalsIgnoreCase("gif")) { + } else if ("gif".equalsIgnoreCase(format)) { bufferedImage = new BufferedImage( renderedImage.getWidth(), 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 97119404..8e4ae664 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 @@ -110,15 +110,15 @@ public class MetadataController { for (Entry entry : allRequestParams.entrySet()) { String key = entry.getKey(); // Check if the key is a standard metadata key - if (!key.equalsIgnoreCase("Author") - && !key.equalsIgnoreCase("CreationDate") - && !key.equalsIgnoreCase("Creator") - && !key.equalsIgnoreCase("Keywords") - && !key.equalsIgnoreCase("modificationDate") - && !key.equalsIgnoreCase("Producer") - && !key.equalsIgnoreCase("Subject") - && !key.equalsIgnoreCase("Title") - && !key.equalsIgnoreCase("Trapped") + if (!"Author".equalsIgnoreCase(key) + && !"CreationDate".equalsIgnoreCase(key) + && !"Creator".equalsIgnoreCase(key) + && !"Keywords".equalsIgnoreCase(key) + && !"modificationDate".equalsIgnoreCase(key) + && !"Producer".equalsIgnoreCase(key) + && !"Subject".equalsIgnoreCase(key) + && !"Title".equalsIgnoreCase(key) + && !"Trapped".equalsIgnoreCase(key) && !key.contains("customKey") && !key.contains("customValue")) { info.setCustomMetadataValue(key, entry.getValue()); diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java index 685a6526..143ae1da 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java @@ -75,7 +75,7 @@ public class OCRController { throw new IOException("Please select at least one language."); } - if (!ocrRenderType.equals("hocr") && !ocrRenderType.equals("sandwich")) { + if (!"hocr".equals(ocrRenderType) && !"sandwich".equals(ocrRenderType)) { throw new IOException("ocrRenderType wrong"); } @@ -128,7 +128,7 @@ public class OCRController { if (cleanFinal != null && cleanFinal) { command.add("--clean-final"); } - if (ocrType != null && !ocrType.equals("")) { + if (ocrType != null && !"".equals(ocrType)) { if ("skip-text".equals(ocrType)) { command.add("--skip-text"); } else if ("force-ocr".equals(ocrType)) { diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/StampController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/StampController.java index 9a01cf4d..52e8d970 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/StampController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/StampController.java @@ -96,7 +96,7 @@ public class StampController { graphicsState.setNonStrokingAlphaConstant(opacity); contentStream.setGraphicsStateParameters(graphicsState); - if (watermarkType.equalsIgnoreCase("text")) { + if ("text".equalsIgnoreCase(watermarkType)) { addTextStamp( contentStream, watermarkText, @@ -110,7 +110,7 @@ public class StampController { overrideY, marginFactor, customColor); - } else if (watermarkType.equalsIgnoreCase("image")) { + } else if ("image".equalsIgnoreCase(watermarkType)) { addImageStamp( contentStream, watermarkImage, @@ -167,7 +167,7 @@ public class StampController { break; } - if (!resourceDir.equals("")) { + if (!"".equals(resourceDir)) { ClassPathResource classPathResource = new ClassPathResource(resourceDir); String fileExtension = resourceDir.substring(resourceDir.lastIndexOf(".")); File tempFile = Files.createTempFile("NotoSansFont", fileExtension).toFile(); diff --git a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java index 4fbc2aa9..c4e98bdb 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java +++ b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java @@ -98,7 +98,7 @@ public class PipelineProcessor { for (Resource file : outputFiles) { boolean hasInputFileType = false; for (String extension : inputFileTypes) { - if (extension.equals("ALL") || file.getFilename().endsWith(extension)) { + if ("ALL".equals(extension) || file.getFilename().endsWith(extension)) { hasInputFileType = true; MultiValueMap body = new LinkedMultiValueMap<>(); body.add("fileInput", file); 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 469f32be..91a8a265 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 @@ -77,7 +77,7 @@ public class WatermarkController { graphicsState.setNonStrokingAlphaConstant(opacity); contentStream.setGraphicsStateParameters(graphicsState); - if (watermarkType.equalsIgnoreCase("text")) { + if ("text".equalsIgnoreCase(watermarkType)) { addTextWatermark( contentStream, watermarkText, @@ -88,7 +88,7 @@ public class WatermarkController { heightSpacer, fontSize, alphabet); - } else if (watermarkType.equalsIgnoreCase("image")) { + } else if ("image".equalsIgnoreCase(watermarkType)) { addImageWatermark( contentStream, watermarkImage, @@ -141,7 +141,7 @@ public class WatermarkController { break; } - if (!resourceDir.equals("")) { + if (!"".equals(resourceDir)) { ClassPathResource classPathResource = new ClassPathResource(resourceDir); String fileExtension = resourceDir.substring(resourceDir.lastIndexOf(".")); File tempFile = Files.createTempFile("NotoSansFont", fileExtension).toFile(); diff --git a/src/main/java/stirling/software/SPDF/controller/web/MetricsController.java b/src/main/java/stirling/software/SPDF/controller/web/MetricsController.java index 5b079042..155fcdbd 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/MetricsController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/MetricsController.java @@ -84,7 +84,7 @@ public class MetricsController { for (Meter meter : meterRegistry.getMeters()) { if (meter.getId().getName().equals("http.requests")) { String method = meter.getId().getTag("method"); - if (method != null && method.equals("GET")) { + if (method != null && "GET".equals(method)) { if (endpoint.isPresent() && !endpoint.get().isBlank()) { if (!endpoint.get().startsWith("/")) { @@ -129,7 +129,7 @@ public class MetricsController { for (Meter meter : meterRegistry.getMeters()) { if (meter.getId().getName().equals("http.requests")) { String method = meter.getId().getTag("method"); - if (method != null && method.equals("GET")) { + if (method != null && "GET".equals(method)) { String uri = meter.getId().getTag("uri"); if (uri != null) { double currentCount = counts.getOrDefault(uri, 0.0); @@ -197,7 +197,7 @@ public class MetricsController { for (Meter meter : meterRegistry.getMeters()) { if (meter.getId().getName().equals("http.requests")) { String method = meter.getId().getTag("method"); - if (method != null && method.equals("POST")) { + if (method != null && "POST".equals(method)) { if (endpoint.isPresent() && !endpoint.get().isBlank()) { if (!endpoint.get().startsWith("/")) { endpoint = Optional.of("/" + endpoint.get()); @@ -235,7 +235,7 @@ public class MetricsController { for (Meter meter : meterRegistry.getMeters()) { if (meter.getId().getName().equals("http.requests")) { String method = meter.getId().getTag("method"); - if (method != null && method.equals("POST")) { + if (method != null && "POST".equals(method)) { String uri = meter.getId().getTag("uri"); if (uri != null) { double currentCount = counts.getOrDefault(uri, 0.0); diff --git a/src/main/java/stirling/software/SPDF/utils/FileToPdf.java b/src/main/java/stirling/software/SPDF/utils/FileToPdf.java index 816cdef6..09ce430c 100644 --- a/src/main/java/stirling/software/SPDF/utils/FileToPdf.java +++ b/src/main/java/stirling/software/SPDF/utils/FileToPdf.java @@ -173,7 +173,7 @@ public class FileToPdf { // Prioritize 'index.html' if it exists, otherwise use the first .html file for (Path htmlFile : htmlFiles) { - if (htmlFile.getFileName().toString().equals("index.html")) { + if ("index.html".equals(htmlFile.getFileName().toString())) { return htmlFile; } } diff --git a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java index 7b6905db..1737b27e 100644 --- a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java @@ -122,7 +122,7 @@ public class GeneralUtils { // loop through the page order array for (String element : pageOrderArr) { - if (element.equalsIgnoreCase("all")) { + if ("all".equalsIgnoreCase(element)) { for (int i = 0; i < totalPages; i++) { newPageOrder.add(i); } @@ -137,11 +137,11 @@ public class GeneralUtils { if (element.contains("n")) { String[] parts = element.split("n"); - if (!parts[0].equals("") && parts[0] != null) { + if (!"".equals(parts[0]) && parts[0] != null) { coefficient = Integer.parseInt(parts[0]); coefficientExists = true; } - if (parts.length > 1 && !parts[1].equals("") && parts[1] != null) { + if (parts.length > 1 && !"".equals(parts[1]) && parts[1] != null) { constant = Integer.parseInt(parts[1]); constantExists = true; } diff --git a/src/main/java/stirling/software/SPDF/utils/PDFToFile.java b/src/main/java/stirling/software/SPDF/utils/PDFToFile.java index e210d8a9..7afe6a49 100644 --- a/src/main/java/stirling/software/SPDF/utils/PDFToFile.java +++ b/src/main/java/stirling/software/SPDF/utils/PDFToFile.java @@ -88,7 +88,7 @@ public class PDFToFile { if (outputFiles.size() == 1) { // Return single output file File outputFile = outputFiles.get(0); - if (outputFormat.equals("txt:Text")) { + if ("txt:Text".equals(outputFormat)) { outputFormat = "txt"; } fileName = pdfBaseName + "." + outputFormat; diff --git a/src/main/java/stirling/software/SPDF/utils/PdfUtils.java b/src/main/java/stirling/software/SPDF/utils/PdfUtils.java index 03e03671..748f8aad 100644 --- a/src/main/java/stirling/software/SPDF/utils/PdfUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/PdfUtils.java @@ -133,7 +133,7 @@ public class PdfUtils { PDFTextStripper textStripper = new PDFTextStripper(); String pdfText = ""; - if (pagesToCheck == null || pagesToCheck.equals("all")) { + if (pagesToCheck == null || "all".equals(pagesToCheck)) { pdfText = textStripper.getText(pdfDocument); } else { // remove whitespaces @@ -219,8 +219,8 @@ public class PdfUtils { ByteArrayOutputStream baos = new ByteArrayOutputStream(); if (singleImage) { - if (imageType.toLowerCase().equals("tiff") - || imageType.toLowerCase().equals("tif")) { + if ("tiff".equals(imageType.toLowerCase()) + || "tif".equals(imageType.toLowerCase())) { // Write the images to the output stream as a TIFF with multiple frames ImageWriter writer = ImageIO.getImageWritersByFormatName("tiff").next(); ImageWriteParam param = writer.getDefaultWriteParam(); @@ -321,7 +321,7 @@ public class PdfUtils { ImageProcessingUtils.convertColorType(image, colorType); // Use JPEGFactory if it's JPEG since JPEG is lossy PDImageXObject pdImage = - (contentType != null && contentType.equals("image/jpeg")) + (contentType != null && "image/jpeg".equals(contentType)) ? JPEGFactory.createFromImage(doc, convertedImage) : LosslessFactory.createFromImage(doc, convertedImage); addImageToDocument(doc, pdImage, fitOption, autoRotate); From 48be77270385d18d3f9fd33e4ed190c7fceef2bd Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Sat, 3 Feb 2024 22:54:33 +0000 Subject: [PATCH 76/81] Update build.gradle --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index a473e733..7025b2bd 100644 --- a/build.gradle +++ b/build.gradle @@ -12,7 +12,7 @@ plugins { import com.github.jk1.license.render.* group = 'stirling.software' -version = '0.20.1' +version = '0.20.2' sourceCompatibility = '17' repositories { From 96f4e5eac72763cd5d7442b7a0fdb6ebb85754dd Mon Sep 17 00:00:00 2001 From: Michel Heusschen <59014050+michelheusschen@users.noreply.github.com> Date: Sun, 4 Feb 2024 18:08:55 +0100 Subject: [PATCH 77/81] fix: small corrections for Dutch language --- src/main/resources/messages_nl_NL.properties | 28 ++++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/main/resources/messages_nl_NL.properties b/src/main/resources/messages_nl_NL.properties index c56e988a..a9e0ba91 100644 --- a/src/main/resources/messages_nl_NL.properties +++ b/src/main/resources/messages_nl_NL.properties @@ -5,8 +5,8 @@ language.direction=ltr pdfPrompt=Selecteer PDF('s) -multiPdfPrompt=Selecteer PDFs (2+) -multiPdfDropPrompt=Selecteer (of sleep & zet neer) alle PDFs die je nodig hebt +multiPdfPrompt=Selecteer PDF's (2+) +multiPdfDropPrompt=Selecteer (of sleep & zet neer) alle PDF's die je nodig hebt imgPrompt=Selecteer afbeelding(en) genericSubmit=Indienen processTimeWarning=Waarschuwing: Dit proces kan tot een minuut duren afhankelijk van de bestandsgrootte @@ -65,7 +65,7 @@ pipeline.submitButton=Opslaan ###################### # Pipeline Options # ###################### -pipelineOptions.header=Pijplijn onfiguratie +pipelineOptions.header=Pijplijn configuratie pipelineOptions.pipelineNameLabel=Pijplijn naam pipelineOptions.saveSettings=Instellingen voor bewerking opslaan pipelineOptions.pipelineNamePrompt=Voer hier de naam van de pijplijn in @@ -217,7 +217,7 @@ home.removePassword.desc=Verwijder wachtwoordbeveiliging van je PDF-document. removePassword.tags=veilig,Decrypteren,beveiliging,wachtwoord verwijderen home.compressPdfs.title=Comprimeren -home.compressPdfs.desc=Comprimeer PDFs om hun bestandsgrootte te verkleinen. +home.compressPdfs.desc=Comprimeer PDF's om hun bestandsgrootte te verkleinen. compressPdfs.tags=comprimeren,klein @@ -466,7 +466,7 @@ HTMLToPDF.header=HTML naar PDF HTMLToPDF.help=Accepteert HTML-bestanden en ZIP's die html/css/afbeeldingen etc. bevatten HTMLToPDF.submit=Converteren HTMLToPDF.credit=Gebruikt WeasyPrint -HTMLToPDF.zoom=Zoom level for displaying the website. +HTMLToPDF.zoom=Zoomniveau voor weergave van de website. HTMLToPDF.pageWidth=Breedte van de pagina in centimeters. (leeg voor standaard) HTMLToPDF.pageHeight=Hoogte van de pagina in centimeters. (leeg voor standaard) HTMLToPDF.marginTop=Marge bovenaan de pagina in millimeters. (leeg voor standaard) @@ -494,7 +494,7 @@ AddStampRequest.opacity=Transparantie AddStampRequest.position=Positie AddStampRequest.overrideX=X coördinaat overschrijven AddStampRequest.overrideY=Y coördinaat overschrijven -AddStampRequest.customMargin=Aangepate marge +AddStampRequest.customMargin=Aangepaste marge AddStampRequest.customColor=Aangepaste tekstkleur AddStampRequest.submit=Indienen @@ -584,11 +584,11 @@ scalePages.submit=Indienen certSign.title=Certificaat ondertekening certSign.header=Onderteken een PDF met je certificaat (in ontwikkeling) certSign.selectPDF=Selecteer een PDF-bestand voor ondertekening: -certSign.jksNote=Note: If your certificate type is not listed below, please convert it to a Java Keystore (.jks) file using the keytool command line tool. Then, choose the .jks file option below. +certSign.jksNote=Let op: als het certificaattype hieronder niet staat, converteer het dan naar een Java Keystore (.jks) bestand met de keytool command line tool. Kies vervolgens de .jks bestandsoptie. certSign.selectKey=Selecteer je privésleutelbestand (PKCS#8 formaat, kan .pem of .der zijn): certSign.selectCert=Selecteer je certificaatbestand (X.509 formaat, kan .pem of .der zijn): certSign.selectP12=Selecteer je PKCS#12 Sleutelopslagbestand (.p12 of .pfx) (Optioneel, indien verstrekt, moet het je privésleutel en certificaat bevatten): -certSign.selectJKS=Select Your Java Keystore File (.jks or .keystore): +certSign.selectJKS=Selecteer je Java Keystore bestand (.jks of .keystore): certSign.certType=Certificaattype certSign.password=Voer je sleutelopslag of privésleutel wachtwoord in (indien van toepassing): certSign.showSig=Toon handtekening @@ -920,8 +920,8 @@ PDFToXML.submit=Converteren #PDFToCSV PDFToCSV.title=PDF naar CSV PDFToCSV.header=PDF naar CSV -PDFToCSV.prompt=Choose page to extract table -PDFToCSV.submit=Extract +PDFToCSV.prompt=Kies pagina om tabel te extraheren +PDFToCSV.submit=Extraheren #split-by-size-or-count split-by-size-or-count.header=PDF splitsen op grootte of aantal @@ -961,11 +961,11 @@ split-by-sections.submit=PDF splitsen #licenses -licenses.nav=Licensies -licenses.title=Licensies van derden -licenses.header=Licensies van derden +licenses.nav=Licenties +licenses.title=Licenties van derden +licenses.header=Licenties van derden licenses.module=Module licenses.version=Versie -licenses.license=Licensie +licenses.license=Licentie From 296f265391c951b818c58ad053006adea83711c2 Mon Sep 17 00:00:00 2001 From: Stirling-PDF-Bot Date: Tue, 6 Feb 2024 08:39:13 +0000 Subject: [PATCH 78/81] Update 3rd Party Licenses --- .../resources/static/3rdPartyLicenses.json | 92 +++++++++++-------- 1 file changed, 53 insertions(+), 39 deletions(-) diff --git a/src/main/resources/static/3rdPartyLicenses.json b/src/main/resources/static/3rdPartyLicenses.json index 699be591..c03dd84c 100644 --- a/src/main/resources/static/3rdPartyLicenses.json +++ b/src/main/resources/static/3rdPartyLicenses.json @@ -95,6 +95,13 @@ "moduleLicense": "MPL 2.0", "moduleLicenseUrl": "https://www.mozilla.org/en-US/MPL/2.0/" }, + { + "moduleName": "com.martiansoftware:jsap", + "moduleUrl": "http://www.martiansoftware.com/jsap/", + "moduleVersion": "2.1", + "moduleLicense": "LGPL", + "moduleLicenseUrl": "http://www.martiansoftware.com/jsap/license.html" + }, { "moduleName": "com.opencsv:opencsv", "moduleUrl": "http://opencsv.sf.net", @@ -204,31 +211,38 @@ "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "/LICENSE.txt" }, + { + "moduleName": "io.github.pixee:java-security-toolkit", + "moduleUrl": "https://github.com/pixee/java-security-toolkit", + "moduleVersion": "1.1.2", + "moduleLicense": "MIT License", + "moduleLicenseUrl": "http://www.opensource.org/licenses/mit-license.php" + }, { "moduleName": "io.micrometer:micrometer-commons", "moduleUrl": "https://github.com/micrometer-metrics/micrometer", - "moduleVersion": "1.12.1", + "moduleVersion": "1.12.2", "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, { "moduleName": "io.micrometer:micrometer-core", "moduleUrl": "https://github.com/micrometer-metrics/micrometer", - "moduleVersion": "1.12.1", + "moduleVersion": "1.12.2", "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, { "moduleName": "io.micrometer:micrometer-jakarta9", "moduleUrl": "https://github.com/micrometer-metrics/micrometer", - "moduleVersion": "1.12.1", + "moduleVersion": "1.12.2", "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, { "moduleName": "io.micrometer:micrometer-observation", "moduleUrl": "https://github.com/micrometer-metrics/micrometer", - "moduleVersion": "1.12.1", + "moduleVersion": "1.12.2", "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, @@ -310,7 +324,7 @@ }, { "moduleName": "net.bytebuddy:byte-buddy", - "moduleVersion": "1.14.10", + "moduleVersion": "1.14.11", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, @@ -385,21 +399,21 @@ { "moduleName": "org.apache.tomcat.embed:tomcat-embed-core", "moduleUrl": "https://tomcat.apache.org/", - "moduleVersion": "10.1.17", + "moduleVersion": "10.1.18", "moduleLicense": "Eclipse Public License - v 2.0", "moduleLicenseUrl": "https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt" }, { "moduleName": "org.apache.tomcat.embed:tomcat-embed-el", "moduleUrl": "https://tomcat.apache.org/", - "moduleVersion": "10.1.17", + "moduleVersion": "10.1.18", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, { "moduleName": "org.apache.tomcat.embed:tomcat-embed-websocket", "moduleUrl": "https://tomcat.apache.org/", - "moduleVersion": "10.1.17", + "moduleVersion": "10.1.18", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, @@ -582,14 +596,14 @@ { "moduleName": "org.slf4j:jul-to-slf4j", "moduleUrl": "http://www.slf4j.org", - "moduleVersion": "2.0.9", + "moduleVersion": "2.0.11", "moduleLicense": "MIT License", "moduleLicenseUrl": "http://www.opensource.org/licenses/mit-license.php" }, { "moduleName": "org.slf4j:slf4j-api", "moduleUrl": "http://www.slf4j.org", - "moduleVersion": "2.0.9", + "moduleVersion": "2.0.11", "moduleLicense": "MIT License", "moduleLicenseUrl": "http://www.opensource.org/licenses/mit-license.php" }, @@ -614,126 +628,126 @@ { "moduleName": "org.springframework.boot:spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.2.1", + "moduleVersion": "3.2.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-actuator", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.2.1", + "moduleVersion": "3.2.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-actuator-autoconfigure", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.2.1", + "moduleVersion": "3.2.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-autoconfigure", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.2.1", + "moduleVersion": "3.2.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-devtools", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.2.1", + "moduleVersion": "3.2.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.2.1", + "moduleVersion": "3.2.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter-actuator", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.2.1", + "moduleVersion": "3.2.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter-aop", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.2.1", + "moduleVersion": "3.2.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter-data-jpa", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.2.1", + "moduleVersion": "3.2.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter-jdbc", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.2.1", + "moduleVersion": "3.2.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter-json", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.2.1", + "moduleVersion": "3.2.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter-logging", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.2.1", + "moduleVersion": "3.2.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter-security", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.2.1", + "moduleVersion": "3.2.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter-thymeleaf", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.2.1", + "moduleVersion": "3.2.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter-tomcat", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.2.1", + "moduleVersion": "3.2.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter-web", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.2.1", + "moduleVersion": "3.2.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.data:spring-data-commons", "moduleUrl": "https://spring.io/projects/spring-data", - "moduleVersion": "3.2.1", + "moduleVersion": "3.2.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.data:spring-data-jpa", "moduleUrl": "https://projects.spring.io/spring-data-jpa", - "moduleVersion": "3.2.1", + "moduleVersion": "3.2.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, @@ -768,77 +782,77 @@ { "moduleName": "org.springframework:spring-aop", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.2", + "moduleVersion": "6.1.3", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-aspects", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.2", + "moduleVersion": "6.1.3", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-beans", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.2", + "moduleVersion": "6.1.3", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-context", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.2", + "moduleVersion": "6.1.3", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-core", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.2", + "moduleVersion": "6.1.3", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-expression", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.2", + "moduleVersion": "6.1.3", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-jcl", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.2", + "moduleVersion": "6.1.3", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-jdbc", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.2", + "moduleVersion": "6.1.3", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-orm", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.2", + "moduleVersion": "6.1.3", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-tx", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.2", + "moduleVersion": "6.1.3", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-web", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.2", + "moduleVersion": "6.1.3", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, From 3f932ebec9799f0981809ca0560b07d4d16dc18e Mon Sep 17 00:00:00 2001 From: NeilJared Date: Tue, 6 Feb 2024 10:03:55 +0100 Subject: [PATCH 79/81] Update messages_es_ES.properties Updated es_ES translation (100%) --- src/main/resources/messages_es_ES.properties | 104 +++++++++---------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/src/main/resources/messages_es_ES.properties b/src/main/resources/messages_es_ES.properties index 538cc776..37bc5a06 100644 --- a/src/main/resources/messages_es_ES.properties +++ b/src/main/resources/messages_es_ES.properties @@ -42,9 +42,9 @@ red=Rojo green=Verde blue=Azul custom=Personalizado... -WorkInProgess=Work in progress, May not work or be buggy, Please report any ploblems! -poweredBy=Powered by -yes=Yes +WorkInProgess=Tarea en progreso, puede no funcionar o ralentizarse; ¡por favor, informe de cualquier problema! +poweredBy=Desarrollado por +yes=Sí no=No changedCredsMessage=Se cambiaron las credenciales! notAuthenticatedMessage=Usuario no autentificado. @@ -56,24 +56,24 @@ usernameExistsMessage=El nuevo nombre de usuario está en uso. ############### # Pipeline # ############### -pipeline.header=Pipeline Menu (Alpha) -pipeline.uploadButton=Upload Custom -pipeline.configureButton=Configure -pipeline.defaultOption=Custom -pipeline.submitButton=Submit +pipeline.header=Menu Pipeline (Alfa) +pipeline.uploadButton=Cargar personalización +pipeline.configureButton=Configurar +pipeline.defaultOption=Personalizar +pipeline.submitButton=Enviar ###################### # Pipeline Options # ###################### -pipelineOptions.header=Pipeline Configuration -pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Operation Settings -pipelineOptions.pipelineNamePrompt=Enter pipeline name here -pipelineOptions.selectOperation=Select Operation -pipelineOptions.addOperationButton=Add operation +pipelineOptions.header=Configuración Pipeline +pipelineOptions.pipelineNameLabel=Nombre del Pipeline +pipelineOptions.saveSettings=Guardar configuración de la oiperación +pipelineOptions.pipelineNamePrompt=Introduzca aquí el nombre del pipeline +pipelineOptions.selectOperation=Seleccione la operación +pipelineOptions.addOperationButton=Añadir operación pipelineOptions.pipelineHeader=Pipeline: -pipelineOptions.saveButton=Download -pipelineOptions.validateButton=Validate +pipelineOptions.saveButton=Descargar +pipelineOptions.validateButton=Validar @@ -466,37 +466,37 @@ HTMLToPDF.header=HTML a PDF HTMLToPDF.help=Acepta archivos HTML y ZIPs conteniendo los html/css/imágenes, etc, requeridas HTMLToPDF.submit=Convertir HTMLToPDF.credit=Utiliza WeasyPrint -HTMLToPDF.zoom=Zoom level for displaying the website. -HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) -HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) -HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) -HTMLToPDF.printBackground=Render the background of websites. -HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) -HTMLToPDF.cssMediaType=Change the CSS media type of the page. -HTMLToPDF.none=None -HTMLToPDF.print=Print -HTMLToPDF.screen=Screen +HTMLToPDF.zoom=Nivel de zoom para mostrar la página web. +HTMLToPDF.pageWidth=Ancho de la página en centímetros. (Dejar en blanco por defecto) +HTMLToPDF.pageHeight=Alto de la página en centímetros. (Dejar en blanco por defecto) +HTMLToPDF.marginTop=Margen superior de la página en milímetros. (Dejar en blanco por defecto) +HTMLToPDF.marginBottom=Margen inferior de la página en milímetros. (Dejar en blanco por defecto) +HTMLToPDF.marginLeft=Margen izquierdo de la página en milímetros. (Dejar en blanco por defecto) +HTMLToPDF.marginRight=Margen derecho de la página en milímetros. (Dejar en blanco por defecto) +HTMLToPDF.printBackground=Renderizar el fondo de las páginas web. +HTMLToPDF.defaultHeader=Habilitar encabezado predeterminado (Nombre y número de página) +HTMLToPDF.cssMediaType=Cambiar el tipo de medio CSS de la página. +HTMLToPDF.none=Ninguno +HTMLToPDF.print=Imprimir +HTMLToPDF.screen=Pantalla #AddStampRequest -AddStampRequest.header=Stamp PDF -AddStampRequest.title=Stamp PDF -AddStampRequest.stampType=Stamp Type -AddStampRequest.stampText=Stamp Text -AddStampRequest.stampImage=Stamp Image -AddStampRequest.alphabet=Alphabet -AddStampRequest.fontSize=Font/Image Size -AddStampRequest.rotation=Rotation -AddStampRequest.opacity=Opacity -AddStampRequest.position=Position -AddStampRequest.overrideX=Override X Coordinate -AddStampRequest.overrideY=Override Y Coordinate -AddStampRequest.customMargin=Custom Margin -AddStampRequest.customColor=Custom Text Color -AddStampRequest.submit=Submit +AddStampRequest.header=Sellar PDF +AddStampRequest.title=Sellar PDF +AddStampRequest.stampType=Tipo de sello +AddStampRequest.stampText=Texto del sello +AddStampRequest.stampImage=Imagen de sello +AddStampRequest.alphabet=Alfabeto +AddStampRequest.fontSize=Tamaño de fuente/imagen +AddStampRequest.rotation=Rotación +AddStampRequest.opacity=Opacidad +AddStampRequest.position=Posición +AddStampRequest.overrideX=Forzar coordenada X +AddStampRequest.overrideY=Forzar coordenada Y +AddStampRequest.customMargin=Personalizar margen +AddStampRequest.customColor=Personalizar color de texto +AddStampRequest.submit=Enviar #sanitizePDF sanitizePDF.title=Desinfectar archivo PDF @@ -584,11 +584,11 @@ scalePages.submit=Entregar certSign.title=Firma con certificado certSign.header=Firmar un PDF con su certificado (en desarrollo) certSign.selectPDF=Seleccione un archivo PDF para firmar: -certSign.jksNote=Note: If your certificate type is not listed below, please convert it to a Java Keystore (.jks) file using the keytool command line tool. Then, choose the .jks file option below. +certSign.jksNote=Nota: si el tipo de certificado no está enla lista de abajo, por favor conviértalo a un archivo almacén de claves de Java Java KeyStore (.jks) utilizando la herramienta línea de comandos. Posteriormente, seleccione en el listado de abajo la opción archivo .jks. certSign.selectKey=Seleccione su archivo de clave privada (formato PKCS#8, podría ser .pem o .der): certSign.selectCert=Seleccione su archivo de certificado (formato X.509, podría ser .pem o .der): certSign.selectP12=Seleccione su archivo de almacén de claves PKCS#12 (.p12 o .pfx) (Opcional, si se proporciona, debe contener su clave privada y certificado): -certSign.selectJKS=Select Your Java Keystore File (.jks or .keystore): +certSign.selectJKS=Seleccione su archivo de almacén de claves Java KeyStore (.jks or .keystore): certSign.certType=Tipo de certificado certSign.password=Introduzca su almacén de claves o contraseña de clave privada (si corresponde): certSign.showSig=Mostrar firma @@ -961,11 +961,11 @@ split-by-sections.submit=Dividir PDF #licenses -licenses.nav=Licenses -licenses.title=3rd Party Licenses -licenses.header=3rd Party Licenses -licenses.module=Module -licenses.version=Version -licenses.license=License +licenses.nav=Licencias +licenses.title=Licencias de terceros +licenses.header=Licencias de terceros +licenses.module=Módulo +licenses.version=Versión +licenses.license=Licencia From 4af58118c932b1cc6f0931d863995f77baed52e6 Mon Sep 17 00:00:00 2001 From: sbplat <71648843+sbplat@users.noreply.github.com> Date: Wed, 7 Feb 2024 21:40:33 -0500 Subject: [PATCH 80/81] fix: use the same margins for x and y in the stamp feature --- .../software/SPDF/LibreOfficeListener.java | 3 +- .../software/SPDF/SPdfApplication.java | 3 +- .../api/MultiPageLayoutController.java | 5 +- .../controller/api/PdfOverlayController.java | 5 +- .../api/RearrangePagesPDFController.java | 9 ++- .../controller/api/RotationController.java | 6 +- .../controller/api/ScalePagesController.java | 5 +- .../controller/api/SplitPDFController.java | 6 +- .../api/SplitPdfBySectionsController.java | 6 +- .../api/SplitPdfBySizeController.java | 6 +- .../ConvertBookToPDFController.java | 2 +- .../api/converters/ConvertHtmlToPDF.java | 2 +- .../converters/ConvertImgPDFController.java | 6 +- .../api/converters/ConvertMarkdownToPdf.java | 2 +- .../converters/ConvertOfficeController.java | 5 +- .../ConvertPDFToBookController.java | 5 +- .../api/converters/ConvertPDFToPDFA.java | 6 +- .../api/filters/FilterController.java | 2 +- .../api/misc/AutoRenameController.java | 5 +- .../api/misc/AutoSplitPdfController.java | 6 +- .../api/misc/BlankPageController.java | 5 +- .../api/misc/CompressController.java | 6 +- .../api/misc/ExtractImagesController.java | 6 +- .../api/misc/FakeScanControllerWIP.java | 6 +- .../api/misc/MetadataController.java | 6 +- .../controller/api/misc/OCRController.java | 10 ++- .../api/misc/OverlayImageController.java | 6 +- .../api/misc/PageNumbersController.java | 5 +- .../controller/api/misc/RepairController.java | 6 +- .../controller/api/misc/ShowJavascript.java | 5 +- .../controller/api/misc/StampController.java | 71 ++++++++++--------- .../api/pipeline/PipelineProcessor.java | 5 +- .../api/security/CertSignController.java | 6 +- .../api/security/PasswordController.java | 12 ++-- .../api/security/RedactController.java | 5 +- .../api/security/SanitizeController.java | 5 +- .../api/security/WatermarkController.java | 6 +- .../software/SPDF/utils/FileToPdf.java | 6 +- .../software/SPDF/utils/GeneralUtils.java | 9 +-- .../software/SPDF/utils/PDFToFile.java | 3 +- .../software/SPDF/utils/PdfUtils.java | 3 +- .../software/SPDF/utils/ProcessExecutor.java | 13 +++- .../software/SPDF/utils/WebResponseUtils.java | 3 +- 43 files changed, 187 insertions(+), 116 deletions(-) diff --git a/src/main/java/stirling/software/SPDF/LibreOfficeListener.java b/src/main/java/stirling/software/SPDF/LibreOfficeListener.java index d8196dcd..96c4d270 100644 --- a/src/main/java/stirling/software/SPDF/LibreOfficeListener.java +++ b/src/main/java/stirling/software/SPDF/LibreOfficeListener.java @@ -1,12 +1,13 @@ package stirling.software.SPDF; -import io.github.pixee.security.SystemCommand; import java.io.IOException; import java.net.InetSocketAddress; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import io.github.pixee.security.SystemCommand; + public class LibreOfficeListener { private static final long ACTIVITY_TIMEOUT = 20 * 60 * 1000; // 20 minutes diff --git a/src/main/java/stirling/software/SPDF/SPdfApplication.java b/src/main/java/stirling/software/SPDF/SPdfApplication.java index f37dfb6e..62cbfe10 100644 --- a/src/main/java/stirling/software/SPDF/SPdfApplication.java +++ b/src/main/java/stirling/software/SPDF/SPdfApplication.java @@ -1,6 +1,5 @@ package stirling.software.SPDF; -import io.github.pixee.security.SystemCommand; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Collections; @@ -11,6 +10,8 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.core.env.Environment; import org.springframework.scheduling.annotation.EnableScheduling; +import io.github.pixee.security.SystemCommand; + import jakarta.annotation.PostConstruct; import stirling.software.SPDF.config.ConfigInitializer; import stirling.software.SPDF.utils.GeneralUtils; 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 b4949a58..adc5424d 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api; -import io.github.pixee.security.Filenames; import java.awt.Color; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -22,6 +21,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -137,6 +137,7 @@ public class MultiPageLayoutController { byte[] result = baos.toByteArray(); return WebResponseUtils.bytesToWebResponse( result, - Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_layoutChanged.pdf"); + Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + + "_layoutChanged.pdf"); } } 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 f9938a39..a6148d4a 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/PdfOverlayController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/PdfOverlayController.java @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api; -import io.github.pixee.security.Filenames; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; @@ -21,6 +20,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -77,7 +77,8 @@ public class PdfOverlayController { overlay.overlay(overlayGuide).save(outputStream); byte[] data = outputStream.toByteArray(); String outputFilename = - Filenames.toSimpleFileName(baseFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + Filenames.toSimpleFileName(baseFile.getOriginalFilename()) + .replaceFirst("[.][^.]+$", "") + "_overlayed.pdf"; // Remove file extension and append .pdf return WebResponseUtils.bytesToWebResponse( 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 3074f9f8..88bdcd91 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api; -import io.github.pixee.security.Filenames; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -17,6 +16,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -58,7 +58,9 @@ public class RearrangePagesPDFController { } return WebResponseUtils.pdfDocToWebResponse( document, - Filenames.toSimpleFileName(pdfFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_removed_pages.pdf"); + Filenames.toSimpleFileName(pdfFile.getOriginalFilename()) + .replaceFirst("[.][^.]+$", "") + + "_removed_pages.pdf"); } private List removeFirst(int totalPages) { @@ -212,7 +214,8 @@ public class RearrangePagesPDFController { return WebResponseUtils.pdfDocToWebResponse( document, - Filenames.toSimpleFileName(pdfFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + Filenames.toSimpleFileName(pdfFile.getOriginalFilename()) + .replaceFirst("[.][^.]+$", "") + "_rearranged.pdf"); } catch (IOException e) { logger.error("Failed rearranging documents", e); 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 609e20f8..76f508d3 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/RotationController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/RotationController.java @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api; -import io.github.pixee.security.Filenames; import java.io.IOException; import org.apache.pdfbox.Loader; @@ -16,6 +15,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -50,6 +50,8 @@ public class RotationController { return WebResponseUtils.pdfDocToWebResponse( document, - Filenames.toSimpleFileName(pdfFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_rotated.pdf"); + Filenames.toSimpleFileName(pdfFile.getOriginalFilename()) + .replaceFirst("[.][^.]+$", "") + + "_rotated.pdf"); } } 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 03994321..91cd012d 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/ScalePagesController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/ScalePagesController.java @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api; -import io.github.pixee.security.Filenames; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.HashMap; @@ -23,6 +22,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -113,6 +113,7 @@ public class ScalePagesController { return WebResponseUtils.bytesToWebResponse( baos.toByteArray(), - Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_scaled.pdf"); + Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + + "_scaled.pdf"); } } 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 c218788a..44c87464 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api; -import io.github.pixee.security.Filenames; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.file.Files; @@ -24,6 +23,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -84,7 +84,9 @@ public class SplitPDFController { Path zipFile = Files.createTempFile("split_documents", ".zip"); - String filename = Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", ""); + String filename = + Filenames.toSimpleFileName(file.getOriginalFilename()) + .replaceFirst("[.][^.]+$", ""); try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipFile))) { // loop through the split documents and write them to the zip file for (int i = 0; i < splitDocumentsBoas.size(); i++) { 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 2951a73e..3deb798e 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api; -import io.github.pixee.security.Filenames; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.file.Files; @@ -27,6 +26,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -65,7 +65,9 @@ public class SplitPdfBySectionsController { sourceDocument.close(); Path zipFile = Files.createTempFile("split_documents", ".zip"); - String filename = Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", ""); + String filename = + Filenames.toSimpleFileName(file.getOriginalFilename()) + .replaceFirst("[.][^.]+$", ""); byte[] data; try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipFile))) { 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 eb2cfa28..45d2dd38 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api; -import io.github.pixee.security.Filenames; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.file.Files; @@ -21,6 +20,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -121,7 +121,9 @@ public class SplitPdfBySizeController { sourceDocument.close(); Path zipFile = Files.createTempFile("split_documents", ".zip"); - String filename = Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", ""); + String filename = + Filenames.toSimpleFileName(file.getOriginalFilename()) + .replaceFirst("[.][^.]+$", ""); byte[] data; try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipFile))) { diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertBookToPDFController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertBookToPDFController.java index a266e871..3cbc783c 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertBookToPDFController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertBookToPDFController.java @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api.converters; -import io.github.pixee.security.Filenames; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.ResponseEntity; @@ -10,6 +9,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java index 2cf79992..189eebdf 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api.converters; -import io.github.pixee.security.Filenames; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.http.ResponseEntity; @@ -10,6 +9,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; 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 c131d883..86a70472 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 @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api.converters; -import io.github.pixee.security.Filenames; import java.io.IOException; import java.net.URLConnection; @@ -19,6 +18,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -57,7 +57,9 @@ public class ConvertImgPDFController { // returns bytes for image boolean singleImage = "single".equals(singleOrMultiple); byte[] result = null; - String filename = Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", ""); + String filename = + Filenames.toSimpleFileName(file.getOriginalFilename()) + .replaceFirst("[.][^.]+$", ""); try { result = PdfUtils.convertFromPdf( diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java index 39710ea0..050dd0fe 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api.converters; -import io.github.pixee.security.Filenames; import java.util.List; import java.util.Map; @@ -20,6 +19,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java index ce3d9fe9..c6740b5f 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api.converters; -import io.github.pixee.security.Filenames; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -17,6 +16,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -90,7 +90,8 @@ public class ConvertOfficeController { byte[] pdfByteArray = convertToPdf(inputFile); return WebResponseUtils.bytesToWebResponse( pdfByteArray, - Filenames.toSimpleFileName(inputFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + Filenames.toSimpleFileName(inputFile.getOriginalFilename()) + .replaceFirst("[.][^.]+$", "") + "_convertedToPDF.pdf"); } } diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToBookController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToBookController.java index 9711fc5e..c9171305 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToBookController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToBookController.java @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api.converters; -import io.github.pixee.security.Filenames; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; @@ -16,6 +15,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -93,7 +93,8 @@ public class ConvertPDFToBookController { } String outputFilename = - Filenames.toSimpleFileName(fileInput.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + Filenames.toSimpleFileName(fileInput.getOriginalFilename()) + .replaceFirst("[.][^.]+$", "") + "." + outputFormat; // Remove file extension and append .pdf diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java index 5de8ee9a..41498413 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api.converters; -import io.github.pixee.security.Filenames; import java.nio.file.Files; import java.nio.file.Path; import java.util.ArrayList; @@ -13,6 +12,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -64,7 +64,9 @@ public class ConvertPDFToPDFA { // Return the optimized PDF as a response String outputFilename = - Filenames.toSimpleFileName(inputFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_PDFA.pdf"; + Filenames.toSimpleFileName(inputFile.getOriginalFilename()) + .replaceFirst("[.][^.]+$", "") + + "_PDFA.pdf"; return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename); } } 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 6326cf19..9beaf413 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 @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api.filters; -import io.github.pixee.security.Filenames; import java.io.IOException; import org.apache.pdfbox.Loader; @@ -14,6 +13,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; 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 9000658c..2dc6c8a3 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 @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api.misc; -import io.github.pixee.security.Filenames; import java.io.IOException; import java.util.ArrayList; import java.util.Comparator; @@ -19,6 +18,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -134,7 +134,8 @@ public class AutoRenameController { return WebResponseUtils.pdfDocToWebResponse(document, header + ".pdf"); } else { logger.info("File has no good title to be found"); - return WebResponseUtils.pdfDocToWebResponse(document, Filenames.toSimpleFileName(file.getOriginalFilename())); + return WebResponseUtils.pdfDocToWebResponse( + document, Filenames.toSimpleFileName(file.getOriginalFilename())); } } } 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 da162d85..32f39c04 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 @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api.misc; -import io.github.pixee.security.Filenames; import java.awt.image.BufferedImage; import java.awt.image.DataBufferByte; import java.awt.image.DataBufferInt; @@ -32,6 +31,7 @@ import com.google.zxing.PlanarYUVLuminanceSource; import com.google.zxing.Result; import com.google.zxing.common.HybridBinarizer; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -98,7 +98,9 @@ public class AutoSplitPdfController { document.close(); Path zipFile = Files.createTempFile("split_documents", ".zip"); - String filename = Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", ""); + String filename = + Filenames.toSimpleFileName(file.getOriginalFilename()) + .replaceFirst("[.][^.]+$", ""); byte[] data; try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipFile))) { 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 34664a3b..b414a35b 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 @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api.misc; -import io.github.pixee.security.Filenames; import java.awt.image.BufferedImage; import java.io.IOException; import java.nio.file.Files; @@ -28,6 +27,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -132,7 +132,8 @@ public class BlankPageController { return WebResponseUtils.pdfDocToWebResponse( document, - Filenames.toSimpleFileName(inputFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + Filenames.toSimpleFileName(inputFile.getOriginalFilename()) + .replaceFirst("[.][^.]+$", "") + "_blanksRemoved.pdf"); } catch (IOException e) { e.printStackTrace(); 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 c1b4a996..82a2c72f 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 @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api.misc; -import io.github.pixee.security.Filenames; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; @@ -30,6 +29,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -265,7 +265,9 @@ public class CompressController { // Return the optimized PDF as a response String outputFilename = - Filenames.toSimpleFileName(inputFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_Optimized.pdf"; + Filenames.toSimpleFileName(inputFile.getOriginalFilename()) + .replaceFirst("[.][^.]+$", "") + + "_Optimized.pdf"; return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename); } } 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 cb9071d8..3931e2df 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 @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api.misc; -import io.github.pixee.security.Filenames; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; @@ -30,6 +29,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -67,7 +67,9 @@ public class ExtractImagesController { zos.setLevel(Deflater.BEST_COMPRESSION); int imageIndex = 1; - String filename = Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", ""); + String filename = + Filenames.toSimpleFileName(file.getOriginalFilename()) + .replaceFirst("[.][^.]+$", ""); int pageNum = 0; Set processedImages = new HashSet<>(); // Iterate over each page 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 8fb4af43..789bf17e 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 @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api.misc; -import io.github.pixee.security.Filenames; import java.awt.Color; import java.awt.geom.AffineTransform; import java.awt.image.AffineTransformOp; @@ -34,6 +33,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -142,7 +142,9 @@ public class FakeScanControllerWIP { // Return the optimized PDF as a response String outputFilename = - Filenames.toSimpleFileName(inputFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_scanned.pdf"; + Filenames.toSimpleFileName(inputFile.getOriginalFilename()) + .replaceFirst("[.][^.]+$", "") + + "_scanned.pdf"; return WebResponseUtils.boasToWebResponse(baos, outputFilename); } } 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 8e4ae664..fec07380 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 @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api.misc; -import io.github.pixee.security.Filenames; import java.io.IOException; import java.text.ParseException; import java.text.SimpleDateFormat; @@ -19,6 +18,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -165,6 +165,8 @@ public class MetadataController { document.setDocumentInformation(info); return WebResponseUtils.pdfDocToWebResponse( document, - Filenames.toSimpleFileName(pdfFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_metadata.pdf"); + Filenames.toSimpleFileName(pdfFile.getOriginalFilename()) + .replaceFirst("[.][^.]+$", "") + + "_metadata.pdf"); } } diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java index 143ae1da..542e3c6d 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api.misc; -import io.github.pixee.security.Filenames; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; @@ -25,6 +24,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -183,12 +183,16 @@ public class OCRController { // Return the OCR processed PDF as a response String outputFilename = - Filenames.toSimpleFileName(inputFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_OCR.pdf"; + Filenames.toSimpleFileName(inputFile.getOriginalFilename()) + .replaceFirst("[.][^.]+$", "") + + "_OCR.pdf"; if (sidecar != null && sidecar) { // Create a zip file containing both the PDF and the text file String outputZipFilename = - Filenames.toSimpleFileName(inputFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_OCR.zip"; + Filenames.toSimpleFileName(inputFile.getOriginalFilename()) + .replaceFirst("[.][^.]+$", "") + + "_OCR.zip"; Path tempZipFile = Files.createTempFile("output_", ".zip"); try (ZipOutputStream zipOut = diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java index 01da177d..c3fad457 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api.misc; -import io.github.pixee.security.Filenames; import java.io.IOException; import org.slf4j.Logger; @@ -13,6 +12,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -45,7 +45,9 @@ public class OverlayImageController { return WebResponseUtils.bytesToWebResponse( result, - Filenames.toSimpleFileName(pdfFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_overlayed.pdf"); + Filenames.toSimpleFileName(pdfFile.getOriginalFilename()) + .replaceFirst("[.][^.]+$", "") + + "_overlayed.pdf"); } catch (IOException e) { logger.error("Failed to add image to PDF", e); return new ResponseEntity<>(HttpStatus.BAD_REQUEST); 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 cd99e9d0..337a9f48 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 @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api.misc; -import io.github.pixee.security.Filenames; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.List; @@ -22,6 +21,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -146,7 +146,8 @@ public class PageNumbersController { return WebResponseUtils.bytesToWebResponse( baos.toByteArray(), - Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_numbersAdded.pdf", + Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + + "_numbersAdded.pdf", MediaType.APPLICATION_PDF); } } diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/RepairController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/RepairController.java index caaaed5c..85d4560c 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/RepairController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/RepairController.java @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api.misc; -import io.github.pixee.security.Filenames; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -16,6 +15,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -66,7 +66,9 @@ public class RepairController { // Return the optimized PDF as a response String outputFilename = - Filenames.toSimpleFileName(inputFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_repaired.pdf"; + Filenames.toSimpleFileName(inputFile.getOriginalFilename()) + .replaceFirst("[.][^.]+$", "") + + "_repaired.pdf"; return WebResponseUtils.bytesToWebResponse(pdfBytes, outputFilename); } } 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 0903a6e1..6accfb7a 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 @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api.misc; -import io.github.pixee.security.Filenames; import java.nio.charset.StandardCharsets; import java.util.Map; @@ -17,6 +16,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -55,7 +55,8 @@ public class ShowJavascript { script += "// File: " - + Filenames.toSimpleFileName(inputFile.getOriginalFilename()) + + Filenames.toSimpleFileName( + inputFile.getOriginalFilename()) + ", Script: " + name + "\n" diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/StampController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/StampController.java index 52e8d970..99a5e2df 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/StampController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/StampController.java @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api.misc; -import io.github.pixee.security.Filenames; import java.awt.Color; import java.awt.image.BufferedImage; import java.io.File; @@ -33,6 +32,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -65,6 +65,7 @@ public class StampController { String customColor = request.getCustomColor(); float marginFactor; + switch (request.getCustomMargin().toLowerCase()) { case "small": marginFactor = 0.02f; @@ -78,7 +79,6 @@ public class StampController { case "x-large": marginFactor = 0.075f; break; - default: marginFactor = 0.035f; break; @@ -88,6 +88,9 @@ public class StampController { PDDocument document = Loader.loadPDF(pdfFile.getBytes()); for (PDPage page : document.getPages()) { + PDRectangle pageSize = page.getMediaBox(); + float margin = marginFactor * (pageSize.getWidth() + pageSize.getHeight()) / 2; + PDPageContentStream contentStream = new PDPageContentStream( document, page, PDPageContentStream.AppendMode.APPEND, true, true); @@ -108,7 +111,7 @@ public class StampController { alphabet, overrideX, overrideY, - marginFactor, + margin, customColor); } else if ("image".equalsIgnoreCase(watermarkType)) { addImageStamp( @@ -121,7 +124,7 @@ public class StampController { fontSize, overrideX, overrideY, - marginFactor); + margin); } contentStream.close(); @@ -129,7 +132,9 @@ public class StampController { return WebResponseUtils.pdfDocToWebResponse( document, - Filenames.toSimpleFileName(pdfFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_watermarked.pdf"); + Filenames.toSimpleFileName(pdfFile.getOriginalFilename()) + .replaceFirst("[.][^.]+$", "") + + "_watermarked.pdf"); } private void addTextStamp( @@ -143,7 +148,7 @@ public class StampController { String alphabet, float overrideX, // X override float overrideY, - float marginFactor, + float margin, String colorString) // Y override throws IOException { String resourceDir = ""; @@ -205,14 +210,10 @@ public class StampController { } else { x = calculatePositionX( - pageSize, - position, - fontSize, - font, - fontSize, - watermarkText, - marginFactor); - y = calculatePositionY(pageSize, position, fontSize, marginFactor); + pageSize, position, fontSize, font, fontSize, watermarkText, margin); + y = + calculatePositionY( + pageSize, position, calculateTextCapHeight(font, fontSize), margin); } contentStream.beginText(); @@ -231,7 +232,7 @@ public class StampController { float fontSize, float overrideX, float overrideY, - float marginFactor) + float margin) throws IOException { // Load the watermark image @@ -257,10 +258,8 @@ public class StampController { x = overrideX; y = overrideY; } else { - x = - calculatePositionX( - pageSize, position, desiredPhysicalWidth, null, 0, null, marginFactor); - y = calculatePositionY(pageSize, position, fontSize, marginFactor); + x = calculatePositionX(pageSize, position, desiredPhysicalWidth, null, 0, null, margin); + y = calculatePositionY(pageSize, position, fontSize, margin); } contentStream.saveGraphicsState(); @@ -277,17 +276,31 @@ public class StampController { PDFont font, float fontSize, String text, - float marginFactor) + float margin) throws IOException { float actualWidth = (text != null) ? calculateTextWidth(text, font, fontSize) : contentWidth; switch (position % 3) { case 1: // Left - return pageSize.getLowerLeftX() + marginFactor * pageSize.getWidth(); + return pageSize.getLowerLeftX() + margin; case 2: // Center return (pageSize.getWidth() - actualWidth) / 2; case 0: // Right - return pageSize.getUpperRightX() - actualWidth - marginFactor * pageSize.getWidth(); + return pageSize.getUpperRightX() - actualWidth - margin; + default: + return 0; + } + } + + private float calculatePositionY( + PDRectangle pageSize, int position, float height, float margin) { + switch ((position - 1) / 3) { + case 0: // Top + return pageSize.getUpperRightY() - height - margin; + case 1: // Middle + return (pageSize.getHeight() - height) / 2; + case 2: // Bottom + return pageSize.getLowerLeftY() + margin; default: return 0; } @@ -297,17 +310,7 @@ public class StampController { return font.getStringWidth(text) / 1000 * fontSize; } - private float calculatePositionY( - PDRectangle pageSize, int position, float height, float marginFactor) { - switch ((position - 1) / 3) { - case 0: // Top - return pageSize.getUpperRightY() - height - marginFactor * pageSize.getHeight(); - case 1: // Middle - return (pageSize.getHeight() - height) / 2; - case 2: // Bottom - return pageSize.getLowerLeftY() + marginFactor * pageSize.getHeight(); - default: - return 0; - } + private float calculateTextCapHeight(PDFont font, float fontSize) { + return font.getFontDescriptor().getCapHeight() / 1000 * fontSize; } } diff --git a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java index c4e98bdb..c327cdd8 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java +++ b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java @@ -1,7 +1,5 @@ package stirling.software.SPDF.controller.api.pipeline; -import io.github.pixee.security.Filenames; -import io.github.pixee.security.ZipSecurity; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; @@ -38,6 +36,9 @@ import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; +import io.github.pixee.security.ZipSecurity; + import jakarta.servlet.ServletContext; import stirling.software.SPDF.SPdfApplication; import stirling.software.SPDF.model.PipelineConfig; 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 658f68f3..d066bd9a 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 @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api.security; -import io.github.pixee.security.Filenames; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -43,6 +42,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -124,7 +124,9 @@ public class CertSignController { ByteArrayOutputStream baos = new ByteArrayOutputStream(); sign(pdf.getBytes(), baos, createSignature, name, location, reason); return WebResponseUtils.boasToWebResponse( - baos, Filenames.toSimpleFileName(pdf.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_signed.pdf"); + baos, + Filenames.toSimpleFileName(pdf.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + + "_signed.pdf"); } private static void sign( 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 328b753c..84c44933 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 @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api.security; -import io.github.pixee.security.Filenames; import java.io.IOException; import org.apache.pdfbox.Loader; @@ -16,6 +15,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -44,7 +44,8 @@ public class PasswordController { document.setAllSecurityToBeRemoved(true); return WebResponseUtils.pdfDocToWebResponse( document, - Filenames.toSimpleFileName(fileInput.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + Filenames.toSimpleFileName(fileInput.getOriginalFilename()) + .replaceFirst("[.][^.]+$", "") + "_password_removed.pdf"); } @@ -89,10 +90,13 @@ public class PasswordController { if ("".equals(ownerPassword) && "".equals(password)) return WebResponseUtils.pdfDocToWebResponse( document, - Filenames.toSimpleFileName(fileInput.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + Filenames.toSimpleFileName(fileInput.getOriginalFilename()) + .replaceFirst("[.][^.]+$", "") + "_permissions.pdf"); return WebResponseUtils.pdfDocToWebResponse( document, - Filenames.toSimpleFileName(fileInput.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_passworded.pdf"); + Filenames.toSimpleFileName(fileInput.getOriginalFilename()) + .replaceFirst("[.][^.]+$", "") + + "_passworded.pdf"); } } 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 82ff54dd..0f482647 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 @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api.security; -import io.github.pixee.security.Filenames; import java.awt.Color; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; @@ -26,6 +25,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -105,7 +105,8 @@ public class RedactController { byte[] pdfContent = baos.toByteArray(); return WebResponseUtils.bytesToWebResponse( pdfContent, - Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_redacted.pdf"); + Filenames.toSimpleFileName(file.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + + "_redacted.pdf"); } private void redactFoundText( 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 bbcfeeaa..6dfbf044 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 @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api.security; -import io.github.pixee.security.Filenames; import java.io.IOException; import org.apache.pdfbox.Loader; @@ -29,6 +28,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -77,7 +77,8 @@ public class SanitizeController { return WebResponseUtils.pdfDocToWebResponse( document, - Filenames.toSimpleFileName(inputFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + Filenames.toSimpleFileName(inputFile.getOriginalFilename()) + .replaceFirst("[.][^.]+$", "") + "_sanitized.pdf"); } } 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 91a8a265..9506822c 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 @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api.security; -import io.github.pixee.security.Filenames; import java.awt.Color; import java.awt.image.BufferedImage; import java.io.File; @@ -32,6 +31,7 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -106,7 +106,9 @@ public class WatermarkController { return WebResponseUtils.pdfDocToWebResponse( document, - Filenames.toSimpleFileName(pdfFile.getOriginalFilename()).replaceFirst("[.][^.]+$", "") + "_watermarked.pdf"); + Filenames.toSimpleFileName(pdfFile.getOriginalFilename()) + .replaceFirst("[.][^.]+$", "") + + "_watermarked.pdf"); } private void addTextWatermark( diff --git a/src/main/java/stirling/software/SPDF/utils/FileToPdf.java b/src/main/java/stirling/software/SPDF/utils/FileToPdf.java index 09ce430c..90f7dbc3 100644 --- a/src/main/java/stirling/software/SPDF/utils/FileToPdf.java +++ b/src/main/java/stirling/software/SPDF/utils/FileToPdf.java @@ -1,6 +1,5 @@ package stirling.software.SPDF.utils; -import io.github.pixee.security.ZipSecurity; import java.io.ByteArrayInputStream; import java.io.IOException; import java.nio.charset.StandardCharsets; @@ -13,6 +12,8 @@ import java.util.stream.Stream; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; +import io.github.pixee.security.ZipSecurity; + import stirling.software.SPDF.model.api.converters.HTMLToPdfRequest; import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; @@ -145,7 +146,8 @@ public class FileToPdf { private static Path unzipAndGetMainHtml(byte[] fileBytes) throws IOException { Path tempDirectory = Files.createTempDirectory("unzipped_"); - try (ZipInputStream zipIn = ZipSecurity.createHardenedInputStream(new ByteArrayInputStream(fileBytes))) { + try (ZipInputStream zipIn = + ZipSecurity.createHardenedInputStream(new ByteArrayInputStream(fileBytes))) { ZipEntry entry = zipIn.getNextEntry(); while (entry != null) { Path filePath = tempDirectory.resolve(entry.getName()); diff --git a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java index 1737b27e..7b1082b3 100644 --- a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java @@ -1,13 +1,10 @@ package stirling.software.SPDF.utils; -import io.github.pixee.security.HostValidator; -import io.github.pixee.security.Urls; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; -import java.net.URL; import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; @@ -19,6 +16,9 @@ import java.util.List; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.HostValidator; +import io.github.pixee.security.Urls; + public class GeneralUtils { public static File convertMultipartFileToFile(MultipartFile multipartFile) throws IOException { @@ -59,7 +59,8 @@ public class GeneralUtils { public static boolean isValidURL(String urlStr) { try { - Urls.create(urlStr, Urls.HTTP_PROTOCOLS, HostValidator.DENY_COMMON_INFRASTRUCTURE_TARGETS); + Urls.create( + urlStr, Urls.HTTP_PROTOCOLS, HostValidator.DENY_COMMON_INFRASTRUCTURE_TARGETS); return true; } catch (MalformedURLException e) { return false; diff --git a/src/main/java/stirling/software/SPDF/utils/PDFToFile.java b/src/main/java/stirling/software/SPDF/utils/PDFToFile.java index 7afe6a49..43683be8 100644 --- a/src/main/java/stirling/software/SPDF/utils/PDFToFile.java +++ b/src/main/java/stirling/software/SPDF/utils/PDFToFile.java @@ -1,6 +1,5 @@ package stirling.software.SPDF.utils; -import io.github.pixee.security.Filenames; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; @@ -21,6 +20,8 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; + import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; public class PDFToFile { diff --git a/src/main/java/stirling/software/SPDF/utils/PdfUtils.java b/src/main/java/stirling/software/SPDF/utils/PdfUtils.java index 748f8aad..77814340 100644 --- a/src/main/java/stirling/software/SPDF/utils/PdfUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/PdfUtils.java @@ -1,6 +1,5 @@ package stirling.software.SPDF.utils; -import io.github.pixee.security.Filenames; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.awt.image.RenderedImage; @@ -38,6 +37,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; + public class PdfUtils { private static final Logger logger = LoggerFactory.getLogger(PdfUtils.class); diff --git a/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java b/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java index f75367a7..2c81dce5 100644 --- a/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java +++ b/src/main/java/stirling/software/SPDF/utils/ProcessExecutor.java @@ -1,6 +1,5 @@ package stirling.software.SPDF.utils; -import io.github.pixee.security.BoundedLineReader; import java.io.BufferedReader; import java.io.File; import java.io.IOException; @@ -17,6 +16,8 @@ import java.util.concurrent.TimeUnit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import io.github.pixee.security.BoundedLineReader; + public class ProcessExecutor { private static final Logger logger = LoggerFactory.getLogger(ProcessExecutor.class); @@ -110,7 +111,10 @@ public class ProcessExecutor { process.getErrorStream(), StandardCharsets.UTF_8))) { String line; - while ((line = BoundedLineReader.readLine(errorReader, 5_000_000)) != null) { + while ((line = + BoundedLineReader.readLine( + errorReader, 5_000_000)) + != null) { errorLines.add(line); if (liveUpdates) logger.info(line); } @@ -131,7 +135,10 @@ public class ProcessExecutor { process.getInputStream(), StandardCharsets.UTF_8))) { String line; - while ((line = BoundedLineReader.readLine(outputReader, 5_000_000)) != null) { + while ((line = + BoundedLineReader.readLine( + outputReader, 5_000_000)) + != null) { outputLines.add(line); if (liveUpdates) logger.info(line); } diff --git a/src/main/java/stirling/software/SPDF/utils/WebResponseUtils.java b/src/main/java/stirling/software/SPDF/utils/WebResponseUtils.java index a85720e7..d148e65b 100644 --- a/src/main/java/stirling/software/SPDF/utils/WebResponseUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/WebResponseUtils.java @@ -1,6 +1,5 @@ package stirling.software.SPDF.utils; -import io.github.pixee.security.Filenames; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.net.URLEncoder; @@ -13,6 +12,8 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.multipart.MultipartFile; +import io.github.pixee.security.Filenames; + public class WebResponseUtils { public static ResponseEntity boasToWebResponse( From 4e937a6024662242171431918401466bfb108c70 Mon Sep 17 00:00:00 2001 From: "pixeebot[bot]" <23113631+pixeebot@users.noreply.github.com> Date: Thu, 8 Feb 2024 02:46:39 +0000 Subject: [PATCH 81/81] Sanitized user-provided file names in HTTP multipart uploads --- .../software/SPDF/controller/api/misc/ShowJavascript.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 6accfb7a..e1355c30 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 @@ -68,7 +68,7 @@ public class ShowJavascript { if (script.isEmpty()) { script = - "PDF '" + inputFile.getOriginalFilename() + "' does not contain Javascript"; + "PDF '" + Filenames.toSimpleFileName(inputFile.getOriginalFilename()) + "' does not contain Javascript"; } return WebResponseUtils.bytesToWebResponse(