From c0e93cd5e5a2bbdb0af5c8d967f9993d84d8ccca Mon Sep 17 00:00:00 2001 From: albanobattistella <34811668+albanobattistella@users.noreply.github.com> Date: Thu, 29 May 2025 17:01:58 +0200 Subject: [PATCH 001/126] Update messages_it_IT.properties (#3612) # Description of Changes Please provide a summary of the changes, including: - What was changed - Why the change was made - Any challenges encountered Closes #(issue_number) --- ## Checklist ### General - [ ] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [ ] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md) (if applicable) - [ ] I have performed a self-review of my own code - [ ] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [ ] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing) for more details. --- src/main/resources/messages_it_IT.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index 65ffffa5a..7a84ff027 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -112,7 +112,7 @@ lang.spa=Spagnolo lang.spa_old=Spagnolo (antico) lang.sqi=Albanese lang.srp=Serbo -lang.srp_latn=Serbian (Latin) +lang.srp_latn=Serbo (latino) lang.sun=Sundanese lang.swa=Swahili lang.swe=Svedese From 45462dc5d4f1e6c1433c629b8b126abeb62f40c2 Mon Sep 17 00:00:00 2001 From: Ludy Date: Sat, 31 May 2025 13:23:20 +0200 Subject: [PATCH 002/126] Use setup-bot token for GitHub Actions and fix GH_APP_ID secret reference (#3615) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Description of Changes Please provide a summary of the changes, including: - **What was changed** - In **`.github/workflows/check_properties.yml`**, each `actions/github-script` step now uses the GitHub App token output (`${{ steps.setup-bot.outputs.token }}`) instead of relying on the default `secrets.GITHUB_TOKEN`. - In **`.github/workflows/sync_files.yml`**, the `app-id` input for the `setup-bot` action was corrected to use `${{ secrets.GH_APP_ID }}` instead of `${{ vars.GH_APP_ID }}`. - **Why the change was made** - To ensure all workflow steps authenticate through the GitHub App with least-privilege tokens, improving security and avoiding permission issues with the default token or inaccessible repo variables. - To maintain consistency across workflows by centralizing authentication to the App’s token output. --- ## Checklist ### General - [ ] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [ ] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md) (if applicable) - [ ] I have performed a self-review of my own code - [ ] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [ ] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing) for more details. --- .github/workflows/check_properties.yml | 5 ++++- .github/workflows/sync_files.yml | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/check_properties.yml b/.github/workflows/check_properties.yml index c8640ff37..d74e3084a 100644 --- a/.github/workflows/check_properties.yml +++ b/.github/workflows/check_properties.yml @@ -36,6 +36,7 @@ jobs: id: get-pr-data uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: + github-token: ${{ steps.setup-bot.outputs.token }} script: | const prNumber = context.payload.pull_request.number; const repoOwner = context.payload.repository.owner.login; @@ -56,7 +57,7 @@ jobs: - name: Fetch PR changed files id: fetch-pr-changes env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_TOKEN: ${{ steps.setup-bot.outputs.token }} run: | echo "Fetching PR changed files..." echo "Getting list of changed files from PR..." @@ -66,6 +67,7 @@ jobs: id: determine-file uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: + github-token: ${{ steps.setup-bot.outputs.token }} script: | const fs = require("fs"); const path = require("path"); @@ -206,6 +208,7 @@ jobs: if: env.SCRIPT_OUTPUT != '' uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 with: + github-token: ${{ steps.setup-bot.outputs.token }} script: | const { GITHUB_REPOSITORY, SCRIPT_OUTPUT } = process.env; const [repoOwner, repoName] = GITHUB_REPOSITORY.split('/'); diff --git a/.github/workflows/sync_files.yml b/.github/workflows/sync_files.yml index 72aff82f1..92b4f3c87 100644 --- a/.github/workflows/sync_files.yml +++ b/.github/workflows/sync_files.yml @@ -30,7 +30,7 @@ jobs: id: setup-bot uses: ./.github/actions/setup-bot with: - app-id: ${{ vars.GH_APP_ID }} + app-id: ${{ secrets.GH_APP_ID }} private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} - name: Set up Python From 3293d0d8a19070262d37a3818034d53efff7117c Mon Sep 17 00:00:00 2001 From: Ludy Date: Sat, 31 May 2025 13:24:02 +0200 Subject: [PATCH 003/126] Fix Tibetan locale code to bo_CN and update translation ignore configurations (#3614) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit # Description of Changes ## This PR also serves as a test for PR #3615. ### PR #3615 must first be merged to complete the test. --- - **What was changed** - Replaced Tibetan locale code in README (`README.md`) from `zh_BO` to `bo_CN`. - Renamed resource file `messages_zh_BO.properties` to `messages_bo_CN.properties` and updated its internal keys/translations. - Updated the HTML fragment (`templates/fragments/languages.html`) to reference `bo_CN` instead of `zh_BO`. - Added a `[bo_CN]` section in `scripts/ignore_translation.toml` and expanded ignore rules across multiple language sections to cover additional codes. - Enhanced `counter_translation.py` error handling: now catches `ValueError` as `e` and logs file path and line number for easier debugging. - **Why the change was made** - The proper locale identifier for Tibetan is `bo_CN`, aligning with [Localizely’s standard](https://localizely.com/locale-code/bo-CN/). - Ensures consistency across code, resources, and templates so the Tibetan translation loads correctly. - Expanded ignore lists prevent false positives in translation coverage checks, and improved error logging aids maintenance of the translation scripts. --- ## Checklist ### General - [x] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [x] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md) (if applicable) - [x] I have performed a self-review of my own code - [x] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [ ] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing) for more details. --- README.md | 2 +- scripts/counter_translation.py | 3 +- scripts/ignore_translation.toml | 762 +++++++++++++++++- ...O.properties => messages_bo_CN.properties} | 0 .../templates/fragments/languages.html | 2 +- 5 files changed, 757 insertions(+), 12 deletions(-) rename src/main/resources/{messages_zh_BO.properties => messages_bo_CN.properties} (100%) diff --git a/README.md b/README.md index 30335755d..ddedb9436 100644 --- a/README.md +++ b/README.md @@ -151,7 +151,7 @@ Stirling-PDF currently supports 40 languages! | Spanish (Español) (es_ES) | ![89%](https://geps.dev/progress/89) | | Swedish (Svenska) (sv_SE) | ![78%](https://geps.dev/progress/78) | | Thai (ไทย) (th_TH) | ![71%](https://geps.dev/progress/71) | -| Tibetan (བོད་ཡིག་) (zh_BO) | ![79%](https://geps.dev/progress/79) | +| Tibetan (བོད་ཡིག་) (bo_CN) | ![79%](https://geps.dev/progress/79) | | Traditional Chinese (繁體中文) (zh_TW) | ![89%](https://geps.dev/progress/89) | | Turkish (Türkçe) (tr_TR) | ![87%](https://geps.dev/progress/87) | | Ukrainian (Українська) (uk_UA) | ![89%](https://geps.dev/progress/89) | diff --git a/scripts/counter_translation.py b/scripts/counter_translation.py index 789cb7c11..f5bcfa1e5 100644 --- a/scripts/counter_translation.py +++ b/scripts/counter_translation.py @@ -182,7 +182,8 @@ def compare_files( sort_ignore_translation[language]["ignore"].remove( default_key.strip() ) - except ValueError: + except ValueError as e: + print(f"Error processing line {line_num} in {file_path}: {e}") print(f"{line_default}|{line_file}") exit(1) except IndexError: diff --git a/scripts/ignore_translation.toml b/scripts/ignore_translation.toml index 12f3bc7a4..9c95ba192 100644 --- a/scripts/ignore_translation.toml +++ b/scripts/ignore_translation.toml @@ -1,34 +1,190 @@ [ar_AR] ignore = [ + 'lang.div', + 'lang.dzo', + 'lang.que', 'language.direction', ] [az_AZ] ignore = [ + 'lang.afr', + 'lang.bre', + 'lang.div', + 'lang.epo', + 'lang.guj', + 'lang.hin', + 'lang.kan', + 'lang.mal', + 'lang.mar', + 'lang.mlt', + 'lang.mri', + 'lang.msa', + 'lang.nep', + 'lang.ori', + 'lang.pan', + 'lang.san', + 'lang.sin', + 'lang.slk', + 'lang.snd', + 'lang.sun', + 'lang.tam', + 'lang.tat', + 'lang.urd', + 'lang.yor', 'language.direction', ] [bg_BG] +ignore = [ + 'lang.div', + 'lang.dzo', + 'lang.iku', + 'lang.que', + 'language.direction', +] + +[bo_CN] ignore = [ 'language.direction', ] [ca_CA] ignore = [ - 'PDFToText.tags', 'adminUserSettings.admin', + 'lang.amh', + 'lang.ceb', + 'lang.chr', + 'lang.div', + 'lang.dzo', + 'lang.epo', + 'lang.fao', + 'lang.fry', + 'lang.guj', + 'lang.hin', + 'lang.iku', + 'lang.kan', + 'lang.kaz', + 'lang.lao', + 'lang.mar', + 'lang.mri', + 'lang.ori', + 'lang.pan', + 'lang.pus', + 'lang.que', + 'lang.snd', + 'lang.swa', + 'lang.tam', + 'lang.tat', + 'lang.tel', + 'lang.tgk', + 'lang.tgl', + 'lang.tir', + 'lang.uzb', + 'lang.uzb_cyrl', 'language.direction', 'watermark.type.1', ] [cs_CZ] ignore = [ + 'lang.amh', + 'lang.asm', + 'lang.bod', + 'lang.bos', + 'lang.bre', + 'lang.ceb', + 'lang.chr', + 'lang.div', + 'lang.dzo', + 'lang.frk', + 'lang.gla', + 'lang.guj', + 'lang.iku', + 'lang.jav', + 'lang.kan', + 'lang.kat', + 'lang.khm', + 'lang.kir', + 'lang.lao', + 'lang.mal', + 'lang.mar', + 'lang.mri', + 'lang.msa', + 'lang.nor', + 'lang.oci', + 'lang.ori', + 'lang.pan', + 'lang.pus', + 'lang.que', + 'lang.san', + 'lang.sin', + 'lang.snd', + 'lang.sun', + 'lang.tam', + 'lang.tat', + 'lang.tel', + 'lang.tgl', + 'lang.tha', + 'lang.tir', + 'lang.uig', + 'lang.urd', + 'lang.uzb', + 'lang.uzb_cyrl', + 'lang.yor', 'language.direction', 'text', ] [da_DK] ignore = [ + 'lang.afr', + 'lang.amh', + 'lang.ben', + 'lang.bre', + 'lang.ceb', + 'lang.chr', + 'lang.div', + 'lang.dzo', + 'lang.epo', + 'lang.frk', + 'lang.guj', + 'lang.hin', + 'lang.iku', + 'lang.jav', + 'lang.kan', + 'lang.khm', + 'lang.lao', + 'lang.lat', + 'lang.ltz', + 'lang.mal', + 'lang.mar', + 'lang.mri', + 'lang.msa', + 'lang.nep', + 'lang.oci', + 'lang.ori', + 'lang.pan', + 'lang.pus', + 'lang.que', + 'lang.san', + 'lang.sin', + 'lang.slk_frak', + 'lang.snd', + 'lang.sun', + 'lang.swa', + 'lang.tam', + 'lang.tat', + 'lang.tel', + 'lang.tgk', + 'lang.tgl', + 'lang.tha', + 'lang.tir', + 'lang.ton', + 'lang.uig', + 'lang.urd', + 'lang.uzb', + 'lang.yor', 'language.direction', ] @@ -41,8 +197,36 @@ ignore = [ 'addPageNumbers.selectText.3', 'alphabet', 'certSign.name', + 'cookieBanner.popUp.acceptAllBtn', + 'endpointStatistics.top10', + 'endpointStatistics.top20', 'fileChooser.dragAndDrop', 'home.pipeline.title', + 'lang.afr', + 'lang.ceb', + 'lang.chr', + 'lang.div', + 'lang.dzo', + 'lang.epo', + 'lang.guj', + 'lang.hin', + 'lang.iku', + 'lang.kan', + 'lang.mal', + 'lang.mar', + 'lang.mri', + 'lang.nep', + 'lang.ori', + 'lang.pan', + 'lang.que', + 'lang.san', + 'lang.snd', + 'lang.tam', + 'lang.tel', + 'lang.tgl', + 'lang.tir', + 'lang.urd', + 'lang.yor', 'language.direction', 'legal.impressum', 'licenses.version', @@ -56,13 +240,19 @@ ignore = [ 'validateSignature.cert.version', 'validateSignature.status', 'watermark.type.1', - 'endpointStatistics.top10', - 'endpointStatistics.top20', - 'cookieBanner.popUp.acceptAllBtn', ] [el_GR] ignore = [ + 'lang.ceb', + 'lang.dzo', + 'lang.iku', + 'lang.ori', + 'lang.pan', + 'lang.que', + 'lang.sin', + 'lang.uig', + 'lang.uzb_cyrl', 'language.direction', ] @@ -70,6 +260,31 @@ ignore = [ ignore = [ 'adminUserSettings.roles', 'error', + 'lang.asm', + 'lang.ceb', + 'lang.chr', + 'lang.div', + 'lang.dzo', + 'lang.fil', + 'lang.frm', + 'lang.guj', + 'lang.iku', + 'lang.kan', + 'lang.lao', + 'lang.mal', + 'lang.mar', + 'lang.oci', + 'lang.ori', + 'lang.pan', + 'lang.san', + 'lang.snd', + 'lang.sun', + 'lang.tam', + 'lang.tel', + 'lang.tir', + 'lang.urd', + 'lang.uzb', + 'lang.yor', 'language.direction', 'no', 'showJS.tags', @@ -77,6 +292,23 @@ ignore = [ [eu_ES] ignore = [ + 'lang.ceb', + 'lang.chr', + 'lang.div', + 'lang.dzo', + 'lang.guj', + 'lang.iku', + 'lang.kan', + 'lang.mal', + 'lang.pan', + 'lang.que', + 'lang.san', + 'lang.slv', + 'lang.snd', + 'lang.sqi', + 'lang.tat', + 'lang.tir', + 'lang.yor', 'language.direction', ] @@ -96,6 +328,31 @@ ignore = [ 'alphabet', 'compare.document.1', 'compare.document.2', + 'lang.bre', + 'lang.ceb', + 'lang.chr', + 'lang.div', + 'lang.dzo', + 'lang.eus', + 'lang.guj', + 'lang.iku', + 'lang.kan', + 'lang.kaz', + 'lang.khm', + 'lang.lao', + 'lang.ltz', + 'lang.mal', + 'lang.mar', + 'lang.oci', + 'lang.ori', + 'lang.que', + 'lang.san', + 'lang.snd', + 'lang.swa', + 'lang.tel', + 'lang.tgl', + 'lang.tir', + 'lang.yor', 'language.direction', 'licenses.license', 'licenses.module', @@ -108,6 +365,24 @@ ignore = [ [ga_IE] ignore = [ + 'lang.ceb', + 'lang.cos', + 'lang.div', + 'lang.dzo', + 'lang.epo', + 'lang.guj', + 'lang.hat', + 'lang.iku', + 'lang.lao', + 'lang.oci', + 'lang.ori', + 'lang.pan', + 'lang.sin', + 'lang.snd', + 'lang.sun', + 'lang.tgk', + 'lang.tir', + 'lang.uig', 'language.direction', ] @@ -120,22 +395,126 @@ ignore = [ ignore = [ 'PDFToBook.selectText.1', 'home.pipeline.title', + 'lang.bod', + 'lang.bre', + 'lang.ceb', + 'lang.chr', + 'lang.dzo', + 'lang.guj', + 'lang.iku', + 'lang.kan', + 'lang.lao', + 'lang.mri', + 'lang.ori', + 'lang.pan', + 'lang.pus', + 'lang.que', + 'lang.san', + 'lang.snd', + 'lang.tam', + 'lang.tel', + 'lang.tgl', + 'lang.tir', 'language.direction', 'showJS.tags', ] [hu_HU] ignore = [ + 'lang.bre', + 'lang.ceb', + 'lang.chr', + 'lang.div', + 'lang.dzo', + 'lang.fao', + 'lang.iku', + 'lang.kan', + 'lang.lao', + 'lang.mar', + 'lang.mri', + 'lang.ori', + 'lang.que', + 'lang.tel', + 'lang.tgl', 'language.direction', ] [id_ID] ignore = [ + 'lang.aze', + 'lang.aze_cyrl', + 'lang.bre', + 'lang.cat', + 'lang.ceb', + 'lang.chr', + 'lang.cym', + 'lang.div', + 'lang.dzo', + 'lang.epo', + 'lang.eus', + 'lang.fao', + 'lang.frk', + 'lang.guj', + 'lang.hin', + 'lang.iku', + 'lang.kan', + 'lang.kaz', + 'lang.kir', + 'lang.lao', + 'lang.lat', + 'lang.mal', + 'lang.mar', + 'lang.mri', + 'lang.ori', + 'lang.pan', + 'lang.pus', + 'lang.que', + 'lang.slk_frak', + 'lang.snd', + 'lang.sun', + 'lang.swa', + 'lang.tam', + 'lang.tat', + 'lang.tel', + 'lang.tgk', + 'lang.tgl', + 'lang.tha', + 'lang.tir', + 'lang.uig', + 'lang.urd', + 'lang.uzb', + 'lang.uzb_cyrl', + 'lang.yor', 'language.direction', ] [it_IT] ignore = [ + 'lang.asm', + 'lang.aze', + 'lang.ceb', + 'lang.chr', + 'lang.div', + 'lang.dzo', + 'lang.fao', + 'lang.guj', + 'lang.iku', + 'lang.kan', + 'lang.lao', + 'lang.mal', + 'lang.mar', + 'lang.mri', + 'lang.ori', + 'lang.pan', + 'lang.pus', + 'lang.que', + 'lang.snd', + 'lang.swa', + 'lang.tam', + 'lang.tel', + 'lang.tgl', + 'lang.urd', + 'lang.yor', 'language.direction', 'no', 'password', @@ -148,11 +527,21 @@ ignore = [ [ja_JP] ignore = [ + 'lang.jav', 'language.direction', ] [ko_KR] ignore = [ + 'lang.fao', + 'lang.pus', + 'lang.sun', + 'language.direction', +] + +[ml_IN] +ignore = [ + 'lang.iku', 'language.direction', ] @@ -160,6 +549,37 @@ ignore = [ ignore = [ 'compare.document.1', 'compare.document.2', + 'lang.afr', + 'lang.asm', + 'lang.bre', + 'lang.ceb', + 'lang.chr', + 'lang.dzo', + 'lang.epo', + 'lang.fao', + 'lang.guj', + 'lang.hin', + 'lang.iku', + 'lang.kan', + 'lang.lao', + 'lang.mal', + 'lang.mar', + 'lang.mri', + 'lang.oci', + 'lang.ori', + 'lang.pan', + 'lang.pus', + 'lang.que', + 'lang.sin', + 'lang.snd', + 'lang.sun', + 'lang.swa', + 'lang.tam', + 'lang.tel', + 'lang.tgl', + 'lang.ton', + 'lang.urd', + 'lang.yor', 'language.direction', 'navbar.allTools', 'sponsor', @@ -170,6 +590,49 @@ ignore = [ 'PDFToBook.selectText.1', 'adminUserSettings.admin', 'info', + 'lang.afr', + 'lang.amh', + 'lang.ben', + 'lang.bos', + 'lang.bre', + 'lang.ceb', + 'lang.chr', + 'lang.dan_frak', + 'lang.div', + 'lang.dzo', + 'lang.epo', + 'lang.guj', + 'lang.hin', + 'lang.iku', + 'lang.kan', + 'lang.khm', + 'lang.lao', + 'lang.lat', + 'lang.ltz', + 'lang.mal', + 'lang.mar', + 'lang.mri', + 'lang.msa', + 'lang.nep', + 'lang.ori', + 'lang.pan', + 'lang.pus', + 'lang.que', + 'lang.san', + 'lang.slk_frak', + 'lang.snd', + 'lang.swa', + 'lang.tam', + 'lang.tat', + 'lang.tel', + 'lang.tgk', + 'lang.tgl', + 'lang.tha', + 'lang.tir', + 'lang.ton', + 'lang.uig', + 'lang.urd', + 'lang.yor', 'language.direction', 'oops', 'sponsor', @@ -178,27 +641,148 @@ ignore = [ [pl_PL] ignore = [ 'PDFToBook.selectText.1', + 'lang.afr', + 'lang.bre', + 'lang.ceb', + 'lang.chr', + 'lang.cos', + 'lang.div', + 'lang.dzo', + 'lang.fao', + 'lang.frk', + 'lang.guj', + 'lang.hat', + 'lang.iku', + 'lang.kan', + 'lang.khm', + 'lang.lao', + 'lang.mal', + 'lang.mar', + 'lang.mri', + 'lang.nep', + 'lang.oci', + 'lang.ori', + 'lang.pus', + 'lang.que', + 'lang.snd', + 'lang.sun', + 'lang.swa', + 'lang.tam', + 'lang.tat', + 'lang.tel', + 'lang.tgl', + 'lang.tir', + 'lang.uig', + 'lang.urd', 'language.direction', ] [pt_BR] ignore = [ + 'lang.bre', + 'lang.ceb', + 'lang.chr', + 'lang.div', + 'lang.dzo', + 'lang.fao', + 'lang.fil', + 'lang.frk', + 'lang.fry', + 'lang.guj', + 'lang.iku', + 'lang.kan', + 'lang.kir', + 'lang.mar', + 'lang.ori', + 'lang.pan', + 'lang.que', + 'lang.snd', + 'lang.tat', + 'lang.tel', + 'lang.tgl', + 'lang.tir', + 'lang.uig', + 'lang.uzb', + 'lang.yid', 'language.direction', 'pipelineOptions.pipelineHeader', ] [pt_PT] ignore = [ + 'lang.bre', + 'lang.ceb', + 'lang.chr', + 'lang.div', + 'lang.dzo', + 'lang.fao', + 'lang.fil', + 'lang.frk', + 'lang.fry', + 'lang.guj', + 'lang.iku', + 'lang.kan', + 'lang.kir', + 'lang.mar', + 'lang.ori', + 'lang.pan', + 'lang.que', + 'lang.snd', + 'lang.tat', + 'lang.tel', + 'lang.tgl', + 'lang.tir', + 'lang.uig', + 'lang.uzb', + 'lang.yid', 'language.direction', ] [ro_RO] ignore = [ + 'lang.amh', + 'lang.asm', + 'lang.bod', + 'lang.bre', + 'lang.ceb', + 'lang.chr', + 'lang.cos', + 'lang.deu_frak', + 'lang.div', + 'lang.dzo', + 'lang.est', + 'lang.fao', + 'lang.glg', + 'lang.guj', + 'lang.iku', + 'lang.jav', + 'lang.kan', + 'lang.lao', + 'lang.mal', + 'lang.mar', + 'lang.mri', + 'lang.nep', + 'lang.oci', + 'lang.ori', + 'lang.pan', + 'lang.pus', + 'lang.slk_frak', + 'lang.snd', + 'lang.sun', + 'lang.swa', + 'lang.tam', + 'lang.tel', + 'lang.tgl', + 'lang.tir', + 'lang.urd', + 'lang.yor', 'language.direction', ] [ru_RU] ignore = [ + 'lang.iku', + 'lang.pus', 'language.direction', ] @@ -207,6 +791,25 @@ ignore = [ 'adminUserSettings.admin', 'home.multiTool.title', 'info', + 'lang.ceb', + 'lang.chr', + 'lang.dzo', + 'lang.epo', + 'lang.iku', + 'lang.kaz', + 'lang.mar', + 'lang.ori', + 'lang.pan', + 'lang.que', + 'lang.san', + 'lang.sin', + 'lang.snd', + 'lang.tat', + 'lang.tel', + 'lang.tgl', + 'lang.tir', + 'lang.urd', + 'lang.uzb', 'language.direction', 'navbar.sections.security', 'text', @@ -215,6 +818,37 @@ ignore = [ [sl_SI] ignore = [ + 'lang.bre', + 'lang.ceb', + 'lang.chr', + 'lang.div', + 'lang.dzo', + 'lang.epo', + 'lang.eus', + 'lang.fao', + 'lang.frk', + 'lang.guj', + 'lang.iku', + 'lang.kan', + 'lang.lao', + 'lang.mar', + 'lang.mri', + 'lang.oci', + 'lang.ori', + 'lang.pan', + 'lang.que', + 'lang.slk', + 'lang.snd', + 'lang.sun', + 'lang.tam', + 'lang.tat', + 'lang.tel', + 'lang.tgk', + 'lang.tgl', + 'lang.tir', + 'lang.urd', + 'lang.uzb', + 'lang.yor', 'language.direction', ] @@ -227,11 +861,43 @@ ignore = [ [sv_SE] ignore = [ + 'lang.ben', + 'lang.bre', + 'lang.ceb', + 'lang.chr', + 'lang.dzo', + 'lang.epo', + 'lang.guj', + 'lang.hin', + 'lang.kan', + 'lang.lao', + 'lang.lat', + 'lang.mal', + 'lang.mri', + 'lang.ori', + 'lang.pan', + 'lang.que', + 'lang.san', + 'lang.slk_frak', + 'lang.snd', + 'lang.tam', + 'lang.tat', + 'lang.tel', + 'lang.tir', + 'lang.urd', + 'lang.yor', 'language.direction', ] [th_TH] ignore = [ + 'lang.dzo', + 'lang.kir', + 'lang.pan', + 'lang.sin', + 'lang.slk_frak', + 'lang.tir', + 'lang.uzb_cyrl', 'language.direction', 'pipelineOptions.pipelineHeader', 'showJS.tags', @@ -239,33 +905,111 @@ ignore = [ [tr_TR] ignore = [ + 'lang.afr', + 'lang.bre', + 'lang.ceb', + 'lang.chr', + 'lang.div', + 'lang.dzo', + 'lang.epo', + 'lang.fao', + 'lang.guj', + 'lang.kan', + 'lang.lao', + 'lang.mal', + 'lang.mar', + 'lang.mri', + 'lang.msa', + 'lang.ori', + 'lang.pus', + 'lang.que', + 'lang.sin', + 'lang.slk', + 'lang.slk_frak', + 'lang.snd', + 'lang.tam', + 'lang.tat', + 'lang.tel', + 'lang.tgk', + 'lang.tgl', + 'lang.tir', + 'lang.urd', + 'lang.yor', 'language.direction', ] [uk_UA] ignore = [ + 'lang.iku', 'language.direction', ] [vi_VN] ignore = [ + 'lang.amh', + 'lang.asm', + 'lang.aze', + 'lang.aze_cyrl', + 'lang.bos', + 'lang.bre', + 'lang.cat', + 'lang.ceb', + 'lang.chr', + 'lang.cos', + 'lang.div', + 'lang.dzo', + 'lang.epo', + 'lang.eus', + 'lang.fao', + 'lang.glg', + 'lang.guj', + 'lang.iku', + 'lang.kan', + 'lang.kaz', + 'lang.kir', + 'lang.lat', + 'lang.ltz', + 'lang.mal', + 'lang.mar', + 'lang.mri', + 'lang.msa', + 'lang.ori', + 'lang.pus', + 'lang.que', + 'lang.sin', + 'lang.slk', + 'lang.slk_frak', + 'lang.snd', + 'lang.swa', + 'lang.syr', + 'lang.tam', + 'lang.tat', + 'lang.tel', + 'lang.tgk', + 'lang.tir', + 'lang.uig', + 'lang.uzb', + 'lang.uzb_cyrl', + 'lang.yid', + 'lang.yor', 'language.direction', 'pipeline.title', 'pipelineOptions.pipelineHeader', 'showJS.tags', ] -[zh_BO] -ignore = [ - 'language.direction', -] - [zh_CN] ignore = [ + 'lang.dzo', + 'lang.iku', + 'lang.que', 'language.direction', ] [zh_TW] ignore = [ + 'lang.dzo', + 'lang.iku', + 'lang.que', 'language.direction', ] diff --git a/src/main/resources/messages_zh_BO.properties b/src/main/resources/messages_bo_CN.properties similarity index 100% rename from src/main/resources/messages_zh_BO.properties rename to src/main/resources/messages_bo_CN.properties diff --git a/src/main/resources/templates/fragments/languages.html b/src/main/resources/templates/fragments/languages.html index e987ea2b3..bf11d91b2 100644 --- a/src/main/resources/templates/fragments/languages.html +++ b/src/main/resources/templates/fragments/languages.html @@ -4,7 +4,7 @@
-
+
From 209c76d8855e2664e99414b88f04ab6bd5010da0 Mon Sep 17 00:00:00 2001 From: "stirlingbot[bot]" <195170888+stirlingbot[bot]@users.noreply.github.com> Date: Sat, 31 May 2025 12:31:25 +0100 Subject: [PATCH 004/126] :globe_with_meridians: Sync Translations + Update README Progress Table (#3616) ### Description of Changes This Pull Request was automatically generated to synchronize updates to translation files and documentation. Below are the details of the changes made: #### **1. Synchronization of Translation Files** - Updated translation files (`messages_*.properties`) to reflect changes in the reference file `messages_en_GB.properties`. - Ensured consistency and synchronization across all supported language files. - Highlighted any missing or incomplete translations. #### **2. Update README.md** - Generated the translation progress table in `README.md`. - Added a summary of the current translation status for all supported languages. - Included up-to-date statistics on translation coverage. #### **Why these changes are necessary** - Keeps translation files aligned with the latest reference updates. - Ensures the documentation reflects the current translation progress. --- Auto-generated by [create-pull-request][1]. [1]: https://github.com/peter-evans/create-pull-request Co-authored-by: stirlingbot[bot] <195170888+stirlingbot[bot]@users.noreply.github.com> --- README.md | 52 ++++++++++++++++++++++++++-------------------------- 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index ddedb9436..3243a9f74 100644 --- a/README.md +++ b/README.md @@ -117,45 +117,45 @@ Stirling-PDF currently supports 40 languages! | Language | Progress | | -------------------------------------------- | -------------------------------------- | | Arabic (العربية) (ar_AR) | ![75%](https://geps.dev/progress/75) | -| Azerbaijani (Azərbaycan Dili) (az_AZ) | ![74%](https://geps.dev/progress/74) | -| Basque (Euskara) (eu_ES) | ![43%](https://geps.dev/progress/43) | +| Azerbaijani (Azərbaycan Dili) (az_AZ) | ![75%](https://geps.dev/progress/75) | +| Basque (Euskara) (eu_ES) | ![44%](https://geps.dev/progress/44) | | Bulgarian (Български) (bg_BG) | ![83%](https://geps.dev/progress/83) | -| Catalan (Català) (ca_CA) | ![80%](https://geps.dev/progress/80) | -| Croatian (Hrvatski) (hr_HR) | ![72%](https://geps.dev/progress/72) | -| Czech (Česky) (cs_CZ) | ![82%](https://geps.dev/progress/82) | -| Danish (Dansk) (da_DK) | ![71%](https://geps.dev/progress/71) | -| Dutch (Nederlands) (nl_NL) | ![71%](https://geps.dev/progress/71) | +| Catalan (Català) (ca_CA) | ![82%](https://geps.dev/progress/82) | +| Croatian (Hrvatski) (hr_HR) | ![74%](https://geps.dev/progress/74) | +| Czech (Česky) (cs_CZ) | ![85%](https://geps.dev/progress/85) | +| Danish (Dansk) (da_DK) | ![75%](https://geps.dev/progress/75) | +| Dutch (Nederlands) (nl_NL) | ![73%](https://geps.dev/progress/73) | | English (English) (en_GB) | ![100%](https://geps.dev/progress/100) | | English (US) (en_US) | ![100%](https://geps.dev/progress/100) | -| French (Français) (fr_FR) | ![82%](https://geps.dev/progress/82) | -| German (Deutsch) (de_DE) | ![89%](https://geps.dev/progress/89) | -| Greek (Ελληνικά) (el_GR) | ![81%](https://geps.dev/progress/81) | +| French (Français) (fr_FR) | ![84%](https://geps.dev/progress/84) | +| German (Deutsch) (de_DE) | ![91%](https://geps.dev/progress/91) | +| Greek (Ελληνικά) (el_GR) | ![82%](https://geps.dev/progress/82) | | Hindi (हिंदी) (hi_IN) | ![82%](https://geps.dev/progress/82) | -| Hungarian (Magyar) (hu_HU) | ![88%](https://geps.dev/progress/88) | -| Indonesian (Bahasa Indonesia) (id_ID) | ![72%](https://geps.dev/progress/72) | -| Irish (Gaeilge) (ga_IE) | ![82%](https://geps.dev/progress/82) | -| Italian (Italiano) (it_IT) | ![96%](https://geps.dev/progress/96) | +| Hungarian (Magyar) (hu_HU) | ![89%](https://geps.dev/progress/89) | +| Indonesian (Bahasa Indonesia) (id_ID) | ![75%](https://geps.dev/progress/75) | +| Irish (Gaeilge) (ga_IE) | ![83%](https://geps.dev/progress/83) | +| Italian (Italiano) (it_IT) | ![98%](https://geps.dev/progress/98) | | Japanese (日本語) (ja_JP) | ![84%](https://geps.dev/progress/84) | | Korean (한국어) (ko_KR) | ![82%](https://geps.dev/progress/82) | -| Norwegian (Norsk) (no_NB) | ![77%](https://geps.dev/progress/77) | +| Norwegian (Norsk) (no_NB) | ![80%](https://geps.dev/progress/80) | | Persian (فارسی) (fa_IR) | ![78%](https://geps.dev/progress/78) | -| Polish (Polski) (pl_PL) | ![85%](https://geps.dev/progress/85) | -| Portuguese (Português) (pt_PT) | ![82%](https://geps.dev/progress/82) | -| Portuguese Brazilian (Português) (pt_BR) | ![87%](https://geps.dev/progress/87) | -| Romanian (Română) (ro_RO) | ![67%](https://geps.dev/progress/67) | +| Polish (Polski) (pl_PL) | ![88%](https://geps.dev/progress/88) | +| Portuguese (Português) (pt_PT) | ![84%](https://geps.dev/progress/84) | +| Portuguese Brazilian (Português) (pt_BR) | ![89%](https://geps.dev/progress/89) | +| Romanian (Română) (ro_RO) | ![70%](https://geps.dev/progress/70) | | Russian (Русский) (ru_RU) | ![89%](https://geps.dev/progress/89) | | Serbian Latin alphabet (Srpski) (sr_LATN_RS) | ![53%](https://geps.dev/progress/53) | | Simplified Chinese (简体中文) (zh_CN) | ![88%](https://geps.dev/progress/88) | -| Slovakian (Slovensky) (sk_SK) | ![61%](https://geps.dev/progress/61) | -| Slovenian (Slovenščina) (sl_SI) | ![84%](https://geps.dev/progress/84) | -| Spanish (Español) (es_ES) | ![89%](https://geps.dev/progress/89) | -| Swedish (Svenska) (sv_SE) | ![78%](https://geps.dev/progress/78) | -| Thai (ไทย) (th_TH) | ![71%](https://geps.dev/progress/71) | +| Slovakian (Slovensky) (sk_SK) | ![63%](https://geps.dev/progress/63) | +| Slovenian (Slovenščina) (sl_SI) | ![87%](https://geps.dev/progress/87) | +| Spanish (Español) (es_ES) | ![91%](https://geps.dev/progress/91) | +| Swedish (Svenska) (sv_SE) | ![80%](https://geps.dev/progress/80) | +| Thai (ไทย) (th_TH) | ![72%](https://geps.dev/progress/72) | | Tibetan (བོད་ཡིག་) (bo_CN) | ![79%](https://geps.dev/progress/79) | | Traditional Chinese (繁體中文) (zh_TW) | ![89%](https://geps.dev/progress/89) | -| Turkish (Türkçe) (tr_TR) | ![87%](https://geps.dev/progress/87) | +| Turkish (Türkçe) (tr_TR) | ![90%](https://geps.dev/progress/90) | | Ukrainian (Українська) (uk_UA) | ![89%](https://geps.dev/progress/89) | -| Vietnamese (Tiếng Việt) (vi_VN) | ![66%](https://geps.dev/progress/66) | +| Vietnamese (Tiếng Việt) (vi_VN) | ![70%](https://geps.dev/progress/70) | | Malayalam (മലയാളം) (ml_IN) | ![89%](https://geps.dev/progress/89) | ## Stirling PDF Enterprise From 631c4fef0baefa30f03cf8170aa47a9ef305013a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20Sz=C3=BCcs?= <127139797+Balazs-Szucs@users.noreply.github.com> Date: Sat, 31 May 2025 17:26:52 +0200 Subject: [PATCH 005/126] Added scan filter feature (#3530) # Description of Changes Please provide a summary of the changes, including: This pull request introduces the "Fake Scan" feature, which simulates scanned PDFs with customizable settings. The changes include the removal of a work-in-progress controller, the addition of a new request model, and updates to the frontend to support the feature. ### Backend Changes: * **Removed the unfinished `FakeScanControllerWIP`:** The entire `FakeScanControllerWIP` class, which contained unimplemented and experimental code for processing PDFs, has been removed. This cleanup eliminates unused code and dependencies. Some of the original code of removed file was ported to the new Controller. * **Added `FakeScanRequest` model:** Introduced a new model class `FakeScanRequest` to handle input parameters for the "Fake Scan" feature. It includes fields for file input, quality, rotation, colorspace, and other advanced settings, with validation and default values. ### Frontend Changes: * **Localization updates for the "Fake Scan" feature:** Added new localization keys for the "Fake Scan" feature, including titles, descriptions, and advanced settings options like quality, rotation, and colorspace. * **Added "Fake Scan" card to the homepage ### Pictures: Front-end ![image](https://github.com/user-attachments/assets/e8e2fcac-9f64-4541-8518-04330644030f) Example document (based on defaults; can be drastically changed according to need.): ![image](https://github.com/user-attachments/assets/9f9cc386-6eb4-431a-b1d7-ca260edfa0c1) ### Quirks/known issues - Performance: It might take even reasonable hardware to convert bigger pdf >500KB more than a few minutes. - Yellowish filter applies to the whole document and also incl to the background. (not desirable in some instances) - There is some randomness involved in the default preset, helps imitate scan but some user might find it annoying. (but it can be disabled through advanced settings). - Some features might confusing to people with no additional context. Closes #458 --- ## Checklist ### General - [x] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [x] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md) (if applicable) - [x] I have performed a self-review of my own code - [x] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### UI Changes (if applicable) - [x] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [x] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing) for more details. --- .../api/misc/FakeScanController.java | 440 ++++++++++++++++++ .../api/misc/FakeScanControllerWIP.java | 311 ------------- .../SPDF/model/api/misc/FakeScanRequest.java | 126 +++++ src/main/resources/messages_en_GB.properties | 35 ++ .../templates/fragments/navElements.html | 1 + .../resources/templates/misc/fake-scan.html | 144 +++++- 6 files changed, 741 insertions(+), 316 deletions(-) create mode 100644 src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanController.java delete mode 100644 src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanControllerWIP.java create mode 100644 src/main/java/stirling/software/SPDF/model/api/misc/FakeScanRequest.java diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanController.java new file mode 100644 index 000000000..7872a4b09 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanController.java @@ -0,0 +1,440 @@ +package stirling.software.SPDF.controller.api.misc; + +import java.awt.Color; +import java.awt.Graphics2D; +import java.awt.RenderingHints; +import java.awt.geom.AffineTransform; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.util.Random; + +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.graphics.image.LosslessFactory; +import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; +import org.apache.pdfbox.rendering.PDFRenderer; +import org.springframework.http.MediaType; +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.github.pixee.security.Filenames; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; + +import jakarta.validation.Valid; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import stirling.software.SPDF.model.api.misc.FakeScanRequest; +import stirling.software.common.service.CustomPDFDocumentFactory; +import stirling.software.common.util.WebResponseUtils; + +@RestController +@RequestMapping("/api/v1/misc") +@Tag(name = "Misc", description = "Miscellaneous PDF APIs") +@RequiredArgsConstructor +@Slf4j +public class FakeScanController { + + private final CustomPDFDocumentFactory pdfDocumentFactory; + private static final Random RANDOM = new Random(); + + @PostMapping(value = "/fake-scan", consumes = "multipart/form-data") + @Operation( + summary = "Convert PDF to look like a scanned document", + description = + "Applies various effects to make a PDF look like it was scanned, including rotation, noise, and edge softening. Input:PDF Output:PDF Type:SISO") + public ResponseEntity fakeScan(@Valid @ModelAttribute FakeScanRequest request) + throws IOException { + MultipartFile file = request.getFileInput(); + + // Apply preset first if needed + if (!request.isAdvancedEnabled()) { + switch (request.getQuality()) { + case high -> request.applyHighQualityPreset(); + case medium -> request.applyMediumQualityPreset(); + case low -> request.applyLowQualityPreset(); + } + } + + // Extract values after preset application + int baseRotation = request.getRotationValue() + request.getRotate(); + int rotateVariance = request.getRotateVariance(); + int borderPx = request.getBorder(); + float brightness = request.getBrightness(); + float contrast = request.getContrast(); + float blur = request.getBlur(); + float noise = request.getNoise(); + boolean yellowish = request.isYellowish(); + int resolution = request.getResolution(); + FakeScanRequest.Colorspace colorspace = request.getColorspace(); + + try (PDDocument document = pdfDocumentFactory.load(file)) { + PDDocument outputDocument = new PDDocument(); + PDFRenderer pdfRenderer = new PDFRenderer(document); + + for (int i = 0; i < document.getNumberOfPages(); i++) { + // Render page to image with specified resolution + BufferedImage image = pdfRenderer.renderImageWithDPI(i, resolution); + + // 1. Convert to grayscale or keep color + BufferedImage processed; + if (colorspace == FakeScanRequest.Colorspace.grayscale) { + processed = + new BufferedImage( + image.getWidth(), + image.getHeight(), + BufferedImage.TYPE_INT_RGB); + Graphics2D gGray = processed.createGraphics(); + gGray.setColor(Color.BLACK); + gGray.fillRect(0, 0, image.getWidth(), image.getHeight()); + gGray.drawImage(image, 0, 0, null); + gGray.dispose(); + + // Convert to grayscale manually + for (int y = 0; y < processed.getHeight(); y++) { + for (int x = 0; x < processed.getWidth(); x++) { + int rgb = processed.getRGB(x, y); + int r = (rgb >> 16) & 0xFF; + int g = (rgb >> 8) & 0xFF; + int b = rgb & 0xFF; + int gray = (r + g + b) / 3; + int grayRGB = (gray << 16) | (gray << 8) | gray; + processed.setRGB(x, y, grayRGB); + } + } + } else { + processed = + new BufferedImage( + image.getWidth(), + image.getHeight(), + BufferedImage.TYPE_INT_RGB); + Graphics2D gCol = processed.createGraphics(); + gCol.drawImage(image, 0, 0, null); + gCol.dispose(); + } + + // 2. Add border with randomized grey gradient + int baseW = processed.getWidth() + 2 * borderPx; + int baseH = processed.getHeight() + 2 * borderPx; + boolean vertical = RANDOM.nextBoolean(); + float startGrey = 0.6f + 0.3f * RANDOM.nextFloat(); + float endGrey = 0.6f + 0.3f * RANDOM.nextFloat(); + Color startColor = + new Color( + Math.round(startGrey * 255), + Math.round(startGrey * 255), + Math.round(startGrey * 255)); + Color endColor = + new Color( + Math.round(endGrey * 255), + Math.round(endGrey * 255), + Math.round(endGrey * 255)); + BufferedImage composed = new BufferedImage(baseW, baseH, processed.getType()); + Graphics2D gBg = composed.createGraphics(); + for (int y = 0; y < baseH; y++) { + for (int x = 0; x < baseW; x++) { + float frac = vertical ? (float) y / (baseH - 1) : (float) x / (baseW - 1); + int r = + Math.round( + startColor.getRed() + + (endColor.getRed() - startColor.getRed()) * frac); + int g = + Math.round( + startColor.getGreen() + + (endColor.getGreen() - startColor.getGreen()) + * frac); + int b = + Math.round( + startColor.getBlue() + + (endColor.getBlue() - startColor.getBlue()) + * frac); + composed.setRGB(x, y, new Color(r, g, b).getRGB()); + } + } + gBg.drawImage(processed, borderPx, borderPx, null); + gBg.dispose(); + + // 3. Rotate the entire composed image + double pageRotation = baseRotation; + if (baseRotation != 0 || rotateVariance != 0) { + pageRotation += (RANDOM.nextDouble() * 2 - 1) * rotateVariance; + } + + BufferedImage rotated; + int w = composed.getWidth(); + int h = composed.getHeight(); + int rotW = w; + int rotH = h; + + // Skip rotation entirely if no rotation is needed + if (pageRotation == 0) { + rotated = composed; + } else { + double radians = Math.toRadians(pageRotation); + double sin = Math.abs(Math.sin(radians)); + double cos = Math.abs(Math.cos(radians)); + rotW = (int) Math.floor(w * cos + h * sin); + rotH = (int) Math.floor(h * cos + w * sin); + BufferedImage rotatedBg = new BufferedImage(rotW, rotH, composed.getType()); + Graphics2D gBgRot = rotatedBg.createGraphics(); + for (int y = 0; y < rotH; y++) { + for (int x = 0; x < rotW; x++) { + float frac = vertical ? (float) y / (rotH - 1) : (float) x / (rotW - 1); + int r = + Math.round( + startColor.getRed() + + (endColor.getRed() - startColor.getRed()) + * frac); + int g = + Math.round( + startColor.getGreen() + + (endColor.getGreen() - startColor.getGreen()) + * frac); + int b = + Math.round( + startColor.getBlue() + + (endColor.getBlue() - startColor.getBlue()) + * frac); + rotatedBg.setRGB(x, y, new Color(r, g, b).getRGB()); + } + } + gBgRot.dispose(); + rotated = new BufferedImage(rotW, rotH, composed.getType()); + Graphics2D g2d = rotated.createGraphics(); + g2d.drawImage(rotatedBg, 0, 0, null); + AffineTransform at = new AffineTransform(); + at.translate((rotW - w) / 2.0, (rotH - h) / 2.0); + at.rotate(radians, w / 2.0, h / 2.0); + g2d.setRenderingHint( + RenderingHints.KEY_INTERPOLATION, + RenderingHints.VALUE_INTERPOLATION_BICUBIC); + g2d.setRenderingHint( + RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); + g2d.setRenderingHint( + RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2d.drawImage(composed, at, null); + g2d.dispose(); + } + + // 4. Scale and center the rotated image to cover the original page size + PDRectangle origPageSize = document.getPage(i).getMediaBox(); + float origW = origPageSize.getWidth(); + float origH = origPageSize.getHeight(); + float scale = Math.max(origW / rotW, origH / rotH); + float drawW = rotW * scale; + float drawH = rotH * scale; + float offsetX = (origW - drawW) / 2f; + float offsetY = (origH - drawH) / 2f; + + // 5. Apply adaptive blur and edge softening + BufferedImage softened = + softenEdges( + rotated, + Math.max(10, Math.round(Math.min(rotW, rotH) * 0.02f)), + startColor, + endColor, + vertical); + BufferedImage blurred = applyGaussianBlur(softened, blur); + + // 6. Adjust brightness and contrast + BufferedImage adjusted = adjustBrightnessContrast(blurred, brightness, contrast); + + // 7. Add noise and yellowish effect to the content + if (yellowish) { + applyYellowishEffect(adjusted); + } + addGaussianNoise(adjusted, noise); + + // 8. Write to PDF + PDPage newPage = new PDPage(new PDRectangle(origW, origH)); + outputDocument.addPage(newPage); + try (PDPageContentStream contentStream = + new PDPageContentStream(outputDocument, newPage)) { + PDImageXObject pdImage = + LosslessFactory.createFromImage(outputDocument, adjusted); + contentStream.drawImage(pdImage, offsetX, offsetY, drawW, drawH); + } + } + + // Save to byte array + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + outputDocument.save(outputStream); + outputDocument.close(); + + String outputFilename = + Filenames.toSimpleFileName(file.getOriginalFilename()) + .replaceFirst("[.][^.]+$", "") + + "_scanned.pdf"; + + return WebResponseUtils.bytesToWebResponse( + outputStream.toByteArray(), outputFilename, MediaType.APPLICATION_PDF); + } + } + + private BufferedImage softenEdges( + BufferedImage image, + int featherRadius, + Color startColor, + Color endColor, + boolean vertical) { + int width = image.getWidth(); + int height = image.getHeight(); + BufferedImage output = new BufferedImage(width, height, image.getType()); + for (int y = 0; y < height; y++) { + for (int x = 0; x < width; x++) { + int dx = Math.min(x, width - 1 - x); + int dy = Math.min(y, height - 1 - y); + int d = Math.min(dx, dy); + float frac = vertical ? (float) y / (height - 1) : (float) x / (width - 1); + int rBg = + Math.round( + startColor.getRed() + + (endColor.getRed() - startColor.getRed()) * frac); + int gBg = + Math.round( + startColor.getGreen() + + (endColor.getGreen() - startColor.getGreen()) * frac); + int bBg = + Math.round( + startColor.getBlue() + + (endColor.getBlue() - startColor.getBlue()) * frac); + int bgVal = new Color(rBg, gBg, bBg).getRGB(); + int fgVal = image.getRGB(x, y); + float alpha = d < featherRadius ? (float) d / featherRadius : 1.0f; + int blended = blendColors(fgVal, bgVal, alpha); + output.setRGB(x, y, blended); + } + } + return output; + } + + private int blendColors(int fg, int bg, float alpha) { + int r = Math.round(((fg >> 16) & 0xFF) * alpha + ((bg >> 16) & 0xFF) * (1 - alpha)); + int g = Math.round(((fg >> 8) & 0xFF) * alpha + ((bg >> 8) & 0xFF) * (1 - alpha)); + int b = Math.round((fg & 0xFF) * alpha + (bg & 0xFF) * (1 - alpha)); + return (r << 16) | (g << 8) | b; + } + + private BufferedImage applyGaussianBlur(BufferedImage image, double sigma) { + if (sigma <= 0) { + return image; + } + + // Scale sigma based on image size to maintain consistent blur effect + double scaledSigma = sigma * Math.min(image.getWidth(), image.getHeight()) / 1000.0; + + int radius = Math.max(1, (int) Math.ceil(scaledSigma * 3)); + int size = 2 * radius + 1; + float[] data = new float[size * size]; + double sum = 0.0; + + // Generate Gaussian kernel + for (int i = -radius; i <= radius; i++) { + for (int j = -radius; j <= radius; j++) { + double xDistance = (double) i * i; + double yDistance = (double) j * j; + double g = Math.exp(-(xDistance + yDistance) / (2 * scaledSigma * scaledSigma)); + data[(i + radius) * size + j + radius] = (float) g; + sum += g; + } + } + + // Normalize kernel + for (int i = 0; i < data.length; i++) { + data[i] /= (float) sum; + } + + // Create and apply convolution + java.awt.image.Kernel kernel = new java.awt.image.Kernel(size, size, data); + java.awt.image.ConvolveOp op = + new java.awt.image.ConvolveOp(kernel, java.awt.image.ConvolveOp.EDGE_NO_OP, null); + + // Apply blur with high-quality rendering hints + BufferedImage result = + new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); + Graphics2D g2d = result.createGraphics(); + g2d.setRenderingHint( + RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); + g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2d.drawImage(op.filter(image, null), 0, 0, null); + g2d.dispose(); + + return result; + } + + private void applyYellowishEffect(BufferedImage image) { + for (int x = 0; x < image.getWidth(); x++) { + for (int y = 0; y < image.getHeight(); y++) { + int rgb = image.getRGB(x, y); + int r = (rgb >> 16) & 0xFF; + int g = (rgb >> 8) & 0xFF; + int b = rgb & 0xFF; + + // Stronger yellow tint while preserving brightness + float brightness = (r + g + b) / 765.0f; // Normalize to 0-1 + r = Math.min(255, (int) (r + (255 - r) * 0.18f * brightness)); + g = Math.min(255, (int) (g + (255 - g) * 0.12f * brightness)); + b = Math.max(0, (int) (b * (1 - 0.25f * brightness))); + + image.setRGB(x, y, (r << 16) | (g << 8) | b); + } + } + } + + private void addGaussianNoise(BufferedImage image, double strength) { + if (strength <= 0) return; + + // Scale noise based on image size + double scaledStrength = strength * Math.min(image.getWidth(), image.getHeight()) / 1000.0; + + for (int x = 0; x < image.getWidth(); x++) { + for (int y = 0; y < image.getHeight(); y++) { + int rgb = image.getRGB(x, y); + int r = (rgb >> 16) & 0xFF; + int g = (rgb >> 8) & 0xFF; + int b = rgb & 0xFF; + + // Generate noise with better distribution + double noiseR = RANDOM.nextGaussian() * scaledStrength; + double noiseG = RANDOM.nextGaussian() * scaledStrength; + double noiseB = RANDOM.nextGaussian() * scaledStrength; + + // Apply noise with better color preservation + r = Math.min(255, Math.max(0, r + (int) noiseR)); + g = Math.min(255, Math.max(0, g + (int) noiseG)); + b = Math.min(255, Math.max(0, b + (int) noiseB)); + + image.setRGB(x, y, (r << 16) | (g << 8) | b); + } + } + } + + private BufferedImage adjustBrightnessContrast( + BufferedImage image, float brightness, float contrast) { + BufferedImage output = + new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); + for (int y = 0; y < image.getHeight(); y++) { + for (int x = 0; x < image.getWidth(); x++) { + int rgb = image.getRGB(x, y); + int r = (int) (((((rgb >> 16) & 0xFF) - 128) * contrast + 128) * brightness); + int g = (int) (((((rgb >> 8) & 0xFF) - 128) * contrast + 128) * brightness); + int b = (int) ((((rgb & 0xFF) - 128) * contrast + 128) * brightness); + r = Math.min(255, Math.max(0, r)); + g = Math.min(255, Math.max(0, g)); + b = Math.min(255, Math.max(0, b)); + output.setRGB(x, y, (r << 16) | (g << 8) | b); + } + } + return output; + } +} 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 deleted file mode 100644 index 9861c1f19..000000000 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/FakeScanControllerWIP.java +++ /dev/null @@ -1,311 +0,0 @@ -package stirling.software.SPDF.controller.api.misc; - -import java.awt.*; -import java.awt.geom.AffineTransform; -import java.awt.geom.Ellipse2D; -import java.awt.geom.Path2D; -import java.awt.image.*; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.security.SecureRandom; -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -import org.apache.pdfbox.Loader; -import org.apache.pdfbox.pdmodel.PDDocument; -import org.apache.pdfbox.pdmodel.graphics.image.JPEGFactory; -import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; -import org.apache.pdfbox.rendering.ImageType; -import org.apache.pdfbox.rendering.PDFRenderer; -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.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; - -import stirling.software.common.model.api.PDFFile; -import stirling.software.common.util.PdfUtils; -import stirling.software.common.util.WebResponseUtils; - -@RestController -@RequestMapping("/api/v1/misc") -@Tag(name = "Misc", description = "Miscellaneous APIs") -public class FakeScanControllerWIP { - - // TODO finish - @PostMapping(consumes = "multipart/form-data", value = "/fake-scan") - @Hidden - @Operation( - summary = "Repair a PDF file", - description = - "This endpoint repairs a given PDF file by running qpdf command. The PDF is first saved to a temporary location, repaired, read back, and then returned as a response.") - public ResponseEntity fakeScan(@ModelAttribute PDFFile request) throws IOException { - MultipartFile inputFile = request.getFileInput(); - - // Load the PDF document - PDDocument document = Loader.loadPDF(inputFile.getBytes()); - PDFRenderer renderer = new PDFRenderer(document); - List images = new ArrayList<>(); - // Convert each page to an image - for (int i = 0; i < document.getNumberOfPages(); i++) { - BufferedImage image = renderer.renderImageWithDPI(i, 150, ImageType.GRAY); - images.add(processImage(image)); - } - document.close(); - - // Create a new PDF document with the processed images - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - PDDocument newDocument = new PDDocument(); - for (BufferedImage img : images) { - // PDPageContentStream contentStream = new PDPageContentStream(newDocument, new - // PDPage()); - PDImageXObject pdImage = JPEGFactory.createFromImage(newDocument, img); - PdfUtils.addImageToDocument(newDocument, pdImage, "maintainAspectRatio", false); - } - - newDocument.save(baos); - newDocument.close(); - - // Return the optimized PDF as a response - String outputFilename = - Filenames.toSimpleFileName(inputFile.getOriginalFilename()) - .replaceFirst("[.][^.]+$", "") - + "_scanned.pdf"; - return WebResponseUtils.boasToWebResponse(baos, outputFilename); - } - - public BufferedImage processImage(BufferedImage image) { - // Rotation - - image = softenEdges(image, 50); - image = rotate(image, 1); - - image = applyGaussianBlur(image, 0.5); - addGaussianNoise(image, 0.5); - image = linearStretch(image); - addDustAndHairs(image, 3); - return image; - } - - private BufferedImage rotate(BufferedImage image, double rotation) { - - double rotationRequired = Math.toRadians(rotation); - double locationX = (double) image.getWidth() / 2; - double locationY = (double) image.getHeight() / 2; - AffineTransform tx = - AffineTransform.getRotateInstance(rotationRequired, locationX, locationY); - AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BICUBIC); - return op.filter(image, null); - } - - private BufferedImage applyGaussianBlur(BufferedImage image, double sigma) { - int radius = 3; // Fixed radius size for simplicity - - int size = 2 * radius + 1; - float[] data = new float[size * size]; - double sum = 0.0; - - for (int i = -radius; i <= radius; i++) { - for (int j = -radius; j <= radius; j++) { - double xDistance = (double) i * i; - double yDistance = (double) j * j; - double g = Math.exp(-(xDistance + yDistance) / (2 * sigma * sigma)); - data[(i + radius) * size + j + radius] = (float) g; - sum += g; - } - } - - // Normalize the kernel - for (int i = 0; i < data.length; i++) { - if (sum != 0) data[i] /= sum; - } - - Kernel kernel = new Kernel(size, size, data); - BufferedImageOp op = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null); - return op.filter(image, null); - } - - public BufferedImage softenEdges(BufferedImage image, int featherRadius) { - int width = image.getWidth(); - int height = image.getHeight(); - BufferedImage output = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); - - Graphics2D g2 = output.createGraphics(); - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); - g2.setRenderingHint( - RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); - - g2.drawImage(image, 0, 0, null); - g2.setComposite(AlphaComposite.DstIn); - - // Top edge - g2.setPaint( - new GradientPaint( - 0, - 0, - new Color(0, 0, 0, 1f), - 0, - featherRadius * 2f, - new Color(0, 0, 0, 0f))); - g2.fillRect(0, 0, width, featherRadius); - - // Bottom edge - g2.setPaint( - new GradientPaint( - 0, - height - featherRadius * 2f, - new Color(0, 0, 0, 0f), - 0, - height, - new Color(0, 0, 0, 1f))); - g2.fillRect(0, height - featherRadius, width, featherRadius); - - // Left edge - g2.setPaint( - new GradientPaint( - 0, - 0, - new Color(0, 0, 0, 1f), - featherRadius * 2f, - 0, - new Color(0, 0, 0, 0f))); - g2.fillRect(0, 0, featherRadius, height); - - // Right edge - g2.setPaint( - new GradientPaint( - width - featherRadius * 2f, - 0, - new Color(0, 0, 0, 0f), - width, - 0, - new Color(0, 0, 0, 1f))); - g2.fillRect(width - featherRadius, 0, featherRadius, height); - - g2.dispose(); - - return output; - } - - private void addDustAndHairs(BufferedImage image, float intensity) { - int width = image.getWidth(); - int height = image.getHeight(); - Graphics2D g2d = image.createGraphics(); - Random random = new SecureRandom(); - - // Set rendering hints for better quality - g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - - // Calculate the number of artifacts based on intensity - int numSpots = (int) (intensity * 10); - int numHairs = (int) (intensity * 20); - - // Add spots with more variable sizes - g2d.setColor(new Color(100, 100, 100, 50)); // Semi-transparent gray - for (int i = 0; i < numSpots; i++) { - int x = random.nextInt(width); - int y = random.nextInt(height); - int ovalSize = 1 + random.nextInt(3); // Base size + variable component - if (random.nextFloat() > 0.9) { - // 10% chance to get a larger spot - ovalSize += random.nextInt(3); - } - g2d.fill(new Ellipse2D.Double(x, y, ovalSize, ovalSize)); - } - - // Add hairs - g2d.setStroke(new BasicStroke(0.5f)); // Thin stroke for hairs - g2d.setColor(new Color(80, 80, 80, 40)); // Slightly lighter and more transparent - for (int i = 0; i < numHairs; i++) { - int x1 = random.nextInt(width); - int y1 = random.nextInt(height); - int x2 = x1 + random.nextInt(20) - 10; // Random length and direction - int y2 = y1 + random.nextInt(20) - 10; - Path2D.Double hair = new Path2D.Double(); - hair.moveTo(x1, y1); - hair.curveTo(x1, y1, (double) (x1 + x2) / 2, (double) (y1 + y2) / 2, x2, y2); - g2d.draw(hair); - } - - g2d.dispose(); - } - - private void addGaussianNoise(BufferedImage image, double strength) { - Random rand = new SecureRandom(); - int width = image.getWidth(); - int height = image.getHeight(); - - for (int i = 0; i < width; i++) { - for (int j = 0; j < height; j++) { - int rgba = image.getRGB(i, j); - int alpha = (rgba >> 24) & 0xff; - int red = (rgba >> 16) & 0xff; - int green = (rgba >> 8) & 0xff; - int blue = rgba & 0xff; - - // Apply Gaussian noise - red = (int) (red + rand.nextGaussian() * strength); - green = (int) (green + rand.nextGaussian() * strength); - blue = (int) (blue + rand.nextGaussian() * strength); - - // Clamping values to the 0-255 range - red = Math.min(Math.max(0, red), 255); - green = Math.min(Math.max(0, green), 255); - blue = Math.min(Math.max(0, blue), 255); - - image.setRGB(i, j, (alpha << 24) | (red << 16) | (green << 8) | blue); - } - } - } - - public BufferedImage linearStretch(BufferedImage image) { - int width = image.getWidth(); - int height = image.getHeight(); - int min = 255; - int max = 0; - - // First pass: find the min and max grayscale values - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) { - int rgb = image.getRGB(x, y); - int gray = - (int) - (((rgb >> 16) & 0xff) * 0.299 - + ((rgb >> 8) & 0xff) * 0.587 - + (rgb & 0xff) * 0.114); // Convert to grayscale - if (gray < min) min = gray; - if (gray > max) max = gray; - } - } - - // Second pass: stretch the histogram - for (int y = 0; y < height; y++) { - for (int x = 0; x < width; x++) { - int rgb = image.getRGB(x, y); - int alpha = (rgb >> 24) & 0xff; - int red = (rgb >> 16) & 0xff; - int green = (rgb >> 8) & 0xff; - int blue = rgb & 0xff; - - // Apply linear stretch to each channel - red = (int) (((red - min) / (float) (max - min)) * 255); - green = (int) (((green - min) / (float) (max - min)) * 255); - blue = (int) (((blue - min) / (float) (max - min)) * 255); - - // Set new RGB value maintaining the alpha channel - rgb = (alpha << 24) | (red << 16) | (green << 8) | blue; - image.setRGB(x, y, rgb); - } - } - - return image; - } -} diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/FakeScanRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/FakeScanRequest.java new file mode 100644 index 000000000..1237d2305 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/misc/FakeScanRequest.java @@ -0,0 +1,126 @@ +package stirling.software.SPDF.model.api.misc; + +import org.springframework.web.multipart.MultipartFile; + +import io.swagger.v3.oas.annotations.media.Schema; + +import jakarta.validation.constraints.NotNull; + +import lombok.Data; +import lombok.EqualsAndHashCode; + +@Data +@EqualsAndHashCode +public class FakeScanRequest { + public enum Quality { + low, + medium, + high + } + + public enum Rotation { + none, + slight, + moderate, + severe + } + + public enum Colorspace { + grayscale, + color + } + + @Schema( + description = "PDF file to process", + requiredMode = Schema.RequiredMode.REQUIRED, + type = "string", + format = "binary") + @NotNull(message = "File input is required") + private MultipartFile fileInput; + + @Schema(description = "Scan quality preset", example = "high") + @NotNull(message = "Quality is required") + private Quality quality = Quality.high; + + @Schema(description = "Rotation preset", example = "none") + @NotNull(message = "Rotation is required") + private Rotation rotation = Rotation.slight; + + @Schema(description = "Colorspace for output image", example = "grayscale") + private Colorspace colorspace = Colorspace.grayscale; + + @Schema(description = "Border thickness in pixels", example = "20") + private int border = 20; + + @Schema(description = "Base rotation in degrees", example = "0") + private int rotate = 0; + + @Schema(description = "Random rotation variance in degrees", example = "2") + private int rotateVariance = 2; + + @Schema(description = "Brightness multiplier (1.0 = no change)", example = "1.0") + private float brightness = 1.0f; + + @Schema(description = "Contrast multiplier (1.0 = no change)", example = "1.0") + private float contrast = 1.0f; + + @Schema(description = "Blur amount (0 = none, higher = more blur)", example = "1.0") + private float blur = 1.0f; + + @Schema(description = "Noise amount (0 = none, higher = more noise)", example = "8.0") + private float noise = 8.0f; + + @Schema(description = "Simulate yellowed paper", example = "false") + private boolean yellowish = false; + + @Schema(description = "Rendering resolution in DPI", example = "300") + private int resolution = 300; + + @Schema(description = "Whether advanced settings are enabled", example = "false") + private boolean advancedEnabled = false; + + public boolean isAdvancedEnabled() { + return advancedEnabled; + } + + public int getQualityValue() { + return switch (quality) { + case low -> 30; + case medium -> 60; + case high -> 100; + }; + } + + public int getRotationValue() { + return switch (rotation) { + case none -> 0; + case slight -> 2; + case moderate -> 5; + case severe -> 8; + }; + } + + public void applyHighQualityPreset() { + this.blur = 0.1f; + this.noise = 1.0f; + this.brightness = 1.02f; + this.contrast = 1.05f; + this.resolution = 600; + } + + public void applyMediumQualityPreset() { + this.blur = 0.5f; + this.noise = 3.0f; + this.brightness = 1.05f; + this.contrast = 1.1f; + this.resolution = 300; + } + + public void applyLowQualityPreset() { + this.blur = 1.0f; + this.noise = 5.0f; + this.brightness = 1.1f; + this.contrast = 1.2f; + this.resolution = 150; + } +} diff --git a/src/main/resources/messages_en_GB.properties b/src/main/resources/messages_en_GB.properties index d78f3e239..56d31e749 100644 --- a/src/main/resources/messages_en_GB.properties +++ b/src/main/resources/messages_en_GB.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=These cookies are essential cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/templates/fragments/navElements.html b/src/main/resources/templates/fragments/navElements.html index 0bc0ef1e0..1c7d329dd 100644 --- a/src/main/resources/templates/fragments/navElements.html +++ b/src/main/resources/templates/fragments/navElements.html @@ -264,6 +264,7 @@
+
diff --git a/src/main/resources/templates/misc/fake-scan.html b/src/main/resources/templates/misc/fake-scan.html index 08821f285..dc625084c 100644 --- a/src/main/resources/templates/misc/fake-scan.html +++ b/src/main/resources/templates/misc/fake-scan.html @@ -1,7 +1,7 @@ - + @@ -12,12 +12,85 @@

-
-

-
+
+
+ scanner + +
+ + +

- +
+ + +
+
+ + +
+
+ + +
+ +
+ +
@@ -25,5 +98,66 @@
+ + \ No newline at end of file From 679ecdd50d8ad2f43681a40b78de7a7dc8acb90c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Jun 2025 19:51:22 +0100 Subject: [PATCH 006/126] Bump docker/build-push-action from 6.17.0 to 6.18.0 (#3624) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 6.17.0 to 6.18.0.
Release notes

Sourced from docker/build-push-action's releases.

v6.18.0

[!NOTE] Build summary is now supported with Docker Build Cloud.

Full Changelog: https://github.com/docker/build-push-action/compare/v6.17.0...v6.18.0

Commits
  • 2634353 Merge pull request #1381 from docker/dependabot/npm_and_yarn/docker/actions-t...
  • c0432d2 chore: update generated content
  • 0bb1f27 set builder driver and endpoint attributes for dbc summary support
  • 5f9dbf9 chore(deps): Bump @​docker/actions-toolkit from 0.61.0 to 0.62.1
  • 0788c44 Merge pull request #1375 from crazy-max/remove-gcr
  • aa179ca e2e: remove GCR
  • See full diff in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=docker/build-push-action&package-manager=github_actions&previous-version=6.17.0&new-version=6.18.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/PR-Demo-Comment-with-react.yml | 2 +- .github/workflows/push-docker.yml | 6 +++--- .github/workflows/testdriver.yml | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/PR-Demo-Comment-with-react.yml b/.github/workflows/PR-Demo-Comment-with-react.yml index 14566855b..67ed61ef1 100644 --- a/.github/workflows/PR-Demo-Comment-with-react.yml +++ b/.github/workflows/PR-Demo-Comment-with-react.yml @@ -180,7 +180,7 @@ jobs: password: ${{ secrets.DOCKER_HUB_API }} - name: Build and push PR-specific image - uses: docker/build-push-action@1dc73863535b631f98b2378be8619f83b136f4a0 # v6.17.0 + uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 with: context: . file: ./Dockerfile diff --git a/.github/workflows/push-docker.yml b/.github/workflows/push-docker.yml index ab45d3a52..7fa1b9afb 100644 --- a/.github/workflows/push-docker.yml +++ b/.github/workflows/push-docker.yml @@ -90,7 +90,7 @@ jobs: - name: Build and push main Dockerfile id: build-push-regular - uses: docker/build-push-action@1dc73863535b631f98b2378be8619f83b136f4a0 # v6.17.0 + uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 with: builder: ${{ steps.buildx.outputs.name }} context: . @@ -135,7 +135,7 @@ jobs: - name: Build and push Dockerfile-ultra-lite id: build-push-lite - uses: docker/build-push-action@1dc73863535b631f98b2378be8619f83b136f4a0 # v6.17.0 + uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 if: github.ref != 'refs/heads/main' with: context: . @@ -166,7 +166,7 @@ jobs: - name: Build and push main Dockerfile fat id: build-push-fat - uses: docker/build-push-action@1dc73863535b631f98b2378be8619f83b136f4a0 # v6.17.0 + uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 if: github.ref != 'refs/heads/main' with: builder: ${{ steps.buildx.outputs.name }} diff --git a/.github/workflows/testdriver.yml b/.github/workflows/testdriver.yml index 07a23defe..44c2fbe11 100644 --- a/.github/workflows/testdriver.yml +++ b/.github/workflows/testdriver.yml @@ -46,7 +46,7 @@ jobs: password: ${{ secrets.DOCKER_HUB_API }} - name: Build and push test image - uses: docker/build-push-action@1dc73863535b631f98b2378be8619f83b136f4a0 # v6.17.0 + uses: docker/build-push-action@263435318d21b8e681c14492fe198d362a7d2c83 # v6.18.0 with: context: . file: ./Dockerfile From 03d27013d6b831f8c5d2471dc440ad62546cb098 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Jun 2025 19:51:52 +0100 Subject: [PATCH 007/126] Bump alpine from 3.21.3 to 3.22.0 (#3623) Bumps alpine from 3.21.3 to 3.22.0. [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=alpine&package-manager=docker&previous-version=3.21.3&new-version=3.22.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- Dockerfile | 2 +- Dockerfile.fat | 2 +- Dockerfile.ultra-lite | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 68c50976f..f078e78ac 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Main stage -FROM alpine:3.21.3@sha256:a8560b36e8b8210634f77d9f7f9efd7ffa463e380b75e2e74aff4511df3ef88c +FROM alpine:3.22.0@sha256:8a1f59ffb675680d47db6337b49d22281a139e9d709335b492be023728e11715 # Copy necessary files COPY scripts /scripts diff --git a/Dockerfile.fat b/Dockerfile.fat index 6d23809a8..9029fc8eb 100644 --- a/Dockerfile.fat +++ b/Dockerfile.fat @@ -19,7 +19,7 @@ RUN DOCKER_ENABLE_SECURITY=true \ ./gradlew clean build -x spotlessApply -x spotlessCheck -x test -x sonarqube # Main stage -FROM alpine:3.21.3@sha256:a8560b36e8b8210634f77d9f7f9efd7ffa463e380b75e2e74aff4511df3ef88c +FROM alpine:3.22.0@sha256:8a1f59ffb675680d47db6337b49d22281a139e9d709335b492be023728e11715 # Copy necessary files COPY scripts /scripts diff --git a/Dockerfile.ultra-lite b/Dockerfile.ultra-lite index 0ea37f704..ec0ab55aa 100644 --- a/Dockerfile.ultra-lite +++ b/Dockerfile.ultra-lite @@ -1,5 +1,5 @@ # use alpine -FROM alpine:3.21.3@sha256:a8560b36e8b8210634f77d9f7f9efd7ffa463e380b75e2e74aff4511df3ef88c +FROM alpine:3.22.0@sha256:8a1f59ffb675680d47db6337b49d22281a139e9d709335b492be023728e11715 ARG VERSION_TAG From d83d8b47486e267792fd132810e2e73b0d29c0a8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Jun 2025 19:58:03 +0100 Subject: [PATCH 008/126] Bump ossf/scorecard-action from 2.4.1 to 2.4.2 (#3625) Bumps [ossf/scorecard-action](https://github.com/ossf/scorecard-action) from 2.4.1 to 2.4.2.
Release notes

Sourced from ossf/scorecard-action's releases.

v2.4.2

What's Changed

This update bumps the Scorecard version to the v5.2.1 release. For a complete list of changes, please refer to the Scorecard v5.2.0 and v5.2.1 release notes.

Full Changelog: https://github.com/ossf/scorecard-action/compare/v2.4.1...v2.4.2

Commits
  • 05b42c6 :seedling: bump docker to ghcr v2.4.2 (#1548)
  • b225da6 Bump github.com/ossf/scorecard/v5 from v5.2.0 to v5.2.1 (#1550)
  • 9399f6f :seedling: Bump the docker-images group across 1 directory with 2 updates (#1...
  • e1daa8c :seedling: Bump the github-actions group across 1 directory with 5 updates (#...
  • 9fe6511 :seedling: Bump golang.org/x/net from 0.39.0 to 0.40.0 (#1542)
  • 25b9cd9 :seedling: Bump github.com/ossf/scorecard/v5 from v5.1.1 to v5.2.0 (#1547)
  • 18cc9b8 :seedling: Bump golang.org/x/net from 0.38.0 to 0.39.0 (#1536)
  • db78142 :seedling: Bump the github-actions group with 2 updates (#1538)
  • de386ed :seedling: Bump golang from 1.24.1 to 1.24.2 in the docker-images group (#1534)
  • 5b7cedb :seedling: Bump github.com/sigstore/cosign/v2 from 2.4.3 to 2.5.0 (#1537)
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=ossf/scorecard-action&package-manager=github_actions&previous-version=2.4.1&new-version=2.4.2)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/scorecards.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index 8c6485b7b..1e531075a 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -44,7 +44,7 @@ jobs: persist-credentials: false - name: "Run analysis" - uses: ossf/scorecard-action@f49aabe0b5af0936a0987cfb85d86b75731b0186 # v2.4.1 + uses: ossf/scorecard-action@05b42c624433fc40578a4040d5cf5e36ddca8cde # v2.4.2 with: results_file: results.sarif results_format: sarif From 3bec51f4e50849a3db4e3305e3d1457046476ba0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Jun 2025 19:58:31 +0100 Subject: [PATCH 009/126] Bump com.diffplug.spotless from 7.0.3 to 7.0.4 (#3626) Bumps com.diffplug.spotless from 7.0.3 to 7.0.4. [![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=com.diffplug.spotless&package-manager=gradle&previous-version=7.0.3&new-version=7.0.4)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 5e53275c8..1d30853d5 100644 --- a/build.gradle +++ b/build.gradle @@ -6,7 +6,7 @@ plugins { id "org.springdoc.openapi-gradle-plugin" version "1.9.0" id "io.swagger.swaggerhub" version "1.3.2" id "edu.sc.seis.launch4j" version "3.0.6" - id "com.diffplug.spotless" version "7.0.3" + id "com.diffplug.spotless" version "7.0.4" id "com.github.jk1.dependency-license-report" version "2.9" //id "nebula.lint" version "19.0.3" id("org.panteleyev.jpackageplugin") version "1.6.1" From 5ec78b54254d1ec913272b5f83956b2f138a1d31 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Jun 2025 19:59:57 +0100 Subject: [PATCH 010/126] Bump org.springframework.boot:spring-boot-dependencies from 3.4.5 to 3.5.0 (#3627) Bumps [org.springframework.boot:spring-boot-dependencies](https://github.com/spring-projects/spring-boot) from 3.4.5 to 3.5.0.
Release notes

Sourced from org.springframework.boot:spring-boot-dependencies's releases.

v3.5.0

Full release notes for Spring Boot 3.5 are available on the wiki.

:star: New Features

  • Make heapdump endpoint restricted by default #45624
  • Remove SSL status tag from metrics #45602
  • Remove 'spring.http.client' deprecation and change 'spring.http.reactiveclient.settings' to 'spring.http.reactiveclient' #45507

:lady_beetle: Bug Fixes

  • Unable to override/set nested ConfigurationProperties by passing as a system property #45639
  • ValidationAutoConfiguration triggers early initialization of properties binding #45618
  • Micrometer "enable" annotations property does not cover observed aspect #45617
  • spring.graphql.sse.timeout is no longer exposed #45613
  • SpringApplication.setEnvironmentPrefix is ignored when reading SPRING_PROFILES_ACTIVE #45549
  • IllegalStateException when extracting using layers a module with no code of its own #45449
  • Removed spring.batch.initialize-schema property is still considered #45380
  • ReactorHttpClientBuilder does not offer a factory method to create the HttpClient #45378
  • Suggested values for spring.jpa.hibernate.ddl-auto are not aligned with Hibernate #45351
  • Custom default units declared on a field are ignored when binding properties in a native image #45347
  • DockerRegistryConfigAuthentication uses the wrong serverUrl as a fallback for the Credentials helper #45345
  • Various spring.datasource properties are mistakenly marked as ignored #45342
  • JerseyWebApplicationInitializer always gets loaded, setting a ServletContext initParameter #45297
  • DockerRegistryConfigAuthentication does not align with Docker CLI #45292
  • Unlike the Docker CLI, "\x00" characters are not trimmed from a decoded Docker Registry password #45290
  • CloudFoundry security matcher logs a warning due to use of the 'ignoring()' method #32622

:notebook_with_decorative_cover: Documentation

  • Document the java info contribution #45634
  • Document the process info contribution #45632
  • Document the os info contribution #45630
  • Document typical spring.application.group and name use #45628
  • Document that bean methods should be static when annotated with @ConfigurationPropertiesBinding #45626
  • Document the way that primary Kotlin constructors are used when binding #45553
  • Improve "profile" reference documentation with additional admonitions #45551
  • Improve setEnvironmentPrefix(...) reference documentation #45376
  • Document all the available Testcontainers integrations #45367
  • Document when a spring.config.import value is relative and when it is fixed #45363
  • Update org.cyclonedx.bom version in docs to 2.3.0 #45320
  • Update link to "Parameter Name Retention" section of Spring Framework's release notes #45299

:hammer: Dependency Upgrades

  • Prevent upgrade to Prometheus Client 1.3.7 #45541
  • Upgrade to Couchbase Client 3.8.1 #45539
  • Upgrade to Elasticsearch 8.18.1 #45447
  • Upgrade to GraphQL Java 24.0 #45588
  • Upgrade to Hibernate 6.6.15.Final #45540

... (truncated)

Commits
  • 8c2d645 Release v3.5.0
  • 0b49e78 Merge branch '3.4.x'
  • c684fa4 Switch make-default for publish-to-sdkman to 3.5.x
  • 5695192 Ensure descendants are always recalculated on cache refresh
  • 31f549e Merge branch '3.4.x'
  • 68df6f5 Next development version (v3.4.7-SNAPSHOT)
  • 9f46877 Merge branch '3.4.x'
  • 404a0df Merge branch '3.3.x' into 3.4.x
  • e331846 Next development version (v3.3.13-SNAPSHOT)
  • b142798 Merge branch '3.4.x'
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=org.springframework.boot:spring-boot-dependencies&package-manager=gradle&previous-version=3.4.5&new-version=3.5.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- common/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/build.gradle b/common/build.gradle index 64b98b88b..4dee0ecaf 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -25,7 +25,7 @@ configurations.all { dependencyManagement { imports { - mavenBom 'org.springframework.boot:spring-boot-dependencies:3.4.5' + mavenBom 'org.springframework.boot:spring-boot-dependencies:3.5.0' } } From d12aca0ca614393d3fa5b423c7ce6ca4bf6b73f0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Jun 2025 20:07:28 +0100 Subject: [PATCH 011/126] Bump org.postgresql:postgresql from 42.7.5 to 42.7.6 (#3629) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bumps [org.postgresql:postgresql](https://github.com/pgjdbc/pgjdbc) from 42.7.5 to 42.7.6.
Release notes

Sourced from org.postgresql:postgresql's releases.

v42.7.6

Changes

  • Prepare release notes for release 42_7_6 (new format) @​davecramer (#3628)
  • fix: isValid incorrectly called execute, instead of executeWithFlags fixes Issue #3630 @​davecramer (#3631)
  • add override @​davecramer (#3629)
  • add the ability to turn off automatic LSN flush @​davecramer (#3403)
  • test: add tests with reWriteBatchedInserts=true @​vlsi (#3616)
  • test: add CI executions with adaptive_fetch=true by default @​vlsi (#3615)
  • test: simplify TestUtil.openDB, add tests with various assumeMinServerVersion values @​vlsi (#3614)
  • Deprecate group startup parms @​davecramer (#3613)
  • Add back application name setting @​joejensen (#3509)
  • Copr: Use Java 21 as the build dependency @​mkoncek (#3607)
  • fix indentation of return child to allow built pass in Checkstyle's CIs @​mohitsatr (#3611)
  • Set column name explicitely when using current_database() in queries @​kneth (#3526)
  • add PgMessageType and use static variables for protocol literals @​davecramer (#3609)
  • Handle protocol 3.2 and wider cancel keys. @​davecramer (#3592)
  • refactor empty resultset to use empty result set if the catalog is not correct @​davecramer (#3588)
  • Use query to find the current catalog instead of relying on the database in the connection URL or connection properties as this could be different if connected through a pooler or proxy @​davecramer (#3565)
  • ci: add Java 24 tests @​davecramer (#3580)
  • docs: Relabel 42.7.4 as past version as it is no longer the latest @​sehrope (#3586)
  • test: remove stale logging message from SslTest @​vlsi (#3584)
  • chore: appply the latest byte-buddy version for tests so we support the latest Java versions @​vlsi (#3583)
  • fix: make PgConnection#abort compatible with Java 24 @​vlsi (#3582)
  • chore(deps): update plugin com.github.burrunan.s3-build-cache to v1.8.5 @​renovate-bot (#3573)
  • Fix JavadocTagContinuationIndentation in AfterBeforeParameterResolver @​Anmol202005 (#3566)
  • Revert "use in row values instead of union all (#3510)" @​vlsi (#3524)
  • use in row values instead of union all @​davecramer (#3510)
  • feat: enhanced DatabaseMetadata.getIndexInfo() method, added index comment as REMARKS property @​raminorujov (#3513)
  • Nit: correct message in main.yml test action @​ecki (#3503)
  • chore: use import instead of require to support modern NodeJS @​vlsi (#3502)
  • chore: use PostgreSQL 17 rather than 17rc1 for CI tests @​vlsi (#3501)
  • chore: add ErrorProne verification to catch bugs ealier @​vlsi (#3493)
  • fix: ArrayIndexOutOfBounds when write big object into GSS enabled connection, make GSSInputStream robust in face of streams that produce incomplete reads @​vlsi (#3500)
  • refactor: factor out duplicated .getBytes() when converting date/time to Date/Time/Timestamp @​vlsi (#3497)
  • chore: exclude Oracle Java 17 from CI tests @​vlsi (#3499)
  • chore: remove unused Travis CI configuration @​vlsi (#3498)
  • Undeprecate sslfactoryarg connection property @​sehrope (#3496)
  • fix:Fix sending extra_float_digits @​davecramer (#3491)

🐛 Bug Fixes

  • fix: EOFException on PreparedStatement#toString with unset bytea parameter since 42.7.4 @​MrEasy (#3369)

🧰 Maintenance

  • chore: use Java 21 for building pgjdbc by default @​vlsi (#3612)

⬆️ Dependencies

... (truncated)

Changelog

Sourced from org.postgresql:postgresql's changelog.

[42.7.6]

Features

  • fix: Enhanced DatabaseMetadata.getIndexInfo() method, added index comment as REMARKS property [PR #3513](pgjdbc/pgjdbc#3513)

Performance Improvements

  • performance: Improve ResultSetMetadata.fetchFieldMetaData by using IN row values instead of UNION ALL for improved query performance (later reverted) [PR #3510](pgjdbc/pgjdbc#3510)
  • feat:Use a single simple query for all startup parameters, so groupStartupParameters is no longer needed [PR #3613](pgjdbc/pgjdbc#3613)

Bug Fixes

Protocol & Connection Handling

Metadata & Catalog Handling

  • fix: Set column name explicitly when using current_database() in queries [PR #3526](pgjdbc/pgjdbc#3526)
  • fix: Use query to find the current catalog instead of relying on the database in the connection URL [pull #3565](pgjdbc/pgjdbc#3565)
  • fix: Refactored empty resultset to use empty result set if the catalog is not correct [PR #3588](pgjdbc/pgjdbc#3588)

API Improvements

Infrastructure & Build Improvements

Java Support

Testing & Quality

Code Quality

... (truncated)

Commits
  • 689708f Prepare release notes for release 42_7_6 (new format) (#3628)
  • 0a88ea4 fix: EOFException on PreparedStatement#toString with unset bytea parameter si...
  • 2de9b94 fix: make sure Connection.isValid correctly uses executeWithFlags fixes Issu...
  • d9e2087 add override (#3629)
  • 665b27b add the ability to turn off automatic LSN flush (#3403)
  • 253c682 chore(deps): update burrunan/gradle-cache-action action to v3
  • 2d1ae0c chore(deps): update plugin com.gradle.develocity to v4
  • baeb893 fix(deps): update dependency org.openrewrite.rewrite:org.openrewrite.rewrite....
  • e24d599 fix(deps): update dependency com.google.errorprone:error_prone_core to v2.38.0
  • 1617c68 fix(deps): update dependency net.ltgt.errorprone:net.ltgt.errorprone.gradle.p...
  • Additional commits viewable in compare view

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=org.postgresql:postgresql&package-manager=gradle&previous-version=42.7.5&new-version=42.7.6)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 1d30853d5..8c4f9c8ed 100644 --- a/build.gradle +++ b/build.gradle @@ -464,7 +464,7 @@ dependencies { implementation 'com.unboundid.product.scim2:scim2-sdk-client:2.3.5' // Don't upgrade h2database runtimeOnly "com.h2database:h2:2.3.232" - runtimeOnly "org.postgresql:postgresql:42.7.5" + runtimeOnly "org.postgresql:postgresql:42.7.6" constraints { implementation "org.opensaml:opensaml-core:$openSamlVersion" implementation "org.opensaml:opensaml-saml-api:$openSamlVersion" From b08bc191fcb8885d58ff22dabe9c6f70a37736e8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Jun 2025 20:08:06 +0100 Subject: [PATCH 012/126] Bump org.springdoc:springdoc-openapi-starter-webmvc-ui from 2.8.6 to 2.8.8 (#3628) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [//]: # (dependabot-start) ⚠️ **Dependabot is rebasing this PR** ⚠️ Rebasing might not happen immediately, so don't worry if this takes some time. Note: if you make any changes to this PR yourself, they will take precedence over the rebase. --- [//]: # (dependabot-end) Bumps [org.springdoc:springdoc-openapi-starter-webmvc-ui](https://github.com/springdoc/springdoc-openapi) from 2.8.6 to 2.8.8.
Release notes

Sourced from org.springdoc:springdoc-openapi-starter-webmvc-ui's releases.

v2.8.8

Full Changelog: https://github.com/springdoc/springdoc-openapi/compare/v2.8.7...v2.8.8

Fixed

  • #2977 - Handle projects not using kotlin-reflect #2977

springdoc-openapi v2.8.7 released!

What's Changed

Added

  • #2944 - Introducing springdoc-openapi-bom project
  • #2948 - Customize Servers via application.yml
  • #2963 - Set default content type for problem details object to application/problem+jso
  • #2971 - List of value classes in Kotlin

Changed

  • Upgrade swagger-ui to v5.21.0
  • Upgrade swagger-core to 2.2.30
  • Upgrade spring-boot to version 3.4.5
  • Upgrade spring-security-oauth2-authorization-server to version 1.4.3

Fixed

  • #2947 - Unexpected warning "Appended trailing slash to static resource location"
  • #2960 - NPE when customizing group's open-api without specifying any schema
  • #2969 - fix path to register resource handler to work SwaggerIndexPageTransformer considering /webjar path prefix
  • #2964 - Cannot add custom description and example for java.time.Duration since v2.8.6
  • #2972 - @​Header(schema = @​Schema(type = "string")) generates empty or broken schema in OpenAPI output since 2.8.0
  • #2976, #2967 - Build Failure due to Private Inner Class.
  • #2556 - Unable to determine if it is a Kotlin type

New Contributors

Full Changelog: https://github.com/springdoc/springdoc-openapi/compare/v2.8.6...v2.8.7

Changelog

Sourced from org.springdoc:springdoc-openapi-starter-webmvc-ui's changelog.

[2.8.8] - 2025-05-04

Fixed

  • #2977 - Handle projects not using kotlin-reflect #2977

[2.8.7] - 2025-05-04

Added

  • #2944 - Introducing springdoc-openapi-bom project
  • #2948 - Customize Servers via application.yml
  • #2963 - Set default content type for problem details object to application/problem+jso
  • #2971 - List of value classes in Kotlin

Changed

  • Upgrade swagger-ui to v5.21.0
  • Upgrade swagger-core to 2.2.30
  • Upgrade spring-boot to version 3.4.5
  • Upgrade spring-security-oauth2-authorization-server to version 1.4.3

Fixed

  • #2947 - Unexpected warning "Appended trailing slash to static resource location"
  • #2960 - NPE when customizing group's open-api without specifying any schema
  • #2969 - fix path to register resource handler to work SwaggerIndexPageTransformer considering /webjar path prefix
  • #2964 - Cannot add custom description and example for java.time.Duration since v2.8.6
  • #2972 - @​Header(schema = @​Schema(type = "string")) generates empty or broken schema in OpenAPI output since 2.8.0
  • #2976, #2967 - Build Failure due to Private Inner Class.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=org.springdoc:springdoc-openapi-starter-webmvc-ui&package-manager=gradle&previous-version=2.8.6&new-version=2.8.8)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- common/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/build.gradle b/common/build.gradle index 4dee0ecaf..7406a699e 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -42,7 +42,7 @@ dependencies { implementation "org.apache.pdfbox:pdfbox:$pdfboxVersion" implementation 'jakarta.servlet:jakarta.servlet-api:6.0.0' implementation 'org.snakeyaml:snakeyaml-engine:2.9' - implementation "org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.6" + implementation "org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.8" compileOnly "org.projectlombok:lombok:$lombokVersion" annotationProcessor "org.projectlombok:lombok:$lombokVersion" From 92f5c5de7af1da9d7582246cf9154d08657bffed Mon Sep 17 00:00:00 2001 From: "stirlingbot[bot]" <195170888+stirlingbot[bot]@users.noreply.github.com> Date: Mon, 2 Jun 2025 20:08:36 +0100 Subject: [PATCH 013/126] :globe_with_meridians: Sync Translations + Update README Progress Table (#3617) ### Description of Changes This Pull Request was automatically generated to synchronize updates to translation files and documentation. Below are the details of the changes made: #### **1. Synchronization of Translation Files** - Updated translation files (`messages_*.properties`) to reflect changes in the reference file `messages_en_GB.properties`. - Ensured consistency and synchronization across all supported language files. - Highlighted any missing or incomplete translations. #### **2. Update README.md** - Generated the translation progress table in `README.md`. - Added a summary of the current translation status for all supported languages. - Included up-to-date statistics on translation coverage. #### **Why these changes are necessary** - Keeps translation files aligned with the latest reference updates. - Ensures the documentation reflects the current translation progress. --- Auto-generated by [create-pull-request][1]. [1]: https://github.com/peter-evans/create-pull-request --------- Co-authored-by: stirlingbot[bot] <195170888+stirlingbot[bot]@users.noreply.github.com> --- README.md | 78 +++++++++---------- src/main/resources/messages_ar_AR.properties | 35 +++++++++ src/main/resources/messages_az_AZ.properties | 35 +++++++++ src/main/resources/messages_bg_BG.properties | 35 +++++++++ src/main/resources/messages_bo_CN.properties | 35 +++++++++ src/main/resources/messages_ca_CA.properties | 35 +++++++++ src/main/resources/messages_cs_CZ.properties | 35 +++++++++ src/main/resources/messages_da_DK.properties | 35 +++++++++ src/main/resources/messages_de_DE.properties | 35 +++++++++ src/main/resources/messages_el_GR.properties | 35 +++++++++ src/main/resources/messages_en_US.properties | 35 +++++++++ src/main/resources/messages_es_ES.properties | 35 +++++++++ src/main/resources/messages_eu_ES.properties | 35 +++++++++ src/main/resources/messages_fa_IR.properties | 35 +++++++++ src/main/resources/messages_fr_FR.properties | 35 +++++++++ src/main/resources/messages_ga_IE.properties | 35 +++++++++ src/main/resources/messages_hi_IN.properties | 35 +++++++++ src/main/resources/messages_hr_HR.properties | 35 +++++++++ src/main/resources/messages_hu_HU.properties | 35 +++++++++ src/main/resources/messages_id_ID.properties | 35 +++++++++ src/main/resources/messages_it_IT.properties | 35 +++++++++ src/main/resources/messages_ja_JP.properties | 35 +++++++++ src/main/resources/messages_ko_KR.properties | 35 +++++++++ src/main/resources/messages_ml_IN.properties | 35 +++++++++ src/main/resources/messages_nl_NL.properties | 35 +++++++++ src/main/resources/messages_no_NB.properties | 35 +++++++++ src/main/resources/messages_pl_PL.properties | 35 +++++++++ src/main/resources/messages_pt_BR.properties | 35 +++++++++ src/main/resources/messages_pt_PT.properties | 35 +++++++++ src/main/resources/messages_ro_RO.properties | 35 +++++++++ src/main/resources/messages_ru_RU.properties | 35 +++++++++ src/main/resources/messages_sk_SK.properties | 35 +++++++++ src/main/resources/messages_sl_SI.properties | 35 +++++++++ .../resources/messages_sr_LATN_RS.properties | 35 +++++++++ src/main/resources/messages_sv_SE.properties | 35 +++++++++ src/main/resources/messages_th_TH.properties | 35 +++++++++ src/main/resources/messages_tr_TR.properties | 35 +++++++++ src/main/resources/messages_uk_UA.properties | 35 +++++++++ src/main/resources/messages_vi_VN.properties | 35 +++++++++ src/main/resources/messages_zh_CN.properties | 35 +++++++++ src/main/resources/messages_zh_TW.properties | 35 +++++++++ 41 files changed, 1439 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index 3243a9f74..36d600787 100644 --- a/README.md +++ b/README.md @@ -116,47 +116,47 @@ Stirling-PDF currently supports 40 languages! | Language | Progress | | -------------------------------------------- | -------------------------------------- | -| Arabic (العربية) (ar_AR) | ![75%](https://geps.dev/progress/75) | -| Azerbaijani (Azərbaycan Dili) (az_AZ) | ![75%](https://geps.dev/progress/75) | -| Basque (Euskara) (eu_ES) | ![44%](https://geps.dev/progress/44) | -| Bulgarian (Български) (bg_BG) | ![83%](https://geps.dev/progress/83) | -| Catalan (Català) (ca_CA) | ![82%](https://geps.dev/progress/82) | -| Croatian (Hrvatski) (hr_HR) | ![74%](https://geps.dev/progress/74) | -| Czech (Česky) (cs_CZ) | ![85%](https://geps.dev/progress/85) | -| Danish (Dansk) (da_DK) | ![75%](https://geps.dev/progress/75) | -| Dutch (Nederlands) (nl_NL) | ![73%](https://geps.dev/progress/73) | +| Arabic (العربية) (ar_AR) | ![73%](https://geps.dev/progress/73) | +| Azerbaijani (Azərbaycan Dili) (az_AZ) | ![74%](https://geps.dev/progress/74) | +| Basque (Euskara) (eu_ES) | ![43%](https://geps.dev/progress/43) | +| Bulgarian (Български) (bg_BG) | ![81%](https://geps.dev/progress/81) | +| Catalan (Català) (ca_CA) | ![81%](https://geps.dev/progress/81) | +| Croatian (Hrvatski) (hr_HR) | ![72%](https://geps.dev/progress/72) | +| Czech (Česky) (cs_CZ) | ![83%](https://geps.dev/progress/83) | +| Danish (Dansk) (da_DK) | ![73%](https://geps.dev/progress/73) | +| Dutch (Nederlands) (nl_NL) | ![71%](https://geps.dev/progress/71) | | English (English) (en_GB) | ![100%](https://geps.dev/progress/100) | | English (US) (en_US) | ![100%](https://geps.dev/progress/100) | -| French (Français) (fr_FR) | ![84%](https://geps.dev/progress/84) | -| German (Deutsch) (de_DE) | ![91%](https://geps.dev/progress/91) | -| Greek (Ελληνικά) (el_GR) | ![82%](https://geps.dev/progress/82) | -| Hindi (हिंदी) (hi_IN) | ![82%](https://geps.dev/progress/82) | -| Hungarian (Magyar) (hu_HU) | ![89%](https://geps.dev/progress/89) | -| Indonesian (Bahasa Indonesia) (id_ID) | ![75%](https://geps.dev/progress/75) | -| Irish (Gaeilge) (ga_IE) | ![83%](https://geps.dev/progress/83) | -| Italian (Italiano) (it_IT) | ![98%](https://geps.dev/progress/98) | -| Japanese (日本語) (ja_JP) | ![84%](https://geps.dev/progress/84) | -| Korean (한국어) (ko_KR) | ![82%](https://geps.dev/progress/82) | -| Norwegian (Norsk) (no_NB) | ![80%](https://geps.dev/progress/80) | -| Persian (فارسی) (fa_IR) | ![78%](https://geps.dev/progress/78) | -| Polish (Polski) (pl_PL) | ![88%](https://geps.dev/progress/88) | -| Portuguese (Português) (pt_PT) | ![84%](https://geps.dev/progress/84) | -| Portuguese Brazilian (Português) (pt_BR) | ![89%](https://geps.dev/progress/89) | -| Romanian (Română) (ro_RO) | ![70%](https://geps.dev/progress/70) | -| Russian (Русский) (ru_RU) | ![89%](https://geps.dev/progress/89) | -| Serbian Latin alphabet (Srpski) (sr_LATN_RS) | ![53%](https://geps.dev/progress/53) | -| Simplified Chinese (简体中文) (zh_CN) | ![88%](https://geps.dev/progress/88) | -| Slovakian (Slovensky) (sk_SK) | ![63%](https://geps.dev/progress/63) | -| Slovenian (Slovenščina) (sl_SI) | ![87%](https://geps.dev/progress/87) | -| Spanish (Español) (es_ES) | ![91%](https://geps.dev/progress/91) | -| Swedish (Svenska) (sv_SE) | ![80%](https://geps.dev/progress/80) | -| Thai (ไทย) (th_TH) | ![72%](https://geps.dev/progress/72) | -| Tibetan (བོད་ཡིག་) (bo_CN) | ![79%](https://geps.dev/progress/79) | -| Traditional Chinese (繁體中文) (zh_TW) | ![89%](https://geps.dev/progress/89) | -| Turkish (Türkçe) (tr_TR) | ![90%](https://geps.dev/progress/90) | -| Ukrainian (Українська) (uk_UA) | ![89%](https://geps.dev/progress/89) | -| Vietnamese (Tiếng Việt) (vi_VN) | ![70%](https://geps.dev/progress/70) | -| Malayalam (മലയാളം) (ml_IN) | ![89%](https://geps.dev/progress/89) | +| French (Français) (fr_FR) | ![82%](https://geps.dev/progress/82) | +| German (Deutsch) (de_DE) | ![89%](https://geps.dev/progress/89) | +| Greek (Ελληνικά) (el_GR) | ![80%](https://geps.dev/progress/80) | +| Hindi (हिंदी) (hi_IN) | ![80%](https://geps.dev/progress/80) | +| Hungarian (Magyar) (hu_HU) | ![87%](https://geps.dev/progress/87) | +| Indonesian (Bahasa Indonesia) (id_ID) | ![74%](https://geps.dev/progress/74) | +| Irish (Gaeilge) (ga_IE) | ![81%](https://geps.dev/progress/81) | +| Italian (Italiano) (it_IT) | ![95%](https://geps.dev/progress/95) | +| Japanese (日本語) (ja_JP) | ![82%](https://geps.dev/progress/82) | +| Korean (한국어) (ko_KR) | ![80%](https://geps.dev/progress/80) | +| Norwegian (Norsk) (no_NB) | ![78%](https://geps.dev/progress/78) | +| Persian (فارسی) (fa_IR) | ![76%](https://geps.dev/progress/76) | +| Polish (Polski) (pl_PL) | ![86%](https://geps.dev/progress/86) | +| Portuguese (Português) (pt_PT) | ![82%](https://geps.dev/progress/82) | +| Portuguese Brazilian (Português) (pt_BR) | ![87%](https://geps.dev/progress/87) | +| Romanian (Română) (ro_RO) | ![68%](https://geps.dev/progress/68) | +| Russian (Русский) (ru_RU) | ![87%](https://geps.dev/progress/87) | +| Serbian Latin alphabet (Srpski) (sr_LATN_RS) | ![52%](https://geps.dev/progress/52) | +| Simplified Chinese (简体中文) (zh_CN) | ![86%](https://geps.dev/progress/86) | +| Slovakian (Slovensky) (sk_SK) | ![61%](https://geps.dev/progress/61) | +| Slovenian (Slovenščina) (sl_SI) | ![85%](https://geps.dev/progress/85) | +| Spanish (Español) (es_ES) | ![88%](https://geps.dev/progress/88) | +| Swedish (Svenska) (sv_SE) | ![78%](https://geps.dev/progress/78) | +| Thai (ไทย) (th_TH) | ![70%](https://geps.dev/progress/70) | +| Tibetan (བོད་ཡིག་) (bo_CN) | ![77%](https://geps.dev/progress/77) | +| Traditional Chinese (繁體中文) (zh_TW) | ![87%](https://geps.dev/progress/87) | +| Turkish (Türkçe) (tr_TR) | ![87%](https://geps.dev/progress/87) | +| Ukrainian (Українська) (uk_UA) | ![87%](https://geps.dev/progress/87) | +| Vietnamese (Tiếng Việt) (vi_VN) | ![68%](https://geps.dev/progress/68) | +| Malayalam (മലയാളം) (ml_IN) | ![87%](https://geps.dev/progress/87) | ## Stirling PDF Enterprise diff --git a/src/main/resources/messages_ar_AR.properties b/src/main/resources/messages_ar_AR.properties index 0dcc27883..ac3bbea08 100644 --- a/src/main/resources/messages_ar_AR.properties +++ b/src/main/resources/messages_ar_AR.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=These cookies are essential cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_az_AZ.properties b/src/main/resources/messages_az_AZ.properties index f0667c353..4a7ed92be 100644 --- a/src/main/resources/messages_az_AZ.properties +++ b/src/main/resources/messages_az_AZ.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=These cookies are essential cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_bg_BG.properties b/src/main/resources/messages_bg_BG.properties index 80308d801..42b77743e 100644 --- a/src/main/resources/messages_bg_BG.properties +++ b/src/main/resources/messages_bg_BG.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=These cookies are essential cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_bo_CN.properties b/src/main/resources/messages_bo_CN.properties index 5146250ea..00c96c01d 100644 --- a/src/main/resources/messages_bo_CN.properties +++ b/src/main/resources/messages_bo_CN.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=These cookies are essential cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_ca_CA.properties b/src/main/resources/messages_ca_CA.properties index 880d48590..ee5b1561a 100644 --- a/src/main/resources/messages_ca_CA.properties +++ b/src/main/resources/messages_ca_CA.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=These cookies are essential cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_cs_CZ.properties b/src/main/resources/messages_cs_CZ.properties index bb5b7d456..a31f8445d 100644 --- a/src/main/resources/messages_cs_CZ.properties +++ b/src/main/resources/messages_cs_CZ.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=These cookies are essential cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_da_DK.properties b/src/main/resources/messages_da_DK.properties index 232c68892..2963db286 100644 --- a/src/main/resources/messages_da_DK.properties +++ b/src/main/resources/messages_da_DK.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=These cookies are essential cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties index 4a4e0367a..c9744c87a 100644 --- a/src/main/resources/messages_de_DE.properties +++ b/src/main/resources/messages_de_DE.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=Diese Cookies sind für das cookieBanner.preferencesModal.analytics.title=Analyse cookieBanner.preferencesModal.analytics.description=Diese Cookies helfen uns zu verstehen, wie unsere Tools genutzt werden, damit wir uns darauf konzentrieren können, die Funktionen zu entwickeln, die unserer Community am meisten am Herzen liegen. Seien Sie beruhigt – Stirling PDF kann und wird niemals den Inhalt der Dokumente verfolgen, mit denen Sie arbeiten. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_el_GR.properties b/src/main/resources/messages_el_GR.properties index ac020f4ed..073041723 100644 --- a/src/main/resources/messages_el_GR.properties +++ b/src/main/resources/messages_el_GR.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=These cookies are essential cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_en_US.properties b/src/main/resources/messages_en_US.properties index 91d6216ac..1f72b0213 100644 --- a/src/main/resources/messages_en_US.properties +++ b/src/main/resources/messages_en_US.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=These cookies are essential cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_es_ES.properties b/src/main/resources/messages_es_ES.properties index 44e720a0e..ae93c2f04 100644 --- a/src/main/resources/messages_es_ES.properties +++ b/src/main/resources/messages_es_ES.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=Estas cookies son esenciales cookieBanner.preferencesModal.analytics.title=Análisis cookieBanner.preferencesModal.analytics.description=Estas cookies nos ayudan a entender cómo se están utilizando nuestras herramientas, para que podamos centrarnos en desarrollar las funciones que nuestra comunidad valora más. Tenga la seguridad de que Stirling PDF no puede y nunca podrá rastrear el contenido de los documentos con los que trabaja. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_eu_ES.properties b/src/main/resources/messages_eu_ES.properties index 31f740690..320104165 100644 --- a/src/main/resources/messages_eu_ES.properties +++ b/src/main/resources/messages_eu_ES.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=These cookies are essential cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_fa_IR.properties b/src/main/resources/messages_fa_IR.properties index 1055a2bea..e9039d770 100644 --- a/src/main/resources/messages_fa_IR.properties +++ b/src/main/resources/messages_fa_IR.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=These cookies are essential cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_fr_FR.properties b/src/main/resources/messages_fr_FR.properties index cd5be27d3..c3fc9ba65 100644 --- a/src/main/resources/messages_fr_FR.properties +++ b/src/main/resources/messages_fr_FR.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=These cookies are essential cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_ga_IE.properties b/src/main/resources/messages_ga_IE.properties index 022e6d145..c76af2e10 100644 --- a/src/main/resources/messages_ga_IE.properties +++ b/src/main/resources/messages_ga_IE.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=These cookies are essential cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_hi_IN.properties b/src/main/resources/messages_hi_IN.properties index daf6eefaa..55e86ad18 100644 --- a/src/main/resources/messages_hi_IN.properties +++ b/src/main/resources/messages_hi_IN.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=These cookies are essential cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_hr_HR.properties b/src/main/resources/messages_hr_HR.properties index 04f400ab9..890c941a9 100644 --- a/src/main/resources/messages_hr_HR.properties +++ b/src/main/resources/messages_hr_HR.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=These cookies are essential cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_hu_HU.properties b/src/main/resources/messages_hu_HU.properties index 9fb98758b..dd878e690 100644 --- a/src/main/resources/messages_hu_HU.properties +++ b/src/main/resources/messages_hu_HU.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=Ezek a sütik elengedhetetle cookieBanner.preferencesModal.analytics.title=Adatelemzések cookieBanner.preferencesModal.analytics.description=Ezek a sütik segítenek megérteni, hogyan használják eszközeinket, így a közösségünk által leginkább értékelt funkciókra összpontosíthatunk. Nyugodt lehet-a Stirling PDF nem képes és soha nem is fog nyomon követni az Ön által használt dokumentumok tartalmát. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_id_ID.properties b/src/main/resources/messages_id_ID.properties index 8ef45fc34..ae442f370 100644 --- a/src/main/resources/messages_id_ID.properties +++ b/src/main/resources/messages_id_ID.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=These cookies are essential cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index 7a84ff027..c012147da 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=Questi cookie sono essenzial cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=Questi cookie ci aiutano a capire come vengono utilizzati i nostri strumenti, così possiamo concentrarci sullo sviluppo delle funzionalità che la nostra community apprezza di più. Non preoccuparti: Stirling PDF non può e non traccerà mai il contenuto dei documenti con cui lavori. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_ja_JP.properties b/src/main/resources/messages_ja_JP.properties index dfaf43a5c..f7bbfe102 100644 --- a/src/main/resources/messages_ja_JP.properties +++ b/src/main/resources/messages_ja_JP.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=これらのCookieはウェ cookieBanner.preferencesModal.analytics.title=分析 cookieBanner.preferencesModal.analytics.description=これらのCookieはツールがどのように使用されているかを把握するのに役立ちます。これによりコミュニティが最も重視する機能の開発に集中することができます。ご安心ください。Stirling PDFはお客様が操作するドキュメントの内容を追跡することは決してありません。 +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_ko_KR.properties b/src/main/resources/messages_ko_KR.properties index 326c701f8..f5908506a 100644 --- a/src/main/resources/messages_ko_KR.properties +++ b/src/main/resources/messages_ko_KR.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=These cookies are essential cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_ml_IN.properties b/src/main/resources/messages_ml_IN.properties index ff2bc630c..b3de98732 100644 --- a/src/main/resources/messages_ml_IN.properties +++ b/src/main/resources/messages_ml_IN.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=വെബ്സൈറ്റ cookieBanner.preferencesModal.analytics.title=അനലിറ്റിക്സ് cookieBanner.preferencesModal.analytics.description=ഞങ്ങളുടെ ടൂളുകൾ എങ്ങനെ ഉപയോഗിക്കുന്നുവെന്ന് മനസ്സിലാക്കാൻ ഈ കുക്കികൾ ഞങ്ങളെ സഹായിക്കുന്നു, അതിനാൽ ഞങ്ങളുടെ കമ്മ്യൂണിറ്റി ഏറ്റവും കൂടുതൽ വിലമതിക്കുന്ന ഫീച്ചറുകൾ നിർമ്മിക്കുന്നതിൽ ഞങ്ങൾക്ക് ശ്രദ്ധ കേന്ദ്രീകരിക്കാൻ കഴിയും. ഉറപ്പാക്കുക—സ്റ്റെർലിംഗ് PDF-ന് നിങ്ങൾ പ്രവർത്തിക്കുന്ന പ്രമാണങ്ങളുടെ ഉള്ളടക്കം ട്രാക്ക് ചെയ്യാൻ കഴിയില്ല, ഒരിക്കലും കഴിയില്ല. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_nl_NL.properties b/src/main/resources/messages_nl_NL.properties index a12f684c2..b05eefd27 100644 --- a/src/main/resources/messages_nl_NL.properties +++ b/src/main/resources/messages_nl_NL.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=These cookies are essential cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_no_NB.properties b/src/main/resources/messages_no_NB.properties index 163280661..7a9278dad 100644 --- a/src/main/resources/messages_no_NB.properties +++ b/src/main/resources/messages_no_NB.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=These cookies are essential cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_pl_PL.properties b/src/main/resources/messages_pl_PL.properties index 722fa100a..593871aa7 100644 --- a/src/main/resources/messages_pl_PL.properties +++ b/src/main/resources/messages_pl_PL.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=These cookies are essential cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_pt_BR.properties b/src/main/resources/messages_pt_BR.properties index 4eccbf1bc..fb7917ad9 100644 --- a/src/main/resources/messages_pt_BR.properties +++ b/src/main/resources/messages_pt_BR.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=Estes cookies são essenciai cookieBanner.preferencesModal.analytics.title=Cookies Analíticos cookieBanner.preferencesModal.analytics.description=Estes cookies nos ajudam a entender como nossas ferramentas estão sendo utilizadas, para que possamos nos concentrar na construção dos recursos que nossa comunidade mais valoriza. Fique tranquilo: o Stirling PDF não pode e nunca rastreará o conteúdo dos documentos com os quais você manipula. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_pt_PT.properties b/src/main/resources/messages_pt_PT.properties index e7d5c9b85..74c72ca7e 100644 --- a/src/main/resources/messages_pt_PT.properties +++ b/src/main/resources/messages_pt_PT.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=These cookies are essential cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_ro_RO.properties b/src/main/resources/messages_ro_RO.properties index 7ed210487..20453f5bc 100644 --- a/src/main/resources/messages_ro_RO.properties +++ b/src/main/resources/messages_ro_RO.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=These cookies are essential cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_ru_RU.properties b/src/main/resources/messages_ru_RU.properties index cb11ef2d2..451ae6c3c 100644 --- a/src/main/resources/messages_ru_RU.properties +++ b/src/main/resources/messages_ru_RU.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=Эти файлы cookie н cookieBanner.preferencesModal.analytics.title=Аналитика cookieBanner.preferencesModal.analytics.description=Эти файлы cookie помогают нам понять, как используются наши инструменты, чтобы мы могли сосредоточиться на создании функций, которые ценит наше сообщество. Будьте уверены — Stirling PDF не может и никогда не будет отслеживать содержимое документов, с которыми вы работаете. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_sk_SK.properties b/src/main/resources/messages_sk_SK.properties index ad28c9027..e6fadeabd 100644 --- a/src/main/resources/messages_sk_SK.properties +++ b/src/main/resources/messages_sk_SK.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=These cookies are essential cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_sl_SI.properties b/src/main/resources/messages_sl_SI.properties index 6177b4859..bf5eb855e 100644 --- a/src/main/resources/messages_sl_SI.properties +++ b/src/main/resources/messages_sl_SI.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=These cookies are essential cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_sr_LATN_RS.properties b/src/main/resources/messages_sr_LATN_RS.properties index f6ce0844f..c6bc14cf7 100644 --- a/src/main/resources/messages_sr_LATN_RS.properties +++ b/src/main/resources/messages_sr_LATN_RS.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=These cookies are essential cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_sv_SE.properties b/src/main/resources/messages_sv_SE.properties index 2af73f4b3..7b5154838 100644 --- a/src/main/resources/messages_sv_SE.properties +++ b/src/main/resources/messages_sv_SE.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=These cookies are essential cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_th_TH.properties b/src/main/resources/messages_th_TH.properties index 32a08dd46..abddaff44 100644 --- a/src/main/resources/messages_th_TH.properties +++ b/src/main/resources/messages_th_TH.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=These cookies are essential cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_tr_TR.properties b/src/main/resources/messages_tr_TR.properties index ab095e75f..a088ace34 100644 --- a/src/main/resources/messages_tr_TR.properties +++ b/src/main/resources/messages_tr_TR.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=Bu çerezler, web sitesinin cookieBanner.preferencesModal.analytics.title=Analitik cookieBanner.preferencesModal.analytics.description=Bu çerezler, araçlarımızın nasıl kullanıldığını anlamamıza yardımcı olur, böylece topluluğumuzun en çok değer verdiği özellikleri geliştirmeye odaklanabiliriz. İçiniz rahat olsun — Stirling PDF, belgelerinizin içeriğini asla takip etmez ve etmeyecektir. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_uk_UA.properties b/src/main/resources/messages_uk_UA.properties index eb7acd6c1..77ec5eb0b 100644 --- a/src/main/resources/messages_uk_UA.properties +++ b/src/main/resources/messages_uk_UA.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=Ці файли cookie є н cookieBanner.preferencesModal.analytics.title=Аналітика cookieBanner.preferencesModal.analytics.description=Ці файли cookie допомагають нам зрозуміти, як використовуються наші інструменти, щоб ми могли зосередитися на створенні функцій, які найбільше цінує наша спільнота. Будьте впевнені — Stirling PDF не може і ніколи не буде відстежувати вміст документів, з якими ви працюєте. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_vi_VN.properties b/src/main/resources/messages_vi_VN.properties index ce4160021..34fd1f2d9 100644 --- a/src/main/resources/messages_vi_VN.properties +++ b/src/main/resources/messages_vi_VN.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=These cookies are essential cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=These cookies help us understand how our tools are being used, so we can focus on building the features our community values most. Rest assured—Stirling PDF cannot and will never track the content of the documents you work with. +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_zh_CN.properties b/src/main/resources/messages_zh_CN.properties index 206393880..93e348196 100644 --- a/src/main/resources/messages_zh_CN.properties +++ b/src/main/resources/messages_zh_CN.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=这些Cookie对网站基础 cookieBanner.preferencesModal.analytics.title=分析统计 cookieBanner.preferencesModal.analytics.description=这些Cookie帮助我们分析工具使用情况,以便聚焦开发用户最需要的功能。再次强调:Stirling PDF绝不会追踪您处理的文档内容。 +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) diff --git a/src/main/resources/messages_zh_TW.properties b/src/main/resources/messages_zh_TW.properties index aac1de4f3..93c58db7b 100644 --- a/src/main/resources/messages_zh_TW.properties +++ b/src/main/resources/messages_zh_TW.properties @@ -1569,3 +1569,38 @@ cookieBanner.preferencesModal.necessary.description=這些 Cookies 對網站正 cookieBanner.preferencesModal.analytics.title=分析 Cookies cookieBanner.preferencesModal.analytics.description=這些 Cookies 幫助我們分析您如何使用我們的工具,好讓我們能專注在構建社群最重視的功能。儘管放心—— Stirling PDF 不會且永不追蹤您的文件 +#fakeScan +fakeScan.title=Fake Scan +fakeScan.header=Fake Scan +fakeScan.description=Create a PDF that looks like it was scanned +fakeScan.selectPDF=Select PDF: +fakeScan.quality=Scan Quality +fakeScan.quality.low=Low +fakeScan.quality.medium=Medium +fakeScan.quality.high=High +fakeScan.rotation=Rotation Angle +fakeScan.rotation.none=None +fakeScan.rotation.slight=Slight +fakeScan.rotation.moderate=Moderate +fakeScan.rotation.severe=Severe +fakeScan.submit=Create Fake Scan + +#home.fakeScan +home.fakeScan.title=Fake Scan +home.fakeScan.desc=Create a PDF that looks like it was scanned +fakeScan.tags=scan,simulate,realistic,convert + +# FakeScan advanced settings (frontend) +fakeScan.advancedSettings=Enable Advanced Scan Settings +fakeScan.colorspace=Colorspace +fakeScan.colorspace.grayscale=Grayscale +fakeScan.colorspace.color=Color +fakeScan.border=Border (px) +fakeScan.rotate=Base Rotation (degrees) +fakeScan.rotateVariance=Rotation Variance (degrees) +fakeScan.brightness=Brightness +fakeScan.contrast=Contrast +fakeScan.blur=Blur +fakeScan.noise=Noise +fakeScan.yellowish=Yellowish (simulate old paper) +fakeScan.resolution=Resolution (DPI) From 70a9b5f00903e58ab92918ad9223a9904f61cb59 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Jun 2025 20:09:22 +0100 Subject: [PATCH 014/126] Bump jakarta.servlet:jakarta.servlet-api from 6.0.0 to 6.1.0 (#3631) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [//]: # (dependabot-start) ⚠️ **Dependabot is rebasing this PR** ⚠️ Rebasing might not happen immediately, so don't worry if this takes some time. Note: if you make any changes to this PR yourself, they will take precedence over the rebase. --- [//]: # (dependabot-end) Bumps [jakarta.servlet:jakarta.servlet-api](https://github.com/eclipse-ee4j/servlet-api) from 6.0.0 to 6.1.0.
Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=jakarta.servlet:jakarta.servlet-api&package-manager=gradle&previous-version=6.0.0&new-version=6.1.0)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- common/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/build.gradle b/common/build.gradle index 7406a699e..9b4c93e0d 100644 --- a/common/build.gradle +++ b/common/build.gradle @@ -40,7 +40,7 @@ dependencies { implementation 'com.drewnoakes:metadata-extractor:2.19.0' // Image metadata extractor implementation 'com.vladsch.flexmark:flexmark-html2md-converter:0.64.8' implementation "org.apache.pdfbox:pdfbox:$pdfboxVersion" - implementation 'jakarta.servlet:jakarta.servlet-api:6.0.0' + implementation 'jakarta.servlet:jakarta.servlet-api:6.1.0' implementation 'org.snakeyaml:snakeyaml-engine:2.9' implementation "org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.8" From 3cc303740857a7b3b58bc3b2461ad83348017418 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 2 Jun 2025 20:09:42 +0100 Subject: [PATCH 015/126] Bump me.friwi:jcefmaven from 132.3.1 to 135.0.20 (#3548) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [//]: # (dependabot-start) ⚠️ **Dependabot is rebasing this PR** ⚠️ Rebasing might not happen immediately, so don't worry if this takes some time. Note: if you make any changes to this PR yourself, they will take precedence over the rebase. --- [//]: # (dependabot-end) Bumps [me.friwi:jcefmaven](https://github.com/jcefmaven/jcefmaven) from 132.3.1 to 135.0.20.
Release notes

Sourced from me.friwi:jcefmaven's releases.

JCEF Maven 135.0.20

Update JCEF to ca49ada

Build: [GitHub Actions #94](https://github.com/jcefmaven/jcefmaven/actions/runs/15018447852) MVN version: 135.0.20 JCEF commit: ca49ada CEF version: 135.0.20+ge7de5c3+chromium-135.0.7049.85

Use with Maven:

<dependency>
    <groupId>me.friwi</groupId>
    <artifactId>jcefmaven</artifactId>
    <version>135.0.20</version>
</dependency>
Linux AMD64
<dependency>
    <groupId>me.friwi</groupId>
    <artifactId>jcef-natives-linux-amd64</artifactId>

<version>jcef-ca49ada+cef-135.0.20+ge7de5c3+chromium-135.0.7049.85</version>
</dependency>
Linux ARM
<dependency>
    <groupId>me.friwi</groupId>
    <artifactId>jcef-natives-linux-arm</artifactId>

<version>jcef-ca49ada+cef-135.0.20+ge7de5c3+chromium-135.0.7049.85</version>
</dependency>
Linux ARM64
<dependency>
    <groupId>me.friwi</groupId>
    <artifactId>jcef-natives-linux-arm64</artifactId>

<version>jcef-ca49ada+cef-135.0.20+ge7de5c3+chromium-135.0.7049.85</version>
</dependency>
Macosx AMD64
<dependency>
</tr></table>

... (truncated)

Commits

[![Dependabot compatibility score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=me.friwi:jcefmaven&package-manager=gradle&previous-version=132.3.1&new-version=135.0.20)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores) Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting `@dependabot rebase`. [//]: # (dependabot-automerge-start) [//]: # (dependabot-automerge-end) ---
Dependabot commands and options
You can trigger Dependabot actions by commenting on this PR: - `@dependabot rebase` will rebase this PR - `@dependabot recreate` will recreate this PR, overwriting any edits that have been made to it - `@dependabot merge` will merge this PR after your CI passes on it - `@dependabot squash and merge` will squash and merge this PR after your CI passes on it - `@dependabot cancel merge` will cancel a previously requested merge and block automerging - `@dependabot reopen` will reopen this PR if it is closed - `@dependabot close` will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually - `@dependabot show ignore conditions` will show all of the ignore conditions of the specified dependency - `@dependabot ignore this major version` will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this minor version` will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself) - `@dependabot ignore this dependency` will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 8c4f9c8ed..25d34635f 100644 --- a/build.gradle +++ b/build.gradle @@ -430,7 +430,7 @@ dependencies { } if (System.getenv("STIRLING_PDF_DESKTOP_UI") != "false") { - implementation "me.friwi:jcefmaven:132.3.1" + implementation "me.friwi:jcefmaven:135.0.20" implementation "org.openjfx:javafx-controls:21" implementation "org.openjfx:javafx-swing:21" } From 55b928695897a69eb6928b01245d449fd45280f2 Mon Sep 17 00:00:00 2001 From: "stirlingbot[bot]" <195170888+stirlingbot[bot]@users.noreply.github.com> Date: Mon, 2 Jun 2025 20:12:02 +0100 Subject: [PATCH 016/126] Update 3rd Party Licenses (#3632) Auto-generated by stirlingbot[bot] Signed-off-by: stirlingbot[bot] Co-authored-by: stirlingbot[bot] <195170888+stirlingbot[bot]@users.noreply.github.com> --- .../resources/static/3rdPartyLicenses.json | 249 +----------------- 1 file changed, 11 insertions(+), 238 deletions(-) diff --git a/src/main/resources/static/3rdPartyLicenses.json b/src/main/resources/static/3rdPartyLicenses.json index f178313cb..8d257d900 100644 --- a/src/main/resources/static/3rdPartyLicenses.json +++ b/src/main/resources/static/3rdPartyLicenses.json @@ -42,13 +42,6 @@ "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, - { - "moduleName": "com.fasterxml.jackson.core:jackson-annotations", - "moduleUrl": "https://github.com/FasterXML/jackson", - "moduleVersion": "2.18.3", - "moduleLicense": "The Apache Software License, Version 2.0", - "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" - }, { "moduleName": "com.fasterxml.jackson.core:jackson-annotations", "moduleUrl": "https://github.com/FasterXML/jackson", @@ -56,13 +49,6 @@ "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, - { - "moduleName": "com.fasterxml.jackson.core:jackson-core", - "moduleUrl": "https://github.com/FasterXML/jackson-core", - "moduleVersion": "2.18.3", - "moduleLicense": "The Apache Software License, Version 2.0", - "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" - }, { "moduleName": "com.fasterxml.jackson.core:jackson-core", "moduleUrl": "https://github.com/FasterXML/jackson-core", @@ -70,13 +56,6 @@ "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, - { - "moduleName": "com.fasterxml.jackson.core:jackson-databind", - "moduleUrl": "https://github.com/FasterXML/jackson", - "moduleVersion": "2.18.3", - "moduleLicense": "The Apache Software License, Version 2.0", - "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" - }, { "moduleName": "com.fasterxml.jackson.core:jackson-databind", "moduleUrl": "https://github.com/FasterXML/jackson", @@ -84,13 +63,6 @@ "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, - { - "moduleName": "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", - "moduleUrl": "https://github.com/FasterXML/jackson-dataformats-text", - "moduleVersion": "2.18.3", - "moduleLicense": "The Apache Software License, Version 2.0", - "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" - }, { "moduleName": "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml", "moduleUrl": "https://github.com/FasterXML/jackson-dataformats-text", @@ -98,13 +70,6 @@ "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, - { - "moduleName": "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", - "moduleUrl": "https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jdk8", - "moduleVersion": "2.18.3", - "moduleLicense": "The Apache Software License, Version 2.0", - "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" - }, { "moduleName": "com.fasterxml.jackson.datatype:jackson-datatype-jdk8", "moduleUrl": "https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jdk8", @@ -112,13 +77,6 @@ "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, - { - "moduleName": "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", - "moduleUrl": "https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310", - "moduleVersion": "2.18.3", - "moduleLicense": "The Apache Software License, Version 2.0", - "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" - }, { "moduleName": "com.fasterxml.jackson.datatype:jackson-datatype-jsr310", "moduleUrl": "https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310", @@ -147,13 +105,6 @@ "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, - { - "moduleName": "com.fasterxml.jackson.module:jackson-module-parameter-names", - "moduleUrl": "https://github.com/FasterXML/jackson-modules-java8/jackson-module-parameter-names", - "moduleVersion": "2.18.3", - "moduleLicense": "The Apache Software License, Version 2.0", - "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" - }, { "moduleName": "com.fasterxml.jackson.module:jackson-module-parameter-names", "moduleUrl": "https://github.com/FasterXML/jackson-modules-java8/jackson-module-parameter-names", @@ -161,13 +112,6 @@ "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, - { - "moduleName": "com.fasterxml.jackson:jackson-bom", - "moduleUrl": "https://github.com/FasterXML/jackson-bom", - "moduleVersion": "2.18.3", - "moduleLicense": "The Apache Software License, Version 2.0", - "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" - }, { "moduleName": "com.fasterxml.jackson:jackson-bom", "moduleUrl": "https://github.com/FasterXML/jackson-bom", @@ -606,13 +550,6 @@ "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.14.6", - "moduleLicense": "The Apache Software License, Version 2.0", - "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" - }, { "moduleName": "io.micrometer:micrometer-commons", "moduleUrl": "https://github.com/micrometer-metrics/micrometer", @@ -634,13 +571,6 @@ "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.14.6", - "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", @@ -697,13 +627,6 @@ "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, - { - "moduleName": "io.swagger.core.v3:swagger-annotations-jakarta", - "moduleUrl": "https://github.com/swagger-api/swagger-core/modules/swagger-annotations", - "moduleVersion": "2.2.29", - "moduleLicense": "Apache License, Version 2.0", - "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" - }, { "moduleName": "io.swagger.core.v3:swagger-annotations-jakarta", "moduleUrl": "https://github.com/swagger-api/swagger-core/modules/swagger-annotations", @@ -711,13 +634,6 @@ "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, - { - "moduleName": "io.swagger.core.v3:swagger-core-jakarta", - "moduleUrl": "https://github.com/swagger-api/swagger-core/modules/swagger-core", - "moduleVersion": "2.2.29", - "moduleLicense": "Apache License, Version 2.0", - "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" - }, { "moduleName": "io.swagger.core.v3:swagger-core-jakarta", "moduleUrl": "https://github.com/swagger-api/swagger-core/modules/swagger-core", @@ -725,13 +641,6 @@ "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, - { - "moduleName": "io.swagger.core.v3:swagger-models-jakarta", - "moduleUrl": "https://github.com/swagger-api/swagger-core/modules/swagger-models", - "moduleVersion": "2.2.29", - "moduleLicense": "Apache License, Version 2.0", - "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" - }, { "moduleName": "io.swagger.core.v3:swagger-models-jakarta", "moduleUrl": "https://github.com/swagger-api/swagger-core/modules/swagger-models", @@ -795,6 +704,13 @@ "moduleLicense": "GPL2 w/ CPE", "moduleLicenseUrl": "https://www.gnu.org/software/classpath/license.html" }, + { + "moduleName": "jakarta.servlet:jakarta.servlet-api", + "moduleUrl": "https://www.eclipse.org", + "moduleVersion": "6.1.0", + "moduleLicense": "GPL2 w/ CPE", + "moduleLicenseUrl": "https://www.gnu.org/software/classpath/license.html" + }, { "moduleName": "jakarta.transaction:jakarta.transaction-api", "moduleUrl": "https://projects.eclipse.org/projects/ee4j.jta", @@ -854,14 +770,14 @@ { "moduleName": "me.friwi:jcef-api", "moduleUrl": "https://bitbucket.org/chromiumembedded/java-cef/", - "moduleVersion": "jcef-1770317+cef-132.3.1+g144febe+chromium-132.0.6834.83", + "moduleVersion": "jcef-ca49ada+cef-135.0.20+ge7de5c3+chromium-135.0.7049.85", "moduleLicense": "BSD License", "moduleLicenseUrl": "https://bitbucket.org/chromiumembedded/java-cef/src/master/LICENSE.txt" }, { "moduleName": "me.friwi:jcefmaven", "moduleUrl": "https://github.com/jcefmaven/jcefmaven/", - "moduleVersion": "132.3.1", + "moduleVersion": "135.0.20", "moduleLicense": "Apache-2.0 License", "moduleLicenseUrl": "https://github.com/jcefmaven/jcefmaven/blob/master/LICENSE" }, @@ -1079,7 +995,7 @@ { "moduleName": "org.checkerframework:checker-qual", "moduleUrl": "https://checkerframework.org/", - "moduleVersion": "3.48.3", + "moduleVersion": "3.49.3", "moduleLicense": "The MIT License", "moduleLicenseUrl": "http://opensource.org/licenses/MIT" }, @@ -1507,7 +1423,7 @@ { "moduleName": "org.postgresql:postgresql", "moduleUrl": "https://jdbc.postgresql.org/", - "moduleVersion": "42.7.5", + "moduleVersion": "42.7.6", "moduleLicense": "BSD-2-Clause", "moduleLicenseUrl": "https://jdbc.postgresql.org/about/license.html" }, @@ -1532,49 +1448,24 @@ "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, - { - "moduleName": "org.springdoc:springdoc-openapi-starter-common", - "moduleVersion": "2.8.6", - "moduleLicense": "The Apache License, Version 2.0", - "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" - }, { "moduleName": "org.springdoc:springdoc-openapi-starter-common", "moduleVersion": "2.8.8", "moduleLicense": "The Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, - { - "moduleName": "org.springdoc:springdoc-openapi-starter-webmvc-api", - "moduleVersion": "2.8.6", - "moduleLicense": "The Apache License, Version 2.0", - "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" - }, { "moduleName": "org.springdoc:springdoc-openapi-starter-webmvc-api", "moduleVersion": "2.8.8", "moduleLicense": "The Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, - { - "moduleName": "org.springdoc:springdoc-openapi-starter-webmvc-ui", - "moduleVersion": "2.8.6", - "moduleLicense": "The Apache License, Version 2.0", - "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" - }, { "moduleName": "org.springdoc:springdoc-openapi-starter-webmvc-ui", "moduleVersion": "2.8.8", "moduleLicense": "The Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, - { - "moduleName": "org.springframework.boot:spring-boot", - "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.4.5", - "moduleLicense": "Apache License, Version 2.0", - "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" - }, { "moduleName": "org.springframework.boot:spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot", @@ -1596,13 +1487,6 @@ "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.4.5", - "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", @@ -1617,13 +1501,6 @@ "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.4.5", - "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", @@ -1659,13 +1536,6 @@ "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.4.5", - "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", @@ -1673,13 +1543,6 @@ "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.4.5", - "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", @@ -1708,13 +1571,6 @@ "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.4.5", - "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", @@ -1729,13 +1585,6 @@ "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.4.5", - "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", @@ -1820,13 +1669,6 @@ "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, - { - "moduleName": "org.springframework:spring-aop", - "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.2.6", - "moduleLicense": "Apache License, Version 2.0", - "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" - }, { "moduleName": "org.springframework:spring-aop", "moduleUrl": "https://github.com/spring-projects/spring-framework", @@ -1841,13 +1683,6 @@ "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.2.6", - "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", @@ -1855,13 +1690,6 @@ "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.2.6", - "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", @@ -1876,13 +1704,6 @@ "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.2.6", - "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", @@ -1890,13 +1711,6 @@ "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.2.6", - "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", @@ -1904,13 +1718,6 @@ "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.2.6", - "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", @@ -1939,13 +1746,6 @@ "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.2.6", - "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", @@ -1953,13 +1753,6 @@ "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, - { - "moduleName": "org.springframework:spring-webmvc", - "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.2.6", - "moduleLicense": "Apache License, Version 2.0", - "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" - }, { "moduleName": "org.springframework:spring-webmvc", "moduleUrl": "https://github.com/spring-projects/spring-framework", @@ -1998,25 +1791,12 @@ "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, - { - "moduleName": "org.webjars:swagger-ui", - "moduleUrl": "https://www.webjars.org", - "moduleVersion": "5.20.1", - "moduleLicense": "Apache-2.0" - }, { "moduleName": "org.webjars:swagger-ui", "moduleUrl": "https://www.webjars.org", "moduleVersion": "5.21.0", "moduleLicense": "Apache-2.0" }, - { - "moduleName": "org.webjars:webjars-locator-lite", - "moduleUrl": "https://webjars.org", - "moduleVersion": "1.0.1", - "moduleLicense": "MIT", - "moduleLicenseUrl": "https://github.com/webjars/webjars-locator-lite/blob/main/LICENSE.md" - }, { "moduleName": "org.webjars:webjars-locator-lite", "moduleUrl": "https://webjars.org", @@ -2024,13 +1804,6 @@ "moduleLicense": "MIT", "moduleLicenseUrl": "https://github.com/webjars/webjars-locator-lite/blob/main/LICENSE.md" }, - { - "moduleName": "org.yaml:snakeyaml", - "moduleUrl": "https://bitbucket.org/snakeyaml/snakeyaml", - "moduleVersion": "2.3", - "moduleLicense": "Apache License, Version 2.0", - "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" - }, { "moduleName": "org.yaml:snakeyaml", "moduleUrl": "https://bitbucket.org/snakeyaml/snakeyaml", From 63fdb958ef17a293fcab582b242613f1ba7f0858 Mon Sep 17 00:00:00 2001 From: albanobattistella <34811668+albanobattistella@users.noreply.github.com> Date: Tue, 3 Jun 2025 01:26:16 +0200 Subject: [PATCH 017/126] Update messages_it_IT.properties (#3634) # Description of Changes Please provide a summary of the changes, including: - What was changed - Why the change was made - Any challenges encountered Closes #(issue_number) --- ## Checklist ### General - [ ] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [ ] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md) (if applicable) - [ ] I have performed a self-review of my own code - [ ] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [ ] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing) for more details. --- src/main/resources/messages_it_IT.properties | 60 ++++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index c012147da..326d585bc 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -1570,37 +1570,37 @@ cookieBanner.preferencesModal.analytics.title=Analytics cookieBanner.preferencesModal.analytics.description=Questi cookie ci aiutano a capire come vengono utilizzati i nostri strumenti, così possiamo concentrarci sullo sviluppo delle funzionalità che la nostra community apprezza di più. Non preoccuparti: Stirling PDF non può e non traccerà mai il contenuto dei documenti con cui lavori. #fakeScan -fakeScan.title=Fake Scan -fakeScan.header=Fake Scan -fakeScan.description=Create a PDF that looks like it was scanned -fakeScan.selectPDF=Select PDF: -fakeScan.quality=Scan Quality -fakeScan.quality.low=Low -fakeScan.quality.medium=Medium -fakeScan.quality.high=High -fakeScan.rotation=Rotation Angle -fakeScan.rotation.none=None -fakeScan.rotation.slight=Slight -fakeScan.rotation.moderate=Moderate -fakeScan.rotation.severe=Severe -fakeScan.submit=Create Fake Scan +fakeScan.title=Falsa scansione +fakeScan.header=Falsa scansione +fakeScan.description=Crea un PDF che sembra scansionato +fakeScan.selectPDF=Seleziona PDF: +fakeScan.quality=Qualità di scansione +fakeScan.quality.low=Bassa +fakeScan.quality.medium=Media +fakeScan.quality.high=Alta +fakeScan.rotation=Angolo di rotazione +fakeScan.rotation.none=Nessuno +fakeScan.rotation.slight=Lieve +fakeScan.rotation.moderate=Moderato +fakeScan.rotation.severe=Severo +fakeScan.submit=Crea una falsa scansione #home.fakeScan -home.fakeScan.title=Fake Scan -home.fakeScan.desc=Create a PDF that looks like it was scanned -fakeScan.tags=scan,simulate,realistic,convert +home.fakeScan.title=Falsa scansione +home.fakeScan.desc=Crea un PDF che sembra scansionato +fakeScan.tags=scansiona, simula, realistico, converti # FakeScan advanced settings (frontend) -fakeScan.advancedSettings=Enable Advanced Scan Settings -fakeScan.colorspace=Colorspace -fakeScan.colorspace.grayscale=Grayscale -fakeScan.colorspace.color=Color -fakeScan.border=Border (px) -fakeScan.rotate=Base Rotation (degrees) -fakeScan.rotateVariance=Rotation Variance (degrees) -fakeScan.brightness=Brightness -fakeScan.contrast=Contrast -fakeScan.blur=Blur -fakeScan.noise=Noise -fakeScan.yellowish=Yellowish (simulate old paper) -fakeScan.resolution=Resolution (DPI) +fakeScan.advancedSettings=Abilita impostazioni di scansione avanzate +fakeScan.colorspace=Spazio colore +fakeScan.colorspace.grayscale=Scala di grigi +fakeScan.colorspace.color=Colore +fakeScan.border=Bordo (px) +fakeScan.rotate=Rotazione di base (gradi) +fakeScan.rotateVariance=Varianza di rotazione (gradi) +fakeScan.brightness=Luminosità +fakeScan.contrast=Contrasto +fakeScan.blur=Sfocatura +fakeScan.noise=Rumore +fakeScan.yellowish=Giallastro (simula carta vecchia) +fakeScan.resolution=Risoluzione (DPI) From 4883573e87f73c761cc7b1fd3c372f95baf0634d Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Tue, 3 Jun 2025 13:01:07 +0100 Subject: [PATCH 018/126] Update build.yml (#3637) # Description of Changes Please provide a summary of the changes, including: - What was changed - Why the change was made - Any challenges encountered Closes #(issue_number) --- ## Checklist ### General - [ ] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [ ] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md) (if applicable) - [ ] I have performed a self-review of my own code - [ ] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [ ] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing) for more details. --- .github/workflows/build.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1d5016ca8..322d52af1 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -56,6 +56,9 @@ jobs: build/reports/tests/ build/test-results/ build/reports/problems/ + /common/build/reports/tests/ + /common/build/test-results/ + /common/build/reports/problems/ retention-days: 3 check-licence: From 9697d1abe1dd81719f0e862512391da931ee9514 Mon Sep 17 00:00:00 2001 From: "stirlingbot[bot]" <195170888+stirlingbot[bot]@users.noreply.github.com> Date: Tue, 3 Jun 2025 17:43:28 +0100 Subject: [PATCH 019/126] :globe_with_meridians: Sync Translations + Update README Progress Table (#3635) ### Description of Changes This Pull Request was automatically generated to synchronize updates to translation files and documentation. Below are the details of the changes made: #### **1. Synchronization of Translation Files** - Updated translation files (`messages_*.properties`) to reflect changes in the reference file `messages_en_GB.properties`. - Ensured consistency and synchronization across all supported language files. - Highlighted any missing or incomplete translations. #### **2. Update README.md** - Generated the translation progress table in `README.md`. - Added a summary of the current translation status for all supported languages. - Included up-to-date statistics on translation coverage. #### **Why these changes are necessary** - Keeps translation files aligned with the latest reference updates. - Ensures the documentation reflects the current translation progress. --- Auto-generated by [create-pull-request][1]. [1]: https://github.com/peter-evans/create-pull-request Co-authored-by: stirlingbot[bot] <195170888+stirlingbot[bot]@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 36d600787..c37f499f1 100644 --- a/README.md +++ b/README.md @@ -134,7 +134,7 @@ Stirling-PDF currently supports 40 languages! | Hungarian (Magyar) (hu_HU) | ![87%](https://geps.dev/progress/87) | | Indonesian (Bahasa Indonesia) (id_ID) | ![74%](https://geps.dev/progress/74) | | Irish (Gaeilge) (ga_IE) | ![81%](https://geps.dev/progress/81) | -| Italian (Italiano) (it_IT) | ![95%](https://geps.dev/progress/95) | +| Italian (Italiano) (it_IT) | ![98%](https://geps.dev/progress/98) | | Japanese (日本語) (ja_JP) | ![82%](https://geps.dev/progress/82) | | Korean (한국어) (ko_KR) | ![80%](https://geps.dev/progress/80) | | Norwegian (Norsk) (no_NB) | ![78%](https://geps.dev/progress/78) | From a8c6a8342c66942ab728fd909d5b04a29e621687 Mon Sep 17 00:00:00 2001 From: Ludy Date: Tue, 3 Jun 2025 18:43:51 +0200 Subject: [PATCH 020/126] Update messages_de_DE.properties (#3618) # Description of Changes Please provide a summary of the changes, including: - What was changed - Why the change was made - Any challenges encountered Closes #(issue_number) --- ## Checklist ### General - [x] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [x] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md) (if applicable) - [x] I have performed a self-review of my own code - [x] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [ ] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing) for more details. --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- src/main/resources/messages_de_DE.properties | 266 +++++++++---------- 1 file changed, 133 insertions(+), 133 deletions(-) diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties index c9744c87a..1291e8666 100644 --- a/src/main/resources/messages_de_DE.properties +++ b/src/main/resources/messages_de_DE.properties @@ -6,133 +6,133 @@ language.direction=ltr # Language names for reuse throughout the application lang.afr=Afrikaans -lang.amh=Amharic -lang.ara=Arabic -lang.asm=Assamese -lang.aze=Azerbaijani -lang.aze_cyrl=Azerbaijani (Cyrillic) -lang.bel=Belarusian -lang.ben=Bengali -lang.bod=Tibetan -lang.bos=Bosnian -lang.bre=Breton -lang.bul=Bulgarian -lang.cat=Catalan +lang.amh=Amharisch +lang.ara=Arabisch +lang.asm=Assamesisch +lang.aze=Aserbaidschanisch +lang.aze_cyrl=Aserbaidschanisch (Kyrillisch) +lang.bel=Weißrussisch +lang.ben=Bengalisch +lang.bod=Tibetisch +lang.bos=Bosnisch +lang.bre=Bretonisch +lang.bul=Bulgarisch +lang.cat=Katalanisch lang.ceb=Cebuano -lang.ces=Czech -lang.chi_sim=Chinese (Simplified) -lang.chi_sim_vert=Chinese (Simplified, Vertical) -lang.chi_tra=Chinese (Traditional) -lang.chi_tra_vert=Chinese (Traditional, Vertical) +lang.ces=Tschechisch +lang.chi_sim=Chinesisch (vereinfacht) +lang.chi_sim_vert=Chinesisch (vereinfacht, vertikal) +lang.chi_tra=Chinesisch (traditionell) +lang.chi_tra_vert=Chinesisch (traditionell, vertikal) lang.chr=Cherokee -lang.cos=Corsican -lang.cym=Welsh -lang.dan=Danish -lang.dan_frak=Danish (Fraktur) -lang.deu=German -lang.deu_frak=German (Fraktur) +lang.cos=Korsisch +lang.cym=Walisisch +lang.dan=Dänisch +lang.dan_frak=Dänisch (Fraktur) +lang.deu=Deutsch +lang.deu_frak=Deutsch (Fraktur) lang.div=Divehi lang.dzo=Dzongkha -lang.ell=Greek -lang.eng=English -lang.enm=English, Middle (1100-1500) +lang.ell=Griechisch +lang.eng=Englisch +lang.enm=Englisch, Mittelenglisch (1100-1500) lang.epo=Esperanto -lang.equ=Math / equation detection module -lang.est=Estonian -lang.eus=Basque -lang.fao=Faroese -lang.fas=Persian -lang.fil=Filipino -lang.fin=Finnish -lang.fra=French -lang.frk=Frankish -lang.frm=French, Middle (ca.1400-1600) -lang.fry=Western Frisian -lang.gla=Scottish Gaelic -lang.gle=Irish -lang.glg=Galician -lang.grc=Ancient Greek +lang.equ=Mathe-/Gleichungserkennungsmodul +lang.est=Estnisch +lang.eus=Baskisch +lang.fao=Färöisch +lang.fas=Persisch +lang.fil=Philippinisch +lang.fin=Finnisch +lang.fra=Französisch +lang.frk=Fränkisch +lang.frm=Französisch, Mittelfranzösisch (ca. 1400-1600) +lang.fry=Westfriesisch +lang.gla=Schottisch-Gälisch +lang.gle=Irisch +lang.glg=Galizisch +lang.grc=Altgriechisch lang.guj=Gujarati -lang.hat=Haitian, Haitian Creole -lang.heb=Hebrew +lang.hat=Haitianisch, haitianisches Kreol +lang.heb=Hebräisch lang.hin=Hindi -lang.hrv=Croatian -lang.hun=Hungarian -lang.hye=Armenian +lang.hrv=Kroatisch +lang.hun=Ungarisch +lang.hye=Armenisch lang.iku=Inuktitut -lang.ind=Indonesian -lang.isl=Icelandic -lang.ita=Italian -lang.ita_old=Italian (Old) -lang.jav=Javanese -lang.jpn=Japanese -lang.jpn_vert=Japanese (Vertical) +lang.ind=Indonesisch +lang.isl=Isländisch +lang.ita=Italienisch +lang.ita_old=Italienisch (Alt) +lang.jav=Javanesisch +lang.jpn=Japanisch +lang.jpn_vert=Japanisch (vertikal) lang.kan=Kannada -lang.kat=Georgian -lang.kat_old=Georgian (Old) -lang.kaz=Kazakh -lang.khm=Central Khmer -lang.kir=Kirghiz, Kyrgyz -lang.kmr=Northern Kurdish -lang.kor=Korean -lang.kor_vert=Korean (Vertical) -lang.lao=Lao -lang.lat=Latin -lang.lav=Latvian -lang.lit=Lithuanian -lang.ltz=Luxembourgish +lang.kat=Georgisch +lang.kat_old=Georgisch (Alt) +lang.kaz=Kasachisch +lang.khm=Zentral Khmer +lang.kir=Kirgisisch +lang.kmr=Nordkurdisch +lang.kor=Koreanisch +lang.kor_vert=Koreanisch (vertikal) +lang.lao=Laotisch +lang.lat=Latein +lang.lav=Lettisch +lang.lit=Litauisch +lang.ltz=Luxemburgisch lang.mal=Malayalam lang.mar=Marathi -lang.mkd=Macedonian -lang.mlt=Maltese -lang.mon=Mongolian +lang.mkd=Mazedonisch +lang.mlt=Maltesisch +lang.mon=Mongolisch lang.mri=Maori -lang.msa=Malay -lang.mya=Burmese +lang.msa=Malaiisch +lang.mya=Burmesisch lang.nep=Nepali -lang.nld=Dutch; Flemish -lang.nor=Norwegian -lang.oci=Occitan (post 1500) +lang.nld=Niederländisch; Flämisch +lang.nor=Norwegisch +lang.oci=Okzitanisch (nach 1500) lang.ori=Oriya -lang.osd=Orientation and script detection module +lang.osd=Orientierungs- und Skripterkennungsmodul lang.pan=Panjabi, Punjabi -lang.pol=Polish -lang.por=Portuguese -lang.pus=Pushto, Pashto +lang.pol=Polnisch +lang.por=Portugiesisch +lang.pus=Puschtu, Paschtu lang.que=Quechua -lang.ron=Romanian, Moldavian, Moldovan -lang.rus=Russian +lang.ron=Rumänisch, Moldauisch, Moldauisch +lang.rus=Russisch lang.san=Sanskrit -lang.sin=Sinhala, Sinhalese -lang.slk=Slovak -lang.slk_frak=Slovak (Fraktur) -lang.slv=Slovenian +lang.sin=Singhalesisch +lang.slk=Slowakisch +lang.slk_frak=Slowakisch (Fraktur) +lang.slv=Slowenisch lang.snd=Sindhi -lang.spa=Spanish -lang.spa_old=Spanish (Old) -lang.sqi=Albanian -lang.srp=Serbian -lang.srp_latn=Serbian (Latin) -lang.sun=Sundanese -lang.swa=Swahili -lang.swe=Swedish -lang.syr=Syriac +lang.spa=Spanisch +lang.spa_old=Spanisch (Alt) +lang.sqi=Albanisch +lang.srp=Serbisch +lang.srp_latn=Serbisch (Lateinisch) +lang.sun=Sundanesisch +lang.swa=Suaheli +lang.swe=Schwedisch +lang.syr=Syrisch lang.tam=Tamil -lang.tat=Tatar +lang.tat=Tatarisch lang.tel=Telugu -lang.tgk=Tajik +lang.tgk=Tadschikisch lang.tgl=Tagalog -lang.tha=Thai +lang.tha=Thailändisch lang.tir=Tigrinya -lang.ton=Tonga (Tonga Islands) -lang.tur=Turkish -lang.uig=Uighur, Uyghur -lang.ukr=Ukrainian +lang.ton=Tonga (Tonga-Inseln) +lang.tur=Türkisch +lang.uig=Uigurisch +lang.ukr=Ukrainisch lang.urd=Urdu -lang.uzb=Uzbek -lang.uzb_cyrl=Uzbek (Cyrillic) -lang.vie=Vietnamese -lang.yid=Yiddish +lang.uzb=Usbekisch +lang.uzb_cyrl=Usbekisch (Kyrillisch) +lang.vie=Vietnamesisch +lang.yid=Jiddisch lang.yor=Yoruba addPageNumbers.fontSize=Schriftgröße @@ -1570,37 +1570,37 @@ cookieBanner.preferencesModal.analytics.title=Analyse cookieBanner.preferencesModal.analytics.description=Diese Cookies helfen uns zu verstehen, wie unsere Tools genutzt werden, damit wir uns darauf konzentrieren können, die Funktionen zu entwickeln, die unserer Community am meisten am Herzen liegen. Seien Sie beruhigt – Stirling PDF kann und wird niemals den Inhalt der Dokumente verfolgen, mit denen Sie arbeiten. #fakeScan -fakeScan.title=Fake Scan -fakeScan.header=Fake Scan -fakeScan.description=Create a PDF that looks like it was scanned -fakeScan.selectPDF=Select PDF: -fakeScan.quality=Scan Quality -fakeScan.quality.low=Low +fakeScan.title=Fake-Scan-PDF +fakeScan.header=Fake-Scan-PDF +fakeScan.description=Erstellen Sie ein PDF, das so aussieht, als wäre es gescannt worden +fakeScan.selectPDF=Wählen Sie PDF: +fakeScan.quality=Scan-Qualität +fakeScan.quality.low=Niedrig fakeScan.quality.medium=Medium -fakeScan.quality.high=High -fakeScan.rotation=Rotation Angle -fakeScan.rotation.none=None -fakeScan.rotation.slight=Slight -fakeScan.rotation.moderate=Moderate -fakeScan.rotation.severe=Severe -fakeScan.submit=Create Fake Scan +fakeScan.quality.high=Hoch +fakeScan.rotation=Rotationswinkel +fakeScan.rotation.none=Keiner +fakeScan.rotation.slight=Leicht +fakeScan.rotation.moderate=Mäßig +fakeScan.rotation.severe=Schwer +fakeScan.submit=Erstellen Sie einen Fake-Scan #home.fakeScan -home.fakeScan.title=Fake Scan -home.fakeScan.desc=Create a PDF that looks like it was scanned -fakeScan.tags=scan,simulate,realistic,convert +home.fakeScan.title=Fake-Scan-PDF +home.fakeScan.desc=Erstellen Sie ein PDF, das so aussieht, als wäre es gescannt worden +fakeScan.tags=scannen,simulieren,realistisch,konvertieren,fake,scan,pdf # FakeScan advanced settings (frontend) -fakeScan.advancedSettings=Enable Advanced Scan Settings -fakeScan.colorspace=Colorspace -fakeScan.colorspace.grayscale=Grayscale -fakeScan.colorspace.color=Color -fakeScan.border=Border (px) -fakeScan.rotate=Base Rotation (degrees) -fakeScan.rotateVariance=Rotation Variance (degrees) -fakeScan.brightness=Brightness -fakeScan.contrast=Contrast -fakeScan.blur=Blur -fakeScan.noise=Noise -fakeScan.yellowish=Yellowish (simulate old paper) -fakeScan.resolution=Resolution (DPI) +fakeScan.advancedSettings=Aktivieren Sie erweiterte Scaneinstellungen +fakeScan.colorspace=Farbraum +fakeScan.colorspace.grayscale=Graustufen +fakeScan.colorspace.color=Farbe +fakeScan.border=Grenze (PX) +fakeScan.rotate=Grundrotation (Grad) +fakeScan.rotateVariance=Rotationsvarianz (Grad) +fakeScan.brightness=Helligkeit +fakeScan.contrast=Kontrast +fakeScan.blur=Verwischen +fakeScan.noise=Rauschen +fakeScan.yellowish=Gelblich (simulieren Sie altes Papier) +fakeScan.resolution=Auflösung (DPI) From 5d9d8a5625248286ca10c3d629cc1cb13b56d3cb Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Tue, 3 Jun 2025 17:44:35 +0100 Subject: [PATCH 021/126] Fix error display for Split by Chapter (#3621) ## Summary - throw `IllegalArgumentException` when bookmark level is invalid or when a PDF has no outline - rely on global error handling so frontend shows the message ## Testing - `./gradlew build` ------ https://chatgpt.com/codex/tasks/task_b_683dc51dd31083288be3f9892889fa59 --- .../SPDF/controller/api/SplitPdfByChaptersController.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfByChaptersController.java b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfByChaptersController.java index 80ec89738..94cf6aa6d 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfByChaptersController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfByChaptersController.java @@ -131,7 +131,7 @@ public class SplitPdfByChaptersController { Integer bookmarkLevel = request.getBookmarkLevel(); // levels start from 0 (top most bookmarks) if (bookmarkLevel < 0) { - return ResponseEntity.badRequest().body("Invalid bookmark level".getBytes()); + throw new IllegalArgumentException("Invalid bookmark level"); } sourceDocument = pdfDocumentFactory.load(file); @@ -139,7 +139,7 @@ public class SplitPdfByChaptersController { if (outline == null) { log.warn("No outline found for {}", file.getOriginalFilename()); - return ResponseEntity.badRequest().body("No outline found".getBytes()); + throw new IllegalArgumentException("No outline found"); } List bookmarks = new ArrayList<>(); try { From 9cc4f14465c4ea08b50fba04946d9ba6b18234ea Mon Sep 17 00:00:00 2001 From: "stirlingbot[bot]" <195170888+stirlingbot[bot]@users.noreply.github.com> Date: Tue, 3 Jun 2025 17:46:14 +0100 Subject: [PATCH 022/126] :globe_with_meridians: Sync Translations + Update README Progress Table (#3638) ### Description of Changes This Pull Request was automatically generated to synchronize updates to translation files and documentation. Below are the details of the changes made: #### **1. Synchronization of Translation Files** - Updated translation files (`messages_*.properties`) to reflect changes in the reference file `messages_en_GB.properties`. - Ensured consistency and synchronization across all supported language files. - Highlighted any missing or incomplete translations. #### **2. Update README.md** - Generated the translation progress table in `README.md`. - Added a summary of the current translation status for all supported languages. - Included up-to-date statistics on translation coverage. #### **Why these changes are necessary** - Keeps translation files aligned with the latest reference updates. - Ensures the documentation reflects the current translation progress. --- Auto-generated by [create-pull-request][1]. [1]: https://github.com/peter-evans/create-pull-request Co-authored-by: stirlingbot[bot] <195170888+stirlingbot[bot]@users.noreply.github.com> --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c37f499f1..58659da26 100644 --- a/README.md +++ b/README.md @@ -128,7 +128,7 @@ Stirling-PDF currently supports 40 languages! | English (English) (en_GB) | ![100%](https://geps.dev/progress/100) | | English (US) (en_US) | ![100%](https://geps.dev/progress/100) | | French (Français) (fr_FR) | ![82%](https://geps.dev/progress/82) | -| German (Deutsch) (de_DE) | ![89%](https://geps.dev/progress/89) | +| German (Deutsch) (de_DE) | ![99%](https://geps.dev/progress/99) | | Greek (Ελληνικά) (el_GR) | ![80%](https://geps.dev/progress/80) | | Hindi (हिंदी) (hi_IN) | ![80%](https://geps.dev/progress/80) | | Hungarian (Magyar) (hu_HU) | ![87%](https://geps.dev/progress/87) | From 28a259ec95adb5bd483a8d379ea99717ba9b325a Mon Sep 17 00:00:00 2001 From: Anthony Stirling <77850077+Frooodle@users.noreply.github.com> Date: Tue, 3 Jun 2025 17:48:17 +0100 Subject: [PATCH 023/126] GetInfo summary #2388 (#3585) # Description of Changes Please provide a summary of the changes, including: - What was changed - Why the change was made - Any challenges encountered Closes #(issue_number) --- ## Checklist ### General - [ ] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [ ] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md) (if applicable) - [ ] I have performed a self-review of my own code - [ ] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [ ] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing) for more details. Co-authored-by: a --- .gitignore | 1 + .../controller/api/security/GetInfoOnPDF.java | 59 +++ src/main/resources/messages_en_GB.properties | 22 + .../templates/security/get-info-on-pdf.html | 443 +++++++++++++++++- 4 files changed, 522 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 90d48ccea..06602d03b 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ local.properties .recommenders .classpath .project +*.local.json version.properties #### Stirling-PDF Files ### 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 79ffae74f..c630106e4 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 @@ -91,6 +91,59 @@ public class GetInfoOnPDF { } } + /** + * Generates structured summary data about the PDF highlighting its unique characteristics such + * as encryption status, permission restrictions, and standards compliance. + * + * @param document The PDF document to analyze + * @return An ObjectNode containing structured summary data + */ + private ObjectNode generatePDFSummaryData(PDDocument document) { + ObjectNode summaryData = objectMapper.createObjectNode(); + + // Check if encrypted + if (document.isEncrypted()) { + summaryData.put("encrypted", true); + } + + // Check permissions + AccessPermission ap = document.getCurrentAccessPermission(); + ArrayNode restrictedPermissions = objectMapper.createArrayNode(); + + if (!ap.canAssembleDocument()) restrictedPermissions.add("document assembly"); + if (!ap.canExtractContent()) restrictedPermissions.add("content extraction"); + if (!ap.canExtractForAccessibility()) restrictedPermissions.add("accessibility extraction"); + if (!ap.canFillInForm()) restrictedPermissions.add("form filling"); + if (!ap.canModify()) restrictedPermissions.add("modification"); + if (!ap.canModifyAnnotations()) restrictedPermissions.add("annotation modification"); + if (!ap.canPrint()) restrictedPermissions.add("printing"); + + if (restrictedPermissions.size() > 0) { + summaryData.set("restrictedPermissions", restrictedPermissions); + summaryData.put("restrictedPermissionsCount", restrictedPermissions.size()); + } + + // Check standard compliance + if (checkForStandard(document, "PDF/A")) { + summaryData.put("standardCompliance", "PDF/A"); + summaryData.put("standardPurpose", "long-term archiving"); + } else if (checkForStandard(document, "PDF/X")) { + summaryData.put("standardCompliance", "PDF/X"); + summaryData.put("standardPurpose", "graphic exchange"); + } else if (checkForStandard(document, "PDF/UA")) { + summaryData.put("standardCompliance", "PDF/UA"); + summaryData.put("standardPurpose", "universal accessibility"); + } else if (checkForStandard(document, "PDF/E")) { + summaryData.put("standardCompliance", "PDF/E"); + summaryData.put("standardPurpose", "engineering workflows"); + } else if (checkForStandard(document, "PDF/VT")) { + summaryData.put("standardCompliance", "PDF/VT"); + summaryData.put("standardPurpose", "variable and transactional printing"); + } + + return summaryData; + } + public static boolean checkForStandard(PDDocument document, String standardKeyword) { // Check XMP Metadata try { @@ -191,6 +244,12 @@ public class GetInfoOnPDF { } jsonOutput.set("FormFields", formFieldsNode); + // Generate structured summary data about PDF characteristics + ObjectNode summaryData = generatePDFSummaryData(pdfBoxDoc); + if (summaryData != null && summaryData.size() > 0) { + jsonOutput.set("SummaryData", summaryData); + } + // embeed files TODO size if (catalog.getNames() != null) { PDEmbeddedFilesNameTreeNode efTree = catalog.getNames().getEmbeddedFiles(); diff --git a/src/main/resources/messages_en_GB.properties b/src/main/resources/messages_en_GB.properties index 56d31e749..b875859b6 100644 --- a/src/main/resources/messages_en_GB.properties +++ b/src/main/resources/messages_en_GB.properties @@ -807,6 +807,28 @@ getPdfInfo.title=Get Info on PDF getPdfInfo.header=Get Info on PDF getPdfInfo.submit=Get Info getPdfInfo.downloadJson=Download JSON +getPdfInfo.summary=PDF Summary +getPdfInfo.summary.encrypted=This PDF is encrypted so may face issues with some applications +getPdfInfo.summary.permissions=This PDF has {0} restricted permissions which may limit what you can do with it +getPdfInfo.summary.compliance=This PDF complies with the {0} standard +getPdfInfo.summary.basicInfo=Basic Information +getPdfInfo.summary.docInfo=Document Information +getPdfInfo.summary.encrypted.alert=Encrypted PDF - This document is password protected +getPdfInfo.summary.not.encrypted.alert=Unencrypted PDF - No password protection +getPdfInfo.summary.permissions.alert=Restricted Permissions - {0} actions are not allowed +getPdfInfo.summary.all.permissions.alert=All Permissions Allowed +getPdfInfo.summary.compliance.alert={0} Compliant +getPdfInfo.summary.no.compliance.alert=No Compliance Standards +getPdfInfo.summary.security.section=Security Status +getPdfInfo.section.BasicInfo=Basic Information about the PDF document including file size, page count, and language +getPdfInfo.section.Metadata=Document metadata including title, author, creation date and other document properties +getPdfInfo.section.DocumentInfo=Technical details about the PDF document structure and version +getPdfInfo.section.Compliancy=PDF standards compliance information (PDF/A, PDF/X, etc.) +getPdfInfo.section.Encryption=Security and encryption details of the document +getPdfInfo.section.Permissions=Document permission settings that control what actions can be performed +getPdfInfo.section.Other=Additional document components like bookmarks, layers, and embedded files +getPdfInfo.section.FormFields=Interactive form fields present in the document +getPdfInfo.section.PerPageInfo=Detailed information about each page in the document #markdown-to-pdf 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 97ddf723a..95a5ad391 100644 --- a/src/main/resources/templates/security/get-info-on-pdf.html +++ b/src/main/resources/templates/security/get-info-on-pdf.html @@ -11,7 +11,7 @@

-
+
info @@ -22,6 +22,82 @@
+ + + - ", ""); + simplified = simplified.replaceAll("(?i)]*>.*?", ""); + return simplified; + } + + private static String generateUniqueAttachmentId(String filename) { + return "attachment_" + filename.hashCode() + "_" + System.nanoTime(); + } + + private static String convertEmlToHtmlBasic( + byte[] emlBytes, EmlToPdfRequest request) { + if (emlBytes == null || emlBytes.length == 0) { + throw new IllegalArgumentException("EML file is empty or null"); + } + + String emlContent = new String(emlBytes, StandardCharsets.UTF_8); + + // Basic email parsing + String subject = extractBasicHeader(emlContent, "Subject:"); + String from = extractBasicHeader(emlContent, "From:"); + String to = extractBasicHeader(emlContent, "To:"); + String cc = extractBasicHeader(emlContent, "Cc:"); + String bcc = extractBasicHeader(emlContent, "Bcc:"); + String date = extractBasicHeader(emlContent, "Date:"); + + // Try to extract HTML content + String htmlBody = extractHtmlBody(emlContent); + if (htmlBody == null) { + String textBody = extractTextBody(emlContent); + htmlBody = + convertTextToHtml( + textBody != null ? textBody : "Email content could not be parsed"); + } + + // Generate HTML with custom styling based on request + StringBuilder html = new StringBuilder(); + html.append("\n"); + html.append("\n"); + html.append("").append(escapeHtml(subject)).append("\n"); + html.append("\n"); + html.append("\n"); + + html.append("
\n"); + html.append("
\n"); + html.append("

").append(escapeHtml(subject)).append("

\n"); + html.append("
\n"); + html.append("
From: ").append(escapeHtml(from)).append("
\n"); + html.append("
To: ").append(escapeHtml(to)).append("
\n"); + + // Include CC and BCC if present and requested + if (request != null && request.isIncludeAllRecipients()) { + if (!cc.trim().isEmpty()) { + html.append("
CC: ").append(escapeHtml(cc)).append("
\n"); + } + if (!bcc.trim().isEmpty()) { + html.append("
BCC: ") + .append(escapeHtml(bcc)) + .append("
\n"); + } + } + + if (!date.trim().isEmpty()) { + html.append("
Date: ").append(escapeHtml(date)).append("
\n"); + } + html.append("
\n"); + + html.append("
\n"); + html.append(processEmailHtmlBody(htmlBody)); + html.append("
\n"); + + // Add attachment information - always check for and display attachments + String attachmentInfo = extractAttachmentInfo(emlContent); + if (!attachmentInfo.isEmpty()) { + html.append("
\n"); + html.append("

Attachments

\n"); + html.append(attachmentInfo); + + // Add status message about attachment inclusion + if (request != null && request.isIncludeAttachments()) { + html.append("
\n"); + html.append( + "

Note: Attachments are saved as external files and linked in this PDF. Click the links to open files externally.

\n"); + html.append("
\n"); + } else { + html.append("
\n"); + html.append( + "

Attachment information displayed - files not included in PDF. Enable 'Include attachments' to embed files.

\n"); + html.append("
\n"); + } + + html.append("
\n"); + } + + // Show advanced features status if requested + assert request != null; + if (request != null && request.getFileInput().isEmpty()) { + html.append("
\n"); + html.append( + "

Note: Some advanced features require Jakarta Mail dependencies.

\n"); + html.append("
\n"); + } + + html.append("
\n"); + html.append(""); + + return html.toString(); + } + + private static EmailContent extractEmailContentAdvanced( + byte[] emlBytes, EmlToPdfRequest request) { + try { + // Use Jakarta Mail for processing + Class sessionClass = Class.forName("jakarta.mail.Session"); + Class mimeMessageClass = Class.forName("jakarta.mail.internet.MimeMessage"); + + Method getDefaultInstance = + sessionClass.getMethod("getDefaultInstance", Properties.class); + Object session = getDefaultInstance.invoke(null, new Properties()); + + Constructor mimeMessageConstructor = + mimeMessageClass.getConstructor(sessionClass, InputStream.class); + Object message = + mimeMessageConstructor.newInstance(session, new ByteArrayInputStream(emlBytes)); + + + return extractEmailContentAdvanced(message, request); + + } catch (ReflectiveOperationException e) { + // Create basic EmailContent from basic processing + EmailContent content = new EmailContent(); + content.setHtmlBody(convertEmlToHtmlBasic(emlBytes, request)); + return content; + } + } + + private static String convertEmlToHtmlAdvanced( + byte[] emlBytes, EmlToPdfRequest request) { + EmailContent content = extractEmailContentAdvanced(emlBytes, request); + return generateEnhancedEmailHtml(content, request); + } + + private static String extractAttachmentInfo(String emlContent) { + StringBuilder attachmentInfo = new StringBuilder(); + try { + String[] lines = emlContent.split("\r?\n"); + boolean inHeaders = true; + String currentContentType = ""; + String currentDisposition = ""; + String currentFilename = ""; + String currentEncoding = ""; + boolean inMultipart = false; + String boundary = ""; + + // First pass: find boundary for multipart messages + for (String line : lines) { + String lowerLine = line.toLowerCase().trim(); + if (lowerLine.startsWith("content-type:") && lowerLine.contains("multipart")) { + if (lowerLine.contains("boundary=")) { + int boundaryStart = lowerLine.indexOf("boundary=") + 9; + String boundaryPart = line.substring(boundaryStart).trim(); + if (boundaryPart.startsWith("\"")) { + boundary = boundaryPart.substring(1, boundaryPart.indexOf("\"", 1)); + } else { + int spaceIndex = boundaryPart.indexOf(" "); + boundary = + spaceIndex > 0 + ? boundaryPart.substring(0, spaceIndex) + : boundaryPart; + } + inMultipart = true; + break; + } + } + if (line.trim().isEmpty()) break; + } + + // Second pass: extract attachment information + for (String line : lines) { + String lowerLine = line.toLowerCase().trim(); + + // Check for boundary markers in multipart messages + if (inMultipart && line.trim().startsWith("--" + boundary)) { + // Reset for new part + currentContentType = ""; + currentDisposition = ""; + currentFilename = ""; + currentEncoding = ""; + inHeaders = true; + continue; + } + + if (inHeaders && line.trim().isEmpty()) { + inHeaders = false; + + // Process accumulated attachment info + if (isAttachment(currentDisposition, currentFilename, currentContentType)) { + addAttachmentToInfo( + attachmentInfo, + currentFilename, + currentContentType, + currentEncoding); + + // Reset for next attachment + currentContentType = ""; + currentDisposition = ""; + currentFilename = ""; + currentEncoding = ""; + } + continue; + } + + if (!inHeaders) continue; // Skip body content + + // Parse headers + if (lowerLine.startsWith("content-type:")) { + currentContentType = line.substring(13).trim(); + } else if (lowerLine.startsWith("content-disposition:")) { + currentDisposition = line.substring(20).trim(); + // Extract filename if present + currentFilename = extractFilenameFromDisposition(currentDisposition); + } else if (lowerLine.startsWith("content-transfer-encoding:")) { + currentEncoding = line.substring(26).trim(); + } else if (line.startsWith(" ") || line.startsWith("\t")) { + // Continuation of previous header + if (currentDisposition.contains("filename=")) { + currentDisposition += " " + line.trim(); + currentFilename = extractFilenameFromDisposition(currentDisposition); + } else if (!currentContentType.isEmpty()) { + currentContentType += " " + line.trim(); + } + } + } + + if (isAttachment(currentDisposition, currentFilename, currentContentType)) { + addAttachmentToInfo( + attachmentInfo, currentFilename, currentContentType, currentEncoding); + } + + } catch (RuntimeException e) { + log.warn("Error extracting attachment info: {}", e.getMessage()); + } + return attachmentInfo.toString(); + } + + private static boolean isAttachment(String disposition, String filename, String contentType) { + return (disposition.toLowerCase().contains("attachment") && !filename.isEmpty()) + || (!filename.isEmpty() && !contentType.toLowerCase().startsWith("text/")) + || (contentType.toLowerCase().contains("application/") && !filename.isEmpty()); + } + + private static String extractFilenameFromDisposition(String disposition) { + if (disposition.contains("filename=")) { + int filenameStart = disposition.toLowerCase().indexOf("filename=") + 9; + int filenameEnd = disposition.indexOf(";", filenameStart); + if (filenameEnd == -1) filenameEnd = disposition.length(); + String filename = disposition.substring(filenameStart, filenameEnd).trim(); + filename = filename.replaceAll("^\"|\"$", ""); + // Apply MIME decoding to handle encoded filenames + return safeMimeDecode(filename); + } + return ""; + } + + private static void addAttachmentToInfo( + StringBuilder attachmentInfo, String filename, String contentType, String encoding) { + // Create attachment info with paperclip emoji before filename + attachmentInfo + .append("
") + .append("").append(MimeConstants.ATTACHMENT_ICON_PLACEHOLDER).append(" ") + .append("").append(escapeHtml(filename)).append(""); + + // Add content type and encoding info + if (!contentType.isEmpty() || !encoding.isEmpty()) { + attachmentInfo.append(" ("); + if (!contentType.isEmpty()) { + attachmentInfo.append(escapeHtml(contentType)); + } + if (!encoding.isEmpty()) { + if (!contentType.isEmpty()) attachmentInfo.append(", "); + attachmentInfo.append("encoding: ").append(escapeHtml(encoding)); + } + attachmentInfo.append(")"); + } + attachmentInfo.append("
\n"); + } + + private static boolean isInvalidEmlFormat(byte[] emlBytes) { + try { + int checkLength = Math.min(emlBytes.length, StyleConstants.EML_CHECK_LENGTH); + String content = new String(emlBytes, 0, checkLength, StandardCharsets.UTF_8); + String lowerContent = content.toLowerCase(); + + boolean hasFrom = lowerContent.contains("from:") || lowerContent.contains("return-path:"); + boolean hasSubject = lowerContent.contains("subject:"); + boolean hasMessageId = lowerContent.contains("message-id:"); + boolean hasDate = lowerContent.contains("date:"); + boolean hasTo = lowerContent.contains("to:") + || lowerContent.contains("cc:") + || lowerContent.contains("bcc:"); + boolean hasMimeStructure = lowerContent.contains("multipart/") + || lowerContent.contains("text/plain") + || lowerContent.contains("text/html") + || lowerContent.contains("boundary="); + + int headerCount = 0; + if (hasFrom) headerCount++; + if (hasSubject) headerCount++; + if (hasMessageId) headerCount++; + if (hasDate) headerCount++; + if (hasTo) headerCount++; + + return headerCount < StyleConstants.MIN_HEADER_COUNT_FOR_VALID_EML && !hasMimeStructure; + + } catch (RuntimeException e) { + return false; + } + } + + private static String extractBasicHeader(String emlContent, String headerName) { + try { + String[] lines = emlContent.split("\r?\n"); + for (int i = 0; i < lines.length; i++) { + String line = lines[i]; + if (line.toLowerCase().startsWith(headerName.toLowerCase())) { + StringBuilder value = + new StringBuilder(line.substring(headerName.length()).trim()); + // Handle multi-line headers + for (int j = i + 1; j < lines.length; j++) { + if (lines[j].startsWith(" ") || lines[j].startsWith("\t")) { + value.append(" ").append(lines[j].trim()); + } else { + break; + } + } + // Apply MIME header decoding + return safeMimeDecode(value.toString()); + } + if (line.trim().isEmpty()) break; + } + } catch (RuntimeException e) { + log.warn("Error extracting header '{}': {}", headerName, e.getMessage()); + } + return ""; + } + + private static String extractHtmlBody(String emlContent) { + try { + String lowerContent = emlContent.toLowerCase(); + int htmlStart = lowerContent.indexOf("content-type: text/html"); + if (htmlStart == -1) return null; + + return getString(emlContent, htmlStart); + + } catch (Exception e) { + return null; + } + } + + @Nullable + private static String getString(String emlContent, int htmlStart) { + int bodyStart = emlContent.indexOf("\r\n\r\n", htmlStart); + if (bodyStart == -1) bodyStart = emlContent.indexOf("\n\n", htmlStart); + if (bodyStart == -1) return null; + + bodyStart += (emlContent.charAt(bodyStart + 1) == '\r') ? 4 : 2; + int bodyEnd = findPartEnd(emlContent, bodyStart); + + return emlContent.substring(bodyStart, bodyEnd).trim(); + } + + private static String extractTextBody(String emlContent) { + try { + String lowerContent = emlContent.toLowerCase(); + int textStart = lowerContent.indexOf("content-type: text/plain"); + if (textStart == -1) { + int bodyStart = emlContent.indexOf("\r\n\r\n"); + if (bodyStart == -1) bodyStart = emlContent.indexOf("\n\n"); + if (bodyStart != -1) { + bodyStart += (emlContent.charAt(bodyStart + 1) == '\r') ? 4 : 2; + int bodyEnd = findPartEnd(emlContent, bodyStart); + return emlContent.substring(bodyStart, bodyEnd).trim(); + } + return null; + } + + return getString(emlContent, textStart); + + } catch (RuntimeException e) { + return null; + } + } + + private static int findPartEnd(String content, int start) { + String[] lines = content.substring(start).split("\r?\n"); + StringBuilder result = new StringBuilder(); + + for (String line : lines) { + if (line.startsWith("--") && line.length() > 10) break; + result.append(line).append("\n"); + } + + return start + result.length(); + } + + private static String convertTextToHtml(String textBody) { + if (textBody == null) return ""; + + String html = escapeHtml(textBody); + html = html.replace("\r\n", "\n").replace("\r", "\n"); + html = html.replace("\n", "
\n"); + + html = + html.replaceAll( + "(https?://[\\w\\-._~:/?#\\[\\]@!$&'()*+,;=%]+)", + "$1"); + + html = + html.replaceAll( + "([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,63})", + "$1"); + + return html; + } + + private static String processEmailHtmlBody(String htmlBody) { + if (htmlBody == null) return ""; + + String processed = htmlBody; + + // Remove problematic CSS + processed = processed.replaceAll("(?i)\\s*position\\s*:\\s*fixed[^;]*;?", ""); + processed = processed.replaceAll("(?i)\\s*position\\s*:\\s*absolute[^;]*;?", ""); + + return processed; + } + + private static void appendEnhancedStyles(StringBuilder html, EmlToPdfRequest request) { + int fontSize = StyleConstants.DEFAULT_FONT_SIZE; + String textColor = StyleConstants.DEFAULT_TEXT_COLOR; + String backgroundColor = StyleConstants.DEFAULT_BACKGROUND_COLOR; + String borderColor = StyleConstants.DEFAULT_BORDER_COLOR; + + html.append("body {\n"); + html.append(" font-family: ").append(StyleConstants.DEFAULT_FONT_FAMILY).append(";\n"); + html.append(" font-size: ").append(fontSize).append("px;\n"); + html.append(" line-height: ").append(StyleConstants.DEFAULT_LINE_HEIGHT).append(";\n"); + html.append(" color: ").append(textColor).append(";\n"); + html.append(" margin: 0;\n"); + html.append(" padding: 16px;\n"); + html.append(" background-color: ").append(backgroundColor).append(";\n"); + html.append("}\n\n"); + + html.append(".email-container {\n"); + html.append(" width: 100%;\n"); + html.append(" max-width: 100%;\n"); + html.append(" margin: 0 auto;\n"); + html.append("}\n\n"); + + html.append(".email-header {\n"); + html.append(" padding-bottom: 10px;\n"); + html.append(" border-bottom: 1px solid ").append(borderColor).append(";\n"); + html.append(" margin-bottom: 10px;\n"); + html.append("}\n\n"); + html.append(".email-header h1 {\n"); + html.append(" margin: 0 0 10px 0;\n"); + html.append(" font-size: ").append(fontSize + 4).append("px;\n"); + html.append(" font-weight: bold;\n"); + html.append("}\n\n"); + html.append(".email-meta div {\n"); + html.append(" margin-bottom: 2px;\n"); + html.append(" font-size: ").append(fontSize - 1).append("px;\n"); + html.append("}\n\n"); + + + html.append(".email-body {\n"); + html.append(" word-wrap: break-word;\n"); + html.append("}\n\n"); + + + html.append(".attachment-section {\n"); + html.append(" margin-top: 15px;\n"); + html.append(" padding: 10px;\n"); + html.append(" background-color: ").append(StyleConstants.ATTACHMENT_BACKGROUND_COLOR).append(";\n"); + html.append(" border: 1px solid ").append(StyleConstants.ATTACHMENT_BORDER_COLOR).append(";\n"); + html.append(" border-radius: 3px;\n"); + html.append("}\n\n"); + html.append(".attachment-section h3 {\n"); + html.append(" margin: 0 0 8px 0;\n"); + html.append(" font-size: ").append(fontSize + 1).append("px;\n"); + html.append("}\n\n"); + html.append(".attachment-item {\n"); + html.append(" padding: 5px 0;\n"); + html.append("}\n\n"); + html.append(".attachment-icon {\n"); + html.append(" margin-right: 5px;\n"); + html.append("}\n\n"); + html.append(".attachment-details, .attachment-type {\n"); + html.append(" font-size: ").append(fontSize - 2).append("px;\n"); + html.append(" color: #555555;\n"); + html.append("}\n\n"); + html.append(".attachment-inclusion-note, .attachment-info-note {\n"); + html.append(" margin-top: 8px;\n"); + html.append(" padding: 6px;\n"); + html.append(" font-size: ").append(fontSize - 2).append("px;\n"); + html.append(" border-radius: 3px;\n"); + html.append("}\n\n"); + html.append(".attachment-inclusion-note {\n"); + html.append(" background-color: #e6ffed;\n"); + html.append(" border: 1px solid #d4f7dc;\n"); + html.append(" color: #006420;\n"); + html.append("}\n\n"); + html.append(".attachment-info-note {\n"); + html.append(" background-color: #fff9e6;\n"); + html.append(" border: 1px solid #fff0c2;\n"); + html.append(" color: #664d00;\n"); + html.append("}\n\n"); + html.append(".attachment-link-container {\n"); + html.append(" display: flex;\n"); + html.append(" align-items: center;\n"); + html.append(" padding: 8px;\n"); + html.append(" background-color: #f8f9fa;\n"); + html.append(" border: 1px solid #dee2e6;\n"); + html.append(" border-radius: 4px;\n"); + html.append(" margin: 4px 0;\n"); + html.append("}\n\n"); + html.append(".attachment-link-container:hover {\n"); + html.append(" background-color: #e9ecef;\n"); + html.append("}\n\n"); + html.append(".attachment-note {\n"); + html.append(" font-size: ").append(fontSize - 3).append("px;\n"); + html.append(" color: #6c757d;\n"); + html.append(" font-style: italic;\n"); + html.append(" margin-left: 8px;\n"); + html.append("}\n\n"); + + + // Basic image styling: ensure images are responsive but not overly constrained. + html.append("img {\n"); + html.append(" max-width: 100%;\n"); // Make images responsive to container width + html.append(" height: auto;\n"); // Maintain aspect ratio + html.append(" display: block;\n"); // Avoid extra space below images + html.append("}\n\n"); + } + + private static String escapeHtml(String text) { + if (text == null) return ""; + return text.replace("&", "&") + .replace("<", "<") + .replace(">", ">") + .replace("\"", """) + .replace("'", "'"); + } + + private static stirling.software.common.model.api.converters.HTMLToPdfRequest createHtmlRequest( + EmlToPdfRequest request) { + stirling.software.common.model.api.converters.HTMLToPdfRequest htmlRequest = + new stirling.software.common.model.api.converters.HTMLToPdfRequest(); + + if (request != null) { + htmlRequest.setFileInput(request.getFileInput()); + } + + // Set default zoom level + htmlRequest.setZoom(Float.parseFloat(StyleConstants.DEFAULT_ZOOM)); + + return htmlRequest; + } + + private static EmailContent extractEmailContentAdvanced( + Object message, EmlToPdfRequest request) { + EmailContent content = new EmailContent(); + + try { + Class messageClass = message.getClass(); + + // Extract headers via reflection + java.lang.reflect.Method getSubject = messageClass.getMethod("getSubject"); + String subject = (String) getSubject.invoke(message); + content.setSubject(subject != null ? safeMimeDecode(subject) : "No Subject"); + + java.lang.reflect.Method getFrom = messageClass.getMethod("getFrom"); + Object[] fromAddresses = (Object[]) getFrom.invoke(message); + content.setFrom( + fromAddresses != null && fromAddresses.length > 0 + ? safeMimeDecode(fromAddresses[0].toString()) + : ""); + + java.lang.reflect.Method getAllRecipients = messageClass.getMethod("getAllRecipients"); + Object[] recipients = (Object[]) getAllRecipients.invoke(message); + content.setTo( + recipients != null && recipients.length > 0 ? safeMimeDecode(recipients[0].toString()) : ""); + + java.lang.reflect.Method getSentDate = messageClass.getMethod("getSentDate"); + content.setDate((Date) getSentDate.invoke(message)); + + // Extract content + java.lang.reflect.Method getContent = messageClass.getMethod("getContent"); + Object messageContent = getContent.invoke(message); + + if (messageContent instanceof String stringContent) { + java.lang.reflect.Method getContentType = messageClass.getMethod("getContentType"); + String contentType = (String) getContentType.invoke(message); + if (contentType != null && contentType.toLowerCase().contains("text/html")) { + content.setHtmlBody(stringContent); + } else { + content.setTextBody(stringContent); + } + } else { + // Handle multipart content + try { + Class multipartClass = Class.forName("jakarta.mail.Multipart"); + if (multipartClass.isInstance(messageContent)) { + processMultipartAdvanced(messageContent, content, request); + } + } catch (Exception e) { + log.warn("Error processing multipart content: {}", e.getMessage()); + } + } + + } catch (Exception e) { + content.setSubject("Email Conversion"); + content.setFrom("Unknown"); + content.setTo("Unknown"); + content.setTextBody("Email content could not be parsed with advanced processing"); + } + + return content; + } + + private static void processMultipartAdvanced( + Object multipart, EmailContent content, EmlToPdfRequest request) { + try { + Class multipartClass = multipart.getClass(); + java.lang.reflect.Method getCount = multipartClass.getMethod("getCount"); + int count = (Integer) getCount.invoke(multipart); + + java.lang.reflect.Method getBodyPart = + multipartClass.getMethod("getBodyPart", int.class); + + for (int i = 0; i < count; i++) { + Object part = getBodyPart.invoke(multipart, i); + processPartAdvanced(part, content, request); + } + + } catch (Exception e) { + content.setTextBody("Email content could not be parsed with advanced processing"); + } + } + + private static void processPartAdvanced( + Object part, EmailContent content, EmlToPdfRequest request) { + try { + Class partClass = part.getClass(); + java.lang.reflect.Method isMimeType = partClass.getMethod("isMimeType", String.class); + java.lang.reflect.Method getContent = partClass.getMethod("getContent"); + java.lang.reflect.Method getDisposition = partClass.getMethod("getDisposition"); + java.lang.reflect.Method getFileName = partClass.getMethod("getFileName"); + java.lang.reflect.Method getContentType = partClass.getMethod("getContentType"); + java.lang.reflect.Method getHeader = partClass.getMethod("getHeader", String.class); + + Object disposition = getDisposition.invoke(part); + String filename = (String) getFileName.invoke(part); + String contentType = (String) getContentType.invoke(part); + + if ((Boolean) isMimeType.invoke(part, "text/plain") && disposition == null) { + content.setTextBody((String) getContent.invoke(part)); + } else if ((Boolean) isMimeType.invoke(part, "text/html") && disposition == null) { + content.setHtmlBody((String) getContent.invoke(part)); + } else if ("attachment".equalsIgnoreCase((String) disposition) + || (filename != null && !filename.trim().isEmpty())) { + + content.setAttachmentCount(content.getAttachmentCount() + 1); + + // Always extract basic attachment metadata for display + if (filename != null && !filename.trim().isEmpty()) { + // Create attachment with metadata only + EmailAttachment attachment = new EmailAttachment(); + // Apply MIME decoding to filename to handle encoded attachment names + attachment.setFilename(safeMimeDecode(filename)); + attachment.setContentType(contentType); + + // Check if it's an embedded image + String[] contentIdHeaders = (String[]) getHeader.invoke(part, "Content-ID"); + if (contentIdHeaders != null && contentIdHeaders.length > 0) { + attachment.setEmbedded(true); + } + + // Extract attachment data only if attachments should be included + if (request != null && request.isIncludeAttachments()) { + try { + Object attachmentContent = getContent.invoke(part); + byte[] attachmentData = null; + + if (attachmentContent instanceof java.io.InputStream inputStream) { + try { + attachmentData = inputStream.readAllBytes(); + } catch (IOException e) { + log.warn("Failed to read InputStream attachment: {}", e.getMessage()); + } + } else if (attachmentContent instanceof byte[] byteArray) { + attachmentData = byteArray; + } else if (attachmentContent instanceof String stringContent) { + attachmentData = + stringContent.getBytes(StandardCharsets.UTF_8); + } + + if (attachmentData != null) { + // Check size limit (use default 10MB if request is null) + long maxSizeMB = request.getMaxAttachmentSizeMB(); + long maxSizeBytes = maxSizeMB * 1024 * 1024; + + if (attachmentData.length <= maxSizeBytes) { + attachment.setData(attachmentData); + attachment.setSizeBytes(attachmentData.length); + } else { + // Still show attachment info even if too large + attachment.setSizeBytes(attachmentData.length); + } + } + } catch (Exception e) { + log.warn("Error extracting attachment data: {}", e.getMessage()); + } + } + + // Add attachment to the list for display (with or without data) + content.getAttachments().add(attachment); + } + } else if ((Boolean) isMimeType.invoke(part, "multipart/*")) { + // Handle nested multipart content + try { + Object multipartContent = getContent.invoke(part); + Class multipartClass = Class.forName("jakarta.mail.Multipart"); + if (multipartClass.isInstance(multipartContent)) { + processMultipartAdvanced(multipartContent, content, request); + } + } catch (Exception e) { + log.warn("Error processing multipart content: {}", e.getMessage()); + } + } + + } catch (Exception e) { + log.warn("Error processing multipart part: {}", e.getMessage()); + } + } + + private static String generateEnhancedEmailHtml(EmailContent content, EmlToPdfRequest request) { + StringBuilder html = new StringBuilder(); + + html.append("\n"); + html.append("\n"); + html.append("").append(escapeHtml(content.getSubject())).append("\n"); + html.append("\n"); + html.append("\n"); + + html.append("
\n"); + html.append("
\n"); + html.append("

").append(escapeHtml(content.getSubject())).append("

\n"); + html.append("
\n"); + html.append("
From: ") + .append(escapeHtml(content.getFrom())) + .append("
\n"); + html.append("
To: ").append(escapeHtml(content.getTo())).append("
\n"); + + if (content.getDate() != null) { + html.append("
Date: ") + .append(formatEmailDate(content.getDate())) + .append("
\n"); + } + html.append("
\n"); + + html.append("
\n"); + if (content.getHtmlBody() != null && !content.getHtmlBody().trim().isEmpty()) { + html.append(processEmailHtmlBody(content.getHtmlBody())); + } else if (content.getTextBody() != null && !content.getTextBody().trim().isEmpty()) { + html.append("
"); + html.append(convertTextToHtml(content.getTextBody())); + html.append("
"); + } else { + html.append("
"); + html.append("

No content available

"); + html.append("
"); + } + html.append("
\n"); + + if (content.getAttachmentCount() > 0 || !content.getAttachments().isEmpty()) { + html.append("
\n"); + int displayedAttachmentCount = + content.getAttachmentCount() > 0 + ? content.getAttachmentCount() + : content.getAttachments().size(); + html.append("

Attachments (").append(displayedAttachmentCount).append(")

\n"); + + if (!content.getAttachments().isEmpty()) { + for (EmailAttachment attachment : content.getAttachments()) { + // Create attachment info with paperclip emoji before filename + String uniqueId = generateUniqueAttachmentId(attachment.getFilename()); + attachment.setEmbeddedFilename( + attachment.getEmbeddedFilename() != null + ? attachment.getEmbeddedFilename() + : attachment.getFilename()); + + html.append("
") + .append("").append(MimeConstants.PAPERCLIP_EMOJI).append(" ") + .append("") + .append(escapeHtml(safeMimeDecode(attachment.getFilename()))) + .append(""); + + String sizeStr = formatFileSize(attachment.getSizeBytes()); + html.append(" (").append(sizeStr); + if (attachment.getContentType() != null && !attachment.getContentType().isEmpty()) { + html.append(", ").append(escapeHtml(attachment.getContentType())); + } + html.append(")
\n"); + } + } + + if (request.isIncludeAttachments()) { + html.append("
\n"); + html.append( + "

Attachments are embedded in the file.

\n"); + html.append("
\n"); + } else { + html.append("
\n"); + html.append( + "

Attachment information displayed - files not included in PDF.

\n"); + html.append("
\n"); + } + + html.append("
\n"); + } + + html.append("
\n"); + html.append(""); + + return html.toString(); + } + + private static byte[] attachFilesToPdf(byte[] pdfBytes, List attachments, stirling.software.common.service.CustomPDFDocumentFactory pdfDocumentFactory) + throws IOException { + try (PDDocument document = pdfDocumentFactory.load(pdfBytes); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) { + + if (attachments == null || attachments.isEmpty()) { + document.save(outputStream); + return outputStream.toByteArray(); + } + + List embeddedFiles = new ArrayList<>(); + + // Set up the embedded files name tree once + if (document.getDocumentCatalog().getNames() == null) { + document.getDocumentCatalog() + .setNames(new PDDocumentNameDictionary(document.getDocumentCatalog())); + } + + PDDocumentNameDictionary names = document.getDocumentCatalog().getNames(); + if (names.getEmbeddedFiles() == null) { + names.setEmbeddedFiles(new PDEmbeddedFilesNameTreeNode()); + } + + PDEmbeddedFilesNameTreeNode efTree = names.getEmbeddedFiles(); + Map efMap = efTree.getNames(); + if (efMap == null) { + efMap = new HashMap<>(); + } + + // Embed each attachment directly into the PDF + for (EmailAttachment attachment : attachments) { + if (attachment.getData() == null || attachment.getData().length == 0) { + continue; + } + + try { + // Generate unique filename + String filename = attachment.getFilename(); + if (filename == null || filename.trim().isEmpty()) { + filename = "attachment_" + System.currentTimeMillis(); + if (attachment.getContentType() != null + && attachment.getContentType().contains("/")) { + String[] parts = attachment.getContentType().split("/"); + if (parts.length > 1) { + filename += "." + parts[1]; + } + } + } + + // Ensure unique filename + String uniqueFilename = getUniqueFilename(filename, embeddedFiles, efMap); + + // Create embedded file + PDEmbeddedFile embeddedFile = + new PDEmbeddedFile(document, new ByteArrayInputStream(attachment.getData())); + embeddedFile.setSize(attachment.getData().length); + embeddedFile.setCreationDate(new GregorianCalendar()); + if (attachment.getContentType() != null) { + embeddedFile.setSubtype(attachment.getContentType()); + } + + // Create file specification + PDComplexFileSpecification fileSpec = new PDComplexFileSpecification(); + fileSpec.setFile(uniqueFilename); + fileSpec.setEmbeddedFile(embeddedFile); + if (attachment.getContentType() != null) { + fileSpec.setFileDescription("Email attachment: " + uniqueFilename); + } + + // Add to the map (but don't set it yet) + efMap.put(uniqueFilename, fileSpec); + embeddedFiles.add(uniqueFilename); + + // Store the filename for annotation creation + attachment.setEmbeddedFilename(uniqueFilename); + + } catch (Exception e) { + // Log error but continue with other attachments + log.warn("Failed to embed attachment: {}", attachment.getFilename(), e); + } + } + + // Set the complete map once at the end + if (!efMap.isEmpty()) { + efTree.setNames(efMap); + + // Set catalog viewer preferences to automatically show attachments pane + setCatalogViewerPreferences(document); + } + + // Add attachment annotations to the first page for each embedded file + if (!embeddedFiles.isEmpty()) { + addAttachmentAnnotationsToDocument(document, attachments); + } + + document.save(outputStream); + return outputStream.toByteArray(); + } + } + + private static String getUniqueFilename(String filename, List embeddedFiles, Map efMap) { + String uniqueFilename = filename; + int counter = 1; + while (embeddedFiles.contains(uniqueFilename) + || efMap.containsKey(uniqueFilename)) { + String extension = ""; + String baseName = filename; + int lastDot = filename.lastIndexOf('.'); + if (lastDot > 0) { + extension = filename.substring(lastDot); + baseName = filename.substring(0, lastDot); + } + uniqueFilename = baseName + "_" + counter + extension; + counter++; + } + return uniqueFilename; + } + + private static void addAttachmentAnnotationsToDocument( + PDDocument document, List attachments) throws IOException { + if (document.getNumberOfPages() == 0 || attachments == null || attachments.isEmpty()) { + return; + } + + // 1. Find the screen position of all emoji anchors + EmojiPositionFinder finder = new EmojiPositionFinder(); + finder.setSortByPosition(true); // Process pages in order + finder.getText(document); + List emojiPositions = finder.getPositions(); + + // 2. Warn if the number of anchors and attachments don't match + if (emojiPositions.size() != attachments.size()) { + log.warn( + "Found {} emoji anchors, but there are {} attachments. Annotation count may be incorrect.", + emojiPositions.size(), + attachments.size()); + } + + // 3. Create an invisible annotation over each found emoji + int annotationsToAdd = Math.min(emojiPositions.size(), attachments.size()); + for (int i = 0; i < annotationsToAdd; i++) { + EmojiPosition position = emojiPositions.get(i); + EmailAttachment attachment = attachments.get(i); + + if (attachment.getEmbeddedFilename() != null) { + PDPage page = document.getPage(position.getPageIndex()); + addAttachmentAnnotationToPage( + document, page, attachment, position.getX(), position.getY()); + } + } + } + + private static void addAttachmentAnnotationToPage( + PDDocument document, PDPage page, EmailAttachment attachment, float x, float y) + throws IOException { + + PDAnnotationFileAttachment fileAnnotation = new PDAnnotationFileAttachment(); + + PDRectangle rect = getPdRectangle(page, x, y); + fileAnnotation.setRectangle(rect); + + // Remove visual appearance while keeping clickable functionality + try { + PDAppearanceDictionary appearance = new PDAppearanceDictionary(); + PDAppearanceStream normalAppearance = new PDAppearanceStream(document); + normalAppearance.setBBox(new PDRectangle(0, 0, 0, 0)); // Zero-size bounding box + + appearance.setNormalAppearance(normalAppearance); + fileAnnotation.setAppearance(appearance); + } catch (Exception e) { + // If appearance manipulation fails, just set it to null + fileAnnotation.setAppearance(null); + } + + // Set invisibility flags but keep it functional + fileAnnotation.setInvisible(true); + fileAnnotation.setHidden(false); // Must be false to remain clickable + fileAnnotation.setNoView(false); // Must be false to remain clickable + fileAnnotation.setPrinted(false); + + PDEmbeddedFilesNameTreeNode efTree = document.getDocumentCatalog().getNames().getEmbeddedFiles(); + if (efTree != null) { + Map efMap = efTree.getNames(); + if (efMap != null) { + PDComplexFileSpecification fileSpec = efMap.get(attachment.getEmbeddedFilename()); + if (fileSpec != null) { + fileAnnotation.setFile(fileSpec); + } + } + } + + fileAnnotation.setContents("Click to open: " + attachment.getFilename()); + fileAnnotation.setAnnotationName("EmbeddedFile_" + attachment.getEmbeddedFilename()); + + page.getAnnotations().add(fileAnnotation); + + log.info("Added attachment annotation for '{}' on page {}", + attachment.getFilename(), document.getPages().indexOf(page) + 1); + } + + private static @NotNull PDRectangle getPdRectangle(PDPage page, float x, float y) { + PDRectangle mediaBox = page.getMediaBox(); + float pdfY = mediaBox.getHeight() - y; + + float iconWidth = StyleConstants.ATTACHMENT_ICON_WIDTH; // Keep original size for clickability + float iconHeight = StyleConstants.ATTACHMENT_ICON_HEIGHT; // Keep original size for clickability + + // Keep the full-size rectangle so it remains clickable + return new PDRectangle( + x + StyleConstants.ANNOTATION_X_OFFSET, + pdfY - iconHeight + StyleConstants.ANNOTATION_Y_OFFSET, + iconWidth, + iconHeight + ); + } + + private static String formatEmailDate(Date date) { + if (date == null) return ""; + java.text.SimpleDateFormat formatter = + new java.text.SimpleDateFormat("EEE, MMM d, yyyy 'at' h:mm a", Locale.ENGLISH); + return formatter.format(date); + } + + private static String formatFileSize(long bytes) { + if (bytes < FileSizeConstants.BYTES_IN_KB) { + return bytes + " B"; + } else if (bytes < FileSizeConstants.BYTES_IN_MB) { + return String.format("%.1f KB", bytes / (double) FileSizeConstants.BYTES_IN_KB); + } else if (bytes < FileSizeConstants.BYTES_IN_GB) { + return String.format("%.1f MB", bytes / (double) FileSizeConstants.BYTES_IN_MB); + } else { + return String.format("%.1f GB", bytes / (double) FileSizeConstants.BYTES_IN_GB); + } + } + + private static void setCatalogViewerPreferences(PDDocument document) { + try { + PDDocumentCatalog catalog = document.getDocumentCatalog(); + if (catalog != null) { + // Get the catalog's COS dictionary to work with low-level PDF objects + COSDictionary catalogDict = catalog.getCOSObject(); + + // Set PageMode to UseAttachments - this is the standard PDF specification approach + // PageMode values: UseNone, UseOutlines, UseThumbs, FullScreen, UseOC, UseAttachments + catalogDict.setName(COSName.PAGE_MODE, "UseAttachments"); + + // Also set viewer preferences for better attachment viewing experience + COSDictionary viewerPrefs = (COSDictionary) catalogDict.getDictionaryObject(COSName.VIEWER_PREFERENCES); + if (viewerPrefs == null) { + viewerPrefs = new COSDictionary(); + catalogDict.setItem(COSName.VIEWER_PREFERENCES, viewerPrefs); + } + + // Set NonFullScreenPageMode to UseAttachments as fallback for viewers that support it + viewerPrefs.setName(COSName.getPDFName("NonFullScreenPageMode"), "UseAttachments"); + + // Additional viewer preferences that may help with attachment display + viewerPrefs.setBoolean(COSName.getPDFName("DisplayDocTitle"), true); + + log.info("Set PDF PageMode to UseAttachments to automatically show attachments pane"); + } + } catch (Exception e) { + // Log warning but don't fail the entire operation for viewer preferences + log.warn("Failed to set catalog viewer preferences for attachments", e); + } + } + + // MIME header decoding functionality for RFC 2047 encoded headers - moved to constants + + private static String decodeMimeHeader(String encodedText) { + if (encodedText == null || encodedText.trim().isEmpty()) { + return encodedText; + } + + try { + StringBuilder result = new StringBuilder(); + Matcher matcher = MimeConstants.MIME_ENCODED_PATTERN.matcher(encodedText); + int lastEnd = 0; + + while (matcher.find()) { + // Add any text before the encoded part + result.append(encodedText, lastEnd, matcher.start()); + + String charset = matcher.group(1); + String encoding = matcher.group(2).toUpperCase(); + String encodedValue = matcher.group(3); + + try { + String decodedValue; + if ("B".equals(encoding)) { + // Base64 decoding + byte[] decodedBytes = Base64.getDecoder().decode(encodedValue); + decodedValue = new String(decodedBytes, Charset.forName(charset)); + } else if ("Q".equals(encoding)) { + // Quoted-printable decoding + decodedValue = decodeQuotedPrintable(encodedValue, charset); + } else { + // Unknown encoding, keep original + decodedValue = matcher.group(0); + } + result.append(decodedValue); + } catch (Exception e) { + log.warn("Failed to decode MIME header part: {}", matcher.group(0), e); + // If decoding fails, keep the original encoded text + result.append(matcher.group(0)); + } + + lastEnd = matcher.end(); + } + + // Add any remaining text after the last encoded part + result.append(encodedText.substring(lastEnd)); + + return result.toString(); + } catch (Exception e) { + log.warn("Error decoding MIME header: {}", encodedText, e); + return encodedText; // Return original if decoding fails + } + } + + private static String decodeQuotedPrintable(String encodedText, String charset) { + StringBuilder result = new StringBuilder(); + for (int i = 0; i < encodedText.length(); i++) { + char c = encodedText.charAt(i); + switch (c) { + case '=' -> { + if (i + 2 < encodedText.length()) { + String hex = encodedText.substring(i + 1, i + 3); + try { + int value = Integer.parseInt(hex, 16); + result.append((char) value); + i += 2; // Skip the hex digits + } catch (NumberFormatException e) { + // If hex parsing fails, keep the original character + result.append(c); + } + } else { + result.append(c); + } + } + case '_' -> // In RFC 2047, underscore represents space + result.append(' '); + default -> result.append(c); + } + } + + // Convert bytes to proper charset + byte[] bytes = result.toString().getBytes(StandardCharsets.ISO_8859_1); + return new String(bytes, Charset.forName(charset)); + } + + private static String safeMimeDecode(String headerValue) { + if (headerValue == null) { + return ""; + } + + try { + return decodeMimeHeader(headerValue.trim()); + } catch (Exception e) { + log.warn("Failed to decode MIME header, using original: {}", headerValue, e); + return headerValue; + } + } + + @Data + public static class EmailContent { + private String subject; + private String from; + private String to; + private Date date; + private String htmlBody; + private String textBody; + private int attachmentCount; + private List attachments = new ArrayList<>(); + + public void setHtmlBody(String htmlBody) { + this.htmlBody = htmlBody != null ? htmlBody.replaceAll("\r", "") : null; + } + + public void setTextBody(String textBody) { + this.textBody = textBody != null ? textBody.replaceAll("\r", "") : null; + } + } + + @Data + public static class EmailAttachment { + private String filename; + private String contentType; + private byte[] data; + private boolean embedded; + private String embeddedFilename; + private long sizeBytes; + + // New fields for advanced processing + private String contentId; + private String disposition; + private String transferEncoding; + + // Custom setter to maintain size calculation logic + public void setData(byte[] data) { + this.data = data; + if (data != null) { + this.sizeBytes = data.length; + } + } + } + + @Data + public static class EmojiPosition { + private int pageIndex; + private float x; + private float y; + private String character; + + public EmojiPosition() { + } + + public EmojiPosition(int pageIndex, float x, float y, String character) { + this.pageIndex = pageIndex; + this.x = x; + this.y = y; + this.character = character; + } + } + + public static class EmojiPositionFinder extends org.apache.pdfbox.text.PDFTextStripper { + @Getter + private final List positions = new ArrayList<>(); + private int currentPageIndex; + private boolean sortByPosition; + private boolean isInAttachmentSection; + private boolean attachmentSectionFound; + + public EmojiPositionFinder() throws IOException { + super(); + this.currentPageIndex = 0; + this.sortByPosition = false; + this.isInAttachmentSection = false; + this.attachmentSectionFound = false; + } + + @Override + protected void startPage(org.apache.pdfbox.pdmodel.PDPage page) throws IOException { + super.startPage(page); + } + + @Override + protected void endPage(org.apache.pdfbox.pdmodel.PDPage page) throws IOException { + currentPageIndex++; + super.endPage(page); + } + + @Override + protected void writeString(String string, List textPositions) throws IOException { + // Check if we are entering or exiting the attachment section + String lowerString = string.toLowerCase(); + + // Look for attachment section start marker + if (lowerString.contains("attachments (")) { + isInAttachmentSection = true; + attachmentSectionFound = true; + } + + // Look for attachment section end markers (common patterns that indicate end of attachments) + if (isInAttachmentSection && (lowerString.contains("") || + lowerString.contains("") || + (attachmentSectionFound && lowerString.trim().isEmpty() && string.length() > 50))) { + isInAttachmentSection = false; + } + + // Only look for emojis if we are in the attachment section + if (isInAttachmentSection) { + // Look for paperclip emoji characters (U+1F4CE) + String paperclipEmoji = "\uD83D\uDCCE"; // 📎 Unicode representation + + for (int i = 0; i < string.length(); i++) { + // Check if we have a complete paperclip emoji at this position + if (i < string.length() - 1 && + string.substring(i, i + 2).equals(paperclipEmoji) && + i < textPositions.size()) { + + org.apache.pdfbox.text.TextPosition textPosition = textPositions.get(i); + EmojiPosition position = new EmojiPosition( + currentPageIndex, + textPosition.getXDirAdj(), + textPosition.getYDirAdj(), + paperclipEmoji + ); + positions.add(position); + } + } + } + super.writeString(string, textPositions); + } + + @Override + public void setSortByPosition(boolean sortByPosition) { + this.sortByPosition = sortByPosition; + } + + public boolean isSortByPosition() { + return sortByPosition; + } + + + public void reset() { + positions.clear(); + currentPageIndex = 0; + isInAttachmentSection = false; + attachmentSectionFound = false; + } + } +} diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertEmlToPDF.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertEmlToPDF.java new file mode 100644 index 000000000..87ca7537c --- /dev/null +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertEmlToPDF.java @@ -0,0 +1,157 @@ +package stirling.software.SPDF.controller.api.converters; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; + +import org.jetbrains.annotations.NotNull; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +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.github.pixee.security.Filenames; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import stirling.software.common.configuration.RuntimePathConfig; +import stirling.software.common.model.api.converters.EmlToPdfRequest; +import stirling.software.common.service.CustomPDFDocumentFactory; +import stirling.software.common.util.EmlToPdf; +import stirling.software.common.util.WebResponseUtils; + +@RestController +@RequestMapping("/api/v1/convert") +@Tag(name = "Convert", description = "Convert APIs") +@Slf4j +@RequiredArgsConstructor +public class ConvertEmlToPDF { + + private final CustomPDFDocumentFactory pdfDocumentFactory; + private final RuntimePathConfig runtimePathConfig; + + @PostMapping(consumes = "multipart/form-data", value = "/eml/pdf") + @Operation( + summary = "Convert EML to PDF", + description = + "This endpoint converts EML (email) files to PDF format with extensive" + + " customization options. Features include font settings, image constraints, display modes, attachment handling," + + " and HTML debug output. Input: EML file, Output: PDF" + + " or HTML file. Type: SISO") + public ResponseEntity convertEmlToPdf(@ModelAttribute EmlToPdfRequest request) { + + MultipartFile inputFile = request.getFileInput(); + String originalFilename = inputFile.getOriginalFilename(); + + // Validate input + if (inputFile.isEmpty()) { + log.error("No file provided for EML to PDF conversion."); + return ResponseEntity.badRequest() + .body("No file provided".getBytes(StandardCharsets.UTF_8)); + } + + if (originalFilename == null || originalFilename.trim().isEmpty()) { + log.error("Filename is null or empty."); + return ResponseEntity.badRequest() + .body("Please provide a valid filename".getBytes(StandardCharsets.UTF_8)); + } + + // Validate file type - support EML + String lowerFilename = originalFilename.toLowerCase(); + if (!lowerFilename.endsWith(".eml")) { + log.error("Invalid file type for EML to PDF: {}", originalFilename); + return ResponseEntity.badRequest() + .body("Please upload a valid EML file".getBytes(StandardCharsets.UTF_8)); + } + + String baseFilename = Filenames.toSimpleFileName(originalFilename); // Use Filenames utility + + try { + byte[] fileBytes = inputFile.getBytes(); + + if (request.isDownloadHtml()) { + try { + String htmlContent = EmlToPdf.convertEmlToHtml(fileBytes, request); + log.info("Successfully converted EML to HTML: {}", originalFilename); + return WebResponseUtils.bytesToWebResponse( + htmlContent.getBytes(StandardCharsets.UTF_8), + baseFilename + ".html", + MediaType.TEXT_HTML); + } catch (IOException | IllegalArgumentException e) { + log.error("HTML conversion failed for {}", originalFilename, e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body( + ("HTML conversion failed: " + e.getMessage()) + .getBytes(StandardCharsets.UTF_8)); + } + } + + // Convert EML to PDF with enhanced options + try { + byte[] pdfBytes = + EmlToPdf.convertEmlToPdf( + runtimePathConfig.getWeasyPrintPath(), // Use configured WeasyPrint path + request, + fileBytes, + originalFilename, + false, + pdfDocumentFactory); + + if (pdfBytes == null || pdfBytes.length == 0) { + log.error("PDF conversion failed - empty output for {}", originalFilename); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body( + "PDF conversion failed - empty output" + .getBytes(StandardCharsets.UTF_8)); + } + log.info("Successfully converted EML to PDF: {}", originalFilename); + return WebResponseUtils.bytesToWebResponse( + pdfBytes, baseFilename + ".pdf", MediaType.APPLICATION_PDF); + + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + log.error("EML to PDF conversion was interrupted for {}", originalFilename, e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body("Conversion was interrupted".getBytes(StandardCharsets.UTF_8)); + } catch (IllegalArgumentException e) { + String errorMessage = buildErrorMessage(e, originalFilename); + log.error("EML to PDF conversion failed for {}: {}", originalFilename, errorMessage, e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(errorMessage.getBytes(StandardCharsets.UTF_8)); + } catch (RuntimeException e) { + String errorMessage = buildErrorMessage(e, originalFilename); + log.error("EML to PDF conversion failed for {}: {}", originalFilename, errorMessage, e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body(errorMessage.getBytes(StandardCharsets.UTF_8)); + } + + } catch (IOException e) { + log.error("File processing error for EML to PDF: {}", originalFilename, e); + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR) + .body("File processing error".getBytes(StandardCharsets.UTF_8)); + } + } + + private static @NotNull String buildErrorMessage(Exception e, String originalFilename) { + String errorMessage; + if (e.getMessage() != null && e.getMessage().contains("Invalid EML")) { + errorMessage = + "Invalid EML file format. Please ensure you've uploaded a valid email" + + " file (" + + originalFilename + + ")."; + } else if (e.getMessage() != null && e.getMessage().contains("WeasyPrint")) { + errorMessage = + "PDF generation failed for " + + originalFilename + + ". This may be due to complex email formatting."; + } else { + errorMessage = "Conversion failed for " + originalFilename + ": " + e.getMessage(); + } + return errorMessage; + } +} 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 10794693e..efde59066 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java @@ -7,7 +7,6 @@ import org.springframework.web.servlet.ModelAndView; import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.tags.Tag; - import stirling.software.common.util.CheckProgramInstall; @Controller @@ -121,4 +120,11 @@ public class ConverterWebController { model.addAttribute("currentPage", "pdf-to-pdfa"); return "convert/pdf-to-pdfa"; } + + @GetMapping("/eml-to-pdf") + @Hidden + public String convertEmlToPdfForm(Model model) { + model.addAttribute("currentPage", "eml-to-pdf"); + return "convert/eml-to-pdf"; + } } diff --git a/src/main/resources/messages_en_GB.properties b/src/main/resources/messages_en_GB.properties index b875859b6..1ea4f0e72 100644 --- a/src/main/resources/messages_en_GB.properties +++ b/src/main/resources/messages_en_GB.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML to PDF home.HTMLToPDF.desc=Converts any HTML file or zip to PDF HTMLToPDF.tags=markup,web-content,transformation,convert +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown to PDF home.MarkdownToPDF.desc=Converts any Markdown file to PDF diff --git a/src/main/resources/templates/convert/eml-to-pdf.html b/src/main/resources/templates/convert/eml-to-pdf.html new file mode 100644 index 000000000..2f1eb3ba3 --- /dev/null +++ b/src/main/resources/templates/convert/eml-to-pdf.html @@ -0,0 +1,93 @@ + + + + + + + + +
+
+ +
+
+
+
+
+
+ email + +
+
+
+
+ +
+ + +
+
+ +
+
+ + +
+ +
+ + +
+ + +
+ +
+ +
+
+

+
    +
  • +
  • +
  • +
+
+
+
+ + +
+
+
+
+
+
+
+ +
+ + + + diff --git a/src/main/resources/templates/fragments/navElements.html b/src/main/resources/templates/fragments/navElements.html index 1c7d329dd..3ced01be8 100644 --- a/src/main/resources/templates/fragments/navElements.html +++ b/src/main/resources/templates/fragments/navElements.html @@ -59,6 +59,9 @@
+
+
From 461f98be3e146e30de7554afd13ec462b916b2c7 Mon Sep 17 00:00:00 2001 From: "stirlingbot[bot]" <195170888+stirlingbot[bot]@users.noreply.github.com> Date: Sun, 8 Jun 2025 21:43:15 +0100 Subject: [PATCH 045/126] :globe_with_meridians: Sync Translations + Update README Progress Table (#3657) ### Description of Changes This Pull Request was automatically generated to synchronize updates to translation files and documentation. Below are the details of the changes made: #### **1. Synchronization of Translation Files** - Updated translation files (`messages_*.properties`) to reflect changes in the reference file `messages_en_GB.properties`. - Ensured consistency and synchronization across all supported language files. - Highlighted any missing or incomplete translations. #### **2. Update README.md** - Generated the translation progress table in `README.md`. - Added a summary of the current translation status for all supported languages. - Included up-to-date statistics on translation coverage. #### **Why these changes are necessary** - Keeps translation files aligned with the latest reference updates. - Ensures the documentation reflects the current translation progress. --- Auto-generated by [create-pull-request][1]. [1]: https://github.com/peter-evans/create-pull-request --------- Co-authored-by: stirlingbot[bot] <195170888+stirlingbot[bot]@users.noreply.github.com> --- README.md | 60 +++++++++---------- src/main/resources/messages_ar_AR.properties | 16 +++++ src/main/resources/messages_az_AZ.properties | 16 +++++ src/main/resources/messages_bg_BG.properties | 16 +++++ src/main/resources/messages_bo_CN.properties | 16 +++++ src/main/resources/messages_ca_CA.properties | 16 +++++ src/main/resources/messages_cs_CZ.properties | 16 +++++ src/main/resources/messages_da_DK.properties | 16 +++++ src/main/resources/messages_de_DE.properties | 16 +++++ src/main/resources/messages_el_GR.properties | 16 +++++ src/main/resources/messages_en_US.properties | 16 +++++ src/main/resources/messages_es_ES.properties | 16 +++++ src/main/resources/messages_eu_ES.properties | 16 +++++ src/main/resources/messages_fa_IR.properties | 16 +++++ src/main/resources/messages_fr_FR.properties | 16 +++++ src/main/resources/messages_ga_IE.properties | 16 +++++ src/main/resources/messages_hi_IN.properties | 16 +++++ src/main/resources/messages_hr_HR.properties | 16 +++++ src/main/resources/messages_hu_HU.properties | 16 +++++ src/main/resources/messages_id_ID.properties | 16 +++++ src/main/resources/messages_it_IT.properties | 16 +++++ src/main/resources/messages_ja_JP.properties | 16 +++++ src/main/resources/messages_ko_KR.properties | 16 +++++ src/main/resources/messages_ml_IN.properties | 16 +++++ src/main/resources/messages_nl_NL.properties | 16 +++++ src/main/resources/messages_no_NB.properties | 16 +++++ src/main/resources/messages_pl_PL.properties | 16 +++++ src/main/resources/messages_pt_BR.properties | 16 +++++ src/main/resources/messages_pt_PT.properties | 16 +++++ src/main/resources/messages_ro_RO.properties | 16 +++++ src/main/resources/messages_ru_RU.properties | 16 +++++ src/main/resources/messages_sk_SK.properties | 16 +++++ src/main/resources/messages_sl_SI.properties | 16 +++++ .../resources/messages_sr_LATN_RS.properties | 16 +++++ src/main/resources/messages_sv_SE.properties | 16 +++++ src/main/resources/messages_th_TH.properties | 16 +++++ src/main/resources/messages_tr_TR.properties | 16 +++++ src/main/resources/messages_uk_UA.properties | 16 +++++ src/main/resources/messages_vi_VN.properties | 16 +++++ src/main/resources/messages_zh_CN.properties | 16 +++++ src/main/resources/messages_zh_TW.properties | 16 +++++ 41 files changed, 670 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 797b8621d..2a5d735df 100644 --- a/README.md +++ b/README.md @@ -116,46 +116,46 @@ Stirling-PDF currently supports 40 languages! | Language | Progress | | -------------------------------------------- | -------------------------------------- | -| Arabic (العربية) (ar_AR) | ![72%](https://geps.dev/progress/72) | +| Arabic (العربية) (ar_AR) | ![71%](https://geps.dev/progress/71) | | Azerbaijani (Azərbaycan Dili) (az_AZ) | ![72%](https://geps.dev/progress/72) | | Basque (Euskara) (eu_ES) | ![42%](https://geps.dev/progress/42) | -| Bulgarian (Български) (bg_BG) | ![80%](https://geps.dev/progress/80) | -| Catalan (Català) (ca_CA) | ![79%](https://geps.dev/progress/79) | -| Croatian (Hrvatski) (hr_HR) | ![71%](https://geps.dev/progress/71) | -| Czech (Česky) (cs_CZ) | ![82%](https://geps.dev/progress/82) | -| Danish (Dansk) (da_DK) | ![72%](https://geps.dev/progress/72) | -| Dutch (Nederlands) (nl_NL) | ![70%](https://geps.dev/progress/70) | +| Bulgarian (Български) (bg_BG) | ![79%](https://geps.dev/progress/79) | +| Catalan (Català) (ca_CA) | ![78%](https://geps.dev/progress/78) | +| Croatian (Hrvatski) (hr_HR) | ![70%](https://geps.dev/progress/70) | +| Czech (Česky) (cs_CZ) | ![81%](https://geps.dev/progress/81) | +| Danish (Dansk) (da_DK) | ![71%](https://geps.dev/progress/71) | +| Dutch (Nederlands) (nl_NL) | ![69%](https://geps.dev/progress/69) | | English (English) (en_GB) | ![100%](https://geps.dev/progress/100) | | English (US) (en_US) | ![100%](https://geps.dev/progress/100) | -| French (Français) (fr_FR) | ![81%](https://geps.dev/progress/81) | -| German (Deutsch) (de_DE) | ![98%](https://geps.dev/progress/98) | -| Greek (Ελληνικά) (el_GR) | ![79%](https://geps.dev/progress/79) | +| French (Français) (fr_FR) | ![80%](https://geps.dev/progress/80) | +| German (Deutsch) (de_DE) | ![97%](https://geps.dev/progress/97) | +| Greek (Ελληνικά) (el_GR) | ![78%](https://geps.dev/progress/78) | | Hindi (हिंदी) (hi_IN) | ![78%](https://geps.dev/progress/78) | -| Hungarian (Magyar) (hu_HU) | ![90%](https://geps.dev/progress/90) | +| Hungarian (Magyar) (hu_HU) | ![89%](https://geps.dev/progress/89) | | Indonesian (Bahasa Indonesia) (id_ID) | ![72%](https://geps.dev/progress/72) | -| Irish (Gaeilge) (ga_IE) | ![80%](https://geps.dev/progress/80) | -| Italian (Italiano) (it_IT) | ![98%](https://geps.dev/progress/98) | -| Japanese (日本語) (ja_JP) | ![80%](https://geps.dev/progress/80) | -| Korean (한국어) (ko_KR) | ![79%](https://geps.dev/progress/79) | -| Norwegian (Norsk) (no_NB) | ![77%](https://geps.dev/progress/77) | -| Persian (فارسی) (fa_IR) | ![75%](https://geps.dev/progress/75) | -| Polish (Polski) (pl_PL) | ![84%](https://geps.dev/progress/84) | -| Portuguese (Português) (pt_PT) | ![80%](https://geps.dev/progress/80) | -| Portuguese Brazilian (Português) (pt_BR) | ![85%](https://geps.dev/progress/85) | -| Romanian (Română) (ro_RO) | ![67%](https://geps.dev/progress/67) | -| Russian (Русский) (ru_RU) | ![85%](https://geps.dev/progress/85) | +| Irish (Gaeilge) (ga_IE) | ![79%](https://geps.dev/progress/79) | +| Italian (Italiano) (it_IT) | ![97%](https://geps.dev/progress/97) | +| Japanese (日本語) (ja_JP) | ![79%](https://geps.dev/progress/79) | +| Korean (한국어) (ko_KR) | ![78%](https://geps.dev/progress/78) | +| Norwegian (Norsk) (no_NB) | ![76%](https://geps.dev/progress/76) | +| Persian (فارسی) (fa_IR) | ![74%](https://geps.dev/progress/74) | +| Polish (Polski) (pl_PL) | ![83%](https://geps.dev/progress/83) | +| Portuguese (Português) (pt_PT) | ![79%](https://geps.dev/progress/79) | +| Portuguese Brazilian (Português) (pt_BR) | ![84%](https://geps.dev/progress/84) | +| Romanian (Română) (ro_RO) | ![66%](https://geps.dev/progress/66) | +| Russian (Русский) (ru_RU) | ![84%](https://geps.dev/progress/84) | | Serbian Latin alphabet (Srpski) (sr_LATN_RS) | ![51%](https://geps.dev/progress/51) | -| Simplified Chinese (简体中文) (zh_CN) | ![85%](https://geps.dev/progress/85) | +| Simplified Chinese (简体中文) (zh_CN) | ![84%](https://geps.dev/progress/84) | | Slovakian (Slovensky) (sk_SK) | ![60%](https://geps.dev/progress/60) | -| Slovenian (Slovenščina) (sl_SI) | ![83%](https://geps.dev/progress/83) | -| Spanish (Español) (es_ES) | ![87%](https://geps.dev/progress/87) | +| Slovenian (Slovenščina) (sl_SI) | ![82%](https://geps.dev/progress/82) | +| Spanish (Español) (es_ES) | ![86%](https://geps.dev/progress/86) | | Swedish (Svenska) (sv_SE) | ![76%](https://geps.dev/progress/76) | -| Thai (ไทย) (th_TH) | ![69%](https://geps.dev/progress/69) | -| Tibetan (བོད་ཡིག་) (bo_CN) | ![76%](https://geps.dev/progress/76) | +| Thai (ไทย) (th_TH) | ![68%](https://geps.dev/progress/68) | +| Tibetan (བོད་ཡིག་) (bo_CN) | ![75%](https://geps.dev/progress/75) | | Traditional Chinese (繁體中文) (zh_TW) | ![85%](https://geps.dev/progress/85) | -| Turkish (Türkçe) (tr_TR) | ![86%](https://geps.dev/progress/86) | -| Ukrainian (Українська) (uk_UA) | ![85%](https://geps.dev/progress/85) | -| Vietnamese (Tiếng Việt) (vi_VN) | ![67%](https://geps.dev/progress/67) | +| Turkish (Türkçe) (tr_TR) | ![85%](https://geps.dev/progress/85) | +| Ukrainian (Українська) (uk_UA) | ![84%](https://geps.dev/progress/84) | +| Vietnamese (Tiếng Việt) (vi_VN) | ![66%](https://geps.dev/progress/66) | | Malayalam (മലയാളം) (ml_IN) | ![85%](https://geps.dev/progress/85) | ## Stirling PDF Enterprise diff --git a/src/main/resources/messages_ar_AR.properties b/src/main/resources/messages_ar_AR.properties index 5ec11150b..b35874ca2 100644 --- a/src/main/resources/messages_ar_AR.properties +++ b/src/main/resources/messages_ar_AR.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML إلى PDF home.HTMLToPDF.desc=يحول أي ملف HTML أو ملف مضغوط يحتوي HTMLToPDF.tags=لغة الترميز,محتوى الويب,تحويل,تحويل +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown إلى PDF home.MarkdownToPDF.desc=يحول أي ملف Markdown إلى PDF diff --git a/src/main/resources/messages_az_AZ.properties b/src/main/resources/messages_az_AZ.properties index 5b993ac1c..54e13f48d 100644 --- a/src/main/resources/messages_az_AZ.properties +++ b/src/main/resources/messages_az_AZ.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML-dən PDF-ə home.HTMLToPDF.desc=Hər hansı HTML faylını və ya ZİP-i PDF-ə çevirir HTMLToPDF.tags=işarələmə,veb-məzmun,çevirmə,dəyişmə +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown-dan PDF-ə home.MarkdownToPDF.desc=Hər hansı Markdown faylını PDF-ə çevirir diff --git a/src/main/resources/messages_bg_BG.properties b/src/main/resources/messages_bg_BG.properties index ad9653349..0d77c8620 100644 --- a/src/main/resources/messages_bg_BG.properties +++ b/src/main/resources/messages_bg_BG.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML към PDF home.HTMLToPDF.desc=Преобразува всеки HTML файл или архив към PDF HTMLToPDF.tags=маркиране,уеб-съдържание,трансформация,преобразуване +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown към PDF home.MarkdownToPDF.desc=Преобразува всеки Markdown файл към PDF diff --git a/src/main/resources/messages_bo_CN.properties b/src/main/resources/messages_bo_CN.properties index 6f65f1cd9..53141dad9 100644 --- a/src/main/resources/messages_bo_CN.properties +++ b/src/main/resources/messages_bo_CN.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML ནས་ PDF ལ། home.HTMLToPDF.desc=HTML ཡིག་ཆའམ་ zip ཡིག་ཆ་གང་རུང་ PDF ལ་བསྒྱུར་བ། HTMLToPDF.tags=རྟགས་རྒྱག,དྲ་ངོས་ནང་དོན།,བསྒྱུར་བཅོས།,བསྒྱུར་བ། +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown ནས་ PDF ལ། home.MarkdownToPDF.desc=Markdown ཡིག་ཆ་གང་རུང་ PDF ལ་བསྒྱུར་བ། diff --git a/src/main/resources/messages_ca_CA.properties b/src/main/resources/messages_ca_CA.properties index f20b3a064..b0d308813 100644 --- a/src/main/resources/messages_ca_CA.properties +++ b/src/main/resources/messages_ca_CA.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML a PDF home.HTMLToPDF.desc=Converteix qualsevol fitxer HTML o arxiu comprimit a PDF HTMLToPDF.tags=marcatge,contingut web,transformació,convertir +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown a PDF home.MarkdownToPDF.desc=Converteix qualsevol fitxer Markdown a PDF diff --git a/src/main/resources/messages_cs_CZ.properties b/src/main/resources/messages_cs_CZ.properties index 07d9fce84..534fa1729 100644 --- a/src/main/resources/messages_cs_CZ.properties +++ b/src/main/resources/messages_cs_CZ.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML na PDF home.HTMLToPDF.desc=Převádí libovolný HTML soubor nebo zip na PDF HTMLToPDF.tags=značkování,webový-obsah,transformace,převod +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown na PDF home.MarkdownToPDF.desc=Převádí libovolný Markdown soubor na PDF diff --git a/src/main/resources/messages_da_DK.properties b/src/main/resources/messages_da_DK.properties index 54fb6129c..adc2787d4 100644 --- a/src/main/resources/messages_da_DK.properties +++ b/src/main/resources/messages_da_DK.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML til PDF home.HTMLToPDF.desc=Konverterer enhver HTML-fil eller zip til PDF HTMLToPDF.tags=markup,webindhold,transformation,konvertér +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown til PDF home.MarkdownToPDF.desc=Konverterer enhver Markdown-fil til PDF diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties index d37c44103..519c8d3d0 100644 --- a/src/main/resources/messages_de_DE.properties +++ b/src/main/resources/messages_de_DE.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML zu PDF home.HTMLToPDF.desc=Konvertiert jede HTML-Datei oder Zip-Archiv zu PDF HTMLToPDF.tags=markup,webinhalt,transformation,konvertierung +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown zu PDF home.MarkdownToPDF.desc=Konvertiert jede Markdown-Datei zu PDF diff --git a/src/main/resources/messages_el_GR.properties b/src/main/resources/messages_el_GR.properties index 72a5d8e70..c74095293 100644 --- a/src/main/resources/messages_el_GR.properties +++ b/src/main/resources/messages_el_GR.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML σε PDF home.HTMLToPDF.desc=Μετατρέπει οποιοδήποτε αρχείο HTML ή zip σε PDF HTMLToPDF.tags=markup,περιεχόμενο-web,μετατροπή,μετατροπή +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown σε PDF home.MarkdownToPDF.desc=Μετατρέπει οποιοδήποτε αρχείο Markdown σε PDF diff --git a/src/main/resources/messages_en_US.properties b/src/main/resources/messages_en_US.properties index a40c1f3b7..f727830bf 100644 --- a/src/main/resources/messages_en_US.properties +++ b/src/main/resources/messages_en_US.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML to PDF home.HTMLToPDF.desc=Converts any HTML file or zip to PDF HTMLToPDF.tags=markup,web-content,transformation,convert +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown to PDF home.MarkdownToPDF.desc=Converts any Markdown file to PDF diff --git a/src/main/resources/messages_es_ES.properties b/src/main/resources/messages_es_ES.properties index 1ec4a03de..d4e491296 100644 --- a/src/main/resources/messages_es_ES.properties +++ b/src/main/resources/messages_es_ES.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML a PDF home.HTMLToPDF.desc=Convierte cualquier archivo HTML o ZIP a PDF HTMLToPDF.tags=margen,contenido web,transformación,convertir +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown a PDF home.MarkdownToPDF.desc=Convierte cualquier archivo Markdown a PDF diff --git a/src/main/resources/messages_eu_ES.properties b/src/main/resources/messages_eu_ES.properties index 843e85aeb..16daf035e 100644 --- a/src/main/resources/messages_eu_ES.properties +++ b/src/main/resources/messages_eu_ES.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML PDF-ra home.HTMLToPDF.desc=Bihurtu edozein HTML edo zip fitxategi PDFra HTMLToPDF.tags=markup,web-content,transformation,convert +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown PDF-ra home.MarkdownToPDF.desc=Bihurtu Markdown fitxategi guztiak PDF diff --git a/src/main/resources/messages_fa_IR.properties b/src/main/resources/messages_fa_IR.properties index cbb9ad5d0..24836b662 100644 --- a/src/main/resources/messages_fa_IR.properties +++ b/src/main/resources/messages_fa_IR.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML به PDF home.HTMLToPDF.desc=تبدیل هر فایل HTML یا زیپ به PDF HTMLToPDF.tags=مارک‌آپ،محتوای وب،تبدیل،تغییر +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=مارک‌داون به PDF home.MarkdownToPDF.desc=تبدیل هر فایل مارک‌داون به PDF diff --git a/src/main/resources/messages_fr_FR.properties b/src/main/resources/messages_fr_FR.properties index 3268472ba..901733f65 100644 --- a/src/main/resources/messages_fr_FR.properties +++ b/src/main/resources/messages_fr_FR.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML en PDF home.HTMLToPDF.desc=Convertissez n'importe quel fichier HTML ou ZIP en PDF. HTMLToPDF.tags=html,markup,contenu Web,transformation,convert +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown en PDF home.MarkdownToPDF.desc=Convertissez n'importe quel fichier Markdown en PDF. diff --git a/src/main/resources/messages_ga_IE.properties b/src/main/resources/messages_ga_IE.properties index 5c7bb2820..f99b340ca 100644 --- a/src/main/resources/messages_ga_IE.properties +++ b/src/main/resources/messages_ga_IE.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML go PDF home.HTMLToPDF.desc=Tiontaíonn aon chomhad HTML nó zip go PDF HTMLToPDF.tags=marcáil, ábhar gréasáin, claochlú, tiontú +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Marcáil síos go PDF home.MarkdownToPDF.desc=Tiontaíonn aon chomhad Markdown go PDF diff --git a/src/main/resources/messages_hi_IN.properties b/src/main/resources/messages_hi_IN.properties index 870f7d7cb..6eb115d83 100644 --- a/src/main/resources/messages_hi_IN.properties +++ b/src/main/resources/messages_hi_IN.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML से PDF home.HTMLToPDF.desc=किसी भी HTML फ़ाइल या zip को PDF में बदलें HTMLToPDF.tags=मार्कअप,वेब-सामग्री,रूपांतरण,बदलें +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown से PDF home.MarkdownToPDF.desc=किसी भी Markdown फ़ाइल को PDF में बदलें diff --git a/src/main/resources/messages_hr_HR.properties b/src/main/resources/messages_hr_HR.properties index 5c9942adc..177b2e28b 100644 --- a/src/main/resources/messages_hr_HR.properties +++ b/src/main/resources/messages_hr_HR.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML u PDF home.HTMLToPDF.desc=Pretvara bilo koji HTML datoteku ili zip u PDF HTMLToPDF.tags=oznake,web-sadržaj,transformacija,konvertiranje +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown u PDF home.MarkdownToPDF.desc=Pretvara bilo koju Markdown datoteku u PDF diff --git a/src/main/resources/messages_hu_HU.properties b/src/main/resources/messages_hu_HU.properties index 8dda0cef0..b76b2f616 100644 --- a/src/main/resources/messages_hu_HU.properties +++ b/src/main/resources/messages_hu_HU.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML konvertálása PDF-be home.HTMLToPDF.desc=HTML fájl vagy ZIP konvertálása PDF-be HTMLToPDF.tags=jelölőnyelv,webtartalom,átalakítás,konvertálás +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown konvertálása PDF-be home.MarkdownToPDF.desc=Markdown fájl konvertálása PDF-be diff --git a/src/main/resources/messages_id_ID.properties b/src/main/resources/messages_id_ID.properties index 9f707219a..ea98581ea 100644 --- a/src/main/resources/messages_id_ID.properties +++ b/src/main/resources/messages_id_ID.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML ke PDF home.HTMLToPDF.desc=Mengonversi berkas HTML atau zip ke PDF HTMLToPDF.tags=markup, konten web, transformasi, konversi +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Penurunan harga ke PDF home.MarkdownToPDF.desc=Mengonversi berkas Markdown apa pun ke PDF diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index 46bd1ec0e..f3cd102f9 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=Da HTML a PDF home.HTMLToPDF.desc=Converte qualsiasi file HTML o zip in PDF HTMLToPDF.tags=markup,contenuto web,trasformazione,conversione +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown in PDF home.MarkdownToPDF.desc=Converte qualsiasi file Markdown in PDF diff --git a/src/main/resources/messages_ja_JP.properties b/src/main/resources/messages_ja_JP.properties index 89b13d94d..cdd770d51 100644 --- a/src/main/resources/messages_ja_JP.properties +++ b/src/main/resources/messages_ja_JP.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTMLをPDFに変換 home.HTMLToPDF.desc=HTMLファイルまたはzipをPDFに変換します。 HTMLToPDF.tags=markup,web-content,transformation,convert +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=MarkdownをPDFに変換 home.MarkdownToPDF.desc=あらゆるMarkdownファイルをPDFに変換します。 diff --git a/src/main/resources/messages_ko_KR.properties b/src/main/resources/messages_ko_KR.properties index b9fcfa85f..94807ce99 100644 --- a/src/main/resources/messages_ko_KR.properties +++ b/src/main/resources/messages_ko_KR.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML을 PDF로 home.HTMLToPDF.desc=HTML 파일이나 zip을 PDF로 변환 HTMLToPDF.tags=마크업,웹-콘텐츠,변환,변환 +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown을 PDF로 home.MarkdownToPDF.desc=Markdown 파일을 PDF로 변환 diff --git a/src/main/resources/messages_ml_IN.properties b/src/main/resources/messages_ml_IN.properties index 8da9ec632..fc3d5fa20 100644 --- a/src/main/resources/messages_ml_IN.properties +++ b/src/main/resources/messages_ml_IN.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML PDF-ലേക്ക് home.HTMLToPDF.desc=ഏത് HTML ഫയലിനെയും അല്ലെങ്കിൽ സിപ്പിനെയും PDF-ലേക്ക് മാറ്റുന്നു HTMLToPDF.tags=മാർക്ക്അപ്പ്,വെബ്-ഉള്ളടക്കം,രൂപാന്തരം,പരിവർത്തനം ചെയ്യുക +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=മാർക്ക്ഡൗൺ PDF-ലേക്ക് home.MarkdownToPDF.desc=ഏത് മാർക്ക്ഡൗൺ ഫയലിനെയും PDF-ലേക്ക് മാറ്റുന്നു diff --git a/src/main/resources/messages_nl_NL.properties b/src/main/resources/messages_nl_NL.properties index 3cd03956b..5832ae536 100644 --- a/src/main/resources/messages_nl_NL.properties +++ b/src/main/resources/messages_nl_NL.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML naar PDF home.HTMLToPDF.desc=Zet HTML-bestand of zip om naar PDF HTMLToPDF.tags=markup,web-inhoud,transformatie,omzetten +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown naar PDF home.MarkdownToPDF.desc=Zet Markdown-bestand om naar PDF diff --git a/src/main/resources/messages_no_NB.properties b/src/main/resources/messages_no_NB.properties index f0d983cc1..84126a498 100644 --- a/src/main/resources/messages_no_NB.properties +++ b/src/main/resources/messages_no_NB.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML til PDF home.HTMLToPDF.desc=Konverter hvilken som helst HTML-fil eller zip til PDF HTMLToPDF.tags=markup,web-innhold,transformasjon,konverter +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown til PDF home.MarkdownToPDF.desc=Konverter hvilken som helst Markdown-fil til PDF diff --git a/src/main/resources/messages_pl_PL.properties b/src/main/resources/messages_pl_PL.properties index 76f582e0d..ed9c48690 100644 --- a/src/main/resources/messages_pl_PL.properties +++ b/src/main/resources/messages_pl_PL.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML do PDF home.HTMLToPDF.desc=Zapisuje podany plik HTML/ZIP do PDF HTMLToPDF.tags=znaczniki, treść internetowa, transformacja, konwertowanie +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown do PDF home.MarkdownToPDF.desc=Zapisuje dokument Markdown do PDF diff --git a/src/main/resources/messages_pt_BR.properties b/src/main/resources/messages_pt_BR.properties index bcdf02849..a282410dd 100644 --- a/src/main/resources/messages_pt_BR.properties +++ b/src/main/resources/messages_pt_BR.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML para PDF home.HTMLToPDF.desc=Converter qualquer arquivo HTML ou zip para PDF. HTMLToPDF.tags=marcação,conteúdo-web,transformação,converter +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown para PDF home.MarkdownToPDF.desc=Converte qualquer arquivo Markdown para PDF. diff --git a/src/main/resources/messages_pt_PT.properties b/src/main/resources/messages_pt_PT.properties index 2f8b3ee3c..897c5d441 100644 --- a/src/main/resources/messages_pt_PT.properties +++ b/src/main/resources/messages_pt_PT.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML para PDF home.HTMLToPDF.desc=Converte qualquer ficheiro HTML ou zip para PDF HTMLToPDF.tags=marcação,conteúdo-web,transformação,converter +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown para PDF home.MarkdownToPDF.desc=Converte qualquer ficheiro Markdown para PDF diff --git a/src/main/resources/messages_ro_RO.properties b/src/main/resources/messages_ro_RO.properties index e856d2a4a..a09b54b8a 100644 --- a/src/main/resources/messages_ro_RO.properties +++ b/src/main/resources/messages_ro_RO.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML în PDF home.HTMLToPDF.desc=Convertește orice fișier HTML sau zip în PDF HTMLToPDF.tags=markup,conținut-web,transformare,convertește +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown în PDF home.MarkdownToPDF.desc=Convertește orice fișier Markdown în PDF diff --git a/src/main/resources/messages_ru_RU.properties b/src/main/resources/messages_ru_RU.properties index 606ef074b..734722c04 100644 --- a/src/main/resources/messages_ru_RU.properties +++ b/src/main/resources/messages_ru_RU.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML в PDF home.HTMLToPDF.desc=Преобразует любой HTML-файл или zip в PDF HTMLToPDF.tags=разметка,веб-контент,преобразование,конвертация +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown в PDF home.MarkdownToPDF.desc=Преобразует любой файл Markdown в PDF diff --git a/src/main/resources/messages_sk_SK.properties b/src/main/resources/messages_sk_SK.properties index b5731b748..34b470830 100644 --- a/src/main/resources/messages_sk_SK.properties +++ b/src/main/resources/messages_sk_SK.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML do PDF home.HTMLToPDF.desc=Konvertuje akýkoľvek HTML súbor alebo zip do PDF HTMLToPDF.tags=markup, webový obsah, transformácia, konvertovať +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown do PDF home.MarkdownToPDF.desc=Konvertuje akýkoľvek Markdown súbor do PDF diff --git a/src/main/resources/messages_sl_SI.properties b/src/main/resources/messages_sl_SI.properties index 9bc2a1e88..ded53d6d1 100644 --- a/src/main/resources/messages_sl_SI.properties +++ b/src/main/resources/messages_sl_SI.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML v PDF home.HTMLToPDF.desc=Pretvori katero koli datoteko HTML ali zip v PDF HTMLToPDF.tags=markup,web-content,transformation,convert +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown v PDF home.MarkdownToPDF.desc=Pretvori katero koli datoteko Markdown v PDF diff --git a/src/main/resources/messages_sr_LATN_RS.properties b/src/main/resources/messages_sr_LATN_RS.properties index dcdba9d79..165600141 100644 --- a/src/main/resources/messages_sr_LATN_RS.properties +++ b/src/main/resources/messages_sr_LATN_RS.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML u PDF home.HTMLToPDF.desc=Konvertuje bilo koji HTML fajl ili zip u PDF HTMLToPDF.tags=oznake,web-sadržaj,transformacija,konvertovanje +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown u PDF home.MarkdownToPDF.desc=Konvertuje bilo koji Markdown fajl u PDF diff --git a/src/main/resources/messages_sv_SE.properties b/src/main/resources/messages_sv_SE.properties index a5fe2259e..50002908e 100644 --- a/src/main/resources/messages_sv_SE.properties +++ b/src/main/resources/messages_sv_SE.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML till PDF home.HTMLToPDF.desc=Konverterar valfri HTML-fil eller zip till PDF HTMLToPDF.tags=markup,webbinnehåll,transformation,konvertera +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown till PDF home.MarkdownToPDF.desc=Konverterar valfri Markdown-fil till PDF diff --git a/src/main/resources/messages_th_TH.properties b/src/main/resources/messages_th_TH.properties index 2d3a0c344..8c11d2dee 100644 --- a/src/main/resources/messages_th_TH.properties +++ b/src/main/resources/messages_th_TH.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML เป็น PDF home.HTMLToPDF.desc=แปลงไฟล์ HTML หรือ zip เป็น PDF HTMLToPDF.tags=มาร์กอัป, เนื้อหาเว็บ, การแปลง, การแปลง +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown เป็น PDF home.MarkdownToPDF.desc=แปลงไฟล์ Markdown เป็น PDF diff --git a/src/main/resources/messages_tr_TR.properties b/src/main/resources/messages_tr_TR.properties index 556f4c6d4..5c635dc62 100644 --- a/src/main/resources/messages_tr_TR.properties +++ b/src/main/resources/messages_tr_TR.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML'den PDF'e home.HTMLToPDF.desc=Herhangi bir HTML dosyasını veya zip'i PDF'e dönüştürür HTMLToPDF.tags=biçimlendirme,web-içeriği,dönüşüm,dönüştür +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown'dan PDF'e home.MarkdownToPDF.desc=Herhangi bir Markdown dosyasını PDF'e dönüştürür diff --git a/src/main/resources/messages_uk_UA.properties b/src/main/resources/messages_uk_UA.properties index e1bb44b5c..f1f281c36 100644 --- a/src/main/resources/messages_uk_UA.properties +++ b/src/main/resources/messages_uk_UA.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML в PDF home.HTMLToPDF.desc=Конвертує будь-який HTML-файл або zip-файл у PDF. HTMLToPDF.tags=розмітка,веб-контент,перетворення,конвертація +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown в PDF home.MarkdownToPDF.desc=Конвертує будь-який файл Markdown у PDF diff --git a/src/main/resources/messages_vi_VN.properties b/src/main/resources/messages_vi_VN.properties index 65170ffed..4600330d2 100644 --- a/src/main/resources/messages_vi_VN.properties +++ b/src/main/resources/messages_vi_VN.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML sang PDF home.HTMLToPDF.desc=Chuyển đổi bất kỳ tệp HTML hoặc zip nào thành PDF HTMLToPDF.tags=đánh dấu,nội dung web,chuyển đổi,chuyển +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown sang PDF home.MarkdownToPDF.desc=Chuyển đổi bất kỳ tệp Markdown nào thành PDF diff --git a/src/main/resources/messages_zh_CN.properties b/src/main/resources/messages_zh_CN.properties index 58a2d047e..56982f79a 100644 --- a/src/main/resources/messages_zh_CN.properties +++ b/src/main/resources/messages_zh_CN.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML 转 PDF home.HTMLToPDF.desc=将任何 HTML 文件或 zip 文件转换为 PDF HTMLToPDF.tags=标记、网页内容、转换、转换 +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown 转 PDF home.MarkdownToPDF.desc=将任何 Markdown 文件转换为 PDF diff --git a/src/main/resources/messages_zh_TW.properties b/src/main/resources/messages_zh_TW.properties index a7a164bb2..1d12c4a81 100644 --- a/src/main/resources/messages_zh_TW.properties +++ b/src/main/resources/messages_zh_TW.properties @@ -621,6 +621,22 @@ home.HTMLToPDF.title=HTML 轉 PDF home.HTMLToPDF.desc=將任何 HTML 檔案或壓縮檔轉換為 PDF HTMLToPDF.tags=標記,網頁內容,轉換,轉檔 +#eml-to-pdf +home.EMLToPDF.title=Email to PDF +home.EMLToPDF.desc=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.tags=email,conversion,eml,message,transformation,convert,mail + +EMLToPDF.title=Email To PDF +EMLToPDF.header=Email To PDF +EMLToPDF.submit=Convert +EMLToPDF.downloadHtml=Download HTML intermediate file instead of PDF +EMLToPDF.downloadHtmlHelp=This allows you to see the HTML version before PDF conversion and can help debug formatting issues +EMLToPDF.includeAttachments=Include attachments in PDF +EMLToPDF.maxAttachmentSize=Maximum attachment size (MB) +EMLToPDF.help=Converts email (EML) files to PDF format including headers, body, and inline images +EMLToPDF.troubleshootingTip1=Email to HTML is a more reliable process, so with batch-processing it is recommended to save both +EMLToPDF.troubleshootingTip2=With a small number of Emails, if the PDF is malformed, you can download HTML and override some of the problematic HTML/CSS code. +EMLToPDF.troubleshootingTip3=Embeddings, however, do not work with HTMLs home.MarkdownToPDF.title=Markdown 轉 PDF home.MarkdownToPDF.desc=將任何 Markdown 檔案轉換為 PDF From baaaa5a0b2ff687407dfce177e1beadb41531659 Mon Sep 17 00:00:00 2001 From: ConnorYoh <40631091+ConnorYoh@users.noreply.github.com> Date: Mon, 9 Jun 2025 12:02:56 +0100 Subject: [PATCH 046/126] Disabled auto capture for posthog (#3661) # Description of Changes Please provide a summary of the changes, including: - What was changed - Why the change was made - Any challenges encountered Closes #(issue_number) --- ## Checklist ### General - [ ] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [ ] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md) (if applicable) - [ ] I have performed a self-review of my own code - [ ] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [ ] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing) for more details. --- src/main/resources/templates/fragments/common.html | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/templates/fragments/common.html b/src/main/resources/templates/fragments/common.html index 02d919b2b..2f7b9df2f 100644 --- a/src/main/resources/templates/fragments/common.html +++ b/src/main/resources/templates/fragments/common.html @@ -147,6 +147,7 @@ api_host: 'https://eu.i.posthog.com', persistence: 'localStorage', person_profiles: 'always', + autocapture: false, mask_all_text: true, mask_all_element_attributes: true, opt_out_capturing_by_default: true From c7d6a063d75139ff793cc4e8550c9ca791874ab7 Mon Sep 17 00:00:00 2001 From: Dario Ghunney Ware Date: Mon, 9 Jun 2025 12:51:41 +0100 Subject: [PATCH 047/126] Multi module refactor (#3640) # Description of Changes Migrated Stirling PDF to a multi-module structure: * Introduced new `:stirling-pdf` module * Moved all the core logic and features of Stirling PDF into `:stirling-pdf` * Updated paths of jobs and scripts --- ## Checklist ### General - [ ] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [ ] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md) (if applicable) - [ ] I have performed a self-review of my own code - [ ] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### UI Changes (if applicable) - [ ] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR) ### Testing (if applicable) - [ ] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing) for more details. --- .gitattributes | 14 +- .github/labeler-config.yml | 57 +- .github/scripts/check_language_properties.py | 2 +- .github/workflows/check_properties.yml | 25 +- .github/workflows/licenses-update.yml | 4 +- .github/workflows/sync_files.yml | 10 +- .gitignore | 4 +- .pre-commit-config.yaml | 2 +- DeveloperGuide.md | 20 +- Dockerfile | 2 +- Dockerfile.fat | 2 +- HowToAddNewLanguage.md | 4 +- build.gradle | 340 ++++++----- common/.gitignore | 2 +- common/build.gradle | 37 -- .../common/configuration/AppConfig.java | 10 +- .../common/model/ApplicationProperties.java | 8 +- .../common/service/PostHogService.java | 2 +- .../software/common/util/ValidationUtil.java | 14 + .../common/util/CheckProgramInstallTest.java | 21 +- .../software/common/util/FileMonitorTest.java | 1 - .../common/util/ProviderUtilsTest.java | 13 +- .../HighContrastColorReplaceDeciderTest.java | 6 +- .../misc/InvertFullColorStrategyTest.java | 1 - .../ReplaceAndInvertColorStrategyTest.java | 1 - .../StringToArrayListPropertyEditorTest.java | 11 +- ...ocker-compose-latest-security-with-sso.yml | 6 +- ...ker-compose-latest-ultra-lite-security.yml | 6 +- .../docker-compose-latest-ultra-lite.yml | 4 +- exampleYmlFiles/docker-compose-latest.yml | 6 +- exampleYmlFiles/test_cicd.yml | 6 +- proprietary/.gitignore | 2 +- proprietary/build.gradle | 30 - .../security/CustomLogoutSuccessHandler.java | 1 + .../configuration/SecurityConfiguration.java | 2 + .../configuration/ee}/EEAppConfig.java | 10 +- .../ee}/KeygenLicenseVerifier.java | 4 +- .../configuration/ee}/LicenseKeyChecker.java | 6 +- .../security/saml2/SAML2Configuration.java | 3 +- .../ee}/LicenseKeyCheckerTest.java | 10 +- scripts/download-security-jar.sh | 2 +- settings.gradle | 2 +- .../software/SPDF/model/api/Email.java | 38 -- .../software/SPDF/model/api/GeneralFile.java | 19 - .../api/converters/ConvertToImageRequest.java | 42 -- .../model/api/general/OverlayPdfsRequest.java | 46 -- .../SPDF/model/api/misc/AddStampRequest.java | 87 --- .../SPDF/model/api/misc/MetadataRequest.java | 84 --- .../model/api/security/RedactPdfRequest.java | 49 -- .../model/api/security/RedactionArea.java | 28 - .../api/security/SanitizePdfRequest.java | 49 -- .../model/api/user/UpdateUserDetails.java | 17 - .../model/api/user/UpdateUserUsername.java | 14 - .../SPDF/model/api/user/Username.java | 14 - .../SPDF/model/api/user/UsernameAndPass.java | 14 - stirling-pdf/.gitignore | 196 +++++++ stirling-pdf/build.gradle | 95 ++++ .../signature/CMSProcessableInputStream.java | 0 .../signature/CreateSignatureBase.java | 0 .../pdfbox/examples/signature/TSAClient.java | 0 .../signature/ValidationTimeStamp.java | 0 .../examples/util/ConnectedInputStream.java | 0 .../ReplaceAndInvertColorFactory.java | 0 .../software/SPDF/LibreOfficeListener.java | 0 .../software/SPDF/SPDFApplication.java | 36 +- .../stirling/software/SPDF/UI/WebBrowser.java | 0 .../software/SPDF/UI/impl/DesktopBrowser.java | 0 .../software/SPDF/UI/impl/LoadingWindow.java | 0 .../SPDF/config/AppUpdateService.java | 0 .../SPDF/config/CleanUrlInterceptor.java | 40 +- .../SPDF/config/EndpointConfiguration.java | 0 .../SPDF/config/EndpointInspector.java | 6 +- .../SPDF/config/EndpointInterceptor.java | 4 +- .../SPDF/config/ExternalAppDepConfig.java | 58 +- .../software/SPDF/config/InitialSetup.java | 2 +- .../SPDF/config/LocaleConfiguration.java | 0 .../SPDF/config/LogbackPropertyLoader.java | 0 .../software/SPDF/config/MetricsConfig.java | 0 .../software/SPDF/config/MetricsFilter.java | 0 .../software/SPDF/config/OpenApiConfig.java | 0 .../config/StartupApplicationListener.java | 0 .../software/SPDF/config/WebMvcConfig.java | 6 +- .../FingerprintBasedSessionFilter.java | 2 +- .../FingerprintBasedSessionManager.java | 0 .../fingerprint/FingerprintGenerator.java | 0 .../api/AdditionalLanguageJsController.java | 0 .../controller/api/AnalysisController.java | 0 .../SPDF/controller/api/CropController.java | 0 .../SPDF/controller/api/MergeController.java | 0 .../api/MultiPageLayoutController.java | 0 .../api/PdfImageRemovalController.java | 0 .../controller/api/PdfOverlayController.java | 0 .../api/RearrangePagesPDFController.java | 0 .../controller/api/RotationController.java | 0 .../controller/api/ScalePagesController.java | 0 .../controller/api/SettingsController.java | 6 +- .../controller/api/SplitPDFController.java | 2 +- .../api/SplitPdfByChaptersController.java | 2 +- .../api/SplitPdfBySectionsController.java | 2 +- .../api/SplitPdfBySizeController.java | 0 .../api/ToSinglePageController.java | 0 .../api/converters/ConvertEmlToPDF.java | 0 .../api/converters/ConvertHtmlToPDF.java | 0 .../converters/ConvertImgPDFController.java | 0 .../api/converters/ConvertMarkdownToPdf.java | 2 +- .../converters/ConvertOfficeController.java | 0 .../api/converters/ConvertPDFToHtml.java | 0 .../api/converters/ConvertPDFToOffice.java | 0 .../api/converters/ConvertPDFToPDFA.java | 0 .../api/converters/ConvertWebsiteToPDF.java | 0 .../api/converters/ExtractCSVController.java | 0 .../api/filters/FilterController.java | 0 .../api/misc/AutoRenameController.java | 0 .../api/misc/AutoSplitPdfController.java | 0 .../api/misc/BlankPageController.java | 0 .../api/misc/CompressController.java | 21 +- .../api/misc/DecompressPdfController.java | 0 .../api/misc/ExtractImageScansController.java | 0 .../api/misc/ExtractImagesController.java | 0 .../api/misc/FakeScanController.java | 0 .../api/misc/FlattenController.java | 0 .../api/misc/MetadataController.java | 0 .../controller/api/misc/OCRController.java | 0 .../api/misc/OverlayImageController.java | 0 .../api/misc/PageNumbersController.java | 0 .../api/misc/PrintFileController.java | 0 .../controller/api/misc/RepairController.java | 0 .../misc/ReplaceAndInvertColorController.java | 0 .../controller/api/misc/ShowJavascript.java | 0 .../controller/api/misc/StampController.java | 0 .../api/misc/UnlockPDFFormsController.java | 0 .../api/pipeline/PipelineController.java | 0 .../pipeline/PipelineDirectoryProcessor.java | 3 +- .../api/pipeline/PipelineProcessor.java | 1 + .../api/security/CertSignController.java | 0 .../controller/api/security/GetInfoOnPDF.java | 0 .../api/security/PasswordController.java | 0 .../api/security/RedactController.java | 5 +- .../security/RemoveCertSignController.java | 0 .../api/security/SanitizeController.java | 0 .../security/ValidateSignatureController.java | 0 .../api/security/WatermarkController.java | 0 .../web/ConverterWebController.java | 0 .../controller/web/GeneralWebController.java | 0 .../controller/web/HomeWebController.java | 7 +- .../controller/web/MetricsController.java | 0 .../controller/web/OtherWebController.java | 0 .../controller/web/SecurityWebController.java | 0 .../controller/web/SignatureController.java | 0 .../controller/web/UploadLimitService.java | 0 .../software/SPDF/model/ApiEndpoint.java | 0 .../software/SPDF/model/Dependency.java | 0 .../stirling/software/SPDF/model/PDFText.java | 0 .../software/SPDF/model/PipelineConfig.java | 0 .../SPDF/model/PipelineOperation.java | 0 .../software/SPDF/model/PipelineResult.java | 0 .../software/SPDF/model/SignatureFile.java | 0 .../software/SPDF/model/SortTypes.java | 0 .../SPDF/model/api/HandleDataRequest.java | 0 .../software/SPDF/model/api/ImageFile.java | 0 .../SPDF/model/api/MultiplePDFFiles.java | 0 .../SPDF/model/api/PDFComparison.java | 0 .../SPDF/model/api/PDFComparisonAndCount.java | 0 .../model/api/PDFExtractImagesRequest.java | 0 .../model/api/PDFWithImageFormatRequest.java | 0 .../SPDF/model/api/PDFWithPageNums.java | 0 .../SPDF/model/api/PDFWithPageSize.java | 0 .../model/api/SplitPdfByChaptersRequest.java | 1 - .../model/api/SplitPdfBySectionsRequest.java | 1 - .../api/converters/ConvertPDFToMarkdown.java | 0 .../api/converters/ConvertToImageRequest.java | 41 ++ .../api/converters/ConvertToPdfRequest.java | 0 .../api/converters/PdfToBookRequest.java | 0 .../api/converters/PdfToPdfARequest.java | 0 .../converters/PdfToPresentationRequest.java | 0 .../api/converters/PdfToTextOrRTFRequest.java | 0 .../api/converters/PdfToWordRequest.java | 0 .../model/api/converters/UrlToPdfRequest.java | 0 .../model/api/filter/ContainsTextRequest.java | 6 +- .../model/api/filter/FileSizeRequest.java | 6 +- .../model/api/filter/PageRotationRequest.java | 6 +- .../model/api/filter/PageSizeRequest.java | 8 +- .../SPDF/model/api/general/CropPdfForm.java | 0 .../general/MergeMultiplePagesRequest.java | 0 .../model/api/general/MergePdfsRequest.java | 0 .../model/api/general/OverlayPdfsRequest.java | 46 ++ .../api/general/RearrangePagesRequest.java | 0 .../model/api/general/RotatePDFRequest.java | 0 .../model/api/general/ScalePagesRequest.java | 0 .../general/SplitPdfBySizeOrCountRequest.java | 0 .../model/api/misc/AddPageNumbersRequest.java | 0 .../SPDF/model/api/misc/AddStampRequest.java | 87 +++ .../model/api/misc/AutoSplitPdfRequest.java | 0 .../model/api/misc/ExtractHeaderRequest.java | 0 .../api/misc/ExtractImageScansRequest.java | 0 .../SPDF/model/api/misc/FakeScanRequest.java | 0 .../SPDF/model/api/misc/FlattenRequest.java | 0 .../SPDF/model/api/misc/MetadataRequest.java | 84 +++ .../model/api/misc/OptimizePdfRequest.java | 0 .../model/api/misc/OverlayImageRequest.java | 0 .../SPDF/model/api/misc/PrintFileRequest.java | 1 - .../api/misc/ProcessPdfWithOcrRequest.java | 0 .../api/misc/RemoveBlankPagesRequest.java | 0 .../misc/ReplaceAndInvertColorRequest.java | 0 .../api/security/AddPasswordRequest.java | 32 +- .../api/security/AddWatermarkRequest.java | 0 .../api/security/ManualRedactPdfRequest.java | 17 +- .../api/security/PDFPasswordRequest.java | 0 .../model/api/security/RedactPdfRequest.java | 48 ++ .../api/security/SanitizePdfRequest.java | 49 ++ .../api/security/SignPDFWithCertRequest.java | 0 .../security/SignatureValidationRequest.java | 0 .../security/SignatureValidationResult.java | 0 .../software/SPDF/pdf/FlexibleCSVWriter.java | 0 .../software/SPDF/pdf/TextFinder.java | 0 .../software/SPDF/service}/ApiDocService.java | 2 +- .../service/CertificateValidationService.java | 0 .../SPDF/service/LanguageService.java | 0 .../service/MetricsAggregatorService.java | 2 +- .../SPDF/service/PdfImageRemovalService.java | 0 .../SPDF/service/SignatureService.java | 0 .../misc/ReplaceAndInvertColorService.java | 0 .../main/resources/application.properties | 6 +- .../src}/main/resources/banner.txt | 0 .../src}/main/resources/certdata.txt | 0 .../src}/main/resources/logback.xml | 4 +- .../src}/main/resources/messages.properties | 0 .../main/resources/messages_ar_AR.properties | 167 ------ .../main/resources/messages_az_AZ.properties | 167 ------ .../main/resources/messages_bg_BG.properties | 167 ------ .../main/resources/messages_ca_CA.properties | 167 ------ .../main/resources/messages_cs_CZ.properties | 167 ------ .../main/resources/messages_da_DK.properties | 167 ------ .../main/resources/messages_de_DE.properties | 0 .../main/resources/messages_el_GR.properties | 0 .../main/resources/messages_en_GB.properties | 167 ------ .../main/resources/messages_en_US.properties | 167 ------ .../main/resources/messages_es_ES.properties | 193 +------ .../main/resources/messages_eu_ES.properties | 167 ------ .../main/resources/messages_fa_IR.properties | 167 ------ .../main/resources/messages_fr_FR.properties | 167 ------ .../main/resources/messages_ga_IE.properties | 167 ------ .../main/resources/messages_hi_IN.properties | 167 ------ .../main/resources/messages_hr_HR.properties | 167 ------ .../main/resources/messages_hu_HU.properties | 0 .../main/resources/messages_id_ID.properties | 167 ------ .../main/resources/messages_it_IT.properties | 167 ------ .../main/resources/messages_ja_JP.properties | 0 .../main/resources/messages_ko_KR.properties | 167 ------ .../main/resources/messages_ml_ML.properties | 167 ------ .../main/resources/messages_nl_NL.properties | 167 ------ .../main/resources/messages_no_NB.properties | 167 ------ .../main/resources/messages_pl_PL.properties | 167 ------ .../main/resources/messages_pt_BR.properties | 167 ------ .../main/resources/messages_pt_PT.properties | 167 ------ .../main/resources/messages_ro_RO.properties | 167 ------ .../main/resources/messages_ru_RU.properties | 303 +++------- .../main/resources/messages_sk_SK.properties | 167 ------ .../main/resources/messages_sl_SI.properties | 167 ------ .../resources/messages_sr_LATN_RS.properties | 167 ------ .../main/resources/messages_sv_SE.properties | 167 ------ .../main/resources/messages_th_TH.properties | 167 ------ .../main/resources/messages_tr_TR.properties | 167 ------ .../main/resources/messages_uk_UA.properties | 277 ++------- .../main/resources/messages_vi_VN.properties | 167 ------ .../main/resources/messages_zh_BO.properties | 205 ------- .../main/resources/messages_zh_CN.properties | 307 +++------- .../main/resources/messages_zh_TW.properties | 179 +----- .../src}/main/resources/settings.yml.template | 11 +- .../resources/static/3rdPartyLicenses.json | 242 ++++---- .../static/android-chrome-192x192.png | Bin .../static/android-chrome-512x512.png | Bin .../resources/static/apple-touch-icon.png | Bin .../main/resources/static/browserconfig.xml | 0 .../main/resources/static/css/account.css | 0 .../main/resources/static/css/add-image.css | 0 .../resources/static/css/bootstrap-icons.css | 0 .../static/css/bootstrap-icons.min.css | 0 .../resources/static/css/bootstrap.min.css | 0 .../static/css/bootstrap.min.css.map | 0 .../resources/static/css/cookieconsent.css | 0 .../static/css/cookieconsentCustomisation.css | 0 .../main/resources/static/css/dragdrop.css | 0 .../src}/main/resources/static/css/error.css | 0 .../main/resources/static/css/errorBanner.css | 0 .../main/resources/static/css/fileSelect.css | 0 .../static/css/fonts/bootstrap-icons.woff | Bin .../static/css/fonts/bootstrap-icons.woff2 | Bin .../src}/main/resources/static/css/footer.css | 0 .../src}/main/resources/static/css/game.css | 0 .../main/resources/static/css/general.css | 0 .../main/resources/static/css/home-legacy.css | 229 ++++++++ .../src}/main/resources/static/css/home.css | 0 .../resources/static/css/imageHighlighter.css | 0 .../main/resources/static/css/licenses.css | 0 .../src}/main/resources/static/css/login.css | 0 .../src}/main/resources/static/css/merge.css | 0 .../main/resources/static/css/multi-tool.css | 0 .../src}/main/resources/static/css/navbar.css | 0 .../main/resources/static/css/pdfActions.css | 0 .../main/resources/static/css/pipeline.css | 0 .../src}/main/resources/static/css/prism.css | 0 .../resources/static/css/rainbow-mode.css | 0 .../src}/main/resources/static/css/redact.css | 0 .../main/resources/static/css/removeImage.css | 0 .../main/resources/static/css/rotate-pdf.css | 0 .../src}/main/resources/static/css/sign.css | 0 .../static/css/split-pdf-by-sections.css | 0 .../src}/main/resources/static/css/stamp.css | 0 .../resources/static/css/tab-container.css | 0 .../static/css/theme/componentes.css | 0 .../main/resources/static/css/theme/font.css | 0 .../main/resources/static/css/theme/theme.css | 0 .../resources/static/css/theme/theme.dark.css | 0 .../static/css/theme/theme.light.css | 0 .../src}/main/resources/static/css/usage.css | 0 .../main/resources/static/favicon-16x16.png | Bin .../main/resources/static/favicon-32x32.png | Bin .../src}/main/resources/static/favicon.icns | Bin .../src}/main/resources/static/favicon.ico | Bin .../src}/main/resources/static/favicon.png | Bin .../src}/main/resources/static/favicon.svg | 0 ...o Splitter Divider (with instructions).pdf | Bin .../resources/static/files/popularity.txt | 0 .../static/fonts/Arimo-Regular.woff2 | Bin .../static/fonts/DancingScript-Regular.woff2 | Bin .../main/resources/static/fonts/Estonia.woff2 | Bin .../static/fonts/IndieFlower-Regular.woff2 | Bin .../main/resources/static/fonts/Meiryo.ttf | Bin .../static/fonts/NotoSans-Regular.ttf | Bin .../static/fonts/NotoSansArabic-Regular.ttf | Bin .../static/fonts/NotoSansJP-Regular.ttf | Bin .../static/fonts/NotoSansSC-Regular.ttf | Bin .../main/resources/static/fonts/SimSun.ttf | Bin .../resources/static/fonts/Tangerine.woff2 | Bin .../static/fonts/Tinos-Regular.woff2 | Bin .../static/fonts/google-symbol.woff2 | Bin .../main/resources/static/fonts/malgun.ttf | Bin .../fonts/static/NotoSansArabic-Regular.ttf | Bin .../fonts/static/NotoSansJP-Regular.ttf | Bin .../main/resources/static/images/Files.svg | 0 .../static/images/arrow-right-short.svg | 0 .../main/resources/static/images/book.svg | 0 .../resources/static/images/clipboard.svg | 0 .../main/resources/static/images/discord.svg | 0 .../main/resources/static/images/docker.svg | 0 .../static/images/file-earmark-pdf.svg | 0 .../main/resources/static/images/github.svg | 0 .../resources/static/images/google-drive.svg | 0 .../resources/static/images/redact-auto.svg | 0 .../resources/static/images/redact-manual.svg | 0 .../main/resources/static/images/rename.svg | 0 .../resources/static/images/signature.png | Bin .../resources/static/images/split-auto.svg | 0 .../static/images/split-chapters.svg | 0 .../resources/static/images/split-size.svg | 0 .../main/resources/static/images/update.svg | 0 .../main/resources/static/js/DecryptFiles.js | 0 .../resources/static/js/cacheFormInputs.js | 0 .../main/resources/static/js/compare/diff.js | 0 .../resources/static/js/compare/pdfWorker.js | 0 .../src}/main/resources/static/js/csrf.js | 0 .../src}/main/resources/static/js/darkmode.js | 0 .../src}/main/resources/static/js/download.js | 0 .../main/resources/static/js/downloader.js | 0 .../resources/static/js/draggable-utils.js | 0 .../main/resources/static/js/errorBanner.js | 0 .../main/resources/static/js/favourites.js | 6 +- .../main/resources/static/js/fetch-utils.js | 0 .../resources/static/js/file-icon-factory.js | 0 .../main/resources/static/js/file-utils.js | 0 .../main/resources/static/js/fileInput.js | 0 .../src}/main/resources/static/js/game.js | 0 .../main/resources/static/js/githubVersion.js | 0 .../resources/static/js/googleFilePicker.js | 0 .../resources/static/js/homecard-legacy.js | 266 +++++++++ .../src}/main/resources/static/js/homecard.js | 0 .../resources/static/js/languageSelection.js | 0 .../static/js/local-pdf-input-download.js | 0 .../src}/main/resources/static/js/merge.js | 0 .../static/js/multitool/DragDropManager.js | 0 .../static/js/multitool/ImageHighlighter.js | 0 .../static/js/multitool/PdfActionsManager.js | 0 .../static/js/multitool/PdfContainer.js | 0 .../static/js/multitool/UndoManager.js | 0 .../static/js/multitool/commands/add-page.js | 0 .../static/js/multitool/commands/command.js | 0 .../multitool/commands/commands-sequence.js | 0 .../js/multitool/commands/delete-page.js | 0 .../static/js/multitool/commands/move-page.js | 0 .../js/multitool/commands/page-break.js | 0 .../static/js/multitool/commands/remove.js | 0 .../static/js/multitool/commands/rotate.js | 0 .../static/js/multitool/commands/select.js | 0 .../static/js/multitool/commands/split.js | 0 .../src}/main/resources/static/js/navbar.js | 0 .../resources/static/js/pages/add-image.js | 0 .../static/js/pages/adjust-contrast.js | 0 .../static/js/pages/change-metadata.js | 0 .../main/resources/static/js/pages/crop.js | 0 .../main/resources/static/js/pages/home.js | 4 + .../resources/static/js/pages/pdf-to-csv.js | 0 .../main/resources/static/js/pages/sign.js | 0 .../src}/main/resources/static/js/pipeline.js | 0 .../src}/main/resources/static/js/redact.js | 0 .../src}/main/resources/static/js/search.js | 0 .../src}/main/resources/static/js/settings.js | 0 .../static/js/sign/signature-canvas.js | 0 .../main/resources/static/js/tab-container.js | 0 .../static/js/thirdParty/bootstrap.min.js | 0 .../static/js/thirdParty/bootstrap.min.js.map | 0 .../static/js/thirdParty/chart.umd.min.js | 0 .../js/thirdParty/cookieconsent-config.js | 0 .../static/js/thirdParty/cookieconsent.umd.js | 0 .../thirdParty/fontfaceobserver.standalone.js | 0 .../static/js/thirdParty/interact.min.js | 0 .../static/js/thirdParty/interact.min.js.map | 0 .../static/js/thirdParty/jquery.min.js | 0 .../js/thirdParty/jquery.validate.min.js | 0 .../static/js/thirdParty/jszip.min.js | 0 .../static/js/thirdParty/pdf-lib.min.js | 0 .../static/js/thirdParty/pdf-lib.min.js.map | 0 .../static/js/thirdParty/popper.min.js | 0 .../static/js/thirdParty/popper.min.js.map | 0 .../resources/static/js/thirdParty/prism.js | 0 .../js/thirdParty/signature_pad.umd.min.js | 0 .../thirdParty/signature_pad.umd.min.js.map | 0 .../src}/main/resources/static/js/usage.js | 0 .../src}/main/resources/static/js/uuid.js | 0 .../src}/main/resources/static/manifest.json | 0 .../src}/main/resources/static/moon.svg | 0 .../main/resources/static/mstile-144x144.png | Bin .../main/resources/static/mstile-150x150.png | Bin .../main/resources/static/mstile-310x150.png | Bin .../main/resources/static/mstile-310x310.png | Bin .../main/resources/static/mstile-70x70.png | Bin .../static/pdfjs-legacy/cmaps/78-EUC-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/78-EUC-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/78-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/78-RKSJ-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/78-RKSJ-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/78-V.bcmap | Bin .../pdfjs-legacy/cmaps/78ms-RKSJ-H.bcmap | Bin .../pdfjs-legacy/cmaps/78ms-RKSJ-V.bcmap | Bin .../pdfjs-legacy/cmaps/83pv-RKSJ-H.bcmap | Bin .../pdfjs-legacy/cmaps/90ms-RKSJ-H.bcmap | Bin .../pdfjs-legacy/cmaps/90ms-RKSJ-V.bcmap | Bin .../pdfjs-legacy/cmaps/90msp-RKSJ-H.bcmap | Bin .../pdfjs-legacy/cmaps/90msp-RKSJ-V.bcmap | Bin .../pdfjs-legacy/cmaps/90pv-RKSJ-H.bcmap | Bin .../pdfjs-legacy/cmaps/90pv-RKSJ-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/Add-H.bcmap | Bin .../pdfjs-legacy/cmaps/Add-RKSJ-H.bcmap | Bin .../pdfjs-legacy/cmaps/Add-RKSJ-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/Add-V.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-CNS1-0.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-CNS1-1.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-CNS1-2.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-CNS1-3.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-CNS1-4.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-CNS1-5.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-CNS1-6.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-CNS1-UCS2.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-GB1-0.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-GB1-1.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-GB1-2.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-GB1-3.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-GB1-4.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-GB1-5.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-GB1-UCS2.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-Japan1-0.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-Japan1-1.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-Japan1-2.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-Japan1-3.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-Japan1-4.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-Japan1-5.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-Japan1-6.bcmap | Bin .../cmaps/Adobe-Japan1-UCS2.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-Korea1-0.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-Korea1-1.bcmap | Bin .../pdfjs-legacy/cmaps/Adobe-Korea1-2.bcmap | Bin .../cmaps/Adobe-Korea1-UCS2.bcmap | Bin .../static/pdfjs-legacy/cmaps/B5-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/B5-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/B5pc-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/B5pc-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/CNS-EUC-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/CNS-EUC-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/CNS1-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/CNS1-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/CNS2-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/CNS2-V.bcmap | 0 .../static/pdfjs-legacy/cmaps/ETHK-B5-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/ETHK-B5-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/ETen-B5-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/ETen-B5-V.bcmap | Bin .../pdfjs-legacy/cmaps/ETenms-B5-H.bcmap | 0 .../pdfjs-legacy/cmaps/ETenms-B5-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/EUC-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/EUC-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/Ext-H.bcmap | Bin .../pdfjs-legacy/cmaps/Ext-RKSJ-H.bcmap | Bin .../pdfjs-legacy/cmaps/Ext-RKSJ-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/Ext-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/GB-EUC-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/GB-EUC-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/GB-H.bcmap | 0 .../static/pdfjs-legacy/cmaps/GB-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/GBK-EUC-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/GBK-EUC-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/GBK2K-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/GBK2K-V.bcmap | Bin .../pdfjs-legacy/cmaps/GBKp-EUC-H.bcmap | Bin .../pdfjs-legacy/cmaps/GBKp-EUC-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/GBT-EUC-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/GBT-EUC-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/GBT-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/GBT-V.bcmap | Bin .../pdfjs-legacy/cmaps/GBTpc-EUC-H.bcmap | Bin .../pdfjs-legacy/cmaps/GBTpc-EUC-V.bcmap | Bin .../pdfjs-legacy/cmaps/GBpc-EUC-H.bcmap | Bin .../pdfjs-legacy/cmaps/GBpc-EUC-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/H.bcmap | Bin .../pdfjs-legacy/cmaps/HKdla-B5-H.bcmap | Bin .../pdfjs-legacy/cmaps/HKdla-B5-V.bcmap | Bin .../pdfjs-legacy/cmaps/HKdlb-B5-H.bcmap | Bin .../pdfjs-legacy/cmaps/HKdlb-B5-V.bcmap | Bin .../pdfjs-legacy/cmaps/HKgccs-B5-H.bcmap | Bin .../pdfjs-legacy/cmaps/HKgccs-B5-V.bcmap | Bin .../pdfjs-legacy/cmaps/HKm314-B5-H.bcmap | Bin .../pdfjs-legacy/cmaps/HKm314-B5-V.bcmap | Bin .../pdfjs-legacy/cmaps/HKm471-B5-H.bcmap | Bin .../pdfjs-legacy/cmaps/HKm471-B5-V.bcmap | Bin .../pdfjs-legacy/cmaps/HKscs-B5-H.bcmap | Bin .../pdfjs-legacy/cmaps/HKscs-B5-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/Hankaku.bcmap | Bin .../static/pdfjs-legacy/cmaps/Hiragana.bcmap | Bin .../static/pdfjs-legacy/cmaps/KSC-EUC-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/KSC-EUC-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/KSC-H.bcmap | Bin .../pdfjs-legacy/cmaps/KSC-Johab-H.bcmap | Bin .../pdfjs-legacy/cmaps/KSC-Johab-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/KSC-V.bcmap | Bin .../pdfjs-legacy/cmaps/KSCms-UHC-H.bcmap | Bin .../pdfjs-legacy/cmaps/KSCms-UHC-HW-H.bcmap | Bin .../pdfjs-legacy/cmaps/KSCms-UHC-HW-V.bcmap | Bin .../pdfjs-legacy/cmaps/KSCms-UHC-V.bcmap | Bin .../pdfjs-legacy/cmaps/KSCpc-EUC-H.bcmap | Bin .../pdfjs-legacy/cmaps/KSCpc-EUC-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/Katakana.bcmap | Bin .../static/pdfjs-legacy/cmaps/LICENSE | 0 .../static/pdfjs-legacy/cmaps/NWP-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/NWP-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/RKSJ-H.bcmap | Bin .../static/pdfjs-legacy/cmaps/RKSJ-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/Roman.bcmap | Bin .../pdfjs-legacy/cmaps/UniCNS-UCS2-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniCNS-UCS2-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniCNS-UTF16-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniCNS-UTF16-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniCNS-UTF32-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniCNS-UTF32-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniCNS-UTF8-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniCNS-UTF8-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniGB-UCS2-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniGB-UCS2-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniGB-UTF16-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniGB-UTF16-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniGB-UTF32-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniGB-UTF32-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniGB-UTF8-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniGB-UTF8-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniJIS-UCS2-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniJIS-UCS2-HW-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniJIS-UCS2-HW-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniJIS-UCS2-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniJIS-UTF16-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniJIS-UTF16-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniJIS-UTF32-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniJIS-UTF32-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniJIS-UTF8-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniJIS-UTF8-V.bcmap | Bin .../cmaps/UniJIS2004-UTF16-H.bcmap | Bin .../cmaps/UniJIS2004-UTF16-V.bcmap | Bin .../cmaps/UniJIS2004-UTF32-H.bcmap | Bin .../cmaps/UniJIS2004-UTF32-V.bcmap | Bin .../cmaps/UniJIS2004-UTF8-H.bcmap | Bin .../cmaps/UniJIS2004-UTF8-V.bcmap | Bin .../cmaps/UniJISPro-UCS2-HW-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniJISPro-UCS2-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniJISPro-UTF8-V.bcmap | Bin .../cmaps/UniJISX0213-UTF32-H.bcmap | Bin .../cmaps/UniJISX0213-UTF32-V.bcmap | Bin .../cmaps/UniJISX02132004-UTF32-H.bcmap | Bin .../cmaps/UniJISX02132004-UTF32-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniKS-UCS2-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniKS-UCS2-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniKS-UTF16-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniKS-UTF16-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniKS-UTF32-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniKS-UTF32-V.bcmap | Bin .../pdfjs-legacy/cmaps/UniKS-UTF8-H.bcmap | Bin .../pdfjs-legacy/cmaps/UniKS-UTF8-V.bcmap | Bin .../static/pdfjs-legacy/cmaps/V.bcmap | Bin .../static/pdfjs-legacy/cmaps/WP-Symbol.bcmap | Bin .../static/pdfjs-legacy/css/debugger.css | 0 .../static/pdfjs-legacy/css/viewer-redact.css | 0 .../static/pdfjs-legacy/css/viewer.css | 0 .../static/pdfjs-legacy/example/Welcome.pdf | Bin .../pdfjs-legacy/example/Welcome_old.pdf | Bin .../pdfjs-legacy/images/altText_add.svg | 0 .../pdfjs-legacy/images/altText_done.svg | 0 .../pdfjs-legacy/images/annotation-check.svg | 0 .../images/annotation-comment.svg | 0 .../pdfjs-legacy/images/annotation-help.svg | 0 .../pdfjs-legacy/images/annotation-insert.svg | 0 .../pdfjs-legacy/images/annotation-key.svg | 0 .../images/annotation-newparagraph.svg | 0 .../pdfjs-legacy/images/annotation-noicon.svg | 0 .../pdfjs-legacy/images/annotation-note.svg | 0 .../images/annotation-paperclip.svg | 0 .../images/annotation-paragraph.svg | 0 .../images/annotation-pushpin.svg | 0 .../images/cursor-editorFreeHighlight.svg | 0 .../images/cursor-editorFreeText.svg | 0 .../pdfjs-legacy/images/cursor-editorInk.svg | 0 .../images/cursor-editorTextHighlight.svg | 0 .../images/editor-toolbar-delete.svg | 0 .../images/findbarButton-next.svg | 0 .../images/findbarButton-previous.svg | 0 .../images/gv-toolbarButton-download.svg | 0 .../pdfjs-legacy/images/loading-icon.gif | Bin .../static/pdfjs-legacy/images/loading.svg | 0 ...ondaryToolbarButton-documentProperties.svg | 0 .../secondaryToolbarButton-firstPage.svg | 0 .../secondaryToolbarButton-handTool.svg | 0 .../secondaryToolbarButton-lastPage.svg | 0 .../secondaryToolbarButton-rotateCcw.svg | 0 .../secondaryToolbarButton-rotateCw.svg | 0 ...econdaryToolbarButton-scrollHorizontal.svg | 0 .../secondaryToolbarButton-scrollPage.svg | 0 .../secondaryToolbarButton-scrollVertical.svg | 0 .../secondaryToolbarButton-scrollWrapped.svg | 0 .../secondaryToolbarButton-selectTool.svg | 0 .../secondaryToolbarButton-spreadEven.svg | 0 .../secondaryToolbarButton-spreadNone.svg | 0 .../secondaryToolbarButton-spreadOdd.svg | 0 .../images/toolbarButton-bookmark.svg | 0 .../toolbarButton-currentOutlineItem.svg | 0 .../images/toolbarButton-download.svg | 0 .../images/toolbarButton-editorFreeText.svg | 0 .../images/toolbarButton-editorHighlight.svg | 0 .../images/toolbarButton-editorInk.svg | 0 .../images/toolbarButton-editorStamp.svg | 0 .../images/toolbarButton-home.svg | 0 .../images/toolbarButton-menuArrow.svg | 0 .../images/toolbarButton-openFile.svg | 0 .../images/toolbarButton-pageDown.svg | 0 .../images/toolbarButton-pageUp.svg | 0 .../images/toolbarButton-presentationMode.svg | 0 .../images/toolbarButton-print.svg | 0 .../images/toolbarButton-search.svg | 0 .../toolbarButton-secondaryToolbarToggle.svg | 0 .../images/toolbarButton-sidebarToggle.svg | 0 .../images/toolbarButton-viewAttachments.svg | 0 .../images/toolbarButton-viewLayers.svg | 0 .../images/toolbarButton-viewOutline.svg | 0 .../images/toolbarButton-viewThumbnail.svg | 0 .../images/toolbarButton-zoomIn.svg | 0 .../images/toolbarButton-zoomOut.svg | 0 .../images/treeitem-collapsed.svg | 0 .../pdfjs-legacy/images/treeitem-expanded.svg | 0 .../static/pdfjs-legacy/js/viewer.mjs | 0 .../static/pdfjs-legacy/js/viewer.mjs.map | 0 .../static/pdfjs-legacy/locale/ach/viewer.ftl | 0 .../static/pdfjs-legacy/locale/af/viewer.ftl | 0 .../static/pdfjs-legacy/locale/an/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ar/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ast/viewer.ftl | 0 .../static/pdfjs-legacy/locale/az/viewer.ftl | 0 .../static/pdfjs-legacy/locale/be/viewer.ftl | 0 .../static/pdfjs-legacy/locale/bg/viewer.ftl | 0 .../static/pdfjs-legacy/locale/bn/viewer.ftl | 0 .../static/pdfjs-legacy/locale/bo/viewer.ftl | 0 .../static/pdfjs-legacy/locale/br/viewer.ftl | 0 .../static/pdfjs-legacy/locale/brx/viewer.ftl | 0 .../static/pdfjs-legacy/locale/bs/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ca/viewer.ftl | 0 .../static/pdfjs-legacy/locale/cak/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ckb/viewer.ftl | 0 .../static/pdfjs-legacy/locale/cs/viewer.ftl | 0 .../static/pdfjs-legacy/locale/cy/viewer.ftl | 0 .../static/pdfjs-legacy/locale/da/viewer.ftl | 0 .../static/pdfjs-legacy/locale/de/viewer.ftl | 0 .../static/pdfjs-legacy/locale/dsb/viewer.ftl | 0 .../static/pdfjs-legacy/locale/el/viewer.ftl | 0 .../pdfjs-legacy/locale/en-CA/viewer.ftl | 0 .../pdfjs-legacy/locale/en-GB/viewer.ftl | 0 .../pdfjs-legacy/locale/en-US/viewer.ftl | 0 .../static/pdfjs-legacy/locale/eo/viewer.ftl | 0 .../pdfjs-legacy/locale/es-AR/viewer.ftl | 0 .../pdfjs-legacy/locale/es-CL/viewer.ftl | 0 .../pdfjs-legacy/locale/es-ES/viewer.ftl | 0 .../pdfjs-legacy/locale/es-MX/viewer.ftl | 0 .../static/pdfjs-legacy/locale/et/viewer.ftl | 0 .../static/pdfjs-legacy/locale/eu/viewer.ftl | 0 .../static/pdfjs-legacy/locale/fa/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ff/viewer.ftl | 0 .../static/pdfjs-legacy/locale/fi/viewer.ftl | 0 .../static/pdfjs-legacy/locale/fr/viewer.ftl | 0 .../static/pdfjs-legacy/locale/fur/viewer.ftl | 0 .../pdfjs-legacy/locale/fy-NL/viewer.ftl | 0 .../pdfjs-legacy/locale/ga-IE/viewer.ftl | 0 .../static/pdfjs-legacy/locale/gd/viewer.ftl | 0 .../static/pdfjs-legacy/locale/gl/viewer.ftl | 0 .../static/pdfjs-legacy/locale/gn/viewer.ftl | 0 .../pdfjs-legacy/locale/gu-IN/viewer.ftl | 0 .../static/pdfjs-legacy/locale/he/viewer.ftl | 0 .../pdfjs-legacy/locale/hi-IN/viewer.ftl | 0 .../static/pdfjs-legacy/locale/hr/viewer.ftl | 0 .../static/pdfjs-legacy/locale/hsb/viewer.ftl | 0 .../static/pdfjs-legacy/locale/hu/viewer.ftl | 0 .../pdfjs-legacy/locale/hy-AM/viewer.ftl | 0 .../static/pdfjs-legacy/locale/hye/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ia/viewer.ftl | 0 .../static/pdfjs-legacy/locale/id/viewer.ftl | 0 .../static/pdfjs-legacy/locale/is/viewer.ftl | 0 .../static/pdfjs-legacy/locale/it/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ja/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ka/viewer.ftl | 0 .../static/pdfjs-legacy/locale/kab/viewer.ftl | 0 .../static/pdfjs-legacy/locale/kk/viewer.ftl | 0 .../static/pdfjs-legacy/locale/km/viewer.ftl | 0 .../static/pdfjs-legacy/locale/kn/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ko/viewer.ftl | 0 .../static/pdfjs-legacy/locale/lij/viewer.ftl | 0 .../static/pdfjs-legacy/locale/lo/viewer.ftl | 0 .../static/pdfjs-legacy/locale/locale.json | 0 .../static/pdfjs-legacy/locale/lt/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ltg/viewer.ftl | 0 .../static/pdfjs-legacy/locale/lv/viewer.ftl | 0 .../static/pdfjs-legacy/locale/meh/viewer.ftl | 0 .../static/pdfjs-legacy/locale/mk/viewer.ftl | 0 .../static/pdfjs-legacy/locale/mr/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ms/viewer.ftl | 0 .../static/pdfjs-legacy/locale/my/viewer.ftl | 0 .../pdfjs-legacy/locale/nb-NO/viewer.ftl | 0 .../pdfjs-legacy/locale/ne-NP/viewer.ftl | 0 .../static/pdfjs-legacy/locale/nl/viewer.ftl | 0 .../pdfjs-legacy/locale/nn-NO/viewer.ftl | 0 .../static/pdfjs-legacy/locale/oc/viewer.ftl | 0 .../pdfjs-legacy/locale/pa-IN/viewer.ftl | 0 .../static/pdfjs-legacy/locale/pl/viewer.ftl | 0 .../pdfjs-legacy/locale/pt-BR/viewer.ftl | 0 .../pdfjs-legacy/locale/pt-PT/viewer.ftl | 0 .../static/pdfjs-legacy/locale/rm/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ro/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ru/viewer.ftl | 0 .../static/pdfjs-legacy/locale/sat/viewer.ftl | 0 .../static/pdfjs-legacy/locale/sc/viewer.ftl | 0 .../static/pdfjs-legacy/locale/scn/viewer.ftl | 0 .../static/pdfjs-legacy/locale/sco/viewer.ftl | 0 .../static/pdfjs-legacy/locale/si/viewer.ftl | 0 .../static/pdfjs-legacy/locale/sk/viewer.ftl | 0 .../static/pdfjs-legacy/locale/skr/viewer.ftl | 0 .../static/pdfjs-legacy/locale/sl/viewer.ftl | 0 .../static/pdfjs-legacy/locale/son/viewer.ftl | 0 .../static/pdfjs-legacy/locale/sq/viewer.ftl | 0 .../static/pdfjs-legacy/locale/sr/viewer.ftl | 0 .../pdfjs-legacy/locale/sv-SE/viewer.ftl | 0 .../static/pdfjs-legacy/locale/szl/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ta/viewer.ftl | 0 .../static/pdfjs-legacy/locale/te/viewer.ftl | 0 .../static/pdfjs-legacy/locale/tg/viewer.ftl | 0 .../static/pdfjs-legacy/locale/th/viewer.ftl | 0 .../static/pdfjs-legacy/locale/tl/viewer.ftl | 0 .../static/pdfjs-legacy/locale/tr/viewer.ftl | 0 .../static/pdfjs-legacy/locale/trs/viewer.ftl | 0 .../static/pdfjs-legacy/locale/uk/viewer.ftl | 0 .../static/pdfjs-legacy/locale/ur/viewer.ftl | 0 .../static/pdfjs-legacy/locale/uz/viewer.ftl | 0 .../static/pdfjs-legacy/locale/vi/viewer.ftl | 0 .../static/pdfjs-legacy/locale/wo/viewer.ftl | 0 .../static/pdfjs-legacy/locale/xh/viewer.ftl | 0 .../pdfjs-legacy/locale/zh-CN/viewer.ftl | 0 .../pdfjs-legacy/locale/zh-TW/viewer.ftl | 0 .../resources/static/pdfjs-legacy/pdf.mjs | 0 .../resources/static/pdfjs-legacy/pdf.mjs.map | 0 .../static/pdfjs-legacy/pdf.sandbox.mjs | 0 .../static/pdfjs-legacy/pdf.sandbox.mjs.map | 0 .../static/pdfjs-legacy/pdf.worker.entry.js | 0 .../static/pdfjs-legacy/pdf.worker.mjs | 0 .../static/pdfjs-legacy/pdf.worker.mjs.map | 0 .../standard_fonts/FoxitDingbats.pfb | Bin .../standard_fonts/FoxitFixed.pfb | Bin .../standard_fonts/FoxitFixedBold.pfb | Bin .../standard_fonts/FoxitFixedBoldItalic.pfb | Bin .../standard_fonts/FoxitFixedItalic.pfb | Bin .../standard_fonts/FoxitSerif.pfb | Bin .../standard_fonts/FoxitSerifBold.pfb | Bin .../standard_fonts/FoxitSerifBoldItalic.pfb | Bin .../standard_fonts/FoxitSerifItalic.pfb | Bin .../standard_fonts/FoxitSymbol.pfb | Bin .../pdfjs-legacy/standard_fonts/LICENSE_FOXIT | 0 .../standard_fonts/LICENSE_LIBERATION | 0 .../standard_fonts/LiberationSans-Bold.ttf | Bin .../LiberationSans-BoldItalic.ttf | Bin .../standard_fonts/LiberationSans-Italic.ttf | Bin .../standard_fonts/LiberationSans-Regular.ttf | Bin .../src}/main/resources/static/rainbow.svg | 0 .../resources/static/safari-pinned-tab.svg | 0 .../main/resources/static/site.webmanifest | 0 .../src}/main/resources/static/sun.svg | 0 .../src}/main/resources/templates/about.html | 0 .../main/resources/templates/account.html | 0 .../resources/templates/adminSettings.html | 0 .../resources/templates/auto-split-pdf.html | 0 .../resources/templates/change-creds.html | 0 .../templates/convert/eml-to-pdf.html | 0 .../templates/convert/file-to-pdf.html | 0 .../templates/convert/html-to-pdf.html | 0 .../templates/convert/img-to-pdf.html | 0 .../templates/convert/markdown-to-pdf.html | 0 .../templates/convert/pdf-to-csv.html | 0 .../templates/convert/pdf-to-html.html | 0 .../templates/convert/pdf-to-img.html | 0 .../templates/convert/pdf-to-markdown.html | 0 .../templates/convert/pdf-to-pdfa.html | 0 .../convert/pdf-to-presentation.html | 0 .../templates/convert/pdf-to-text.html | 0 .../templates/convert/pdf-to-word.html | 0 .../templates/convert/pdf-to-xml.html | 0 .../templates/convert/url-to-pdf.html | 0 .../src}/main/resources/templates/crop.html | 0 .../main/resources/templates/database.html | 0 .../src}/main/resources/templates/error.html | 0 .../resources/templates/extract-page.html | 0 .../resources/templates/fragments/card.html | 0 .../resources/templates/fragments/common.html | 1 - .../templates/fragments/errorBanner.html | 0 .../fragments/errorBannerPerPage.html | 0 .../fragments/featureGroupHeader.html | 0 .../fragments/featureGroupHeaderLegacy.html | 6 + .../resources/templates/fragments/footer.html | 0 .../templates/fragments/languageEntry.html | 0 .../templates/fragments/languages.html | 0 .../templates/fragments/multi-toolAdvert.html | 0 .../templates/fragments/navElements.html | 0 .../resources/templates/fragments/navbar.html | 0 .../templates/fragments/navbarEntry.html | 14 +- .../fragments/navbarEntryCustom.html | 0 .../main/resources/templates/home-legacy.html | 528 ++++++++++++++++++ .../src}/main/resources/templates/home.html | 0 .../main/resources/templates/licenses.html | 0 .../src}/main/resources/templates/login.html | 0 .../main/resources/templates/merge-pdfs.html | 0 .../resources/templates/misc/add-image.html | 0 .../templates/misc/add-page-numbers.html | 0 .../templates/misc/adjust-contrast.html | 0 .../resources/templates/misc/auto-crop.html | 0 .../resources/templates/misc/auto-rename.html | 0 .../templates/misc/change-metadata.html | 0 .../resources/templates/misc/compare.html | 0 .../templates/misc/compress-pdf.html | 0 .../templates/misc/extract-image-scans.html | 0 .../templates/misc/extract-images.html | 0 .../resources/templates/misc/fake-scan.html | 0 .../resources/templates/misc/flatten.html | 0 .../resources/templates/misc/ocr-pdf.html | 0 .../resources/templates/misc/print-file.html | 0 .../templates/misc/remove-annotations.html | 0 .../templates/misc/remove-blanks.html | 0 .../main/resources/templates/misc/repair.html | 0 .../templates/misc/replace-color.html | 0 .../templates/misc/show-javascript.html | 0 .../main/resources/templates/misc/stamp.html | 0 .../templates/misc/unlock-pdf-forms.html | 0 .../templates/multi-page-layout.html | 0 .../main/resources/templates/multi-tool.html | 0 .../main/resources/templates/overlay-pdf.html | 0 .../resources/templates/pdf-organizer.html | 0 .../templates/pdf-to-single-page.html | 0 .../main/resources/templates/pipeline.html | 0 .../main/resources/templates/releases.html | 0 .../resources/templates/remove-image-pdf.html | 0 .../resources/templates/remove-pages.html | 0 .../main/resources/templates/rotate-pdf.html | 0 .../main/resources/templates/scale-pages.html | 0 .../templates/security/add-password.html | 0 .../templates/security/add-watermark.html | 0 .../templates/security/auto-redact.html | 0 .../templates/security/cert-sign.html | 0 .../security/change-permissions.html | 0 .../templates/security/get-info-on-pdf.html | 0 .../resources/templates/security/redact.html | 0 .../templates/security/remove-cert-sign.html | 0 .../templates/security/remove-password.html | 0 .../templates/security/remove-watermark.html | 0 .../templates/security/sanitize-pdf.html | 0 .../security/validate-signature.html | 0 .../src}/main/resources/templates/sign.html | 0 .../templates/split-by-size-or-count.html | 0 .../templates/split-pdf-by-chapters.html | 0 .../templates/split-pdf-by-sections.html | 0 .../main/resources/templates/split-pdfs.html | 0 .../src}/main/resources/templates/usage.html | 0 .../main/resources/templates/view-pdf.html | 0 .../software/SPDF/SPDFApplicationTest.java | 0 .../api/RearrangePagesPDFControllerTest.java | 0 .../api/RotationControllerTest.java | 0 .../converters/ConvertWebsiteToPdfTest.java | 0 .../api/pipeline/PipelineProcessorTest.java | 19 +- .../web/UploadLimitServiceTest.java | 0 .../CertificateValidationServiceTest.java | 0 .../service/LanguageServiceBasicTest.java | 0 .../SPDF/service/LanguageServiceTest.java | 0 .../service/PdfImageRemovalServiceTest.java | 0 .../service/PdfMetadataServiceBasicTest.java | 0 .../SPDF/service/PdfMetadataServiceTest.java | 0 .../SPDF/service/SignatureServiceTest.java | 2 +- testing/test.sh | 2 +- 921 files changed, 2480 insertions(+), 7648 deletions(-) create mode 100644 common/src/main/java/stirling/software/common/util/ValidationUtil.java rename {src/main/java/stirling/software/SPDF/EE => proprietary/src/main/java/stirling/software/proprietary/security/configuration/ee}/EEAppConfig.java (95%) rename {src/main/java/stirling/software/SPDF/EE => proprietary/src/main/java/stirling/software/proprietary/security/configuration/ee}/KeygenLicenseVerifier.java (99%) rename {src/main/java/stirling/software/SPDF/EE => proprietary/src/main/java/stirling/software/proprietary/security/configuration/ee}/LicenseKeyChecker.java (95%) rename {src/test/java/stirling/software/SPDF/EE => proprietary/src/test/java/stirling/software/proprietary/security/configuration/ee}/LicenseKeyCheckerTest.java (87%) delete mode 100644 src/main/java/stirling/software/SPDF/model/api/Email.java delete mode 100644 src/main/java/stirling/software/SPDF/model/api/GeneralFile.java delete mode 100644 src/main/java/stirling/software/SPDF/model/api/converters/ConvertToImageRequest.java delete mode 100644 src/main/java/stirling/software/SPDF/model/api/general/OverlayPdfsRequest.java delete mode 100644 src/main/java/stirling/software/SPDF/model/api/misc/AddStampRequest.java delete mode 100644 src/main/java/stirling/software/SPDF/model/api/misc/MetadataRequest.java delete mode 100644 src/main/java/stirling/software/SPDF/model/api/security/RedactPdfRequest.java delete mode 100644 src/main/java/stirling/software/SPDF/model/api/security/RedactionArea.java delete mode 100644 src/main/java/stirling/software/SPDF/model/api/security/SanitizePdfRequest.java delete mode 100644 src/main/java/stirling/software/SPDF/model/api/user/UpdateUserDetails.java delete mode 100644 src/main/java/stirling/software/SPDF/model/api/user/UpdateUserUsername.java delete mode 100644 src/main/java/stirling/software/SPDF/model/api/user/Username.java delete mode 100644 src/main/java/stirling/software/SPDF/model/api/user/UsernameAndPass.java create mode 100644 stirling-pdf/.gitignore create mode 100644 stirling-pdf/build.gradle rename {src => stirling-pdf/src}/main/java/org/apache/pdfbox/examples/signature/CMSProcessableInputStream.java (100%) rename {src => stirling-pdf/src}/main/java/org/apache/pdfbox/examples/signature/CreateSignatureBase.java (100%) rename {src => stirling-pdf/src}/main/java/org/apache/pdfbox/examples/signature/TSAClient.java (100%) rename {src => stirling-pdf/src}/main/java/org/apache/pdfbox/examples/signature/ValidationTimeStamp.java (100%) rename {src => stirling-pdf/src}/main/java/org/apache/pdfbox/examples/util/ConnectedInputStream.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/Factories/ReplaceAndInvertColorFactory.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/LibreOfficeListener.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/SPDFApplication.java (91%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/UI/WebBrowser.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/UI/impl/DesktopBrowser.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/UI/impl/LoadingWindow.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/AppUpdateService.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/CleanUrlInterceptor.java (75%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/EndpointConfiguration.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/EndpointInspector.java (96%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/EndpointInterceptor.java (93%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/ExternalAppDepConfig.java (75%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/InitialSetup.java (98%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/LocaleConfiguration.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/LogbackPropertyLoader.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/MetricsConfig.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/MetricsFilter.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/OpenApiConfig.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/StartupApplicationListener.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/WebMvcConfig.java (76%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/fingerprint/FingerprintBasedSessionFilter.java (97%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/fingerprint/FingerprintBasedSessionManager.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/config/fingerprint/FingerprintGenerator.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/AdditionalLanguageJsController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/AnalysisController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/CropController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/MergeController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/PdfImageRemovalController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/PdfOverlayController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/RotationController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/ScalePagesController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/SettingsController.java (90%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/SplitPdfByChaptersController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/ToSinglePageController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/converters/ConvertEmlToPDF.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java (98%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToHtml.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToOffice.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToPDFA.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/converters/ExtractCSVController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/filters/FilterController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/CompressController.java (99%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/DecompressPdfController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/FakeScanController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/FlattenController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/PageNumbersController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/PrintFileController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/RepairController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/ReplaceAndInvertColorController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/StampController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/misc/UnlockPDFFormsController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineDirectoryProcessor.java (99%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessor.java (99%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/security/GetInfoOnPDF.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/security/PasswordController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/security/RedactController.java (98%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/security/RemoveCertSignController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/security/ValidateSignatureController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/web/ConverterWebController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/web/GeneralWebController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/web/HomeWebController.java (96%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/web/MetricsController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/web/OtherWebController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/web/SecurityWebController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/web/SignatureController.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/controller/web/UploadLimitService.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/ApiEndpoint.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/Dependency.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/PDFText.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/PipelineConfig.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/PipelineOperation.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/PipelineResult.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/SignatureFile.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/SortTypes.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/HandleDataRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/ImageFile.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/MultiplePDFFiles.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/PDFComparison.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/PDFComparisonAndCount.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/PDFExtractImagesRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/PDFWithImageFormatRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/PDFWithPageSize.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/SplitPdfByChaptersRequest.java (99%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/SplitPdfBySectionsRequest.java (99%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/converters/ConvertPDFToMarkdown.java (100%) create mode 100644 stirling-pdf/src/main/java/stirling/software/SPDF/model/api/converters/ConvertToImageRequest.java rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/converters/ConvertToPdfRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/converters/PdfToBookRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/converters/PdfToPdfARequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/converters/PdfToPresentationRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/converters/PdfToTextOrRTFRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/converters/PdfToWordRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/converters/UrlToPdfRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/filter/ContainsTextRequest.java (71%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/filter/FileSizeRequest.java (70%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/filter/PageRotationRequest.java (71%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/filter/PageSizeRequest.java (60%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/general/CropPdfForm.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/general/MergeMultiplePagesRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/general/MergePdfsRequest.java (100%) create mode 100644 stirling-pdf/src/main/java/stirling/software/SPDF/model/api/general/OverlayPdfsRequest.java rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/general/RearrangePagesRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/general/RotatePDFRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/general/ScalePagesRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/general/SplitPdfBySizeOrCountRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/misc/AddPageNumbersRequest.java (100%) create mode 100644 stirling-pdf/src/main/java/stirling/software/SPDF/model/api/misc/AddStampRequest.java rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/misc/AutoSplitPdfRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/misc/ExtractHeaderRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/misc/ExtractImageScansRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/misc/FakeScanRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/misc/FlattenRequest.java (100%) create mode 100644 stirling-pdf/src/main/java/stirling/software/SPDF/model/api/misc/MetadataRequest.java rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/misc/OptimizePdfRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/misc/OverlayImageRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/misc/PrintFileRequest.java (99%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/misc/ProcessPdfWithOcrRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/misc/RemoveBlankPagesRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/misc/ReplaceAndInvertColorRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/security/AddPasswordRequest.java (61%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/security/AddWatermarkRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/security/ManualRedactPdfRequest.java (51%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/security/PDFPasswordRequest.java (100%) create mode 100644 stirling-pdf/src/main/java/stirling/software/SPDF/model/api/security/RedactPdfRequest.java create mode 100644 stirling-pdf/src/main/java/stirling/software/SPDF/model/api/security/SanitizePdfRequest.java rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/security/SignatureValidationRequest.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/model/api/security/SignatureValidationResult.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/pdf/FlexibleCSVWriter.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/pdf/TextFinder.java (100%) rename {src/main/java/stirling/software/SPDF/controller/api/pipeline => stirling-pdf/src/main/java/stirling/software/SPDF/service}/ApiDocService.java (99%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/service/CertificateValidationService.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/service/LanguageService.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/service/MetricsAggregatorService.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/service/PdfImageRemovalService.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/service/SignatureService.java (100%) rename {src => stirling-pdf/src}/main/java/stirling/software/SPDF/service/misc/ReplaceAndInvertColorService.java (100%) rename {src => stirling-pdf/src}/main/resources/application.properties (86%) rename {src => stirling-pdf/src}/main/resources/banner.txt (100%) rename {src => stirling-pdf/src}/main/resources/certdata.txt (100%) rename {src => stirling-pdf/src}/main/resources/logback.xml (97%) rename {src => stirling-pdf/src}/main/resources/messages.properties (100%) rename {src => stirling-pdf/src}/main/resources/messages_ar_AR.properties (95%) rename {src => stirling-pdf/src}/main/resources/messages_az_AZ.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_bg_BG.properties (96%) rename {src => stirling-pdf/src}/main/resources/messages_ca_CA.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_cs_CZ.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_da_DK.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_de_DE.properties (100%) rename {src => stirling-pdf/src}/main/resources/messages_el_GR.properties (100%) rename {src => stirling-pdf/src}/main/resources/messages_en_GB.properties (93%) rename {src => stirling-pdf/src}/main/resources/messages_en_US.properties (93%) rename {src => stirling-pdf/src}/main/resources/messages_es_ES.properties (93%) rename {src => stirling-pdf/src}/main/resources/messages_eu_ES.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_fa_IR.properties (95%) rename {src => stirling-pdf/src}/main/resources/messages_fr_FR.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_ga_IE.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_hi_IN.properties (96%) rename {src => stirling-pdf/src}/main/resources/messages_hr_HR.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_hu_HU.properties (100%) rename {src => stirling-pdf/src}/main/resources/messages_id_ID.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_it_IT.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_ja_JP.properties (100%) rename {src => stirling-pdf/src}/main/resources/messages_ko_KR.properties (94%) rename src/main/resources/messages_ml_IN.properties => stirling-pdf/src/main/resources/messages_ml_ML.properties (97%) rename {src => stirling-pdf/src}/main/resources/messages_nl_NL.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_no_NB.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_pl_PL.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_pt_BR.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_pt_PT.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_ro_RO.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_ru_RU.properties (88%) rename {src => stirling-pdf/src}/main/resources/messages_sk_SK.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_sl_SI.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_sr_LATN_RS.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_sv_SE.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_th_TH.properties (96%) rename {src => stirling-pdf/src}/main/resources/messages_tr_TR.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_uk_UA.properties (89%) rename {src => stirling-pdf/src}/main/resources/messages_vi_VN.properties (94%) rename src/main/resources/messages_bo_CN.properties => stirling-pdf/src/main/resources/messages_zh_BO.properties (94%) rename {src => stirling-pdf/src}/main/resources/messages_zh_CN.properties (86%) rename {src => stirling-pdf/src}/main/resources/messages_zh_TW.properties (93%) rename {src => stirling-pdf/src}/main/resources/settings.yml.template (95%) rename {src => stirling-pdf/src}/main/resources/static/3rdPartyLicenses.json (93%) rename {src => stirling-pdf/src}/main/resources/static/android-chrome-192x192.png (100%) rename {src => stirling-pdf/src}/main/resources/static/android-chrome-512x512.png (100%) rename {src => stirling-pdf/src}/main/resources/static/apple-touch-icon.png (100%) rename {src => stirling-pdf/src}/main/resources/static/browserconfig.xml (100%) rename {src => stirling-pdf/src}/main/resources/static/css/account.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/add-image.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/bootstrap-icons.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/bootstrap-icons.min.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/bootstrap.min.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/bootstrap.min.css.map (100%) rename {src => stirling-pdf/src}/main/resources/static/css/cookieconsent.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/cookieconsentCustomisation.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/dragdrop.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/error.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/errorBanner.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/fileSelect.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/fonts/bootstrap-icons.woff (100%) rename {src => stirling-pdf/src}/main/resources/static/css/fonts/bootstrap-icons.woff2 (100%) rename {src => stirling-pdf/src}/main/resources/static/css/footer.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/game.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/general.css (100%) create mode 100644 stirling-pdf/src/main/resources/static/css/home-legacy.css rename {src => stirling-pdf/src}/main/resources/static/css/home.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/imageHighlighter.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/licenses.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/login.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/merge.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/multi-tool.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/navbar.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/pdfActions.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/pipeline.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/prism.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/rainbow-mode.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/redact.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/removeImage.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/rotate-pdf.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/sign.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/split-pdf-by-sections.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/stamp.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/tab-container.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/theme/componentes.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/theme/font.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/theme/theme.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/theme/theme.dark.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/theme/theme.light.css (100%) rename {src => stirling-pdf/src}/main/resources/static/css/usage.css (100%) rename {src => stirling-pdf/src}/main/resources/static/favicon-16x16.png (100%) rename {src => stirling-pdf/src}/main/resources/static/favicon-32x32.png (100%) rename {src => stirling-pdf/src}/main/resources/static/favicon.icns (100%) rename {src => stirling-pdf/src}/main/resources/static/favicon.ico (100%) rename {src => stirling-pdf/src}/main/resources/static/favicon.png (100%) rename {src => stirling-pdf/src}/main/resources/static/favicon.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/files/Auto Splitter Divider (with instructions).pdf (100%) rename {src => stirling-pdf/src}/main/resources/static/files/popularity.txt (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/Arimo-Regular.woff2 (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/DancingScript-Regular.woff2 (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/Estonia.woff2 (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/IndieFlower-Regular.woff2 (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/Meiryo.ttf (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/NotoSans-Regular.ttf (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/NotoSansArabic-Regular.ttf (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/NotoSansJP-Regular.ttf (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/NotoSansSC-Regular.ttf (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/SimSun.ttf (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/Tangerine.woff2 (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/Tinos-Regular.woff2 (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/google-symbol.woff2 (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/malgun.ttf (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/static/NotoSansArabic-Regular.ttf (100%) rename {src => stirling-pdf/src}/main/resources/static/fonts/static/NotoSansJP-Regular.ttf (100%) rename {src => stirling-pdf/src}/main/resources/static/images/Files.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/arrow-right-short.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/book.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/clipboard.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/discord.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/docker.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/file-earmark-pdf.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/github.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/google-drive.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/redact-auto.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/redact-manual.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/rename.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/signature.png (100%) rename {src => stirling-pdf/src}/main/resources/static/images/split-auto.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/split-chapters.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/split-size.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/images/update.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/js/DecryptFiles.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/cacheFormInputs.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/compare/diff.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/compare/pdfWorker.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/csrf.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/darkmode.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/download.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/downloader.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/draggable-utils.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/errorBanner.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/favourites.js (96%) rename {src => stirling-pdf/src}/main/resources/static/js/fetch-utils.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/file-icon-factory.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/file-utils.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/fileInput.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/game.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/githubVersion.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/googleFilePicker.js (100%) create mode 100644 stirling-pdf/src/main/resources/static/js/homecard-legacy.js rename {src => stirling-pdf/src}/main/resources/static/js/homecard.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/languageSelection.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/local-pdf-input-download.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/merge.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/DragDropManager.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/ImageHighlighter.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/PdfActionsManager.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/PdfContainer.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/UndoManager.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/commands/add-page.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/commands/command.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/commands/commands-sequence.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/commands/delete-page.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/commands/move-page.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/commands/page-break.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/commands/remove.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/commands/rotate.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/commands/select.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/multitool/commands/split.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/navbar.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/pages/add-image.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/pages/adjust-contrast.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/pages/change-metadata.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/pages/crop.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/pages/home.js (96%) rename {src => stirling-pdf/src}/main/resources/static/js/pages/pdf-to-csv.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/pages/sign.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/pipeline.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/redact.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/search.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/settings.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/sign/signature-canvas.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/tab-container.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/bootstrap.min.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/bootstrap.min.js.map (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/chart.umd.min.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/cookieconsent-config.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/cookieconsent.umd.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/fontfaceobserver.standalone.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/interact.min.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/interact.min.js.map (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/jquery.min.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/jquery.validate.min.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/jszip.min.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/pdf-lib.min.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/pdf-lib.min.js.map (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/popper.min.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/popper.min.js.map (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/prism.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/signature_pad.umd.min.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/thirdParty/signature_pad.umd.min.js.map (100%) rename {src => stirling-pdf/src}/main/resources/static/js/usage.js (100%) rename {src => stirling-pdf/src}/main/resources/static/js/uuid.js (100%) rename {src => stirling-pdf/src}/main/resources/static/manifest.json (100%) rename {src => stirling-pdf/src}/main/resources/static/moon.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/mstile-144x144.png (100%) rename {src => stirling-pdf/src}/main/resources/static/mstile-150x150.png (100%) rename {src => stirling-pdf/src}/main/resources/static/mstile-310x150.png (100%) rename {src => stirling-pdf/src}/main/resources/static/mstile-310x310.png (100%) rename {src => stirling-pdf/src}/main/resources/static/mstile-70x70.png (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/78-EUC-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/78-EUC-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/78-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/78-RKSJ-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/78-RKSJ-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/78-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/78ms-RKSJ-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/78ms-RKSJ-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/83pv-RKSJ-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/90ms-RKSJ-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/90ms-RKSJ-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/90msp-RKSJ-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/90msp-RKSJ-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/90pv-RKSJ-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/90pv-RKSJ-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Add-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Add-RKSJ-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Add-RKSJ-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Add-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-CNS1-0.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-CNS1-1.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-CNS1-2.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-CNS1-3.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-CNS1-4.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-CNS1-5.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-CNS1-6.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-CNS1-UCS2.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-GB1-0.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-GB1-1.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-GB1-2.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-GB1-3.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-GB1-4.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-GB1-5.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-GB1-UCS2.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-Japan1-0.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-Japan1-1.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-Japan1-2.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-Japan1-3.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-Japan1-4.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-Japan1-5.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-Japan1-6.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-Japan1-UCS2.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-Korea1-0.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-Korea1-1.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-Korea1-2.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Adobe-Korea1-UCS2.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/B5-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/B5-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/B5pc-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/B5pc-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/CNS-EUC-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/CNS-EUC-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/CNS1-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/CNS1-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/CNS2-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/CNS2-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/ETHK-B5-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/ETHK-B5-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/ETen-B5-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/ETen-B5-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/ETenms-B5-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/ETenms-B5-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/EUC-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/EUC-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Ext-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Ext-RKSJ-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Ext-RKSJ-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Ext-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GB-EUC-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GB-EUC-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GB-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GB-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GBK-EUC-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GBK-EUC-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GBK2K-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GBK2K-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GBKp-EUC-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GBKp-EUC-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GBT-EUC-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GBT-EUC-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GBT-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GBT-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GBTpc-EUC-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GBTpc-EUC-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GBpc-EUC-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/GBpc-EUC-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/HKdla-B5-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/HKdla-B5-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/HKdlb-B5-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/HKdlb-B5-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/HKgccs-B5-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/HKgccs-B5-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/HKm314-B5-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/HKm314-B5-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/HKm471-B5-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/HKm471-B5-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/HKscs-B5-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/HKscs-B5-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Hankaku.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Hiragana.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/KSC-EUC-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/KSC-EUC-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/KSC-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/KSC-Johab-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/KSC-Johab-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/KSC-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/KSCms-UHC-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/KSCms-UHC-HW-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/KSCms-UHC-HW-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/KSCms-UHC-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/KSCpc-EUC-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/KSCpc-EUC-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Katakana.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/LICENSE (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/NWP-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/NWP-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/RKSJ-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/RKSJ-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/Roman.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniCNS-UCS2-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniCNS-UCS2-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniCNS-UTF16-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniCNS-UTF16-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniCNS-UTF32-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniCNS-UTF32-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniCNS-UTF8-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniCNS-UTF8-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniGB-UCS2-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniGB-UCS2-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniGB-UTF16-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniGB-UTF16-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniGB-UTF32-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniGB-UTF32-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniGB-UTF8-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniGB-UTF8-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS-UCS2-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS-UCS2-HW-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS-UCS2-HW-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS-UCS2-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS-UTF16-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS-UTF16-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS-UTF32-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS-UTF32-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS-UTF8-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS-UTF8-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS2004-UTF16-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS2004-UTF16-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS2004-UTF32-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS2004-UTF32-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS2004-UTF8-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJIS2004-UTF8-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJISPro-UCS2-HW-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJISPro-UCS2-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJISPro-UTF8-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJISX0213-UTF32-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJISX0213-UTF32-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJISX02132004-UTF32-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniJISX02132004-UTF32-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniKS-UCS2-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniKS-UCS2-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniKS-UTF16-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniKS-UTF16-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniKS-UTF32-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniKS-UTF32-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniKS-UTF8-H.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/UniKS-UTF8-V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/V.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/cmaps/WP-Symbol.bcmap (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/css/debugger.css (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/css/viewer-redact.css (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/css/viewer.css (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/example/Welcome.pdf (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/example/Welcome_old.pdf (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/altText_add.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/altText_done.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/annotation-check.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/annotation-comment.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/annotation-help.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/annotation-insert.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/annotation-key.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/annotation-newparagraph.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/annotation-noicon.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/annotation-note.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/annotation-paperclip.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/annotation-paragraph.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/annotation-pushpin.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/cursor-editorFreeHighlight.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/cursor-editorFreeText.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/cursor-editorInk.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/cursor-editorTextHighlight.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/editor-toolbar-delete.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/findbarButton-next.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/findbarButton-previous.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/gv-toolbarButton-download.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/loading-icon.gif (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/loading.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/secondaryToolbarButton-documentProperties.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/secondaryToolbarButton-firstPage.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/secondaryToolbarButton-handTool.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/secondaryToolbarButton-lastPage.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/secondaryToolbarButton-rotateCcw.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/secondaryToolbarButton-rotateCw.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/secondaryToolbarButton-scrollHorizontal.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/secondaryToolbarButton-scrollPage.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/secondaryToolbarButton-scrollVertical.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/secondaryToolbarButton-scrollWrapped.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/secondaryToolbarButton-selectTool.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/secondaryToolbarButton-spreadEven.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/secondaryToolbarButton-spreadNone.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/secondaryToolbarButton-spreadOdd.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-bookmark.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-currentOutlineItem.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-download.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-editorFreeText.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-editorHighlight.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-editorInk.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-editorStamp.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-home.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-menuArrow.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-openFile.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-pageDown.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-pageUp.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-presentationMode.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-print.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-search.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-secondaryToolbarToggle.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-sidebarToggle.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-viewAttachments.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-viewLayers.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-viewOutline.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-viewThumbnail.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-zoomIn.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/toolbarButton-zoomOut.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/treeitem-collapsed.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/images/treeitem-expanded.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/js/viewer.mjs (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/js/viewer.mjs.map (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ach/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/af/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/an/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ar/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ast/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/az/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/be/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/bg/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/bn/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/bo/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/br/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/brx/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/bs/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ca/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/cak/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ckb/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/cs/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/cy/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/da/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/de/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/dsb/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/el/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/en-CA/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/en-GB/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/en-US/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/eo/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/es-AR/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/es-CL/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/es-ES/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/es-MX/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/et/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/eu/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/fa/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ff/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/fi/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/fr/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/fur/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/fy-NL/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ga-IE/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/gd/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/gl/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/gn/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/gu-IN/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/he/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/hi-IN/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/hr/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/hsb/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/hu/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/hy-AM/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/hye/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ia/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/id/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/is/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/it/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ja/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ka/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/kab/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/kk/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/km/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/kn/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ko/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/lij/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/lo/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/locale.json (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/lt/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ltg/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/lv/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/meh/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/mk/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/mr/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ms/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/my/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/nb-NO/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ne-NP/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/nl/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/nn-NO/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/oc/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/pa-IN/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/pl/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/pt-BR/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/pt-PT/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/rm/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ro/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ru/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/sat/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/sc/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/scn/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/sco/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/si/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/sk/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/skr/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/sl/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/son/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/sq/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/sr/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/sv-SE/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/szl/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ta/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/te/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/tg/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/th/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/tl/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/tr/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/trs/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/uk/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/ur/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/uz/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/vi/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/wo/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/xh/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/zh-CN/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/locale/zh-TW/viewer.ftl (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/pdf.mjs (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/pdf.mjs.map (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/pdf.sandbox.mjs (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/pdf.sandbox.mjs.map (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/pdf.worker.entry.js (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/pdf.worker.mjs (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/pdf.worker.mjs.map (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/FoxitDingbats.pfb (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/FoxitFixed.pfb (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/FoxitFixedBold.pfb (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/FoxitFixedBoldItalic.pfb (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/FoxitFixedItalic.pfb (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/FoxitSerif.pfb (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/FoxitSerifBold.pfb (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/FoxitSerifBoldItalic.pfb (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/FoxitSerifItalic.pfb (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/FoxitSymbol.pfb (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/LICENSE_FOXIT (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/LICENSE_LIBERATION (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/LiberationSans-Bold.ttf (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/LiberationSans-BoldItalic.ttf (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/LiberationSans-Italic.ttf (100%) rename {src => stirling-pdf/src}/main/resources/static/pdfjs-legacy/standard_fonts/LiberationSans-Regular.ttf (100%) rename {src => stirling-pdf/src}/main/resources/static/rainbow.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/safari-pinned-tab.svg (100%) rename {src => stirling-pdf/src}/main/resources/static/site.webmanifest (100%) rename {src => stirling-pdf/src}/main/resources/static/sun.svg (100%) rename {src => stirling-pdf/src}/main/resources/templates/about.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/account.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/adminSettings.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/auto-split-pdf.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/change-creds.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/eml-to-pdf.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/file-to-pdf.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/html-to-pdf.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/img-to-pdf.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/markdown-to-pdf.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/pdf-to-csv.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/pdf-to-html.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/pdf-to-img.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/pdf-to-markdown.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/pdf-to-pdfa.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/pdf-to-presentation.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/pdf-to-text.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/pdf-to-word.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/pdf-to-xml.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/convert/url-to-pdf.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/crop.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/database.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/error.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/extract-page.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/fragments/card.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/fragments/common.html (99%) rename {src => stirling-pdf/src}/main/resources/templates/fragments/errorBanner.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/fragments/errorBannerPerPage.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/fragments/featureGroupHeader.html (100%) create mode 100644 stirling-pdf/src/main/resources/templates/fragments/featureGroupHeaderLegacy.html rename {src => stirling-pdf/src}/main/resources/templates/fragments/footer.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/fragments/languageEntry.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/fragments/languages.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/fragments/multi-toolAdvert.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/fragments/navElements.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/fragments/navbar.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/fragments/navbarEntry.html (64%) rename {src => stirling-pdf/src}/main/resources/templates/fragments/navbarEntryCustom.html (100%) create mode 100644 stirling-pdf/src/main/resources/templates/home-legacy.html rename {src => stirling-pdf/src}/main/resources/templates/home.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/licenses.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/login.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/merge-pdfs.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/add-image.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/add-page-numbers.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/adjust-contrast.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/auto-crop.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/auto-rename.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/change-metadata.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/compare.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/compress-pdf.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/extract-image-scans.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/extract-images.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/fake-scan.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/flatten.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/ocr-pdf.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/print-file.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/remove-annotations.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/remove-blanks.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/repair.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/replace-color.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/show-javascript.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/stamp.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/misc/unlock-pdf-forms.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/multi-page-layout.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/multi-tool.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/overlay-pdf.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/pdf-organizer.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/pdf-to-single-page.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/pipeline.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/releases.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/remove-image-pdf.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/remove-pages.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/rotate-pdf.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/scale-pages.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/security/add-password.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/security/add-watermark.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/security/auto-redact.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/security/cert-sign.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/security/change-permissions.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/security/get-info-on-pdf.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/security/redact.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/security/remove-cert-sign.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/security/remove-password.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/security/remove-watermark.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/security/sanitize-pdf.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/security/validate-signature.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/sign.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/split-by-size-or-count.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/split-pdf-by-chapters.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/split-pdf-by-sections.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/split-pdfs.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/usage.html (100%) rename {src => stirling-pdf/src}/main/resources/templates/view-pdf.html (100%) rename {src => stirling-pdf/src}/test/java/stirling/software/SPDF/SPDFApplicationTest.java (100%) rename {src => stirling-pdf/src}/test/java/stirling/software/SPDF/controller/api/RearrangePagesPDFControllerTest.java (100%) rename {src => stirling-pdf/src}/test/java/stirling/software/SPDF/controller/api/RotationControllerTest.java (100%) rename {src => stirling-pdf/src}/test/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPdfTest.java (100%) rename {src => stirling-pdf/src}/test/java/stirling/software/SPDF/controller/api/pipeline/PipelineProcessorTest.java (86%) rename {src => stirling-pdf/src}/test/java/stirling/software/SPDF/controller/web/UploadLimitServiceTest.java (100%) rename {src => stirling-pdf/src}/test/java/stirling/software/SPDF/service/CertificateValidationServiceTest.java (100%) rename {src => stirling-pdf/src}/test/java/stirling/software/SPDF/service/LanguageServiceBasicTest.java (100%) rename {src => stirling-pdf/src}/test/java/stirling/software/SPDF/service/LanguageServiceTest.java (100%) rename {src => stirling-pdf/src}/test/java/stirling/software/SPDF/service/PdfImageRemovalServiceTest.java (100%) rename {src => stirling-pdf/src}/test/java/stirling/software/SPDF/service/PdfMetadataServiceBasicTest.java (100%) rename {src => stirling-pdf/src}/test/java/stirling/software/SPDF/service/PdfMetadataServiceTest.java (100%) rename {src => stirling-pdf/src}/test/java/stirling/software/SPDF/service/SignatureServiceTest.java (100%) diff --git a/.gitattributes b/.gitattributes index c498408ab..f72c204bd 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,10 +1,10 @@ * text=auto eol=lf # Ignore all JavaScript files in a directory -src/main/resources/static/pdfjs/* linguist-vendored -src/main/resources/static/pdfjs/** linguist-vendored -src/main/resources/static/pdfjs-legacy/* linguist-vendored -src/main/resources/static/pdfjs-legacy/** linguist-vendored -src/main/resources/static/css/bootstrap-icons.css linguist-vendored -src/main/resources/static/css/bootstrap.min.css linguist-vendored -src/main/resources/static/css/fonts/* linguist-vendored +stirling-pdf/src/main/resources/static/pdfjs/* linguist-vendored +stirling-pdf/src/main/resources/static/pdfjs/** linguist-vendored +stirling-pdf/src/main/resources/static/pdfjs-legacy/* linguist-vendored +stirling-pdf/src/main/resources/static/pdfjs-legacy/** linguist-vendored +stirling-pdf/src/main/resources/static/css/bootstrap-icons.css linguist-vendored +stirling-pdf/src/main/resources/static/css/bootstrap.min.css linguist-vendored +stirling-pdf/src/main/resources/static/css/fonts/* linguist-vendored diff --git a/.github/labeler-config.yml b/.github/labeler-config.yml index bb52c7b85..d1a340065 100644 --- a/.github/labeler-config.yml +++ b/.github/labeler-config.yml @@ -1,60 +1,45 @@ Translation: - changed-files: - - any-glob-to-any-file: 'src/main/resources/messages_*_*.properties' + - any-glob-to-any-file: 'stirling-pdf/src/main/resources/messages_*_*.properties' - any-glob-to-any-file: 'scripts/ignore_translation.toml' - - any-glob-to-any-file: 'src/main/resources/templates/fragments/languages.html' + - any-glob-to-any-file: 'stirling-pdf/src/main/resources/templates/fragments/languages.html' Front End: - changed-files: - - any-glob-to-any-file: 'src/main/resources/templates/**/*' - - any-glob-to-any-file: 'src/main/resources/static/**/*' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/web/**' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/UI/**/*' + - any-glob-to-any-file: 'stirling-pdf/src/main/resources/templates/**/*' + - any-glob-to-any-file: 'stirling-pdf/src/main/resources/static/**/*' + - any-glob-to-any-file: 'stirling-pdf/src/main/java/stirling/software/SPDF/controller/web/**' + - any-glob-to-any-file: 'stirling-pdf/src/main/java/stirling/software/SPDF/UI/**/*' Java: - changed-files: - - any-glob-to-any-file: 'src/main/java/**/*.java' + - any-glob-to-any-file: 'common/src/main/java/**/*.java' + - any-glob-to-any-file: 'proprietary/src/main/java/**/*.java' + - any-glob-to-any-file: 'stirling-pdf/src/main/java/**/*.java' Back End: - changed-files: - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/**/*' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/**/*' - - any-glob-to-any-file: 'src/main/resources/settings.yml.template' - - any-glob-to-any-file: 'src/main/resources/application.properties' - - any-glob-to-any-file: 'src/main/resources/banner.txt' + - any-glob-to-any-file: 'stirling-pdf/src/main/java/stirling/software/SPDF/config/**/*' + - any-glob-to-any-file: 'stirling-pdf/src/main/java/stirling/software/SPDF/controller/**/*' + - any-glob-to-any-file: 'stirling-pdf/src/main/resources/settings.yml.template' + - any-glob-to-any-file: 'stirling-pdf/src/main/resources/application.properties' + - any-glob-to-any-file: 'stirling-pdf/src/main/resources/banner.txt' - any-glob-to-any-file: 'scripts/png_to_webp.py' - any-glob-to-any-file: 'split_photos.py' Security: - changed-files: - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/interfaces/DatabaseInterface.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/security/**/*' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/api/DatabaseController.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/api/EmailController.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/api/H2SQLController.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/web/DatabaseWebController.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/api/UserController.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/api/Email.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/exception/BackupNotFoundException.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/exception/NoProviderFoundExceptionjava' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/provider/**/*' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/AuthenticationType.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/ApiKeyAuthenticationToken.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/AttemptCounter.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/Authority.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/PersistentLogin.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/SessionEntity.java' + - any-glob-to-any-file: 'proprietary/src/main/java/stirling/software/proprietary/security/**/*' - any-glob-to-any-file: 'scripts/download-security-jar.sh' - any-glob-to-any-file: '.github/workflows/dependency-review.yml' - any-glob-to-any-file: '.github/workflows/scorecards.yml' API: - changed-files: - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/config/OpenApiConfig.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/web/MetricsController.java' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/controller/api/**/*' - - any-glob-to-any-file: 'src/main/java/stirling/software/SPDF/model/api/**/*' + - any-glob-to-any-file: 'stirling-pdf/src/main/java/stirling/software/SPDF/config/OpenApiConfig.java' + - any-glob-to-any-file: 'stirling-pdf/src/main/java/stirling/software/SPDF/controller/web/MetricsController.java' + - any-glob-to-any-file: 'stirling-pdf/src/main/java/stirling/software/SPDF/controller/api/**/*' + - any-glob-to-any-file: 'stirling-pdf/src/main/java/stirling/software/SPDF/model/api/**/*' - any-glob-to-any-file: 'scripts/png_to_webp.py' - any-glob-to-any-file: 'split_photos.py' - any-glob-to-any-file: '.github/workflows/swagger.yml' @@ -88,7 +73,9 @@ Devtools: Test: - changed-files: - any-glob-to-any-file: 'cucumber/**/*' - - any-glob-to-any-file: 'src/test/**/*' + - any-glob-to-any-file: 'common/src/test/**/*' + - any-glob-to-any-file: 'proprietary/src/test/**/*' + - any-glob-to-any-file: 'stirling-pdf/src/test/**/*' - any-glob-to-any-file: 'src/testing/**/*' - any-glob-to-any-file: '.pre-commit-config' - any-glob-to-any-file: '.github/workflows/pre_commit.yml' diff --git a/.github/scripts/check_language_properties.py b/.github/scripts/check_language_properties.py index 10e6fb650..8ae7dbfc1 100644 --- a/.github/scripts/check_language_properties.py +++ b/.github/scripts/check_language_properties.py @@ -317,7 +317,7 @@ def check_for_differences(reference_file, file_list, branch, actor): report.append("## ❌ Overall Check Status: **_Failed_**") report.append("") report.append( - f"@{actor} please check your translation if it conforms to the standard. Follow the format of [messages_en_GB.properties](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/src/main/resources/messages_en_GB.properties)" + f"@{actor} please check your translation if it conforms to the standard. Follow the format of [messages_en_GB.properties](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/stirling-pdf/src/main/resources/messages_en_GB.properties)" ) else: report.append("## ✅ Overall Check Status: **_Success_**") diff --git a/.github/workflows/check_properties.yml b/.github/workflows/check_properties.yml index d74e3084a..9598351a5 100644 --- a/.github/workflows/check_properties.yml +++ b/.github/workflows/check_properties.yml @@ -4,7 +4,7 @@ on: pull_request_target: types: [opened, synchronize, reopened] paths: - - "src/main/resources/messages_*.properties" + - "stirling-pdf/src/main/resources/messages_*.properties" permissions: contents: read # Allow read access to repository content @@ -61,7 +61,20 @@ jobs: run: | echo "Fetching PR changed files..." echo "Getting list of changed files from PR..." - gh pr view ${{ steps.get-pr-data.outputs.pr_number }} --json files -q ".files[].path" | grep -E '^src/main/resources/messages_[a-zA-Z_]{2}_[a-zA-Z_]{2,7}\.properties$' > changed_files.txt # Filter only matching property files + # Check if PR number exists + if [ -z "${{ steps.get-pr-data.outputs.pr_number }}" ]; then + echo "Error: PR number is empty" + exit 1 + fi + # Get changed files and filter for properties files, handle case where no matches are found + gh pr view ${{ steps.get-pr-data.outputs.pr_number }} --json files -q ".files[].path" | grep -E '^stirling-pdf/src/main/resources/messages_[a-zA-Z_]{2}_[a-zA-Z_]{2,7}\.properties$' > changed_files.txt || echo "No matching properties files found in PR" + # Check if any files were found + if [ ! -s changed_files.txt ]; then + echo "No properties files changed in this PR" + echo "Workflow will exit early as no relevant files to check" + exit 0 + fi + echo "Found $(wc -l < changed_files.txt) matching properties files" - name: Determine reference file test id: determine-file @@ -103,7 +116,7 @@ jobs: // Filter for relevant files based on the PR changes const changedFiles = files .map(file => file.filename) - .filter(file => /^src\/main\/resources\/messages_[a-zA-Z_]{2}_[a-zA-Z_]{2,7}\.properties$/.test(file)); + .filter(file => /^stirling-pdf\src\/main\/resources\/messages_[a-zA-Z_]{2}_[a-zA-Z_]{2,7}\.properties$/.test(file)); console.log("Changed files:", changedFiles); @@ -141,12 +154,12 @@ jobs: // Determine reference file let referenceFilePath; - if (changedFiles.includes("src/main/resources/messages_en_GB.properties")) { + if (changedFiles.includes("stirling-pdf/src/main/resources/messages_en_GB.properties")) { console.log("Using PR branch reference file."); const { data: fileContent } = await github.rest.repos.getContent({ owner: prRepoOwner, repo: prRepoName, - path: "src/main/resources/messages_en_GB.properties", + path: "stirling-pdf/src/main/resources/messages_en_GB.properties", ref: branch, }); @@ -158,7 +171,7 @@ jobs: const { data: fileContent } = await github.rest.repos.getContent({ owner: repoOwner, repo: repoName, - path: "src/main/resources/messages_en_GB.properties", + path: "stirling-pdf/src/main/resources/messages_en_GB.properties", ref: "main", }); diff --git a/.github/workflows/licenses-update.yml b/.github/workflows/licenses-update.yml index e040e5436..f9fb1e521 100644 --- a/.github/workflows/licenses-update.yml +++ b/.github/workflows/licenses-update.yml @@ -57,11 +57,11 @@ jobs: - name: Move and rename license file run: | - mv build/reports/dependency-license/index.json src/main/resources/static/3rdPartyLicenses.json + mv build/reports/dependency-license/index.json stirling-pdf/src/main/resources/static/3rdPartyLicenses.json - name: Commit changes run: | - git add src/main/resources/static/3rdPartyLicenses.json + git add stirling-pdf/src/main/resources/static/3rdPartyLicenses.json git diff --staged --quiet || echo "CHANGES_DETECTED=true" >> $GITHUB_ENV - name: Create Pull Request diff --git a/.github/workflows/sync_files.yml b/.github/workflows/sync_files.yml index 92b4f3c87..dd29b0d4b 100644 --- a/.github/workflows/sync_files.yml +++ b/.github/workflows/sync_files.yml @@ -8,8 +8,8 @@ on: paths: - "build.gradle" - "README.md" - - "src/main/resources/messages_*.properties" - - "src/main/resources/static/3rdPartyLicenses.json" + - "stirling-pdf/src/main/resources/messages_*.properties" + - "stirling-pdf/src/main/resources/static/3rdPartyLicenses.json" - "scripts/ignore_translation.toml" permissions: @@ -41,11 +41,11 @@ jobs: - name: Sync translation property files run: | - python .github/scripts/check_language_properties.py --reference-file "src/main/resources/messages_en_GB.properties" --branch main + python .github/scripts/check_language_properties.py --reference-file "stirling-pdf/src/main/resources/messages_en_GB.properties" --branch main - name: Commit translation files run: | - git add src/main/resources/messages_*.properties + git add stirling-pdf/src/main/resources/messages_*.properties git diff --staged --quiet || git commit -m ":memo: Sync translation files" || echo "No changes detected" - name: Install dependencies @@ -101,4 +101,4 @@ jobs: sign-commits: true add-paths: | README.md - src/main/resources/messages_*.properties + stirling-pdf/src/main/resources/messages_*.properties diff --git a/.gitignore b/.gitignore index 06602d03b..ca949e769 100644 --- a/.gitignore +++ b/.gitignore @@ -125,6 +125,9 @@ SwaggerDoc.json *.rar *.db /build +/stirling-pdf/build +/common/build +/proprietary/build # Byte-compiled / optimized / DLL files __pycache__/ @@ -194,4 +197,3 @@ id_ed25519.pub # node_modules node_modules/ -*.mjs diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index beec5eb99..b4b3841e6 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -20,7 +20,7 @@ repos: - --skip="./.*,*.csv,*.json,*.ambr" - --quiet-level=2 files: \.(html|css|js|py|md)$ - exclude: (.vscode|.devcontainer|src/main/resources|Dockerfile|.*/pdfjs.*|.*/thirdParty.*|bootstrap.*|.*\.min\..*|.*diff\.js) + exclude: (.vscode|.devcontainer|stirling-pdf/src/main/resources|Dockerfile|.*/pdfjs.*|.*/thirdParty.*|bootstrap.*|.*\.min\..*|.*diff\.js) - repo: https://github.com/gitleaks/gitleaks rev: v8.26.0 hooks: diff --git a/DeveloperGuide.md b/DeveloperGuide.md index d484838e0..d2c9ddb2a 100644 --- a/DeveloperGuide.md +++ b/DeveloperGuide.md @@ -137,9 +137,9 @@ services: ports: - "8080:8080" volumes: - - /stirling/latest/data:/usr/share/tessdata:rw - - /stirling/latest/config:/configs:rw - - /stirling/latest/logs:/logs:rw + - ./stirling/latest/data:/usr/share/tessdata:rw + - ./stirling/latest/config:/configs:rw + - ./stirling/latest/logs:/logs:rw environment: DISABLE_ADDITIONAL_FEATURES: "false" SECURITY_ENABLELOGIN: "true" @@ -332,7 +332,7 @@ Thymeleaf is a server-side Java HTML template engine. It is used in Stirling-PDF ### Thymeleaf overview -In Stirling-PDF, Thymeleaf is used to create HTML templates that are rendered on the server side. These templates are located in the `src/main/resources/templates` directory. Thymeleaf templates use a combination of HTML and special Thymeleaf attributes to dynamically generate content. +In Stirling-PDF, Thymeleaf is used to create HTML templates that are rendered on the server side. These templates are located in the `stirling-pdf/src/main/resources/templates` directory. Thymeleaf templates use a combination of HTML and special Thymeleaf attributes to dynamically generate content. Some examples of this are: @@ -384,7 +384,7 @@ This would generate n entries of tr for each person in exampleData ### Adding a New Feature to the Backend (API) 1. **Create a New Controller:** - - Create a new Java class in the `src/main/java/stirling/software/SPDF/controller/api` directory. + - Create a new Java class in the `stirling-pdf/src/main/java/stirling/software/SPDF/controller/api` directory. - Annotate the class with `@RestController` and `@RequestMapping` to define the API endpoint. - Ensure to add API documentation annotations like `@Tag(name = "General", description = "General APIs")` and `@Operation(summary = "Crops a PDF document", description = "This operation takes an input PDF file and crops it according to the given coordinates. Input:PDF Output:PDF Type:SISO")`. @@ -411,7 +411,7 @@ This would generate n entries of tr for each person in exampleData ``` 2. **Define the Service Layer:** (Not required but often useful) - - Create a new service class in the `src/main/java/stirling/software/SPDF/service` directory. + - Create a new service class in the `stirling-pdf/src/main/java/stirling/software/SPDF/service` directory. - Implement the business logic for the new feature. ```java @@ -463,7 +463,7 @@ This would generate n entries of tr for each person in exampleData ### Adding a New Feature to the Frontend (UI) 1. **Create a New Thymeleaf Template:** - - Create a new HTML file in the `src/main/resources/templates` directory. + - Create a new HTML file in the `stirling-pdf/src/main/resources/templates` directory. - Use Thymeleaf attributes to dynamically generate content. - Use `extract-page.html` as a base example for the HTML template, which is useful to ensure importing of the general layout, navbar, and footer. @@ -507,7 +507,7 @@ This would generate n entries of tr for each person in exampleData ``` 2. **Create a New Controller for the UI:** - - Create a new Java class in the `src/main/java/stirling/software/SPDF/controller/ui` directory. + - Create a new Java class in the `stirling-pdf/src/main/java/stirling/software/SPDF/controller/ui` directory. - Annotate the class with `@Controller` and `@RequestMapping` to define the UI endpoint. ```java @@ -537,7 +537,7 @@ This would generate n entries of tr for each person in exampleData 3. **Update the Navigation Bar:** - Add a link to the new feature page in the navigation bar. - - Update the `src/main/resources/templates/fragments/navbar.html` file. + - Update the `stirling-pdf/src/main/resources/templates/fragments/navbar.html` file. ```html