diff --git a/.github/labeler-config.yml b/.github/labeler-config.yml index a0a634840..bb52c7b85 100644 --- a/.github/labeler-config.yml +++ b/.github/labeler-config.yml @@ -27,18 +27,34 @@ Back End: 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/BackupNotFoundException.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: '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: 'scripts/png_to_webp.py' - any-glob-to-any-file: 'split_photos.py' - any-glob-to-any-file: '.github/workflows/swagger.yml' diff --git a/.github/workflows/PR-Demo-Comment-with-react.yml b/.github/workflows/PR-Demo-Comment-with-react.yml index 105fb60b1..adb3e33cf 100644 --- a/.github/workflows/PR-Demo-Comment-with-react.yml +++ b/.github/workflows/PR-Demo-Comment-with-react.yml @@ -41,14 +41,14 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit # Generate GitHub App token - name: Generate GitHub App Token id: generate-token - uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2.0.2 + uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6 with: app-id: ${{ secrets.GH_APP_ID }} private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} @@ -129,13 +129,13 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit - name: Generate GitHub App Token id: generate-token - uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2.0.2 + uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6 with: app-id: ${{ secrets.GH_APP_ID }} private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} @@ -180,7 +180,7 @@ jobs: password: ${{ secrets.DOCKER_HUB_API }} - name: Build and push PR-specific image - uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0 + uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6.16.0 with: context: . file: ./Dockerfile diff --git a/.github/workflows/PR-Demo-cleanup.yml b/.github/workflows/PR-Demo-cleanup.yml index bcb547588..1962bb83d 100644 --- a/.github/workflows/PR-Demo-cleanup.yml +++ b/.github/workflows/PR-Demo-cleanup.yml @@ -21,7 +21,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit diff --git a/.github/workflows/auto-labeler.yml b/.github/workflows/auto-labeler.yml index 2bd50d8d4..5f350d2d4 100644 --- a/.github/workflows/auto-labeler.yml +++ b/.github/workflows/auto-labeler.yml @@ -13,7 +13,7 @@ jobs: pull-requests: write steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 238773596..1d5016ca8 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -24,7 +24,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit @@ -62,7 +62,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit @@ -106,7 +106,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit @@ -128,7 +128,7 @@ jobs: sudo chmod +x /usr/local/bin/docker-compose - name: Set up Python - uses: actions/setup-python@8d9ed9ac5c53483de85588cdf95a591a75ab9f55 # v5.5.0 + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: "3.12" cache: 'pip' # caching pip dependencies diff --git a/.github/workflows/check_properties.yml b/.github/workflows/check_properties.yml index 84531e094..6825f59f9 100644 --- a/.github/workflows/check_properties.yml +++ b/.github/workflows/check_properties.yml @@ -18,7 +18,7 @@ jobs: pull-requests: write steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit @@ -26,7 +26,7 @@ jobs: uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Set up Python - uses: actions/setup-python@8d9ed9ac5c53483de85588cdf95a591a75ab9f55 # v5.5.0 + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: "3.12" diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml index 2eece92fe..304267160 100644 --- a/.github/workflows/dependency-review.yml +++ b/.github/workflows/dependency-review.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit diff --git a/.github/workflows/licenses-update.yml b/.github/workflows/licenses-update.yml index a86a7c945..f2ab49f88 100644 --- a/.github/workflows/licenses-update.yml +++ b/.github/workflows/licenses-update.yml @@ -18,13 +18,13 @@ jobs: pull-requests: write steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit - name: Generate GitHub App Token id: generate-token - uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2.0.2 + uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6 with: app-id: ${{ secrets.GH_APP_ID }} private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} diff --git a/.github/workflows/manage-label.yml b/.github/workflows/manage-label.yml index 63a3f7b7d..73ece41ae 100644 --- a/.github/workflows/manage-label.yml +++ b/.github/workflows/manage-label.yml @@ -15,7 +15,7 @@ jobs: issues: write steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit diff --git a/.github/workflows/multiOSReleases.yml b/.github/workflows/multiOSReleases.yml index b8c463bf6..b078e4015 100644 --- a/.github/workflows/multiOSReleases.yml +++ b/.github/workflows/multiOSReleases.yml @@ -2,13 +2,13 @@ name: Test Installers Build on: workflow_dispatch: - release: - types: [created] inputs: test_mode: - description: "Run in test mode (skips release step)" + description: "Run in test mode (skip release step)" required: false default: "false" + release: + types: [created] permissions: contents: read @@ -21,7 +21,7 @@ jobs: versionMac: ${{ steps.versionNumberMac.outputs.versionNumberMac }} steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit @@ -56,7 +56,7 @@ jobs: file_suffix: "" steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit @@ -70,7 +70,7 @@ jobs: - uses: gradle/actions/setup-gradle@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1 with: - gradle-version: 8.12 + gradle-version: 8.14 - name: Generate jar (With Security=${{ matrix.enable_security }}) run: ./gradlew clean createExe @@ -106,12 +106,12 @@ jobs: file_suffix: "" steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit - name: Download build artifacts - uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: name: stirling-${{ matrix.file_suffix }}binaries @@ -144,7 +144,7 @@ jobs: contents: write steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit @@ -158,7 +158,7 @@ jobs: - uses: gradle/actions/setup-gradle@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1 with: - gradle-version: 8.12 + gradle-version: 8.14 # Install Windows dependencies - name: Install WiX Toolset @@ -175,7 +175,7 @@ jobs: STIRLING_PDF_DESKTOP_UI: true BROWSER_OPEN: true - - name: ☕ Set up JDK (x86_64) + - name: Set up JDK (x86_64) if: matrix.os == 'macos-latest' run: | curl -L -o jdk.tar.gz https://cdn.azul.com/zulu/bin/zulu17.56.15-ca-jdk17.0.14-macosx_x64.tar.gz @@ -200,10 +200,10 @@ jobs: ls -lah ./build/jpackage/ mkdir ./binaries if [ "${{ matrix.os }}" = "windows-latest" ]; then - mv "./build/jpackage/Stirling-PDF-${{ needs.read_versions.outputs.version }}.exe" "./binaries/Stirling-PDF-win-installer.exe" + mv "./build/jpackage/Stirling PDF-${{ needs.read_versions.outputs.version }}.exe" "./binaries/Stirling-PDF-win-installer.exe" elif [ "${{ matrix.os }}" = "macos-latest" ]; then - mv "./build/jpackage/Stirling-PDF-${{ needs.read_versions.outputs.versionMac }}.dmg" "./binaries/Stirling-PDF-mac-installer.dmg" - mv "./build/jpackage/x86_64/Stirling-PDF (x86_64)-${{ needs.read_versions.outputs.versionMac }}.dmg" "./binaries/Stirling-PDF-mac-x86_64-installer.dmg" + mv "./build/jpackage/Stirling PDF-${{ needs.read_versions.outputs.versionMac }}.dmg" "./binaries/Stirling-PDF-mac-installer.dmg" + mv "./build/jpackage/x86_64/Stirling PDF (x86_64)-${{ needs.read_versions.outputs.versionMac }}.dmg" "./binaries/Stirling-PDF-mac-x86_64-installer.dmg" else mv "./build/jpackage/stirling-pdf_${{ needs.read_versions.outputs.version }}-1_amd64.deb" "./binaries/Stirling-PDF-linux-installer.deb" fi @@ -234,12 +234,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit - name: Download build artifacts - uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: name: ${{ matrix.platform }}binaries @@ -248,7 +248,7 @@ jobs: - name: Install Cosign if: matrix.os == 'windows-latest' - uses: sigstore/cosign-installer@d7d6bc7722e3daa8354c50bcb52f4837da5e9b6a # v3.8.1 + uses: sigstore/cosign-installer@3454372f43399081ed03b604cb2d021dabca52bb # v3.8.2 - name: Generate key pair if: matrix.os == 'windows-latest' @@ -297,12 +297,12 @@ jobs: contents: write steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit - name: Download signed artifacts - uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 - name: Display structure of downloaded files run: ls -R - name: Upload binaries, attestations and signatures to Release and create GitHub Release diff --git a/.github/workflows/pre_commit.yml b/.github/workflows/pre_commit.yml index ad39a1b9a..ce10a6c3e 100644 --- a/.github/workflows/pre_commit.yml +++ b/.github/workflows/pre_commit.yml @@ -16,13 +16,13 @@ jobs: pull-requests: write steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit - name: Generate GitHub App Token id: generate-token - uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2.0.2 + uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6 with: app-id: ${{ secrets.GH_APP_ID }} private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} @@ -42,7 +42,7 @@ jobs: with: fetch-depth: 0 - name: Set up Python - uses: actions/setup-python@8d9ed9ac5c53483de85588cdf95a591a75ab9f55 # v5.5.0 + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: 3.12 cache: 'pip' # caching pip dependencies diff --git a/.github/workflows/push-docker.yml b/.github/workflows/push-docker.yml index 8485a85b4..e4532ff59 100644 --- a/.github/workflows/push-docker.yml +++ b/.github/workflows/push-docker.yml @@ -18,7 +18,7 @@ jobs: id-token: write steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit @@ -32,7 +32,7 @@ jobs: - uses: gradle/actions/setup-gradle@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1 with: - gradle-version: 8.12 + gradle-version: 8.14 - name: Run Gradle Command run: ./gradlew clean build @@ -42,7 +42,7 @@ jobs: - name: Install cosign if: github.ref == 'refs/heads/master' - uses: sigstore/cosign-installer@d7d6bc7722e3daa8354c50bcb52f4837da5e9b6a # v3.8.1 + uses: sigstore/cosign-installer@3454372f43399081ed03b604cb2d021dabca52bb # v3.8.2 with: cosign-release: "v2.4.1" @@ -90,7 +90,7 @@ jobs: - name: Build and push main Dockerfile id: build-push-regular - uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0 + uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6.16.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@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0 + uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6.16.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@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0 + uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6.16.0 if: github.ref != 'refs/heads/main' with: builder: ${{ steps.buildx.outputs.name }} diff --git a/.github/workflows/releaseArtifacts.yml b/.github/workflows/releaseArtifacts.yml index 8844b3a1c..c0d23ce19 100644 --- a/.github/workflows/releaseArtifacts.yml +++ b/.github/workflows/releaseArtifacts.yml @@ -23,7 +23,7 @@ jobs: version: ${{ steps.versionNumber.outputs.versionNumber }} steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit @@ -37,7 +37,7 @@ jobs: - uses: gradle/actions/setup-gradle@06832c7b30a0129d7fb559bcc6e43d26f6374244 # v4.3.1 with: - gradle-version: 8.12 + gradle-version: 8.14 - name: Generate jar (With Security=${{ matrix.enable_security }}) run: ./gradlew clean createExe @@ -83,19 +83,19 @@ jobs: file_suffix: "" steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit - name: Download build artifacts - uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: name: binaries${{ matrix.file_suffix }} - name: Display structure of downloaded files run: ls -R - name: Install Cosign - uses: sigstore/cosign-installer@d7d6bc7722e3daa8354c50bcb52f4837da5e9b6a # v3.8.1 + uses: sigstore/cosign-installer@3454372f43399081ed03b604cb2d021dabca52bb # v3.8.2 - name: Generate key pair run: cosign generate-key-pair @@ -161,12 +161,12 @@ jobs: file_suffix: "" steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit - name: Download signed artifacts - uses: actions/download-artifact@95815c38cf2ff2164869cbab79da8d1f422bc89e # v4.2.1 + uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 with: name: signed${{ matrix.file_suffix }} diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index 4e50b7325..3c2d59e3e 100644 --- a/.github/workflows/scorecards.yml +++ b/.github/workflows/scorecards.yml @@ -34,7 +34,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit @@ -74,6 +74,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@45775bd8235c68ba998cffa5171334d58593da47 # v3.28.15 + uses: github/codeql-action/upload-sarif@60168efe1c415ce0f5521ea06d5c2062adbeed1b # v3.28.17 with: sarif_file: results.sarif diff --git a/.github/workflows/sonarqube.yml b/.github/workflows/sonarqube.yml index 3220da581..ddf0980ab 100644 --- a/.github/workflows/sonarqube.yml +++ b/.github/workflows/sonarqube.yml @@ -18,7 +18,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 24375021c..4000f0e6f 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -16,7 +16,7 @@ jobs: pull-requests: write steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit diff --git a/.github/workflows/swagger.yml b/.github/workflows/swagger.yml index cd72a2483..19c0aaa89 100644 --- a/.github/workflows/swagger.yml +++ b/.github/workflows/swagger.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit diff --git a/.github/workflows/sync_files.yml b/.github/workflows/sync_files.yml index a47d3ee60..fe790c65b 100644 --- a/.github/workflows/sync_files.yml +++ b/.github/workflows/sync_files.yml @@ -24,13 +24,13 @@ jobs: committer: ${{ steps.committer.outputs.committer }} steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit - name: Generate GitHub App Token id: generate-token - uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2.0.2 + uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6 with: app-id: ${{ secrets.GH_APP_ID }} private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} @@ -57,13 +57,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit - name: Generate GitHub App Token id: generate-token - uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2.0.2 + uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6 with: app-id: ${{ vars.GH_APP_ID }} private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} @@ -71,7 +71,7 @@ jobs: - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 - name: Set up Python - uses: actions/setup-python@8d9ed9ac5c53483de85588cdf95a591a75ab9f55 # v5.5.0 + uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 with: python-version: "3.12" cache: 'pip' # caching pip dependencies diff --git a/.github/workflows/testdriver.yml b/.github/workflows/testdriver.yml index 5986c38f4..68c4fabb2 100644 --- a/.github/workflows/testdriver.yml +++ b/.github/workflows/testdriver.yml @@ -12,7 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit @@ -46,7 +46,7 @@ jobs: password: ${{ secrets.DOCKER_HUB_API }} - name: Build and push test image - uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6.15.0 + uses: docker/build-push-action@14487ce63c7a62a4a324b0bfb37086795e31c6c1 # v6.16.0 with: context: . file: ./Dockerfile @@ -105,7 +105,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit @@ -134,7 +134,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@c6295a65d1254861815972266d5933fd6e532bdf # v2.11.1 + uses: step-security/harden-runner@0634a2670c59f64b4a01f0f96f84700a4088b9f0 # v2.12.0 with: egress-policy: audit diff --git a/DeveloperGuide.md b/DeveloperGuide.md index 8a4b53b6b..bbf8b8677 100644 --- a/DeveloperGuide.md +++ b/DeveloperGuide.md @@ -153,6 +153,7 @@ services: SYSTEM_MAXFILESIZE: "100" METRICS_ENABLED: "true" SYSTEM_GOOGLEVISIBILITY: "true" + SHOW_SURVEY: "true" restart: on-failure:5 ``` diff --git a/Dockerfile.dev b/Dockerfile.dev index 646bccaf0..dbfdfc89c 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -1,7 +1,7 @@ # dockerfile.dev # Basisimage: Gradle mit JDK 17 (Debian-basiert) -FROM gradle:8.13-jdk17 +FROM gradle:8.14-jdk17 # Als Root-Benutzer arbeiten, um benötigte Pakete zu installieren USER root diff --git a/Dockerfile.fat b/Dockerfile.fat index 2dbf4ba4f..ef19ebde7 100644 --- a/Dockerfile.fat +++ b/Dockerfile.fat @@ -1,5 +1,5 @@ # Build the application -FROM gradle:8.13-jdk21 AS build +FROM gradle:8.14-jdk21 AS build COPY build.gradle . COPY settings.gradle . diff --git a/README.md b/README.md index 50e2f8c42..e642dd8b4 100644 --- a/README.md +++ b/README.md @@ -116,46 +116,46 @@ Stirling-PDF currently supports 39 languages! | Language | Progress | | -------------------------------------------- | -------------------------------------- | -| Arabic (العربية) (ar_AR) | ![84%](https://geps.dev/progress/84) | -| Azerbaijani (Azərbaycan Dili) (az_AZ) | ![83%](https://geps.dev/progress/83) | +| Arabic (العربية) (ar_AR) | ![83%](https://geps.dev/progress/83) | +| Azerbaijani (Azərbaycan Dili) (az_AZ) | ![82%](https://geps.dev/progress/82) | | Basque (Euskara) (eu_ES) | ![48%](https://geps.dev/progress/48) | -| Bulgarian (Български) (bg_BG) | ![93%](https://geps.dev/progress/93) | -| Catalan (Català) (ca_CA) | ![90%](https://geps.dev/progress/90) | +| Bulgarian (Български) (bg_BG) | ![92%](https://geps.dev/progress/92) | +| Catalan (Català) (ca_CA) | ![89%](https://geps.dev/progress/89) | | Croatian (Hrvatski) (hr_HR) | ![81%](https://geps.dev/progress/81) | -| Czech (Česky) (cs_CZ) | ![92%](https://geps.dev/progress/92) | +| Czech (Česky) (cs_CZ) | ![91%](https://geps.dev/progress/91) | | Danish (Dansk) (da_DK) | ![80%](https://geps.dev/progress/80) | | Dutch (Nederlands) (nl_NL) | ![79%](https://geps.dev/progress/79) | | 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) | ![92%](https://geps.dev/progress/92) | -| German (Deutsch) (de_DE) | ![94%](https://geps.dev/progress/94) | +| French (Français) (fr_FR) | ![91%](https://geps.dev/progress/91) | +| German (Deutsch) (de_DE) | ![99%](https://geps.dev/progress/99) | | Greek (Ελληνικά) (el_GR) | ![91%](https://geps.dev/progress/91) | -| Hindi (हिंदी) (hi_IN) | ![92%](https://geps.dev/progress/92) | -| Hungarian (Magyar) (hu_HU) | ![89%](https://geps.dev/progress/89) | -| Indonesian (Bahasa Indonesia) (id_ID) | ![81%](https://geps.dev/progress/81) | -| Irish (Gaeilge) (ga_IE) | ![92%](https://geps.dev/progress/92) | +| Hindi (हिंदी) (hi_IN) | ![91%](https://geps.dev/progress/91) | +| Hungarian (Magyar) (hu_HU) | ![99%](https://geps.dev/progress/99) | +| Indonesian (Bahasa Indonesia) (id_ID) | ![80%](https://geps.dev/progress/80) | +| Irish (Gaeilge) (ga_IE) | ![91%](https://geps.dev/progress/91) | | Italian (Italiano) (it_IT) | ![99%](https://geps.dev/progress/99) | -| Japanese (日本語) (ja_JP) | ![89%](https://geps.dev/progress/89) | +| Japanese (日本語) (ja_JP) | ![93%](https://geps.dev/progress/93) | | Korean (한국어) (ko_KR) | ![92%](https://geps.dev/progress/92) | | Norwegian (Norsk) (no_NB) | ![86%](https://geps.dev/progress/86) | -| Persian (فارسی) (fa_IR) | ![88%](https://geps.dev/progress/88) | -| Polish (Polski) (pl_PL) | ![96%](https://geps.dev/progress/96) | +| Persian (فارسی) (fa_IR) | ![87%](https://geps.dev/progress/87) | +| Polish (Polski) (pl_PL) | ![95%](https://geps.dev/progress/95) | | Portuguese (Português) (pt_PT) | ![91%](https://geps.dev/progress/91) | -| Portuguese Brazilian (Português) (pt_BR) | ![98%](https://geps.dev/progress/98) | +| Portuguese Brazilian (Português) (pt_BR) | ![97%](https://geps.dev/progress/97) | | Romanian (Română) (ro_RO) | ![75%](https://geps.dev/progress/75) | -| Russian (Русский) (ru_RU) | ![94%](https://geps.dev/progress/94) | +| Russian (Русский) (ru_RU) | ![93%](https://geps.dev/progress/93) | | Serbian Latin alphabet (Srpski) (sr_LATN_RS) | ![60%](https://geps.dev/progress/60) | | Simplified Chinese (简体中文) (zh_CN) | ![93%](https://geps.dev/progress/93) | | Slovakian (Slovensky) (sk_SK) | ![69%](https://geps.dev/progress/69) | -| Slovenian (Slovenščina) (sl_SI) | ![95%](https://geps.dev/progress/95) | -| Spanish (Español) (es_ES) | ![93%](https://geps.dev/progress/93) | +| Slovenian (Slovenščina) (sl_SI) | ![94%](https://geps.dev/progress/94) | +| Spanish (Español) (es_ES) | ![98%](https://geps.dev/progress/98) | | Swedish (Svenska) (sv_SE) | ![87%](https://geps.dev/progress/87) | | Thai (ไทย) (th_TH) | ![80%](https://geps.dev/progress/80) | -| Tibetan (བོད་ཡིག་) (zh_BO) | ![89%](https://geps.dev/progress/89) | +| Tibetan (བོད་ཡིག་) (zh_BO) | ![88%](https://geps.dev/progress/88) | | Traditional Chinese (繁體中文) (zh_TW) | ![99%](https://geps.dev/progress/99) | -| Turkish (Türkçe) (tr_TR) | ![98%](https://geps.dev/progress/98) | -| Ukrainian (Українська) (uk_UA) | ![97%](https://geps.dev/progress/97) | -| Vietnamese (Tiếng Việt) (vi_VN) | ![74%](https://geps.dev/progress/74) | +| Turkish (Türkçe) (tr_TR) | ![97%](https://geps.dev/progress/97) | +| Ukrainian (Українська) (uk_UA) | ![96%](https://geps.dev/progress/96) | +| Vietnamese (Tiếng Việt) (vi_VN) | ![73%](https://geps.dev/progress/73) | ## Stirling PDF Enterprise diff --git a/build.gradle b/build.gradle index 3f3219af4..e91f0a467 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ plugins { id "java" - id "org.springframework.boot" version "3.4.4" + id "org.springframework.boot" version "3.4.5" id "io.spring.dependency-management" version "1.1.7" id "org.springdoc.openapi-gradle-plugin" version "1.9.0" id "io.swagger.swaggerhub" version "1.3.2" @@ -18,18 +18,18 @@ import java.nio.file.Files import java.time.Year ext { - springBootVersion = "3.4.4" - pdfboxVersion = "3.0.4" + springBootVersion = "3.4.5" + pdfboxVersion = "3.0.5" imageioVersion = "3.12.0" lombokVersion = "1.18.38" bouncycastleVersion = "1.80" - springSecuritySamlVersion = "6.4.4" + springSecuritySamlVersion = "6.4.5" openSamlVersion = "4.3.2" tempJrePath = null } group = "stirling.software" -version = "0.45.6" +version = "0.46.0" java { // 17 is lowest but we support and recommend 21 @@ -51,16 +51,20 @@ sourceSets { main { java { if (System.getenv("DOCKER_ENABLE_SECURITY") == "false") { + exclude "stirling/software/SPDF/config/interfaces/DatabaseInterface.java" exclude "stirling/software/SPDF/config/security/**" exclude "stirling/software/SPDF/controller/api/DatabaseController.java" - exclude "stirling/software/SPDF/controller/api/UserController.java" + exclude "stirling/software/SPDF/controller/api/EmailController.java" exclude "stirling/software/SPDF/controller/api/H2SQLCondition.java" + exclude "stirling/software/SPDF/controller/api/UserController.java" exclude "stirling/software/SPDF/controller/web/AccountWebController.java" exclude "stirling/software/SPDF/controller/web/DatabaseWebController.java" + exclude "stirling/software/SPDF/model/api/Email.java" exclude "stirling/software/SPDF/model/ApiKeyAuthenticationToken.java" exclude "stirling/software/SPDF/model/AttemptCounter.java" exclude "stirling/software/SPDF/model/Authority.java" - exclude "stirling/software/SPDF/model/BackupNotFoundException.java" + exclude "stirling/software/SPDF/model/exception/BackupNotFoundException.java" + exclude "stirling/software/SPDF/model/exception/NoProviderFoundException.java" exclude "stirling/software/SPDF/model/PersistentLogin.java" exclude "stirling/software/SPDF/model/SessionEntity.java" exclude "stirling/software/SPDF/model/User.java" @@ -78,16 +82,8 @@ sourceSets { java { if (System.getenv("DOCKER_ENABLE_SECURITY") == "false") { exclude "stirling/software/SPDF/config/security/**" - exclude "stirling/software/SPDF/controller/api/UserControllerTest.java" - exclude "stirling/software/SPDF/controller/api/DatabaseControllerTest.java" - exclude "stirling/software/SPDF/controller/web/AccountWebControllerTest.java" - exclude "stirling/software/SPDF/controller/web/DatabaseWebControllerTest.java" exclude "stirling/software/SPDF/model/ApiKeyAuthenticationTokenTest.java" - exclude "stirling/software/SPDF/model/AttemptCounterTest.java" - exclude "stirling/software/SPDF/model/AuthorityTest.java" - exclude "stirling/software/SPDF/model/PersistentLoginTest.java" - exclude "stirling/software/SPDF/model/SessionEntityTest.java" - exclude "stirling/software/SPDF/model/UserTest.java" + exclude "stirling/software/SPDF/controller/api/EmailControllerTest.java" exclude "stirling/software/SPDF/repository/**" } @@ -116,10 +112,10 @@ jpackage { input = "build/libs" destination = "${projectDir}/build/jpackage" mainJar = "Stirling-PDF-${project.version}.jar" - appName = "Stirling-PDF" + appName = "Stirling PDF" appVersion = project.version // appVersion = "2005.45.1" - vendor = "Stirling-Software" + vendor = "Stirling PDF Inc" appDescription = "Stirling PDF - Your Local PDF Editor" icon = "src/main/resources/static/favicon.ico" verbose = true @@ -151,7 +147,7 @@ jpackage { winShortcutPrompt = true // Lets user choose whether to create shortcuts winDirChooser = true // Allows users to choose installation directory winPerUserInstall = false - winMenuGroup = "Stirling Software" + winMenuGroup = "Stirling PDF" winUpgradeUuid = "2a43ed0c-b8c2-40cf-89e1-751129b87641" // Unique identifier for updates winHelpUrl = "https://github.com/Stirling-Tools/Stirling-PDF" winUpdateUrl = "https://github.com/Stirling-Tools/Stirling-PDF/releases" @@ -164,8 +160,8 @@ jpackage { appVersion = getMacVersion(project.version.toString()) icon = "src/main/resources/static/favicon.icns" type = "dmg" - macPackageIdentifier = "Stirling-PDF" - macPackageName = "Stirling-PDF" + macPackageIdentifier = "Stirling PDF" + macPackageName = "Stirling PDF" macAppCategory = "public.app-category.productivity" macSign = false // Enable signing macAppStore = false // Not targeting App Store initially @@ -249,18 +245,32 @@ tasks.register('jpackageMacX64') { def result = exec { commandLine 'jpackage', - '--type', 'dmg', - '--name', 'Stirling-PDF (x86_64)', - '--input', 'build/libs', - '--main-jar', "Stirling-PDF-${project.version}.jar", - '--main-class', 'org.springframework.boot.loader.launch.JarLauncher', - '--runtime-image', file(jrePath + "/zulu-17.jre/Contents/Home"), - '--dest', 'build/jpackage/x86_64', - '--icon', 'src/main/resources/static/favicon.icns', - '--app-version', getMacVersion(project.version.toString()), - '--mac-package-name', 'Stirling-PDF (x86_64)', - '--mac-package-identifier', 'Stirling-PDF (x86_64)', - '--mac-app-category', 'public.app-category.productivity' + '--type', 'dmg', + '--name', 'Stirling PDF (x86_64)', + '--input', 'build/libs', + '--main-jar', "Stirling-PDF-${project.version}.jar", + '--main-class', 'org.springframework.boot.loader.launch.JarLauncher', + '--runtime-image', file(jrePath + "/zulu-17.jre/Contents/Home"), + '--dest', 'build/jpackage/x86_64', + '--icon', 'src/main/resources/static/favicon.icns', + '--app-version', getMacVersion(project.version.toString()), + '--mac-package-name', 'Stirling PDF (x86_64)', + '--mac-package-identifier', 'Stirling PDF (x86_64)', + '--mac-app-category', 'public.app-category.productivity', + + // Java options + '--java-options', '-DBROWSER_OPEN=true', + '--java-options', '-DSTIRLING_PDF_DESKTOP_UI=true', + '--java-options', '-Djava.awt.headless=false', + '--java-options', '-Dapple.awt.UIElement=true', + '--java-options', '--add-opens=java.base/java.lang=ALL-UNNAMED', + '--java-options', '--add-opens=java.desktop/java.awt.event=ALL-UNNAMED', + '--java-options', '--add-opens=java.desktop/sun.awt=ALL-UNNAMED', + '--java-options', '--add-opens=java.desktop/sun.awt.X11=ALL-UNNAMED', + '--java-options', '--add-opens=java.desktop/sun.awt.windows=ALL-UNNAMED', + '--java-options', '--add-opens=java.desktop/sun.lwawt=ALL-UNNAMED', + '--java-options', '--add-opens=java.desktop/sun.lwawt.macosx=ALL-UNNAMED' + standardOutput = outputStream errorOutput = errorStream ignoreExitValue = true @@ -390,7 +400,7 @@ sonar { // rules=['unused-dependency'] // } tasks.wrapper { - gradleVersion = "8.12" + gradleVersion = "8.14" distributionType = Wrapper.DistributionType.ALL } //tasks.withType(JavaCompile) { @@ -423,7 +433,7 @@ dependencies { } //security updates - implementation "org.springframework:spring-webmvc:6.2.5" + implementation "org.springframework:spring-webmvc:6.2.6" implementation("io.github.pixee:java-security-toolkit:1.2.1") @@ -445,9 +455,10 @@ dependencies { implementation "org.thymeleaf.extras:thymeleaf-extras-springsecurity5:3.1.3.RELEASE" implementation "org.springframework.boot:spring-boot-starter-data-jpa:$springBootVersion" implementation "org.springframework.boot:spring-boot-starter-oauth2-client:$springBootVersion" + implementation "org.springframework.boot:spring-boot-starter-mail:$springBootVersion" - implementation "org.springframework.session:spring-session-core:3.4.2" - implementation "org.springframework:spring-jdbc:6.2.5" + implementation "org.springframework.session:spring-session-core:3.4.3" + implementation "org.springframework:spring-jdbc:6.2.6" implementation 'com.unboundid.product.scim2:scim2-sdk-client:2.3.5' // Don't upgrade h2database @@ -492,11 +503,11 @@ dependencies { implementation "com.drewnoakes:metadata-extractor:2.19.0" implementation "commons-io:commons-io:2.19.0" - implementation "org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0" + implementation "org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.8" //general PDF // https://mvnrepository.com/artifact/com.opencsv/opencsv - implementation ("com.opencsv:opencsv:5.10") + implementation ("com.opencsv:opencsv:5.11") implementation ("org.apache.pdfbox:pdfbox:$pdfboxVersion") implementation "org.apache.pdfbox:preflight:$pdfboxVersion" @@ -523,7 +534,7 @@ dependencies { implementation "org.commonmark:commonmark-ext-gfm-tables:0.24.0" // https://mvnrepository.com/artifact/com.bucket4j/bucket4j_jdk17 implementation "com.bucket4j:bucket4j_jdk17-core:8.14.0" - implementation "com.fathzer:javaluator:3.0.5" + implementation "com.fathzer:javaluator:3.0.6" implementation 'com.vladsch.flexmark:flexmark-html2md-converter:0.64.8' diff --git a/exampleYmlFiles/docker-compose-latest-fat-endpoints-disabled.yml b/exampleYmlFiles/docker-compose-latest-fat-endpoints-disabled.yml index 729684681..f36cd5bc7 100644 --- a/exampleYmlFiles/docker-compose-latest-fat-endpoints-disabled.yml +++ b/exampleYmlFiles/docker-compose-latest-fat-endpoints-disabled.yml @@ -32,4 +32,5 @@ services: SYSTEM_MAXFILESIZE: "100" METRICS_ENABLED: "true" SYSTEM_GOOGLEVISIBILITY: "true" + SHOW_SURVEY: "true" restart: on-failure:5 diff --git a/exampleYmlFiles/docker-compose-latest-fat-security-postgres.yml b/exampleYmlFiles/docker-compose-latest-fat-security-postgres.yml index b79631b6e..c04da1912 100644 --- a/exampleYmlFiles/docker-compose-latest-fat-security-postgres.yml +++ b/exampleYmlFiles/docker-compose-latest-fat-security-postgres.yml @@ -36,6 +36,7 @@ services: SYSTEM_DATASOURCE_CUSTOMDATABASEURL: "jdbc:postgresql://db:5432/stirling_pdf" SYSTEM_DATASOURCE_USERNAME: "admin" SYSTEM_DATASOURCE_PASSWORD: "stirling" + SHOW_SURVEY: "true" restart: on-failure:5 db: diff --git a/exampleYmlFiles/docker-compose-latest-fat-security.yml b/exampleYmlFiles/docker-compose-latest-fat-security.yml index 5d01f33f0..d9e4fa5a9 100644 --- a/exampleYmlFiles/docker-compose-latest-fat-security.yml +++ b/exampleYmlFiles/docker-compose-latest-fat-security.yml @@ -30,4 +30,5 @@ services: SYSTEM_MAXFILESIZE: "100" METRICS_ENABLED: "true" SYSTEM_GOOGLEVISIBILITY: "true" + SHOW_SURVEY: "true" restart: on-failure:5 diff --git a/exampleYmlFiles/docker-compose-latest-security-with-sso.yml b/exampleYmlFiles/docker-compose-latest-security-with-sso.yml index 9b86d4cc2..1514dd7d8 100644 --- a/exampleYmlFiles/docker-compose-latest-security-with-sso.yml +++ b/exampleYmlFiles/docker-compose-latest-security-with-sso.yml @@ -38,4 +38,5 @@ services: SYSTEM_MAXFILESIZE: "100" METRICS_ENABLED: "true" SYSTEM_GOOGLEVISIBILITY: "true" + SHOW_SURVEY: "true" restart: on-failure:5 diff --git a/exampleYmlFiles/docker-compose-latest-security.yml b/exampleYmlFiles/docker-compose-latest-security.yml index b79ea8016..ccd3a41c6 100644 --- a/exampleYmlFiles/docker-compose-latest-security.yml +++ b/exampleYmlFiles/docker-compose-latest-security.yml @@ -30,4 +30,5 @@ services: SYSTEM_MAXFILESIZE: "100" METRICS_ENABLED: "true" SYSTEM_GOOGLEVISIBILITY: "true" + SHOW_SURVEY: "true" restart: on-failure:5 diff --git a/exampleYmlFiles/docker-compose-latest-ultra-lite-security.yml b/exampleYmlFiles/docker-compose-latest-ultra-lite-security.yml index 8f3932f7a..c59713b71 100644 --- a/exampleYmlFiles/docker-compose-latest-ultra-lite-security.yml +++ b/exampleYmlFiles/docker-compose-latest-ultra-lite-security.yml @@ -27,4 +27,5 @@ services: SYSTEM_MAXFILESIZE: "100" METRICS_ENABLED: "true" SYSTEM_GOOGLEVISIBILITY: "true" + SHOW_SURVEY: "true" restart: on-failure:5 diff --git a/exampleYmlFiles/docker-compose-latest-ultra-lite.yml b/exampleYmlFiles/docker-compose-latest-ultra-lite.yml index d194be21c..6148f7251 100644 --- a/exampleYmlFiles/docker-compose-latest-ultra-lite.yml +++ b/exampleYmlFiles/docker-compose-latest-ultra-lite.yml @@ -26,4 +26,5 @@ services: SYSTEM_MAXFILESIZE: "100" METRICS_ENABLED: "true" SYSTEM_GOOGLEVISIBILITY: "true" + SHOW_SURVEY: "true" restart: on-failure:5 diff --git a/exampleYmlFiles/docker-compose-latest.yml b/exampleYmlFiles/docker-compose-latest.yml index 7dec8a959..51266ee8b 100644 --- a/exampleYmlFiles/docker-compose-latest.yml +++ b/exampleYmlFiles/docker-compose-latest.yml @@ -28,4 +28,5 @@ services: SYSTEM_MAXFILESIZE: "100" METRICS_ENABLED: "true" SYSTEM_GOOGLEVISIBILITY: "true" + SHOW_SURVEY: "true" restart: on-failure:5 diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index a4b76b953..1b33c55ba 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index e0fd02028..6514f919f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-all.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index f3b75f3b0..23d15a936 100755 --- a/gradlew +++ b/gradlew @@ -114,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -205,7 +205,7 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. @@ -213,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 9d21a2183..db3a6ac20 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,11 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/scripts/ignore_translation.toml b/scripts/ignore_translation.toml index 521f3c54c..12f3bc7a4 100644 --- a/scripts/ignore_translation.toml +++ b/scripts/ignore_translation.toml @@ -56,6 +56,9 @@ ignore = [ 'validateSignature.cert.version', 'validateSignature.status', 'watermark.type.1', + 'endpointStatistics.top10', + 'endpointStatistics.top20', + 'cookieBanner.popUp.acceptAllBtn', ] [el_GR] diff --git a/settings.gradle b/settings.gradle index f8139930e..6f039dc93 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,5 @@ +plugins { + // Apply the foojay-resolver plugin to allow automatic download of JDKs + id 'org.gradle.toolchains.foojay-resolver-convention' version '0.10.0' +} rootProject.name = 'Stirling-PDF' diff --git a/src/main/java/stirling/software/SPDF/EE/KeygenLicenseVerifier.java b/src/main/java/stirling/software/SPDF/EE/KeygenLicenseVerifier.java index ce3c94435..473f5f385 100644 --- a/src/main/java/stirling/software/SPDF/EE/KeygenLicenseVerifier.java +++ b/src/main/java/stirling/software/SPDF/EE/KeygenLicenseVerifier.java @@ -9,7 +9,6 @@ import java.util.Base64; import org.bouncycastle.crypto.params.Ed25519PublicKeyParameters; import org.bouncycastle.crypto.signers.Ed25519Signer; import org.bouncycastle.util.encoders.Hex; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.fasterxml.jackson.databind.JsonNode; @@ -17,6 +16,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.posthog.java.shaded.org.json.JSONException; import com.posthog.java.shaded.org.json.JSONObject; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import stirling.software.SPDF.model.ApplicationProperties; @@ -24,6 +24,7 @@ import stirling.software.SPDF.utils.GeneralUtils; @Service @Slf4j +@RequiredArgsConstructor public class KeygenLicenseVerifier { enum License { @@ -47,40 +48,35 @@ public class KeygenLicenseVerifier { private static final ObjectMapper objectMapper = new ObjectMapper(); private final ApplicationProperties applicationProperties; - @Autowired - public KeygenLicenseVerifier(ApplicationProperties applicationProperties) { - this.applicationProperties = applicationProperties; - } - public License verifyLicense(String licenseKeyOrCert) { - License license; + License license; - if (isCertificateLicense(licenseKeyOrCert)) { - log.info("Detected certificate-based license. Processing..."); - boolean isValid = verifyCertificateLicense(licenseKeyOrCert); - if (isValid) { - license = isEnterpriseLicense ? License.ENTERPRISE : License.PRO; - } else { - license = License.NORMAL; - } - } else if (isJWTLicense(licenseKeyOrCert)) { - log.info("Detected JWT-style license key. Processing..."); - boolean isValid = verifyJWTLicense(licenseKeyOrCert); - if (isValid) { - license = isEnterpriseLicense ? License.ENTERPRISE : License.PRO; - } else { - license = License.NORMAL; - } - } else { - log.info("Detected standard license key. Processing..."); - boolean isValid = verifyStandardLicense(licenseKeyOrCert); - if (isValid) { - license = isEnterpriseLicense ? License.ENTERPRISE : License.PRO; - } else { - license = License.NORMAL; - } - } - return license; + if (isCertificateLicense(licenseKeyOrCert)) { + log.info("Detected certificate-based license. Processing..."); + boolean isValid = verifyCertificateLicense(licenseKeyOrCert); + if (isValid) { + license = isEnterpriseLicense ? License.ENTERPRISE : License.PRO; + } else { + license = License.NORMAL; + } + } else if (isJWTLicense(licenseKeyOrCert)) { + log.info("Detected JWT-style license key. Processing..."); + boolean isValid = verifyJWTLicense(licenseKeyOrCert); + if (isValid) { + license = isEnterpriseLicense ? License.ENTERPRISE : License.PRO; + } else { + license = License.NORMAL; + } + } else { + log.info("Detected standard license key. Processing..."); + boolean isValid = verifyStandardLicense(licenseKeyOrCert); + if (isValid) { + license = isEnterpriseLicense ? License.ENTERPRISE : License.PRO; + } else { + license = License.NORMAL; + } + } + return license; } private boolean isEnterpriseLicense = false; @@ -123,7 +119,7 @@ public class KeygenLicenseVerifier { } // Verify license file algorithm - if (!algorithm.equals("base64+ed25519")) { + if (!"base64+ed25519".equals(algorithm)) { log.error( "Unsupported algorithm: {}. Only base64+ed25519 is supported.", algorithm); return false; @@ -193,8 +189,6 @@ public class KeygenLicenseVerifier { private boolean processCertificateData(String certData) { try { - - JSONObject licenseData = new JSONObject(certData); JSONObject metaObj = licenseData.optJSONObject("meta"); if (metaObj != null) { @@ -208,7 +202,8 @@ public class KeygenLicenseVerifier { if (issued.isAfter(now)) { log.error( - "License file issued date is in the future. Please adjust system time or request a new license"); + "License file issued date is in the future. Please adjust system" + + " time or request a new license"); return false; } @@ -248,8 +243,8 @@ public class KeygenLicenseVerifier { // Check license status if available String status = attributesObj.optString("status", null); if (status != null - && !status.equals("ACTIVE") - && !status.equals("EXPIRING")) { // Accept "EXPIRING" status as valid + && !"ACTIVE".equals(status) + && !"EXPIRING".equals(status)) { // Accept "EXPIRING" status as valid log.error("License status is not active: {}", status); return false; } @@ -273,7 +268,8 @@ public class KeygenLicenseVerifier { String[] parts = licenseData.split("\\.", 2); if (parts.length != 2) { log.error( - "Invalid ED25519_SIGN license format. Expected format: key/payload.signature"); + "Invalid ED25519_SIGN license format. Expected format:" + + " key/payload.signature"); return false; } @@ -354,7 +350,7 @@ public class KeygenLicenseVerifier { // Check expiry date String expiryStr = licenseObj.optString("expiry", null); - if (expiryStr != null && !expiryStr.equals("null")) { + if (expiryStr != null && !"null".equals(expiryStr)) { java.time.Instant expiry = java.time.Instant.parse(expiryStr); java.time.Instant now = java.time.Instant.now(); @@ -390,19 +386,18 @@ public class KeygenLicenseVerifier { // Extract max users and isEnterprise from policy or metadata int users = policyObj.optInt("users", 0); isEnterpriseLicense = policyObj.optBoolean("isEnterprise", false); - + if (users > 0) { applicationProperties.getPremium().setMaxUsers(users); log.info("License allows for {} users", users); } else { // Try to get users from metadata if present Object metadataObj = policyObj.opt("metadata"); - if (metadataObj instanceof JSONObject) { - JSONObject metadata = (JSONObject) metadataObj; + if (metadataObj instanceof JSONObject metadata) { users = metadata.optInt("users", 1); applicationProperties.getPremium().setMaxUsers(users); log.info("License allows for {} users (from metadata)", users); - + // Check for isEnterprise flag in metadata isEnterpriseLicense = metadata.optBoolean("isEnterprise", false); } else { @@ -411,7 +406,6 @@ public class KeygenLicenseVerifier { log.info("Using default of 1 user for license"); } } - } return true; @@ -438,7 +432,8 @@ public class KeygenLicenseVerifier { || "NO_MACHINES".equals(code) || "FINGERPRINT_SCOPE_MISMATCH".equals(code)) { log.info( - "License not activated for this machine. Attempting to activate..."); + "License not activated for this machine. Attempting to" + + " activate..."); boolean activated = activateMachine(licenseKey, licenseId, machineFingerprint); if (activated) { @@ -507,16 +502,16 @@ public class KeygenLicenseVerifier { .path("users") .asInt(0); applicationProperties.getPremium().setMaxUsers(users); - + // Extract isEnterprise flag - isEnterpriseLicense = + isEnterpriseLicense = jsonResponse .path("data") .path("attributes") .path("metadata") .path("isEnterprise") .asBoolean(false); - + log.info(applicationProperties.toString()); } else { diff --git a/src/main/java/stirling/software/SPDF/EE/LicenseKeyChecker.java b/src/main/java/stirling/software/SPDF/EE/LicenseKeyChecker.java index d788504c5..8e5633f41 100644 --- a/src/main/java/stirling/software/SPDF/EE/LicenseKeyChecker.java +++ b/src/main/java/stirling/software/SPDF/EE/LicenseKeyChecker.java @@ -5,7 +5,6 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -27,7 +26,6 @@ public class LicenseKeyChecker { private License premiumEnabledResult = License.NORMAL; - @Autowired public LicenseKeyChecker( KeygenLicenseVerifier licenseService, ApplicationProperties applicationProperties) { this.licenseService = licenseService; diff --git a/src/main/java/stirling/software/SPDF/config/AppConfig.java b/src/main/java/stirling/software/SPDF/config/AppConfig.java index 1c850b2de..f07368527 100644 --- a/src/main/java/stirling/software/SPDF/config/AppConfig.java +++ b/src/main/java/stirling/software/SPDF/config/AppConfig.java @@ -20,8 +20,7 @@ import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.thymeleaf.spring6.SpringTemplateEngine; -import com.posthog.java.shaded.kotlin.text.Regex; - +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import stirling.software.SPDF.model.ApplicationProperties; @@ -29,14 +28,11 @@ import stirling.software.SPDF.model.ApplicationProperties; @Configuration @Lazy @Slf4j +@RequiredArgsConstructor public class AppConfig { private final ApplicationProperties applicationProperties; - public AppConfig(ApplicationProperties applicationProperties) { - this.applicationProperties = applicationProperties; - } - @Bean @ConditionalOnProperty(name = "system.customHTMLFiles", havingValue = "true") public SpringTemplateEngine templateEngine(ResourceLoader resourceLoader) { diff --git a/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java b/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java index 08da2fa3c..0ddd68958 100644 --- a/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java +++ b/src/main/java/stirling/software/SPDF/config/EndpointConfiguration.java @@ -6,7 +6,6 @@ import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; @@ -24,7 +23,6 @@ public class EndpointConfiguration { private Map> endpointGroups = new ConcurrentHashMap<>(); private final boolean runningProOrHigher; - @Autowired public EndpointConfiguration( ApplicationProperties applicationProperties, @Qualifier("runningProOrHigher") boolean runningProOrHigher) { @@ -166,6 +164,7 @@ public class EndpointConfiguration { addEndpointToGroup("Other", "sign"); addEndpointToGroup("Other", "flatten"); addEndpointToGroup("Other", "repair"); + addEndpointToGroup("Other", "unlock-pdf-forms"); addEndpointToGroup("Other", REMOVE_BLANKS); addEndpointToGroup("Other", "remove-annotations"); addEndpointToGroup("Other", "compare"); diff --git a/src/main/java/stirling/software/SPDF/config/EndpointInspector.java b/src/main/java/stirling/software/SPDF/config/EndpointInspector.java index 6019ca665..d9ceb0f9d 100644 --- a/src/main/java/stirling/software/SPDF/config/EndpointInspector.java +++ b/src/main/java/stirling/software/SPDF/config/EndpointInspector.java @@ -8,7 +8,6 @@ import java.util.TreeSet; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; @@ -18,7 +17,10 @@ import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.mvc.method.RequestMappingInfo; import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping; +import lombok.RequiredArgsConstructor; + @Component +@RequiredArgsConstructor public class EndpointInspector implements ApplicationListener { private static final Logger logger = LoggerFactory.getLogger(EndpointInspector.class); @@ -26,11 +28,6 @@ public class EndpointInspector implements ApplicationListener validGetEndpoints = new HashSet<>(); private boolean endpointsDiscovered = false; - @Autowired - public EndpointInspector(ApplicationContext applicationContext) { - this.applicationContext = applicationContext; - } - @Override public void onApplicationEvent(ContextRefreshedEvent event) { if (!endpointsDiscovered) { diff --git a/src/main/java/stirling/software/SPDF/config/EndpointInterceptor.java b/src/main/java/stirling/software/SPDF/config/EndpointInterceptor.java index aa3fce4c7..52fb42e07 100644 --- a/src/main/java/stirling/software/SPDF/config/EndpointInterceptor.java +++ b/src/main/java/stirling/software/SPDF/config/EndpointInterceptor.java @@ -6,18 +6,16 @@ import org.springframework.web.servlet.HandlerInterceptor; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @Component @Slf4j +@RequiredArgsConstructor public class EndpointInterceptor implements HandlerInterceptor { private final EndpointConfiguration endpointConfiguration; - public EndpointInterceptor(EndpointConfiguration endpointConfiguration) { - this.endpointConfiguration = endpointConfiguration; - } - @Override public boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object handler) diff --git a/src/main/java/stirling/software/SPDF/config/InitialSetup.java b/src/main/java/stirling/software/SPDF/config/InitialSetup.java index 4c3131a1c..44de07d38 100644 --- a/src/main/java/stirling/software/SPDF/config/InitialSetup.java +++ b/src/main/java/stirling/software/SPDF/config/InitialSetup.java @@ -14,6 +14,7 @@ import io.micrometer.common.util.StringUtils; import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import stirling.software.SPDF.model.ApplicationProperties; @@ -22,14 +23,11 @@ import stirling.software.SPDF.utils.GeneralUtils; @Component @Slf4j @Order(Ordered.HIGHEST_PRECEDENCE + 1) +@RequiredArgsConstructor public class InitialSetup { private final ApplicationProperties applicationProperties; - public InitialSetup(ApplicationProperties applicationProperties) { - this.applicationProperties = applicationProperties; - } - @PostConstruct public void init() throws IOException { initUUIDKey(); diff --git a/src/main/java/stirling/software/SPDF/config/LocaleConfiguration.java b/src/main/java/stirling/software/SPDF/config/LocaleConfiguration.java index 94c3392f9..ab37c3c5e 100644 --- a/src/main/java/stirling/software/SPDF/config/LocaleConfiguration.java +++ b/src/main/java/stirling/software/SPDF/config/LocaleConfiguration.java @@ -10,17 +10,16 @@ import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; import org.springframework.web.servlet.i18n.SessionLocaleResolver; +import lombok.RequiredArgsConstructor; + import stirling.software.SPDF.model.ApplicationProperties; @Configuration +@RequiredArgsConstructor public class LocaleConfiguration implements WebMvcConfigurer { private final ApplicationProperties applicationProperties; - public LocaleConfiguration(ApplicationProperties applicationProperties) { - this.applicationProperties = applicationProperties; - } - @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(localeChangeInterceptor()); @@ -52,7 +51,7 @@ public class LocaleConfiguration implements WebMvcConfigurer { defaultLocale = tempLocale; } else { System.err.println( - "Invalid APP_LOCALE environment variable value. Falling back to default Locale.UK."); + "Invalid SYSTEM_DEFAULTLOCALE environment variable value. Falling back to default en-GB."); } } } diff --git a/src/main/java/stirling/software/SPDF/config/MetricsFilter.java b/src/main/java/stirling/software/SPDF/config/MetricsFilter.java index d187502c8..586374cbe 100644 --- a/src/main/java/stirling/software/SPDF/config/MetricsFilter.java +++ b/src/main/java/stirling/software/SPDF/config/MetricsFilter.java @@ -2,7 +2,6 @@ package stirling.software.SPDF.config; import java.io.IOException; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; @@ -15,18 +14,16 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; +import lombok.RequiredArgsConstructor; + import stirling.software.SPDF.utils.RequestUriUtils; @Component +@RequiredArgsConstructor public class MetricsFilter extends OncePerRequestFilter { private final MeterRegistry meterRegistry; - @Autowired - public MetricsFilter(MeterRegistry meterRegistry) { - this.meterRegistry = meterRegistry; - } - @Override protected void doFilterInternal( HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) diff --git a/src/main/java/stirling/software/SPDF/config/OpenApiConfig.java b/src/main/java/stirling/software/SPDF/config/OpenApiConfig.java index 0734b2317..d98c33257 100644 --- a/src/main/java/stirling/software/SPDF/config/OpenApiConfig.java +++ b/src/main/java/stirling/software/SPDF/config/OpenApiConfig.java @@ -9,16 +9,20 @@ import io.swagger.v3.oas.models.info.Info; import io.swagger.v3.oas.models.security.SecurityRequirement; import io.swagger.v3.oas.models.security.SecurityScheme; +import lombok.RequiredArgsConstructor; + import stirling.software.SPDF.model.ApplicationProperties; @Configuration +@RequiredArgsConstructor public class OpenApiConfig { private final ApplicationProperties applicationProperties; - public OpenApiConfig(ApplicationProperties applicationProperties) { - this.applicationProperties = applicationProperties; - } + private static final String DEFAULT_TITLE = "Stirling PDF API"; + private static final String DEFAULT_DESCRIPTION = + "API documentation for all Server-Side processing.\n" + + "Please note some functionality might be UI only and missing from here."; @Bean public OpenAPI customOpenAPI() { @@ -27,29 +31,27 @@ public class OpenApiConfig { // default version if all else fails version = "1.0.0"; } - SecurityScheme apiKeyScheme = - new SecurityScheme() - .type(SecurityScheme.Type.APIKEY) - .in(SecurityScheme.In.HEADER) - .name("X-API-KEY"); if (!applicationProperties.getSecurity().getEnableLogin()) { return new OpenAPI() .components(new Components()) .info( new Info() - .title("Stirling PDF API") + .title(DEFAULT_TITLE) .version(version) - .description( - "API documentation for all Server-Side processing.\nPlease note some functionality might be UI only and missing from here.")); + .description(DEFAULT_DESCRIPTION)); } else { + SecurityScheme apiKeyScheme = + new SecurityScheme() + .type(SecurityScheme.Type.APIKEY) + .in(SecurityScheme.In.HEADER) + .name("X-API-KEY"); return new OpenAPI() .components(new Components().addSecuritySchemes("apiKey", apiKeyScheme)) .info( new Info() - .title("Stirling PDF API") + .title(DEFAULT_TITLE) .version(version) - .description( - "API documentation for all Server-Side processing.\nPlease note some functionality might be UI only and missing from here.")) + .description(DEFAULT_DESCRIPTION)) .addSecurityItem(new SecurityRequirement().addList("apiKey")); } } diff --git a/src/main/java/stirling/software/SPDF/config/WebMvcConfig.java b/src/main/java/stirling/software/SPDF/config/WebMvcConfig.java index 68d3fbbe4..63957fd0f 100644 --- a/src/main/java/stirling/software/SPDF/config/WebMvcConfig.java +++ b/src/main/java/stirling/software/SPDF/config/WebMvcConfig.java @@ -5,15 +5,14 @@ import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; +import lombok.RequiredArgsConstructor; + @Configuration +@RequiredArgsConstructor public class WebMvcConfig implements WebMvcConfigurer { private final EndpointInterceptor endpointInterceptor; - public WebMvcConfig(EndpointInterceptor endpointInterceptor) { - this.endpointInterceptor = endpointInterceptor; - } - @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(endpointInterceptor); diff --git a/src/main/java/stirling/software/SPDF/config/security/AppUpdateAuthService.java b/src/main/java/stirling/software/SPDF/config/security/AppUpdateAuthService.java index c8a133223..23ac9d761 100644 --- a/src/main/java/stirling/software/SPDF/config/security/AppUpdateAuthService.java +++ b/src/main/java/stirling/software/SPDF/config/security/AppUpdateAuthService.java @@ -6,24 +6,21 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; +import lombok.RequiredArgsConstructor; + import stirling.software.SPDF.config.interfaces.ShowAdminInterface; import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.User; import stirling.software.SPDF.repository.UserRepository; @Service +@RequiredArgsConstructor class AppUpdateAuthService implements ShowAdminInterface { private final UserRepository userRepository; private final ApplicationProperties applicationProperties; - public AppUpdateAuthService( - UserRepository userRepository, ApplicationProperties applicationProperties) { - this.userRepository = userRepository; - this.applicationProperties = applicationProperties; - } - @Override public boolean getShowUpdateOnlyAdmins() { boolean showUpdate = applicationProperties.getSystem().isShowUpdate(); @@ -35,7 +32,7 @@ class AppUpdateAuthService implements ShowAdminInterface { if (authentication == null || !authentication.isAuthenticated()) { return !showUpdateOnlyAdmin; } - if (authentication.getName().equalsIgnoreCase("anonymousUser")) { + if ("anonymousUser".equalsIgnoreCase(authentication.getName())) { return !showUpdateOnlyAdmin; } Optional user = userRepository.findByUsername(authentication.getName()); diff --git a/src/main/java/stirling/software/SPDF/config/security/CustomLogoutSuccessHandler.java b/src/main/java/stirling/software/SPDF/config/security/CustomLogoutSuccessHandler.java index b570d625d..d59ba5d16 100644 --- a/src/main/java/stirling/software/SPDF/config/security/CustomLogoutSuccessHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/CustomLogoutSuccessHandler.java @@ -19,7 +19,7 @@ import com.coveo.saml.SamlException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import lombok.AllArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import stirling.software.SPDF.SPDFApplication; @@ -32,7 +32,7 @@ import stirling.software.SPDF.model.provider.KeycloakProvider; import stirling.software.SPDF.utils.UrlUtils; @Slf4j -@AllArgsConstructor +@RequiredArgsConstructor public class CustomLogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler { public static final String LOGOUT_PATH = "/login?logout=true"; diff --git a/src/main/java/stirling/software/SPDF/config/security/CustomUserDetailsService.java b/src/main/java/stirling/software/SPDF/config/security/CustomUserDetailsService.java index d0ee65f30..74c3fb9a4 100644 --- a/src/main/java/stirling/software/SPDF/config/security/CustomUserDetailsService.java +++ b/src/main/java/stirling/software/SPDF/config/security/CustomUserDetailsService.java @@ -11,23 +11,20 @@ import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; +import lombok.RequiredArgsConstructor; + import stirling.software.SPDF.model.Authority; import stirling.software.SPDF.model.User; import stirling.software.SPDF.repository.UserRepository; @Service +@RequiredArgsConstructor public class CustomUserDetailsService implements UserDetailsService { private final UserRepository userRepository; private final LoginAttemptService loginAttemptService; - public CustomUserDetailsService( - UserRepository userRepository, LoginAttemptService loginAttemptService) { - this.userRepository = userRepository; - this.loginAttemptService = loginAttemptService; - } - @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { User user = diff --git a/src/main/java/stirling/software/SPDF/config/security/IPRateLimitingFilter.java b/src/main/java/stirling/software/SPDF/config/security/IPRateLimitingFilter.java index ed269c4d1..25f27d658 100644 --- a/src/main/java/stirling/software/SPDF/config/security/IPRateLimitingFilter.java +++ b/src/main/java/stirling/software/SPDF/config/security/IPRateLimitingFilter.java @@ -7,8 +7,11 @@ import java.util.concurrent.atomic.AtomicInteger; import jakarta.servlet.*; import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; + import stirling.software.SPDF.utils.RequestUriUtils; +@RequiredArgsConstructor public class IPRateLimitingFilter implements Filter { private final ConcurrentHashMap requestCounts = @@ -17,11 +20,6 @@ public class IPRateLimitingFilter implements Filter { private final int maxRequests; private final int maxGetRequests; - public IPRateLimitingFilter(int maxRequests, int maxGetRequests) { - this.maxRequests = maxRequests; - this.maxGetRequests = maxGetRequests; - } - @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { diff --git a/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java b/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java index 9299d4773..9339405da 100644 --- a/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java +++ b/src/main/java/stirling/software/SPDF/config/security/InitialSecuritySetup.java @@ -7,6 +7,7 @@ import org.springframework.stereotype.Component; import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import stirling.software.SPDF.config.interfaces.DatabaseInterface; @@ -16,6 +17,7 @@ import stirling.software.SPDF.model.exception.UnsupportedProviderException; @Slf4j @Component +@RequiredArgsConstructor public class InitialSecuritySetup { private final UserService userService; @@ -24,15 +26,6 @@ public class InitialSecuritySetup { private final DatabaseInterface databaseService; - public InitialSecuritySetup( - UserService userService, - ApplicationProperties applicationProperties, - DatabaseInterface databaseService) { - this.userService = userService; - this.applicationProperties = applicationProperties; - this.databaseService = databaseService; - } - @PostConstruct public void init() { try { diff --git a/src/main/java/stirling/software/SPDF/config/security/LoginAttemptService.java b/src/main/java/stirling/software/SPDF/config/security/LoginAttemptService.java index f036acfd4..d65557822 100644 --- a/src/main/java/stirling/software/SPDF/config/security/LoginAttemptService.java +++ b/src/main/java/stirling/software/SPDF/config/security/LoginAttemptService.java @@ -7,6 +7,7 @@ import org.springframework.stereotype.Service; import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import stirling.software.SPDF.model.ApplicationProperties; @@ -14,6 +15,7 @@ import stirling.software.SPDF.model.AttemptCounter; @Service @Slf4j +@RequiredArgsConstructor public class LoginAttemptService { private final ApplicationProperties applicationProperties; @@ -26,10 +28,6 @@ public class LoginAttemptService { private boolean isBlockedEnabled = true; - public LoginAttemptService(ApplicationProperties applicationProperties) { - this.applicationProperties = applicationProperties; - } - @PostConstruct public void init() { MAX_ATTEMPT = applicationProperties.getSecurity().getLoginAttemptCount(); diff --git a/src/main/java/stirling/software/SPDF/config/security/RateLimitResetScheduler.java b/src/main/java/stirling/software/SPDF/config/security/RateLimitResetScheduler.java index a3641a701..5751ec871 100644 --- a/src/main/java/stirling/software/SPDF/config/security/RateLimitResetScheduler.java +++ b/src/main/java/stirling/software/SPDF/config/security/RateLimitResetScheduler.java @@ -3,15 +3,14 @@ package stirling.software.SPDF.config.security; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; +import lombok.RequiredArgsConstructor; + @Component +@RequiredArgsConstructor public class RateLimitResetScheduler { private final IPRateLimitingFilter rateLimitingFilter; - public RateLimitResetScheduler(IPRateLimitingFilter rateLimitingFilter) { - this.rateLimitingFilter = rateLimitingFilter; - } - @Scheduled(cron = "0 0 0 * * MON") // At 00:00 every Monday TODO: configurable public void resetRateLimit() { rateLimitingFilter.resetRequestCounts(); diff --git a/src/main/java/stirling/software/SPDF/config/security/UserBasedRateLimitingFilter.java b/src/main/java/stirling/software/SPDF/config/security/UserBasedRateLimitingFilter.java index 1c725c9f2..5ca7df214 100644 --- a/src/main/java/stirling/software/SPDF/config/security/UserBasedRateLimitingFilter.java +++ b/src/main/java/stirling/software/SPDF/config/security/UserBasedRateLimitingFilter.java @@ -121,7 +121,7 @@ public class UserBasedRateLimitingFilter extends OncePerRequestFilter { if (probe.isConsumed()) { response.setHeader( "X-Rate-Limit-Remaining", - Newlines.stripAll(Long.toString(probe.getRemainingTokens()))); + stripNewlines(Newlines.stripAll(Long.toString(probe.getRemainingTokens())))); filterChain.doFilter(request, response); } else { long waitForRefill = probe.getNanosToWaitForRefill() / 1_000_000_000; @@ -141,4 +141,8 @@ public class UserBasedRateLimitingFilter extends OncePerRequestFilter { .build(); return Bucket.builder().addLimit(limit).build(); } + + private static String stripNewlines(final String s) { + return s.replaceAll("[\n\r]", ""); + } } diff --git a/src/main/java/stirling/software/SPDF/config/security/UserService.java b/src/main/java/stirling/software/SPDF/config/security/UserService.java index 464676710..d90539171 100644 --- a/src/main/java/stirling/software/SPDF/config/security/UserService.java +++ b/src/main/java/stirling/software/SPDF/config/security/UserService.java @@ -19,6 +19,7 @@ import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import stirling.software.SPDF.config.interfaces.DatabaseInterface; @@ -32,6 +33,7 @@ import stirling.software.SPDF.repository.UserRepository; @Service @Slf4j +@RequiredArgsConstructor public class UserService implements UserServiceInterface { private final UserRepository userRepository; @@ -48,23 +50,6 @@ public class UserService implements UserServiceInterface { private final ApplicationProperties applicationProperties; - public UserService( - UserRepository userRepository, - AuthorityRepository authorityRepository, - PasswordEncoder passwordEncoder, - MessageSource messageSource, - SessionPersistentRegistry sessionRegistry, - DatabaseInterface databaseService, - ApplicationProperties applicationProperties) { - this.userRepository = userRepository; - this.authorityRepository = authorityRepository; - this.passwordEncoder = passwordEncoder; - this.messageSource = messageSource; - this.sessionRegistry = sessionRegistry; - this.databaseService = databaseService; - this.applicationProperties = applicationProperties; - } - @Transactional public void migrateOauth2ToSSO() { userRepository @@ -423,6 +408,8 @@ public class UserService implements UserServiceInterface { if (principal instanceof UserDetails detailsUser) { return detailsUser.getUsername(); + } else if (principal instanceof stirling.software.SPDF.model.User domainUser) { + return domainUser.getUsername(); } else if (principal instanceof OAuth2User oAuth2User) { return oAuth2User.getAttribute( applicationProperties.getSecurity().getOauth2().getUseAsUsername()); diff --git a/src/main/java/stirling/software/SPDF/config/security/database/DatabaseService.java b/src/main/java/stirling/software/SPDF/config/security/database/DatabaseService.java index a8daede36..27e9ae7b1 100644 --- a/src/main/java/stirling/software/SPDF/config/security/database/DatabaseService.java +++ b/src/main/java/stirling/software/SPDF/config/security/database/DatabaseService.java @@ -240,8 +240,34 @@ public class DatabaseService implements DatabaseInterface { private boolean isH2Database() { ApplicationProperties.Datasource datasource = applicationProperties.getSystem().getDatasource(); - return !datasource.isEnableCustomDatabase() - || datasource.getType().equalsIgnoreCase(ApplicationProperties.Driver.H2.name()); + + boolean isTypeH2 = + datasource.getType().equalsIgnoreCase(ApplicationProperties.Driver.H2.name()); + boolean isDBUrlH2 = + datasource.getCustomDatabaseUrl().contains("h2") + || datasource.getCustomDatabaseUrl().contains("H2"); + boolean isCustomDatabase = datasource.isEnableCustomDatabase(); + + if (isCustomDatabase) { + if (isTypeH2 && !isDBUrlH2) { + log.warn( + "Datasource type is H2, but the URL does not contain 'h2'. " + + "Please check your configuration."); + throw new IllegalStateException( + "Datasource type is H2, but the URL does not contain 'h2'. Please check" + + " your configuration."); + } else if (!isTypeH2 && isDBUrlH2) { + log.warn( + "Datasource URL contains 'h2', but the type is not H2. " + + "Please check your configuration."); + throw new IllegalStateException( + "Datasource URL contains 'h2', but the type is not H2. Please check your" + + " configuration."); + } + } + boolean isH2 = isTypeH2 && isDBUrlH2; + + return !isCustomDatabase || isH2; } /** diff --git a/src/main/java/stirling/software/SPDF/config/security/database/ScheduledTasks.java b/src/main/java/stirling/software/SPDF/config/security/database/ScheduledTasks.java index c318f1d97..a0c4af046 100644 --- a/src/main/java/stirling/software/SPDF/config/security/database/ScheduledTasks.java +++ b/src/main/java/stirling/software/SPDF/config/security/database/ScheduledTasks.java @@ -6,20 +6,19 @@ import org.springframework.context.annotation.Conditional; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; +import lombok.RequiredArgsConstructor; + import stirling.software.SPDF.config.interfaces.DatabaseInterface; import stirling.software.SPDF.controller.api.H2SQLCondition; import stirling.software.SPDF.model.exception.UnsupportedProviderException; @Component @Conditional(H2SQLCondition.class) +@RequiredArgsConstructor public class ScheduledTasks { private final DatabaseInterface databaseService; - public ScheduledTasks(DatabaseInterface databaseService) { - this.databaseService = databaseService; - } - @Scheduled(cron = "0 0 0 * * ?") public void performBackup() throws SQLException, UnsupportedProviderException { databaseService.exportDatabase(); diff --git a/src/main/java/stirling/software/SPDF/config/security/mail/EmailService.java b/src/main/java/stirling/software/SPDF/config/security/mail/EmailService.java new file mode 100644 index 000000000..8939fbab6 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/config/security/mail/EmailService.java @@ -0,0 +1,63 @@ +package stirling.software.SPDF.config.security.mail; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import jakarta.mail.MessagingException; +import jakarta.mail.internet.MimeMessage; + +import lombok.RequiredArgsConstructor; + +import stirling.software.SPDF.model.ApplicationProperties; +import stirling.software.SPDF.model.api.Email; + +/** + * Service class responsible for sending emails, including those with attachments. It uses + * JavaMailSender to send the email and is designed to handle both the message content and file + * attachments. + */ +@Service +@RequiredArgsConstructor +@ConditionalOnProperty(value = "mail.enabled", havingValue = "true", matchIfMissing = false) +public class EmailService { + + private final JavaMailSender mailSender; + private final ApplicationProperties applicationProperties; + + /** + * Sends an email with an attachment asynchronously. This method is annotated with @Async, which + * means it will be executed asynchronously. + * + * @param email The Email object containing the recipient, subject, body, and file attachment. + * @throws MessagingException If there is an issue with creating or sending the email. + */ + @Async + public void sendEmailWithAttachment(Email email) throws MessagingException { + ApplicationProperties.Mail mailProperties = applicationProperties.getMail(); + MultipartFile file = email.getFileInput(); + + // Creates a MimeMessage to represent the email + MimeMessage message = mailSender.createMimeMessage(); + + // Helper class to set up the message content and attachments + MimeMessageHelper helper = new MimeMessageHelper(message, true); + + // Sets the recipient, subject, body, and sender email + helper.addTo(email.getTo()); + helper.setSubject(email.getSubject()); + helper.setText( + email.getBody(), + true); // The "true" here indicates that the body contains HTML content. + helper.setFrom(mailProperties.getFrom()); + + // Adds the attachment to the email + helper.addAttachment(file.getOriginalFilename(), file); + + // Sends the email via the configured mail sender + mailSender.send(message); + } +} diff --git a/src/main/java/stirling/software/SPDF/config/security/mail/MailConfig.java b/src/main/java/stirling/software/SPDF/config/security/mail/MailConfig.java new file mode 100644 index 000000000..68c2fe35d --- /dev/null +++ b/src/main/java/stirling/software/SPDF/config/security/mail/MailConfig.java @@ -0,0 +1,54 @@ +package stirling.software.SPDF.config.security.mail; + +import java.util.Properties; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.JavaMailSenderImpl; + +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import stirling.software.SPDF.model.ApplicationProperties; + +/** + * This configuration class provides the JavaMailSender bean, which is used to send emails. It reads + * email server settings from the configuration (ApplicationProperties) and configures the mail + * client (JavaMailSender). + */ +@Configuration +@Slf4j +@AllArgsConstructor +@ConditionalOnProperty(value = "mail.enabled", havingValue = "true", matchIfMissing = false) +public class MailConfig { + + private final ApplicationProperties applicationProperties; + + @Bean + public JavaMailSender javaMailSender() { + + ApplicationProperties.Mail mailProperties = applicationProperties.getMail(); + + // Creates a new instance of JavaMailSenderImpl, which is a Spring implementation + JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); + mailSender.setHost(mailProperties.getHost()); + mailSender.setPort(mailProperties.getPort()); + mailSender.setUsername(mailProperties.getUsername()); + mailSender.setPassword(mailProperties.getPassword()); + mailSender.setDefaultEncoding("UTF-8"); + + // Retrieves the JavaMail properties to configure additional SMTP parameters + Properties props = mailSender.getJavaMailProperties(); + + // Enables SMTP authentication + props.put("mail.smtp.auth", "true"); + + // Enables STARTTLS to encrypt the connection if supported by the SMTP server + props.put("mail.smtp.starttls.enable", "true"); + + // Returns the configured mail sender, ready to send emails + return mailSender; + } +} diff --git a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationSuccessHandler.java b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationSuccessHandler.java index 4ee49aed4..1b320c2c7 100644 --- a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationSuccessHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationSuccessHandler.java @@ -15,6 +15,8 @@ import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; +import lombok.RequiredArgsConstructor; + import stirling.software.SPDF.config.security.LoginAttemptService; import stirling.software.SPDF.config.security.UserService; import stirling.software.SPDF.model.ApplicationProperties; @@ -23,6 +25,7 @@ import stirling.software.SPDF.model.AuthenticationType; import stirling.software.SPDF.model.exception.UnsupportedProviderException; import stirling.software.SPDF.utils.RequestUriUtils; +@RequiredArgsConstructor public class CustomOAuth2AuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler { @@ -30,15 +33,6 @@ public class CustomOAuth2AuthenticationSuccessHandler private final ApplicationProperties applicationProperties; private final UserService userService; - public CustomOAuth2AuthenticationSuccessHandler( - LoginAttemptService loginAttemptService, - ApplicationProperties applicationProperties, - UserService userService) { - this.applicationProperties = applicationProperties; - this.userService = userService; - this.loginAttemptService = loginAttemptService; - } - @Override public void onAuthenticationSuccess( HttpServletRequest request, HttpServletResponse response, Authentication authentication) diff --git a/src/main/java/stirling/software/SPDF/config/security/saml2/CustomSaml2ResponseAuthenticationConverter.java b/src/main/java/stirling/software/SPDF/config/security/saml2/CustomSaml2ResponseAuthenticationConverter.java index 3a576aea5..4a9cdd284 100644 --- a/src/main/java/stirling/software/SPDF/config/security/saml2/CustomSaml2ResponseAuthenticationConverter.java +++ b/src/main/java/stirling/software/SPDF/config/security/saml2/CustomSaml2ResponseAuthenticationConverter.java @@ -13,6 +13,7 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.saml2.provider.service.authentication.OpenSaml4AuthenticationProvider.ResponseToken; import org.springframework.security.saml2.provider.service.authentication.Saml2Authentication; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import stirling.software.SPDF.config.security.UserService; @@ -20,15 +21,12 @@ import stirling.software.SPDF.model.User; @Slf4j @ConditionalOnProperty(name = "security.saml2.enabled", havingValue = "true") +@RequiredArgsConstructor public class CustomSaml2ResponseAuthenticationConverter implements Converter { private final UserService userService; - public CustomSaml2ResponseAuthenticationConverter(UserService userService) { - this.userService = userService; - } - private Map> extractAttributes(Assertion assertion) { Map> attributes = new HashMap<>(); diff --git a/src/main/java/stirling/software/SPDF/config/security/saml2/SAML2Configuration.java b/src/main/java/stirling/software/SPDF/config/security/saml2/SAML2Configuration.java index a6b487ec6..58c0a1637 100644 --- a/src/main/java/stirling/software/SPDF/config/security/saml2/SAML2Configuration.java +++ b/src/main/java/stirling/software/SPDF/config/security/saml2/SAML2Configuration.java @@ -21,6 +21,7 @@ import org.springframework.security.saml2.provider.service.web.authentication.Op import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import stirling.software.SPDF.model.ApplicationProperties; @@ -29,14 +30,11 @@ import stirling.software.SPDF.model.ApplicationProperties.Security.SAML2; @Configuration @Slf4j @ConditionalOnProperty(value = "security.saml2.enabled", havingValue = "true") +@RequiredArgsConstructor public class SAML2Configuration { private final ApplicationProperties applicationProperties; - public SAML2Configuration(ApplicationProperties applicationProperties) { - this.applicationProperties = applicationProperties; - } - @Bean @ConditionalOnProperty(name = "security.saml2.enabled", havingValue = "true") public RelyingPartyRegistrationRepository relyingPartyRegistrations() throws Exception { diff --git a/src/main/java/stirling/software/SPDF/config/security/session/CustomHttpSessionListener.java b/src/main/java/stirling/software/SPDF/config/security/session/CustomHttpSessionListener.java index 3d97181ab..09868eff9 100644 --- a/src/main/java/stirling/software/SPDF/config/security/session/CustomHttpSessionListener.java +++ b/src/main/java/stirling/software/SPDF/config/security/session/CustomHttpSessionListener.java @@ -1,6 +1,5 @@ package stirling.software.SPDF.config.security.session; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import jakarta.servlet.http.HttpSessionEvent; @@ -14,7 +13,6 @@ public class CustomHttpSessionListener implements HttpSessionListener { private SessionPersistentRegistry sessionPersistentRegistry; - @Autowired public CustomHttpSessionListener(SessionPersistentRegistry sessionPersistentRegistry) { super(); this.sessionPersistentRegistry = sessionPersistentRegistry; diff --git a/src/main/java/stirling/software/SPDF/config/security/session/SessionPersistentRegistry.java b/src/main/java/stirling/software/SPDF/config/security/session/SessionPersistentRegistry.java index 18b037164..9e249f3a4 100644 --- a/src/main/java/stirling/software/SPDF/config/security/session/SessionPersistentRegistry.java +++ b/src/main/java/stirling/software/SPDF/config/security/session/SessionPersistentRegistry.java @@ -12,10 +12,13 @@ import org.springframework.stereotype.Component; import jakarta.transaction.Transactional; +import lombok.RequiredArgsConstructor; + import stirling.software.SPDF.config.security.saml2.CustomSaml2AuthenticatedPrincipal; import stirling.software.SPDF.model.SessionEntity; @Component +@RequiredArgsConstructor public class SessionPersistentRegistry implements SessionRegistry { private final SessionRepository sessionRepository; @@ -23,10 +26,6 @@ public class SessionPersistentRegistry implements SessionRegistry { @Value("${server.servlet.session.timeout:30m}") private Duration defaultMaxInactiveInterval; - public SessionPersistentRegistry(SessionRepository sessionRepository) { - this.sessionRepository = sessionRepository; - } - @Override public List getAllPrincipals() { List sessions = sessionRepository.findAll(); diff --git a/src/main/java/stirling/software/SPDF/config/security/session/SessionScheduled.java b/src/main/java/stirling/software/SPDF/config/security/session/SessionScheduled.java index 9710316e3..46c17a77e 100644 --- a/src/main/java/stirling/software/SPDF/config/security/session/SessionScheduled.java +++ b/src/main/java/stirling/software/SPDF/config/security/session/SessionScheduled.java @@ -9,15 +9,14 @@ import org.springframework.scheduling.annotation.Scheduled; import org.springframework.security.core.session.SessionInformation; import org.springframework.stereotype.Component; +import lombok.RequiredArgsConstructor; + @Component +@RequiredArgsConstructor public class SessionScheduled { private final SessionPersistentRegistry sessionPersistentRegistry; - public SessionScheduled(SessionPersistentRegistry sessionPersistentRegistry) { - this.sessionPersistentRegistry = sessionPersistentRegistry; - } - @Scheduled(cron = "0 0/5 * * * ?") public void expireSessions() { Instant now = Instant.now(); diff --git a/src/main/java/stirling/software/SPDF/controller/api/AdditionalLanguageJsController.java b/src/main/java/stirling/software/SPDF/controller/api/AdditionalLanguageJsController.java index 8475d1f20..e5d3ba884 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/AdditionalLanguageJsController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/AdditionalLanguageJsController.java @@ -14,18 +14,17 @@ import io.swagger.v3.oas.annotations.Hidden; import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; + import stirling.software.SPDF.service.LanguageService; @RestController @RequestMapping("/js") +@RequiredArgsConstructor public class AdditionalLanguageJsController { private final LanguageService languageService; - public AdditionalLanguageJsController(LanguageService languageService) { - this.languageService = languageService; - } - @Hidden @GetMapping(value = "/additionalLanguageCode.js", produces = "application/javascript") public void generateAdditionalLanguageJs(HttpServletResponse response) throws IOException { diff --git a/src/main/java/stirling/software/SPDF/controller/api/AnalysisController.java b/src/main/java/stirling/software/SPDF/controller/api/AnalysisController.java index 2406e1168..49c5bc81c 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/AnalysisController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/AnalysisController.java @@ -11,27 +11,24 @@ import org.apache.pdfbox.pdmodel.PDPageTree; import org.apache.pdfbox.pdmodel.encryption.PDEncryption; import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation; import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; + import stirling.software.SPDF.model.api.PDFFile; import stirling.software.SPDF.service.CustomPDFDocumentFactory; @RestController @RequestMapping("/api/v1/analysis") @Tag(name = "Analysis", description = "Analysis APIs") +@RequiredArgsConstructor public class AnalysisController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public AnalysisController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(value = "/page-count", consumes = "multipart/form-data") @Operation( summary = "Get PDF page count", @@ -62,7 +59,8 @@ public class AnalysisController { description = "Returns title, author, subject, etc. Input:PDF Output:JSON Type:SISO") public Map getDocumentProperties(@ModelAttribute PDFFile file) throws IOException { - try (PDDocument document = pdfDocumentFactory.load(file.getFileInput())) { + // Load the document in read-only mode to prevent modifications and ensure the integrity of the original file. + try (PDDocument document = pdfDocumentFactory.load(file.getFileInput(), true)) { PDDocumentInformation info = document.getDocumentInformation(); Map properties = new HashMap<>(); properties.put("title", info.getTitle()); diff --git a/src/main/java/stirling/software/SPDF/controller/api/CropController.java b/src/main/java/stirling/software/SPDF/controller/api/CropController.java index 68c3a44f3..ad16c460e 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/CropController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/CropController.java @@ -10,7 +10,6 @@ import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode; import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -20,6 +19,8 @@ import org.springframework.web.bind.annotation.RestController; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; + import stirling.software.SPDF.model.api.general.CropPdfForm; import stirling.software.SPDF.service.CustomPDFDocumentFactory; import stirling.software.SPDF.utils.WebResponseUtils; @@ -27,15 +28,11 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RestController @RequestMapping("/api/v1/general") @Tag(name = "General", description = "General APIs") +@RequiredArgsConstructor public class CropController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public CropController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(value = "/crop", consumes = "multipart/form-data") @Operation( summary = "Crops a PDF document", diff --git a/src/main/java/stirling/software/SPDF/controller/api/DatabaseController.java b/src/main/java/stirling/software/SPDF/controller/api/DatabaseController.java index 79138721c..8e3484f23 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/DatabaseController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/DatabaseController.java @@ -24,6 +24,7 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import stirling.software.SPDF.config.security.database.DatabaseService; @@ -34,14 +35,11 @@ import stirling.software.SPDF.config.security.database.DatabaseService; @PreAuthorize("hasRole('ROLE_ADMIN')") @Conditional(H2SQLCondition.class) @Tag(name = "Database", description = "Database APIs for backup, import, and management") +@RequiredArgsConstructor public class DatabaseController { private final DatabaseService databaseService; - public DatabaseController(DatabaseService databaseService) { - this.databaseService = databaseService; - } - @Operation( summary = "Import a database backup file", description = "Uploads and imports a database backup SQL file.") diff --git a/src/main/java/stirling/software/SPDF/controller/api/EmailController.java b/src/main/java/stirling/software/SPDF/controller/api/EmailController.java new file mode 100644 index 000000000..3b91368ef --- /dev/null +++ b/src/main/java/stirling/software/SPDF/controller/api/EmailController.java @@ -0,0 +1,57 @@ +package stirling.software.SPDF.controller.api; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.http.HttpStatus; +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 io.swagger.v3.oas.annotations.tags.Tag; + +import jakarta.mail.MessagingException; +import jakarta.validation.Valid; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + +import stirling.software.SPDF.config.security.mail.EmailService; +import stirling.software.SPDF.model.api.Email; + +/** + * Controller for handling email-related API requests. This controller exposes an endpoint for + * sending emails with attachments. + */ +@RestController +@RequestMapping("/api/v1/general") +@RequiredArgsConstructor +@Slf4j +@Tag(name = "General", description = "General APIs") +@ConditionalOnProperty(value = "mail.enabled", havingValue = "true", matchIfMissing = false) +public class EmailController { + private final EmailService emailService; + + /** + * Endpoint to send an email with an attachment. This method consumes a multipart/form-data + * request containing the email details and attachment. + * + * @param email The Email object containing recipient address, subject, body, and file + * attachment. + * @return ResponseEntity with success or error message. + */ + @PostMapping(consumes = "multipart/form-data", value = "/send-email") + public ResponseEntity sendEmailWithAttachment(@Valid @ModelAttribute Email email) { + try { + // Calls the service to send the email with attachment + emailService.sendEmailWithAttachment(email); + return ResponseEntity.ok("Email sent successfully"); + } catch (MessagingException e) { + // Catches any messaging exception (e.g., invalid email address, SMTP server issues) + String errorMsg = "Failed to send email: " + e.getMessage(); + log.error(errorMsg, e); // Logging the detailed error + // Returns an error response with status 500 (Internal Server Error) + return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(errorMsg); + } + } +} diff --git a/src/main/java/stirling/software/SPDF/controller/api/MergeController.java b/src/main/java/stirling/software/SPDF/controller/api/MergeController.java index 279dd2489..a226bd02d 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/MergeController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/MergeController.java @@ -18,7 +18,6 @@ import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; import org.apache.pdfbox.pdmodel.interactive.form.PDField; import org.apache.pdfbox.pdmodel.interactive.form.PDSignatureField; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -29,6 +28,7 @@ import org.springframework.web.multipart.MultipartFile; 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.SPDF.model.api.general.MergePdfsRequest; @@ -40,15 +40,11 @@ import stirling.software.SPDF.utils.WebResponseUtils; @Slf4j @RequestMapping("/api/v1/general") @Tag(name = "General", description = "General APIs") +@RequiredArgsConstructor public class MergeController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public MergeController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - // Merges a list of PDDocument objects into a single PDDocument public PDDocument mergeDocuments(List documents) throws IOException { PDDocument mergedDoc = pdfDocumentFactory.createNewDocument(); diff --git a/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java b/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java index 73bbe98a9..f8f4bd73c 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/MultiPageLayoutController.java @@ -11,7 +11,6 @@ import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; import org.apache.pdfbox.util.Matrix; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -23,6 +22,8 @@ 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 stirling.software.SPDF.model.api.general.MergeMultiplePagesRequest; import stirling.software.SPDF.service.CustomPDFDocumentFactory; import stirling.software.SPDF.utils.WebResponseUtils; @@ -30,15 +31,11 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RestController @RequestMapping("/api/v1/general") @Tag(name = "General", description = "General APIs") +@RequiredArgsConstructor public class MultiPageLayoutController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public MultiPageLayoutController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(value = "/multi-page-layout", consumes = "multipart/form-data") @Operation( summary = "Merge multiple pages of a PDF document into a single page", diff --git a/src/main/java/stirling/software/SPDF/controller/api/PdfImageRemovalController.java b/src/main/java/stirling/software/SPDF/controller/api/PdfImageRemovalController.java index fce61d3e5..a9d66106d 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/PdfImageRemovalController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/PdfImageRemovalController.java @@ -4,7 +4,6 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import org.apache.pdfbox.pdmodel.PDDocument; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -14,6 +13,8 @@ import org.springframework.web.bind.annotation.RestController; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; + import stirling.software.SPDF.model.api.PDFFile; import stirling.software.SPDF.service.CustomPDFDocumentFactory; import stirling.software.SPDF.service.PdfImageRemovalService; @@ -26,6 +27,7 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RestController @RequestMapping("/api/v1/general") @Tag(name = "General", description = "General APIs") +@RequiredArgsConstructor public class PdfImageRemovalController { // Service for removing images from PDFs @@ -33,19 +35,6 @@ public class PdfImageRemovalController { private final CustomPDFDocumentFactory pdfDocumentFactory; - /** - * Constructor for dependency injection of PdfImageRemovalService. - * - * @param pdfImageRemovalService The service used for removing images from PDFs. - */ - @Autowired - public PdfImageRemovalController( - PdfImageRemovalService pdfImageRemovalService, - CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfImageRemovalService = pdfImageRemovalService; - this.pdfDocumentFactory = pdfDocumentFactory; - } - /** * Endpoint to remove images from a PDF file. * diff --git a/src/main/java/stirling/software/SPDF/controller/api/PdfOverlayController.java b/src/main/java/stirling/software/SPDF/controller/api/PdfOverlayController.java index 996ed45bb..60a398305 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/PdfOverlayController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/PdfOverlayController.java @@ -12,7 +12,6 @@ import java.util.Map; import org.apache.pdfbox.Loader; import org.apache.pdfbox.multipdf.Overlay; import org.apache.pdfbox.pdmodel.PDDocument; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; @@ -25,6 +24,8 @@ 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 stirling.software.SPDF.model.api.general.OverlayPdfsRequest; import stirling.software.SPDF.service.CustomPDFDocumentFactory; import stirling.software.SPDF.utils.GeneralUtils; @@ -33,15 +34,11 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RestController @RequestMapping("/api/v1/general") @Tag(name = "General", description = "General APIs") +@RequiredArgsConstructor public class PdfOverlayController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public PdfOverlayController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(value = "/overlay-pdfs", consumes = "multipart/form-data") @Operation( summary = "Overlay PDF files in various modes", diff --git a/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java b/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java index 342d3cb8b..0ce0c1e24 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java @@ -7,7 +7,6 @@ import java.util.List; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -19,6 +18,7 @@ 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.SPDF.model.SortTypes; @@ -32,15 +32,11 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RequestMapping("/api/v1/general") @Slf4j @Tag(name = "General", description = "General APIs") +@RequiredArgsConstructor public class RearrangePagesPDFController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public RearrangePagesPDFController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(consumes = "multipart/form-data", value = "/remove-pages") @Operation( summary = "Remove pages from a PDF file", diff --git a/src/main/java/stirling/software/SPDF/controller/api/RotationController.java b/src/main/java/stirling/software/SPDF/controller/api/RotationController.java index b029450ef..4b1a221a9 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/RotationController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/RotationController.java @@ -5,7 +5,6 @@ import java.io.IOException; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageTree; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -17,6 +16,8 @@ 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 stirling.software.SPDF.model.api.general.RotatePDFRequest; import stirling.software.SPDF.service.CustomPDFDocumentFactory; import stirling.software.SPDF.utils.WebResponseUtils; @@ -24,15 +25,11 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RestController @RequestMapping("/api/v1/general") @Tag(name = "General", description = "General APIs") +@RequiredArgsConstructor public class RotationController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public RotationController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(consumes = "multipart/form-data", value = "/rotate-pdf") @Operation( summary = "Rotate a PDF file", diff --git a/src/main/java/stirling/software/SPDF/controller/api/ScalePagesController.java b/src/main/java/stirling/software/SPDF/controller/api/ScalePagesController.java index 48e3c0f44..65a10c77e 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/ScalePagesController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/ScalePagesController.java @@ -12,7 +12,6 @@ import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; import org.apache.pdfbox.util.Matrix; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -24,6 +23,8 @@ 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 stirling.software.SPDF.model.api.general.ScalePagesRequest; import stirling.software.SPDF.service.CustomPDFDocumentFactory; import stirling.software.SPDF.utils.WebResponseUtils; @@ -31,15 +32,11 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RestController @RequestMapping("/api/v1/general") @Tag(name = "General", description = "General APIs") +@RequiredArgsConstructor public class ScalePagesController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public ScalePagesController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(value = "/scale-pages", consumes = "multipart/form-data") @Operation( summary = "Change the size of a PDF page/document", diff --git a/src/main/java/stirling/software/SPDF/controller/api/SettingsController.java b/src/main/java/stirling/software/SPDF/controller/api/SettingsController.java index 25c198a8a..a64379a64 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/SettingsController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/SettingsController.java @@ -14,6 +14,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; + import stirling.software.SPDF.config.EndpointConfiguration; import stirling.software.SPDF.config.InstallationPathConfig; import stirling.software.SPDF.model.ApplicationProperties; @@ -22,19 +24,13 @@ import stirling.software.SPDF.utils.GeneralUtils; @Controller @Tag(name = "Settings", description = "Settings APIs") @RequestMapping("/api/v1/settings") +@RequiredArgsConstructor @Hidden public class SettingsController { private final ApplicationProperties applicationProperties; private final EndpointConfiguration endpointConfiguration; - public SettingsController( - ApplicationProperties applicationProperties, - EndpointConfiguration endpointConfiguration) { - this.applicationProperties = applicationProperties; - this.endpointConfiguration = endpointConfiguration; - } - @PostMapping("/update-enable-analytics") @Hidden public ResponseEntity updateApiKey(@RequestBody Boolean enabled) throws IOException { diff --git a/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java b/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java index 696482b63..af7fda04a 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPDFController.java @@ -12,7 +12,6 @@ import java.util.zip.ZipOutputStream; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; @@ -25,6 +24,7 @@ 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.SPDF.model.api.PDFWithPageNums; @@ -35,15 +35,11 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RequestMapping("/api/v1/general") @Slf4j @Tag(name = "General", description = "General APIs") +@RequiredArgsConstructor public class SplitPDFController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public SplitPDFController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(consumes = "multipart/form-data", value = "/split-pages") @Operation( summary = "Split a PDF file into separate documents", 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 698e2b50e..5e0f1d012 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfByChaptersController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfByChaptersController.java @@ -12,7 +12,6 @@ import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDDocumentOutline; import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineItem; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; @@ -29,6 +28,7 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import stirling.software.SPDF.model.PdfMetadata; @@ -41,19 +41,13 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RequestMapping("/api/v1/general") @Slf4j @Tag(name = "General", description = "General APIs") +@RequiredArgsConstructor public class SplitPdfByChaptersController { private final PdfMetadataService pdfMetadataService; private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public SplitPdfByChaptersController( - PdfMetadataService pdfMetadataService, CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfMetadataService = pdfMetadataService; - this.pdfDocumentFactory = pdfDocumentFactory; - } - private static List extractOutlineItems( PDDocument sourceDocument, PDOutlineItem current, diff --git a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java index 83f0cb0e9..a2b0e2add 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySectionsController.java @@ -17,7 +17,6 @@ import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode; import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; import org.apache.pdfbox.util.Matrix; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; @@ -30,6 +29,8 @@ 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 stirling.software.SPDF.model.api.SplitPdfBySectionsRequest; import stirling.software.SPDF.service.CustomPDFDocumentFactory; import stirling.software.SPDF.utils.WebResponseUtils; @@ -37,15 +38,11 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RestController @RequestMapping("/api/v1/general") @Tag(name = "General", description = "General APIs") +@RequiredArgsConstructor public class SplitPdfBySectionsController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public SplitPdfBySectionsController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(value = "/split-pdf-by-sections", consumes = "multipart/form-data") @Operation( summary = "Split PDF pages into smaller sections", diff --git a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java index fb5375ef3..1049e02bc 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/SplitPdfBySizeController.java @@ -9,7 +9,6 @@ import java.util.zip.ZipOutputStream; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; @@ -22,6 +21,7 @@ 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.SPDF.model.api.general.SplitPdfBySizeOrCountRequest; @@ -33,15 +33,11 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RequestMapping("/api/v1/general") @Slf4j @Tag(name = "General", description = "General APIs") +@RequiredArgsConstructor public class SplitPdfBySizeController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public SplitPdfBySizeController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(value = "/split-by-size-or-count", consumes = "multipart/form-data") @Operation( summary = "Auto split PDF pages into separate documents based on size or count", diff --git a/src/main/java/stirling/software/SPDF/controller/api/ToSinglePageController.java b/src/main/java/stirling/software/SPDF/controller/api/ToSinglePageController.java index f6b0ed947..b3ae43071 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/ToSinglePageController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/ToSinglePageController.java @@ -10,7 +10,6 @@ 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.form.PDFormXObject; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -20,6 +19,8 @@ import org.springframework.web.bind.annotation.RestController; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; + import stirling.software.SPDF.model.api.PDFFile; import stirling.software.SPDF.service.CustomPDFDocumentFactory; import stirling.software.SPDF.utils.WebResponseUtils; @@ -27,15 +28,11 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RestController @RequestMapping("/api/v1/general") @Tag(name = "General", description = "General APIs") +@RequiredArgsConstructor public class ToSinglePageController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public ToSinglePageController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(consumes = "multipart/form-data", value = "/pdf-to-single-page") @Operation( summary = "Convert a multi-page PDF into a single long page PDF", diff --git a/src/main/java/stirling/software/SPDF/controller/api/UserController.java b/src/main/java/stirling/software/SPDF/controller/api/UserController.java index 06dc76658..ce4770499 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/UserController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/UserController.java @@ -27,6 +27,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import stirling.software.SPDF.config.security.UserService; @@ -43,6 +44,7 @@ import stirling.software.SPDF.model.exception.UnsupportedProviderException; @Tag(name = "User", description = "User APIs") @RequestMapping("/api/v1/user") @Slf4j +@RequiredArgsConstructor public class UserController { private static final String LOGIN_MESSAGETYPE_CREDSUPDATED = "/login?messageType=credsUpdated"; @@ -50,15 +52,6 @@ public class UserController { private final SessionPersistentRegistry sessionRegistry; private final ApplicationProperties applicationProperties; - public UserController( - UserService userService, - SessionPersistentRegistry sessionRegistry, - ApplicationProperties applicationProperties) { - this.userService = userService; - this.sessionRegistry = sessionRegistry; - this.applicationProperties = applicationProperties; - } - @PreAuthorize("!hasAuthority('ROLE_DEMO_USER')") @PostMapping("/register") public String register(@ModelAttribute UsernameAndPass requestModel, Model model) diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java index 52b124e53..bfd67ef76 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertHtmlToPDF.java @@ -1,6 +1,5 @@ package stirling.software.SPDF.controller.api.converters; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -12,6 +11,8 @@ 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 stirling.software.SPDF.config.RuntimePathConfig; import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.api.converters.HTMLToPdfRequest; @@ -22,6 +23,7 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RestController @Tag(name = "Convert", description = "Convert APIs") @RequestMapping("/api/v1/convert") +@RequiredArgsConstructor public class ConvertHtmlToPDF { private final CustomPDFDocumentFactory pdfDocumentFactory; @@ -30,17 +32,6 @@ public class ConvertHtmlToPDF { private final RuntimePathConfig runtimePathConfig; - @Autowired - public ConvertHtmlToPDF( - CustomPDFDocumentFactory pdfDocumentFactory, - ApplicationProperties applicationProperties, - RuntimePathConfig runtimePathConfig) { - this.pdfDocumentFactory = pdfDocumentFactory; - - this.applicationProperties = applicationProperties; - this.runtimePathConfig = runtimePathConfig; - } - @PostMapping(consumes = "multipart/form-data", value = "/html/pdf") @Operation( summary = "Convert an HTML or ZIP (containing HTML and CSS) to PDF", diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java index c64084bf4..2fad77e37 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertImgPDFController.java @@ -15,7 +15,6 @@ import org.apache.commons.io.FileUtils; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.rendering.ImageType; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; @@ -28,6 +27,7 @@ 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.SPDF.model.api.converters.ConvertToImageRequest; @@ -40,15 +40,11 @@ import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; @RequestMapping("/api/v1/convert") @Slf4j @Tag(name = "Convert", description = "Convert APIs") +@RequiredArgsConstructor public class ConvertImgPDFController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public ConvertImgPDFController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(consumes = "multipart/form-data", value = "/pdf/img") @Operation( summary = "Convert PDF to image(s)", diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java index 547d9c646..b8a190f90 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertMarkdownToPdf.java @@ -10,7 +10,6 @@ import org.commonmark.node.Node; import org.commonmark.parser.Parser; import org.commonmark.renderer.html.AttributeProvider; import org.commonmark.renderer.html.HtmlRenderer; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -22,6 +21,8 @@ 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 stirling.software.SPDF.config.RuntimePathConfig; import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.api.GeneralFile; @@ -32,6 +33,7 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RestController @Tag(name = "Convert", description = "Convert APIs") @RequestMapping("/api/v1/convert") +@RequiredArgsConstructor public class ConvertMarkdownToPdf { private final CustomPDFDocumentFactory pdfDocumentFactory; @@ -39,17 +41,6 @@ public class ConvertMarkdownToPdf { private final ApplicationProperties applicationProperties; private final RuntimePathConfig runtimePathConfig; - @Autowired - public ConvertMarkdownToPdf( - CustomPDFDocumentFactory pdfDocumentFactory, - ApplicationProperties applicationProperties, - RuntimePathConfig runtimePathConfig) { - this.pdfDocumentFactory = pdfDocumentFactory; - - this.applicationProperties = applicationProperties; - this.runtimePathConfig = runtimePathConfig; - } - @PostMapping(consumes = "multipart/form-data", value = "/markdown/pdf") @Operation( summary = "Convert a Markdown file to PDF", diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java index 46bf4c033..38a0ac16e 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertOfficeController.java @@ -10,7 +10,6 @@ import java.util.List; import org.apache.commons.io.FilenameUtils; import org.apache.pdfbox.pdmodel.PDDocument; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -22,6 +21,8 @@ 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 stirling.software.SPDF.config.RuntimePathConfig; import stirling.software.SPDF.model.api.GeneralFile; import stirling.software.SPDF.service.CustomPDFDocumentFactory; @@ -32,18 +33,12 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RestController @Tag(name = "Convert", description = "Convert APIs") @RequestMapping("/api/v1/convert") +@RequiredArgsConstructor public class ConvertOfficeController { private final CustomPDFDocumentFactory pdfDocumentFactory; private final RuntimePathConfig runtimePathConfig; - @Autowired - public ConvertOfficeController( - CustomPDFDocumentFactory pdfDocumentFactory, RuntimePathConfig runtimePathConfig) { - this.pdfDocumentFactory = pdfDocumentFactory; - this.runtimePathConfig = runtimePathConfig; - } - public File convertToPdf(MultipartFile inputFile) throws IOException, InterruptedException { // Check for valid file extension String originalFilename = Filenames.toSimpleFileName(inputFile.getOriginalFilename()); diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToOffice.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToOffice.java index f603aa277..76f0b9286 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToOffice.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertPDFToOffice.java @@ -4,7 +4,6 @@ import java.io.IOException; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.text.PDFTextStripper; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; @@ -17,6 +16,8 @@ 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 stirling.software.SPDF.model.api.PDFFile; import stirling.software.SPDF.model.api.converters.PdfToPresentationRequest; import stirling.software.SPDF.model.api.converters.PdfToTextOrRTFRequest; @@ -28,15 +29,11 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RestController @RequestMapping("/api/v1/convert") @Tag(name = "Convert", description = "Convert APIs") +@RequiredArgsConstructor public class ConvertPDFToOffice { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public ConvertPDFToOffice(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(consumes = "multipart/form-data", value = "/pdf/presentation") @Operation( summary = "Convert PDF to Presentation format", diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java index 941d55795..9ef490e9a 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java @@ -7,7 +7,6 @@ import java.util.ArrayList; import java.util.List; import org.apache.pdfbox.pdmodel.PDDocument; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -17,6 +16,7 @@ import org.springframework.web.bind.annotation.RestController; 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.SPDF.config.RuntimePathConfig; @@ -32,22 +32,13 @@ import stirling.software.SPDF.utils.WebResponseUtils; @Tag(name = "Convert", description = "Convert APIs") @Slf4j @RequestMapping("/api/v1/convert") +@RequiredArgsConstructor public class ConvertWebsiteToPDF { private final CustomPDFDocumentFactory pdfDocumentFactory; private final RuntimePathConfig runtimePathConfig; private final ApplicationProperties applicationProperties; - @Autowired - public ConvertWebsiteToPDF( - CustomPDFDocumentFactory pdfDocumentFactory, - RuntimePathConfig runtimePathConfig, - ApplicationProperties applicationProperties) { - this.pdfDocumentFactory = pdfDocumentFactory; - this.runtimePathConfig = runtimePathConfig; - this.applicationProperties = applicationProperties; - } - @PostMapping(consumes = "multipart/form-data", value = "/url/pdf") @Operation( summary = "Convert a URL to a PDF", diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractCSVController.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractCSVController.java index 06cc45094..878936534 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractCSVController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ExtractCSVController.java @@ -13,7 +13,6 @@ import java.util.zip.ZipOutputStream; import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.QuoteMode; import org.apache.pdfbox.pdmodel.PDDocument; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ContentDisposition; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; @@ -26,6 +25,7 @@ import org.springframework.web.bind.annotation.RestController; 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.SPDF.model.api.PDFWithPageNums; @@ -41,15 +41,11 @@ import technology.tabula.extractors.SpreadsheetExtractionAlgorithm; @RequestMapping("/api/v1/convert") @Tag(name = "Convert", description = "Convert APIs") @Slf4j +@RequiredArgsConstructor public class ExtractCSVController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public ExtractCSVController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(value = "/pdf/csv", consumes = "multipart/form-data") @Operation( summary = "Extracts a CSV document from a PDF", diff --git a/src/main/java/stirling/software/SPDF/controller/api/filters/FilterController.java b/src/main/java/stirling/software/SPDF/controller/api/filters/FilterController.java index 006598bd1..935118a7d 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/filters/FilterController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/filters/FilterController.java @@ -5,7 +5,6 @@ import java.io.IOException; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.common.PDRectangle; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -17,6 +16,8 @@ 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 stirling.software.SPDF.model.api.PDFComparisonAndCount; import stirling.software.SPDF.model.api.PDFWithPageNums; import stirling.software.SPDF.model.api.filter.ContainsTextRequest; @@ -30,15 +31,11 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RestController @RequestMapping("/api/v1/filter") @Tag(name = "Filter", description = "Filter APIs") +@RequiredArgsConstructor public class FilterController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public FilterController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(consumes = "multipart/form-data", value = "/filter-contains-text") @Operation( summary = "Checks if a PDF contains set text, returns true if does", diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java index 1d71d94b7..5d6ce4516 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoRenameController.java @@ -8,7 +8,6 @@ import java.util.List; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.text.PDFTextStripper; import org.apache.pdfbox.text.TextPosition; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -20,6 +19,7 @@ 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.SPDF.model.api.misc.ExtractHeaderRequest; @@ -30,18 +30,14 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RequestMapping("/api/v1/misc") @Slf4j @Tag(name = "Misc", description = "Miscellaneous APIs") +@RequiredArgsConstructor public class AutoRenameController { - private static final float TITLE_FONT_SIZE_THRESHOLD = 20.0f; + // private static final float TITLE_FONT_SIZE_THRESHOLD = 20.0f; private static final int LINE_LIMIT = 200; private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public AutoRenameController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(consumes = "multipart/form-data", value = "/auto-rename") @Operation( summary = "Extract header from PDF file", diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java index 7a5c730fe..4e976d12d 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/AutoSplitPdfController.java @@ -16,7 +16,6 @@ import java.util.zip.ZipOutputStream; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.PDFRenderer; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; @@ -32,6 +31,7 @@ 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.SPDF.model.api.misc.AutoSplitPdfRequest; @@ -42,6 +42,7 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RequestMapping("/api/v1/misc") @Slf4j @Tag(name = "Misc", description = "Miscellaneous APIs") +@RequiredArgsConstructor public class AutoSplitPdfController { private static final Set VALID_QR_CONTENTS = @@ -53,11 +54,6 @@ public class AutoSplitPdfController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public AutoSplitPdfController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - private static String decodeQRCode(BufferedImage bufferedImage) { LuminanceSource source; diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java index c50c0a685..c341a49fc 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/BlankPageController.java @@ -13,7 +13,6 @@ import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageTree; import org.apache.pdfbox.rendering.PDFRenderer; import org.apache.pdfbox.text.PDFTextStripper; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; @@ -27,6 +26,7 @@ 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.SPDF.model.api.misc.RemoveBlankPagesRequest; @@ -38,15 +38,11 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RequestMapping("/api/v1/misc") @Slf4j @Tag(name = "Misc", description = "Miscellaneous APIs") +@RequiredArgsConstructor public class BlankPageController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public BlankPageController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - public static boolean isBlankImage( BufferedImage image, int threshold, double whitePercent, int blurSize) { if (image == null) { diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/DecompressPdfController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/DecompressPdfController.java index 090b2b2e1..bceb9e58b 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/DecompressPdfController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/DecompressPdfController.java @@ -10,7 +10,6 @@ import org.apache.pdfbox.cos.*; import org.apache.pdfbox.io.IOUtils; import org.apache.pdfbox.pdfwriter.compress.CompressParameters; import org.apache.pdfbox.pdmodel.PDDocument; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; @@ -22,6 +21,7 @@ import org.springframework.web.multipart.MultipartFile; 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.SPDF.model.api.PDFFile; @@ -32,15 +32,11 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RequestMapping("/api/v1/misc") @Slf4j @Tag(name = "Misc", description = "Miscellaneous APIs") +@RequiredArgsConstructor public class DecompressPdfController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public DecompressPdfController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(value = "/decompress-pdf", consumes = "multipart/form-data") @Operation( summary = "Decompress PDF streams", diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java index fb27bf75a..67019559e 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImageScansController.java @@ -16,7 +16,6 @@ import javax.imageio.ImageIO; import org.apache.commons.io.FileUtils; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.PDFRenderer; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; @@ -29,6 +28,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.parameters.RequestBody; import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import stirling.software.SPDF.model.api.misc.ExtractImageScansRequest; @@ -42,17 +42,13 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RequestMapping("/api/v1/misc") @Slf4j @Tag(name = "Misc", description = "Miscellaneous APIs") +@RequiredArgsConstructor public class ExtractImageScansController { private static final String REPLACEFIRST = "[.][^.]+$"; private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public ExtractImageScansController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(consumes = "multipart/form-data", value = "/extract-image-scans") @Operation( summary = "Extract image scans from an input file", diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java index af865f8f4..187eda305 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/ExtractImagesController.java @@ -24,7 +24,6 @@ import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; @@ -37,6 +36,7 @@ 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.SPDF.model.api.PDFExtractImagesRequest; @@ -48,15 +48,11 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RequestMapping("/api/v1/misc") @Slf4j @Tag(name = "Misc", description = "Miscellaneous APIs") +@RequiredArgsConstructor public class ExtractImagesController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public ExtractImagesController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(consumes = "multipart/form-data", value = "/extract-images") @Operation( summary = "Extract images from a PDF file", diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/FlattenController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/FlattenController.java index 8ddfa1657..e81fa23f2 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/FlattenController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/FlattenController.java @@ -11,7 +11,6 @@ import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; import org.apache.pdfbox.rendering.ImageType; import org.apache.pdfbox.rendering.PDFRenderer; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -23,6 +22,7 @@ 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.SPDF.model.api.misc.FlattenRequest; @@ -33,15 +33,11 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RequestMapping("/api/v1/misc") @Slf4j @Tag(name = "Misc", description = "Miscellaneous APIs") +@RequiredArgsConstructor public class FlattenController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public FlattenController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(consumes = "multipart/form-data", value = "/flatten") @Operation( summary = "Flatten PDF form fields or full page", diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java index 66ac528eb..10e4f6fdd 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/MetadataController.java @@ -10,7 +10,6 @@ import java.util.Map.Entry; import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDDocumentInformation; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.*; @@ -20,6 +19,7 @@ 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.SPDF.model.api.misc.MetadataRequest; @@ -31,15 +31,11 @@ import stirling.software.SPDF.utils.propertyeditor.StringToMapPropertyEditor; @RequestMapping("/api/v1/misc") @Slf4j @Tag(name = "Misc", description = "Miscellaneous APIs") +@RequiredArgsConstructor public class MetadataController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public MetadataController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - private String checkUndefined(String entry) { // Check if the string is "undefined" if ("undefined".equals(entry)) { diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java index e96a29c4b..558ac1fbb 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java @@ -28,6 +28,7 @@ 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.SPDF.model.ApplicationProperties; @@ -38,19 +39,13 @@ import stirling.software.SPDF.service.CustomPDFDocumentFactory; @RequestMapping("/api/v1/misc") @Tag(name = "Misc", description = "Miscellaneous APIs") @Slf4j +@RequiredArgsConstructor public class OCRController { private final ApplicationProperties applicationProperties; private final CustomPDFDocumentFactory pdfDocumentFactory; - public OCRController( - ApplicationProperties applicationProperties, - CustomPDFDocumentFactory pdfDocumentFactory) { - this.applicationProperties = applicationProperties; - this.pdfDocumentFactory = pdfDocumentFactory; - } - /** Gets the list of available Tesseract languages from the tessdata directory */ public List getAvailableTesseractLanguages() { String tessdataDir = applicationProperties.getSystem().getTessdataDir(); @@ -61,7 +56,7 @@ public class OCRController { return Arrays.stream(files) .filter(file -> file.getName().endsWith(".traineddata")) .map(file -> file.getName().replace(".traineddata", "")) - .filter(lang -> !lang.equalsIgnoreCase("osd")) + .filter(lang -> !"osd".equalsIgnoreCase(lang)) .toList(); } diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java index a953586fb..51ca9f9ff 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/OverlayImageController.java @@ -2,7 +2,6 @@ package stirling.software.SPDF.controller.api.misc; import java.io.IOException; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; @@ -15,6 +14,7 @@ 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.SPDF.model.api.misc.OverlayImageRequest; @@ -26,15 +26,11 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RequestMapping("/api/v1/misc") @Slf4j @Tag(name = "Misc", description = "Miscellaneous APIs") +@RequiredArgsConstructor public class OverlayImageController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public OverlayImageController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(consumes = "multipart/form-data", value = "/add-image") @Operation( summary = "Overlay image onto a PDF file", diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/PageNumbersController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/PageNumbersController.java index c66b55d73..cdae7dfad 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/PageNumbersController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/PageNumbersController.java @@ -10,7 +10,6 @@ import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.font.PDType1Font; import org.apache.pdfbox.pdmodel.font.Standard14Fonts; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; @@ -23,6 +22,8 @@ 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 stirling.software.SPDF.model.api.misc.AddPageNumbersRequest; import stirling.software.SPDF.service.CustomPDFDocumentFactory; import stirling.software.SPDF.utils.GeneralUtils; @@ -31,15 +32,11 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RestController @RequestMapping("/api/v1/misc") @Tag(name = "Misc", description = "Miscellaneous APIs") +@RequiredArgsConstructor public class PageNumbersController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public PageNumbersController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(value = "/add-page-numbers", consumes = "multipart/form-data") @Operation( summary = "Add page numbers to a PDF document", diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/RepairController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/RepairController.java index e75a2e20d..1a358b08e 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/RepairController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/RepairController.java @@ -6,7 +6,6 @@ import java.nio.file.Path; import java.util.ArrayList; import java.util.List; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -18,6 +17,8 @@ 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 stirling.software.SPDF.model.api.PDFFile; import stirling.software.SPDF.service.CustomPDFDocumentFactory; import stirling.software.SPDF.utils.ProcessExecutor; @@ -27,15 +28,11 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RestController @RequestMapping("/api/v1/misc") @Tag(name = "Misc", description = "Miscellaneous APIs") +@RequiredArgsConstructor public class RepairController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public RepairController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(consumes = "multipart/form-data", value = "/repair") @Operation( summary = "Repair a PDF file", diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ReplaceAndInvertColorController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/ReplaceAndInvertColorController.java index 65085b1d6..865724a74 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/ReplaceAndInvertColorController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/ReplaceAndInvertColorController.java @@ -2,7 +2,6 @@ package stirling.software.SPDF.controller.api.misc; import java.io.IOException; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.InputStreamResource; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; @@ -15,21 +14,18 @@ import org.springframework.web.bind.annotation.RestController; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; + import stirling.software.SPDF.model.api.misc.ReplaceAndInvertColorRequest; import stirling.software.SPDF.service.misc.ReplaceAndInvertColorService; @RestController @RequestMapping("/api/v1/misc") @Tag(name = "Misc", description = "Miscellaneous APIs") +@RequiredArgsConstructor public class ReplaceAndInvertColorController { - private ReplaceAndInvertColorService replaceAndInvertColorService; - - @Autowired - public ReplaceAndInvertColorController( - ReplaceAndInvertColorService replaceAndInvertColorService) { - this.replaceAndInvertColorService = replaceAndInvertColorService; - } + private final ReplaceAndInvertColorService replaceAndInvertColorService; @PostMapping(consumes = "multipart/form-data", value = "/replace-invert-pdf") @Operation( diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java b/src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java index ca5370b32..400650be3 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/ShowJavascript.java @@ -6,7 +6,6 @@ import java.util.Map; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.common.PDNameTreeNode; import org.apache.pdfbox.pdmodel.interactive.action.PDActionJavaScript; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; @@ -19,6 +18,8 @@ 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 stirling.software.SPDF.model.api.PDFFile; import stirling.software.SPDF.service.CustomPDFDocumentFactory; import stirling.software.SPDF.utils.WebResponseUtils; @@ -26,15 +27,11 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RestController @RequestMapping("/api/v1/misc") @Tag(name = "Misc", description = "Miscellaneous APIs") +@RequiredArgsConstructor public class ShowJavascript { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public ShowJavascript(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(consumes = "multipart/form-data", value = "/show-javascript") @Operation( summary = "Grabs all JS from a PDF and returns a single JS file with all code", diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/StampController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/StampController.java index e23635b82..1ceddba83 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/StampController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/StampController.java @@ -24,7 +24,6 @@ import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory; import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState; import org.apache.pdfbox.util.Matrix; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ClassPathResource; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; @@ -37,6 +36,8 @@ 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 stirling.software.SPDF.model.api.misc.AddStampRequest; import stirling.software.SPDF.service.CustomPDFDocumentFactory; import stirling.software.SPDF.utils.WebResponseUtils; @@ -44,15 +45,11 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RestController @RequestMapping("/api/v1/misc") @Tag(name = "Misc", description = "Miscellaneous APIs") +@RequiredArgsConstructor public class StampController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public StampController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(consumes = "multipart/form-data", value = "/add-stamp") @Operation( summary = "Add stamp to a PDF file", diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/UnlockPDFFormsController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/UnlockPDFFormsController.java new file mode 100644 index 000000000..764c7d6c4 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/UnlockPDFFormsController.java @@ -0,0 +1,124 @@ +package stirling.software.SPDF.controller.api.misc; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; + +import org.apache.pdfbox.cos.*; +import org.apache.pdfbox.pdmodel.PDDocument; +import org.apache.pdfbox.pdmodel.common.PDStream; +import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; +import org.apache.pdfbox.pdmodel.interactive.form.PDField; +import org.springframework.beans.factory.annotation.Autowired; +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 io.github.pixee.security.Filenames; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; + +import lombok.extern.slf4j.Slf4j; + +import stirling.software.SPDF.model.api.PDFFile; +import stirling.software.SPDF.service.CustomPDFDocumentFactory; +import stirling.software.SPDF.utils.WebResponseUtils; + +@RestController +@RequestMapping("/api/v1/misc") +@Slf4j +@Tag(name = "Misc", description = "Miscellaneous APIs") +public class UnlockPDFFormsController { + private final CustomPDFDocumentFactory pdfDocumentFactory; + + @Autowired + public UnlockPDFFormsController(CustomPDFDocumentFactory pdfDocumentFactory) { + this.pdfDocumentFactory = pdfDocumentFactory; + } + + @PostMapping(consumes = "multipart/form-data", value = "/unlock-pdf-forms") + @Operation( + summary = "Remove read-only property from form fields", + description = + "Removing read-only property from form fields making them fillable" + + "Input:PDF, Output:PDF. Type:SISO") + public ResponseEntity unlockPDFForms(@ModelAttribute PDFFile file) { + try (PDDocument document = pdfDocumentFactory.load(file)) { + PDAcroForm acroForm = document.getDocumentCatalog().getAcroForm(); + + if (acroForm != null) { + acroForm.setNeedAppearances(true); + + for (PDField field : acroForm.getFieldTree()) { + COSDictionary dict = field.getCOSObject(); + if (dict.containsKey(COSName.getPDFName("Lock"))) { + dict.removeItem(COSName.getPDFName("Lock")); + } + int currentFlags = field.getFieldFlags(); + if ((currentFlags & 1) == 1) { + int newFlags = currentFlags & ~1; + field.setFieldFlags(newFlags); + } + } + + COSBase xfaBase = acroForm.getCOSObject().getDictionaryObject(COSName.XFA); + if (xfaBase != null) { + try { + if (xfaBase instanceof COSStream xfaStream) { + InputStream is = xfaStream.createInputStream(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + is.transferTo(baos); + String xml = baos.toString(StandardCharsets.UTF_8); + + xml = xml.replaceAll("access\\s*=\\s*\"readOnly\"", "access=\"open\""); + + PDStream newStream = + new PDStream( + document, + new ByteArrayInputStream( + xml.getBytes(StandardCharsets.UTF_8))); + acroForm.getCOSObject().setItem(COSName.XFA, newStream.getCOSObject()); + } else if (xfaBase instanceof COSArray xfaArray) { + for (int i = 0; i < xfaArray.size(); i += 2) { + COSBase namePart = xfaArray.getObject(i); + COSBase streamPart = xfaArray.getObject(i + 1); + if (namePart instanceof COSString + && streamPart instanceof COSStream stream) { + InputStream is = stream.createInputStream(); + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + is.transferTo(baos); + String xml = baos.toString(StandardCharsets.UTF_8); + + xml = + xml.replaceAll( + "access\\s*=\\s*\"readOnly\"", + "access=\"open\""); + + PDStream newStream = + new PDStream( + document, + new ByteArrayInputStream( + xml.getBytes(StandardCharsets.UTF_8))); + xfaArray.set(i + 1, newStream.getCOSObject()); + } + } + } + } catch (Exception e) { + log.error("exception", e); + } + } + } + String mergedFileName = + file.getFileInput().getOriginalFilename().replaceFirst("[.][^.]+$", "") + + "_unlocked_forms.pdf"; + return WebResponseUtils.pdfDocToWebResponse( + document, Filenames.toSimpleFileName(mergedFileName)); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + return null; + } +} diff --git a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineController.java b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineController.java index a7dd8a0ec..f8b05f576 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/pipeline/PipelineController.java @@ -23,6 +23,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import stirling.software.SPDF.model.PipelineConfig; @@ -36,6 +37,7 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RequestMapping("/api/v1/pipeline") @Slf4j @Tag(name = "Pipeline", description = "Pipeline APIs") +@RequiredArgsConstructor public class PipelineController { private final PipelineProcessor processor; @@ -44,14 +46,7 @@ public class PipelineController { private final PostHogService postHogService; - public PipelineController( - PipelineProcessor processor, ObjectMapper objectMapper, PostHogService postHogService) { - this.processor = processor; - this.objectMapper = objectMapper; - this.postHogService = postHogService; - } - - @PostMapping("/handleData") + @PostMapping(value = "/handleData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ResponseEntity handleData(@ModelAttribute HandleDataRequest request) throws JsonMappingException, JsonProcessingException { MultipartFile[] files = request.getFileInput(); diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java b/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java index 4a8981142..58e5b848c 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/CertSignController.java @@ -1,6 +1,7 @@ package stirling.software.SPDF.controller.api.security; import java.awt.*; +import java.beans.PropertyEditorSupport; import java.io.*; import java.nio.file.Files; import java.security.*; @@ -52,9 +53,11 @@ import org.bouncycastle.operator.InputDecryptorProvider; import org.bouncycastle.operator.OperatorCreationException; import org.bouncycastle.pkcs.PKCS8EncryptedPrivateKeyInfo; import org.bouncycastle.pkcs.PKCSException; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ClassPathResource; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -65,6 +68,7 @@ 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.SPDF.model.api.security.SignPDFWithCertRequest; @@ -75,19 +79,27 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RequestMapping("/api/v1/security") @Slf4j @Tag(name = "Security", description = "Security APIs") +@RequiredArgsConstructor public class CertSignController { static { Security.addProvider(new BouncyCastleProvider()); } - private final CustomPDFDocumentFactory pdfDocumentFactory; - - @Autowired - public CertSignController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; + @InitBinder + public void initBinder(WebDataBinder binder) { + binder.registerCustomEditor( + MultipartFile.class, + new PropertyEditorSupport() { + @Override + public void setAsText(String text) throws IllegalArgumentException { + setValue(null); + } + }); } + private final CustomPDFDocumentFactory pdfDocumentFactory; + private static void sign( CustomPDFDocumentFactory pdfDocumentFactory, MultipartFile input, @@ -107,8 +119,7 @@ public class CertSignController { signature.setLocation(location); signature.setReason(reason); signature.setSignDate(Calendar.getInstance()); - - if (showSignature) { + if (Boolean.TRUE.equals(showSignature)) { SignatureOptions signatureOptions = new SignatureOptions(); signatureOptions.setVisualSignature( instance.createVisibleSignature(doc, signature, pageNumber, showLogo)); @@ -125,13 +136,18 @@ public class CertSignController { } } - @PostMapping(consumes = "multipart/form-data", value = "/cert-sign") + @PostMapping( + consumes = { + MediaType.MULTIPART_FORM_DATA_VALUE, + MediaType.APPLICATION_FORM_URLENCODED_VALUE + }, + value = "/cert-sign") @Operation( summary = "Sign PDF with a Digital Certificate", description = "This endpoint accepts a PDF file, a digital certificate and related" - + " information to sign the PDF. It then returns the digitally signed PDF" - + " file. Input:PDF Output:PDF Type:SISO") + + " information to sign the PDF. It then returns the digitally signed PDF" + + " file. Input:PDF Output:PDF Type:SISO") public ResponseEntity signPDFWithCert(@ModelAttribute SignPDFWithCertRequest request) throws Exception { MultipartFile pdf = request.getFileInput(); @@ -141,12 +157,13 @@ public class CertSignController { MultipartFile p12File = request.getP12File(); MultipartFile jksfile = request.getJksFile(); String password = request.getPassword(); - Boolean showSignature = request.isShowSignature(); + Boolean showSignature = request.getShowSignature(); String reason = request.getReason(); String location = request.getLocation(); String name = request.getName(); - Integer pageNumber = request.getPageNumber() - 1; - Boolean showLogo = request.isShowLogo(); + // Convert 1-indexed page number (user input) to 0-indexed page number (API requirement) + Integer pageNumber = request.getPageNumber() != null ? (request.getPageNumber() - 1) : null; + Boolean showLogo = request.getShowLogo(); if (certType == null) { throw new IllegalArgumentException("Cert type must be provided"); @@ -283,7 +300,7 @@ public class CertSignController { widget.setAppearance(appearance); try (PDPageContentStream cs = new PDPageContentStream(doc, appearanceStream)) { - if (showLogo) { + if (Boolean.TRUE.equals(showLogo)) { cs.saveGraphicsState(); PDExtendedGraphicsState extState = new PDExtendedGraphicsState(); extState.setBlendMode(BlendMode.MULTIPLY); 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 3ce586491..ef82a2942 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 @@ -43,7 +43,6 @@ import org.apache.xmpbox.XMPMetadata; import org.apache.xmpbox.xml.DomXmpParser; import org.apache.xmpbox.xml.XmpParsingException; import org.apache.xmpbox.xml.XmpSerializer; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; @@ -59,6 +58,7 @@ import com.fasterxml.jackson.databind.node.ObjectNode; 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.SPDF.model.api.PDFFile; @@ -69,17 +69,13 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RequestMapping("/api/v1/security") @Slf4j @Tag(name = "Security", description = "Security APIs") +@RequiredArgsConstructor public class GetInfoOnPDF { static ObjectMapper objectMapper = new ObjectMapper(); private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public GetInfoOnPDF(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - private static void addOutlinesToArray(PDOutlineItem outline, ArrayNode arrayNode) { if (outline == null) return; diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/PasswordController.java b/src/main/java/stirling/software/SPDF/controller/api/security/PasswordController.java index 386e938b9..830810628 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/PasswordController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/PasswordController.java @@ -5,7 +5,6 @@ import java.io.IOException; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.encryption.AccessPermission; import org.apache.pdfbox.pdmodel.encryption.StandardProtectionPolicy; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -17,6 +16,8 @@ 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 stirling.software.SPDF.model.api.security.AddPasswordRequest; import stirling.software.SPDF.model.api.security.PDFPasswordRequest; import stirling.software.SPDF.service.CustomPDFDocumentFactory; @@ -25,15 +26,11 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RestController @RequestMapping("/api/v1/security") @Tag(name = "Security", description = "Security APIs") +@RequiredArgsConstructor public class PasswordController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public PasswordController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(consumes = "multipart/form-data", value = "/remove-password") @Operation( summary = "Remove password from a PDF file", diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java b/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java index deec98e4e..0c8a7f7e6 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/RedactController.java @@ -14,7 +14,6 @@ import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.PDPageTree; import org.apache.pdfbox.pdmodel.common.PDRectangle; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.InitBinder; @@ -28,6 +27,7 @@ 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.SPDF.model.PDFText; @@ -45,15 +45,11 @@ import stirling.software.SPDF.utils.propertyeditor.StringToArrayListPropertyEdit @RequestMapping("/api/v1/security") @Slf4j @Tag(name = "Security", description = "Security APIs") +@RequiredArgsConstructor public class RedactController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public RedactController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @InitBinder public void initBinder(WebDataBinder binder) { binder.registerCustomEditor( diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/RemoveCertSignController.java b/src/main/java/stirling/software/SPDF/controller/api/security/RemoveCertSignController.java index ddead4338..5761e854f 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/RemoveCertSignController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/RemoveCertSignController.java @@ -7,7 +7,6 @@ import org.apache.pdfbox.pdmodel.PDDocumentCatalog; import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; import org.apache.pdfbox.pdmodel.interactive.form.PDField; import org.apache.pdfbox.pdmodel.interactive.form.PDSignatureField; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -19,6 +18,8 @@ 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 stirling.software.SPDF.model.api.PDFFile; import stirling.software.SPDF.service.CustomPDFDocumentFactory; import stirling.software.SPDF.utils.WebResponseUtils; @@ -26,15 +27,11 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RestController @RequestMapping("/api/v1/security") @Tag(name = "Security", description = "Security APIs") +@RequiredArgsConstructor public class RemoveCertSignController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public RemoveCertSignController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(consumes = "multipart/form-data", value = "/remove-cert-sign") @Operation( summary = "Remove digital signature from PDF", diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java b/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java index 9615c82af..42dbfef64 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/SanitizeController.java @@ -12,7 +12,6 @@ import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationLink; import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget; import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm; import org.apache.pdfbox.pdmodel.interactive.form.PDField; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -24,6 +23,8 @@ 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 stirling.software.SPDF.model.api.security.SanitizePdfRequest; import stirling.software.SPDF.service.CustomPDFDocumentFactory; import stirling.software.SPDF.utils.WebResponseUtils; @@ -31,15 +32,11 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RestController @RequestMapping("/api/v1/security") @Tag(name = "Security", description = "Security APIs") +@RequiredArgsConstructor public class SanitizeController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public SanitizeController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(consumes = "multipart/form-data", value = "/sanitize-pdf") @Operation( summary = "Sanitize a PDF file", diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/ValidateSignatureController.java b/src/main/java/stirling/software/SPDF/controller/api/security/ValidateSignatureController.java index 4b4da4bdd..361bc1e3f 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/ValidateSignatureController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/ValidateSignatureController.java @@ -21,7 +21,7 @@ import org.bouncycastle.cms.SignerInformation; import org.bouncycastle.cms.SignerInformationStore; import org.bouncycastle.cms.jcajce.JcaSimpleSignerInfoVerifierBuilder; import org.bouncycastle.util.Store; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PostMapping; @@ -32,6 +32,8 @@ import org.springframework.web.multipart.MultipartFile; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; + import stirling.software.SPDF.model.api.security.SignatureValidationRequest; import stirling.software.SPDF.model.api.security.SignatureValidationResult; import stirling.software.SPDF.service.CertificateValidationService; @@ -40,25 +42,18 @@ import stirling.software.SPDF.service.CustomPDFDocumentFactory; @RestController @RequestMapping("/api/v1/security") @Tag(name = "Security", description = "Security APIs") +@RequiredArgsConstructor public class ValidateSignatureController { private final CustomPDFDocumentFactory pdfDocumentFactory; private final CertificateValidationService certValidationService; - @Autowired - public ValidateSignatureController( - CustomPDFDocumentFactory pdfDocumentFactory, - CertificateValidationService certValidationService) { - this.pdfDocumentFactory = pdfDocumentFactory; - this.certValidationService = certValidationService; - } - @Operation( summary = "Validate PDF Digital Signature", description = "Validates the digital signatures in a PDF file against default or custom" + " certificates. Input:PDF Output:JSON Type:SISO") - @PostMapping(value = "/validate-signature") + @PostMapping(value = "/validate-signature", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ResponseEntity> validateSignature( @ModelAttribute SignatureValidationRequest request) throws IOException { List results = new ArrayList<>(); diff --git a/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java b/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java index 7ed8a5a04..c477a88f8 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/security/WatermarkController.java @@ -22,7 +22,6 @@ import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory; import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState; import org.apache.pdfbox.util.Matrix; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.ClassPathResource; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; @@ -35,6 +34,8 @@ 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 stirling.software.SPDF.model.api.security.AddWatermarkRequest; import stirling.software.SPDF.service.CustomPDFDocumentFactory; import stirling.software.SPDF.utils.PdfUtils; @@ -43,15 +44,11 @@ import stirling.software.SPDF.utils.WebResponseUtils; @RestController @RequestMapping("/api/v1/security") @Tag(name = "Security", description = "Security APIs") +@RequiredArgsConstructor public class WatermarkController { private final CustomPDFDocumentFactory pdfDocumentFactory; - @Autowired - public WatermarkController(CustomPDFDocumentFactory pdfDocumentFactory) { - this.pdfDocumentFactory = pdfDocumentFactory; - } - @PostMapping(consumes = "multipart/form-data", value = "/add-watermark") @Operation( summary = "Add watermark to a PDF file", diff --git a/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java b/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java index 3f478abe9..327cda76c 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java @@ -191,7 +191,7 @@ public class AccountWebController { } if (request.getParameter("logout") != null) { - model.addAttribute("logoutMessage", "You have been logged out."); + model.addAttribute("logoutMessage", "login.logoutMessage"); } return "login"; diff --git a/src/main/java/stirling/software/SPDF/controller/web/DatabaseWebController.java b/src/main/java/stirling/software/SPDF/controller/web/DatabaseWebController.java index c3bd4f2a3..738db8d89 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/DatabaseWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/DatabaseWebController.java @@ -12,19 +12,18 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; +import lombok.RequiredArgsConstructor; + import stirling.software.SPDF.config.security.database.DatabaseService; import stirling.software.SPDF.utils.FileInfo; @Controller @Tag(name = "Database Management", description = "Database management and security APIs") +@RequiredArgsConstructor public class DatabaseWebController { private final DatabaseService databaseService; - public DatabaseWebController(DatabaseService databaseService) { - this.databaseService = databaseService; - } - @PreAuthorize("hasRole('ROLE_ADMIN')") @GetMapping("/database") public String database(HttpServletRequest request, Model model, Authentication authentication) { diff --git a/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java b/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java index 3341d0054..9a3b2b3e2 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/HomeWebController.java @@ -19,6 +19,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.v3.oas.annotations.Hidden; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import stirling.software.SPDF.model.ApplicationProperties; @@ -26,14 +27,11 @@ import stirling.software.SPDF.model.Dependency; @Controller @Slf4j +@RequiredArgsConstructor public class HomeWebController { private final ApplicationProperties applicationProperties; - public HomeWebController(ApplicationProperties applicationProperties) { - this.applicationProperties = applicationProperties; - } - @GetMapping("/about") @Hidden public String gameForm(Model model) { @@ -67,6 +65,9 @@ public class HomeWebController { @GetMapping("/") public String home(Model model) { model.addAttribute("currentPage", "home"); + String showSurvey = System.getenv("SHOW_SURVEY"); + boolean showSurveyValue = showSurvey == null || "true".equalsIgnoreCase(showSurvey); + model.addAttribute("showSurveyFromDocker", showSurveyValue); return "home"; } diff --git a/src/main/java/stirling/software/SPDF/controller/web/MetricsController.java b/src/main/java/stirling/software/SPDF/controller/web/MetricsController.java index 0fabeeae4..52c79073f 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/MetricsController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/MetricsController.java @@ -19,6 +19,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.annotation.PostConstruct; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import stirling.software.SPDF.config.EndpointInspector; @@ -29,6 +30,7 @@ import stirling.software.SPDF.model.ApplicationProperties; @RequestMapping("/api/v1/info") @Tag(name = "Info", description = "Info APIs") @Slf4j +@RequiredArgsConstructor public class MetricsController { private final ApplicationProperties applicationProperties; @@ -36,15 +38,6 @@ public class MetricsController { private final EndpointInspector endpointInspector; private boolean metricsEnabled; - public MetricsController( - ApplicationProperties applicationProperties, - MeterRegistry meterRegistry, - EndpointInspector endpointInspector) { - this.applicationProperties = applicationProperties; - this.meterRegistry = meterRegistry; - this.endpointInspector = endpointInspector; - } - @PostConstruct public void init() { Boolean metricsEnabled = applicationProperties.getMetrics().getEnabled(); diff --git a/src/main/java/stirling/software/SPDF/controller/web/OtherWebController.java b/src/main/java/stirling/software/SPDF/controller/web/OtherWebController.java index a4b2cc962..ddd189e28 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/OtherWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/OtherWebController.java @@ -13,19 +13,18 @@ import org.springframework.web.servlet.ModelAndView; import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; + import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.utils.CheckProgramInstall; @Controller @Tag(name = "Misc", description = "Miscellaneous APIs") +@RequiredArgsConstructor public class OtherWebController { private final ApplicationProperties applicationProperties; - public OtherWebController(ApplicationProperties applicationProperties) { - this.applicationProperties = applicationProperties; - } - @GetMapping("/compress-pdf") @Hidden public String compressPdfForm(Model model) { @@ -99,6 +98,13 @@ public class OtherWebController { return "misc/change-metadata"; } + @GetMapping("/unlock-pdf-forms") + @Hidden + public String unlockPDFForms(Model model) { + model.addAttribute("currentPage", "unlock-pdf-forms"); + return "misc/unlock-pdf-forms"; + } + @GetMapping("/compare") @Hidden public String compareForm(Model model) { @@ -122,7 +128,7 @@ public class OtherWebController { return Arrays.stream(files) .filter(file -> file.getName().endsWith(".traineddata")) .map(file -> file.getName().replace(".traineddata", "")) - .filter(lang -> !lang.equalsIgnoreCase("osd")) + .filter(lang -> !"osd".equalsIgnoreCase(lang)) .sorted() .toList(); } diff --git a/src/main/java/stirling/software/SPDF/controller/web/UploadLimitService.java b/src/main/java/stirling/software/SPDF/controller/web/UploadLimitService.java index c1c9aebcf..200df6d07 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/UploadLimitService.java +++ b/src/main/java/stirling/software/SPDF/controller/web/UploadLimitService.java @@ -1,32 +1,34 @@ package stirling.software.SPDF.controller.web; +import java.util.regex.Pattern; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import lombok.extern.slf4j.Slf4j; -import stirling.software.SPDF.model.ApplicationProperties; -import java.util.regex.Pattern; +import stirling.software.SPDF.model.ApplicationProperties; @Service @Slf4j public class UploadLimitService { - @Autowired - private ApplicationProperties applicationProperties; + @Autowired private ApplicationProperties applicationProperties; public long getUploadLimit() { - String maxUploadSize = - applicationProperties.getSystem().getFileUploadLimit() != null - ? applicationProperties.getSystem().getFileUploadLimit() - : ""; + String maxUploadSize = + applicationProperties.getSystem().getFileUploadLimit() != null + ? applicationProperties.getSystem().getFileUploadLimit() + : ""; if (maxUploadSize.isEmpty()) { return 0; - } else if (!Pattern.compile("^[1-9][0-9]{0,2}[KMGkmg][Bb]$").matcher(maxUploadSize).matches()) { + } else if (!Pattern.compile("^[1-9][0-9]{0,2}[KMGkmg][Bb]$") + .matcher(maxUploadSize) + .matches()) { log.error( - "Invalid maxUploadSize format. Expected format: [1-9][0-9]{0,2}[KMGkmg][Bb], but got: {}", - maxUploadSize); + "Invalid maxUploadSize format. Expected format: [1-9][0-9]{0,2}[KMGkmg][Bb], but got: {}", + maxUploadSize); return 0; } else { String unit = maxUploadSize.replaceAll("[1-9][0-9]{0,2}", "").toUpperCase(); @@ -41,7 +43,7 @@ public class UploadLimitService { } } - //TODO: why do this server side not client? + // TODO: why do this server side not client? public String getReadableUploadLimit() { return humanReadableByteCount(getUploadLimit()); } @@ -52,4 +54,4 @@ public class UploadLimitService { String pre = "KMGTPE".charAt(exp - 1) + "B"; return String.format("%.1f %s", bytes / Math.pow(1024, exp), pre); } -} \ No newline at end of file +} diff --git a/src/main/java/stirling/software/SPDF/model/ApiEndpoint.java b/src/main/java/stirling/software/SPDF/model/ApiEndpoint.java index 0d707e3b1..dfb06f0d8 100644 --- a/src/main/java/stirling/software/SPDF/model/ApiEndpoint.java +++ b/src/main/java/stirling/software/SPDF/model/ApiEndpoint.java @@ -6,9 +6,9 @@ import java.util.Map; import com.fasterxml.jackson.databind.JsonNode; public class ApiEndpoint { - private String name; + private final String name; private Map parameters; - private String description; + private final String description; public ApiEndpoint(String name, JsonNode postNode) { this.name = name; diff --git a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java b/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java index d42429619..82a17ff2c 100644 --- a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java +++ b/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java @@ -82,6 +82,8 @@ public class ApplicationProperties { private Metrics metrics = new Metrics(); private AutomaticallyGenerated automaticallyGenerated = new AutomaticallyGenerated(); + private Mail mail = new Mail(); + private Premium premium = new Premium(); private EnterpriseEdition enterpriseEdition = new EnterpriseEdition(); private AutoPipeline autoPipeline = new AutoPipeline(); @@ -420,6 +422,16 @@ public class ApplicationProperties { } } + @Data + public static class Mail { + private boolean enabled; + private String host; + private int port; + private String username; + @ToString.Exclude private String password; + private String from; + } + @Data public static class Premium { private boolean enabled; diff --git a/src/main/java/stirling/software/SPDF/model/Authority.java b/src/main/java/stirling/software/SPDF/model/Authority.java index be250e8b8..4a0ed7255 100644 --- a/src/main/java/stirling/software/SPDF/model/Authority.java +++ b/src/main/java/stirling/software/SPDF/model/Authority.java @@ -2,10 +2,22 @@ package stirling.software.SPDF.model; import java.io.Serializable; -import jakarta.persistence.*; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; + +import lombok.Getter; +import lombok.Setter; @Entity @Table(name = "authorities") +@Getter +@Setter public class Authority implements Serializable { private static final long serialVersionUID = 1L; @@ -28,28 +40,4 @@ public class Authority implements Serializable { this.user = user; user.getAuthorities().add(this); } - - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getAuthority() { - return authority; - } - - public void setAuthority(String authority) { - this.authority = authority; - } - - public User getUser() { - return user; - } - - public void setUser(User user) { - this.user = user; - } } diff --git a/src/main/java/stirling/software/SPDF/model/PersistentLogin.java b/src/main/java/stirling/software/SPDF/model/PersistentLogin.java index cc94eea28..c0990199c 100644 --- a/src/main/java/stirling/software/SPDF/model/PersistentLogin.java +++ b/src/main/java/stirling/software/SPDF/model/PersistentLogin.java @@ -7,8 +7,11 @@ import jakarta.persistence.Entity; import jakarta.persistence.Id; import jakarta.persistence.Table; +import lombok.Data; + @Entity @Table(name = "persistent_logins") +@Data public class PersistentLogin { @Id @@ -23,38 +26,4 @@ public class PersistentLogin { @Column(name = "last_used", nullable = false) private Date lastUsed; - - public String getSeries() { - return series; - } - - public void setSeries(String series) { - this.series = series; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getToken() { - return token; - } - - public void setToken(String token) { - this.token = token; - } - - public Date getLastUsed() { - return lastUsed; - } - - public void setLastUsed(Date lastUsed) { - this.lastUsed = lastUsed; - } - - // Getters, setters, etc. } diff --git a/src/main/java/stirling/software/SPDF/model/PipelineConfig.java b/src/main/java/stirling/software/SPDF/model/PipelineConfig.java index efb9b232c..b0d3a3e7d 100644 --- a/src/main/java/stirling/software/SPDF/model/PipelineConfig.java +++ b/src/main/java/stirling/software/SPDF/model/PipelineConfig.java @@ -4,6 +4,9 @@ import java.util.List; import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; + +@Data public class PipelineConfig { private String name; @@ -14,36 +17,4 @@ public class PipelineConfig { @JsonProperty("outputFileName") private String outputPattern; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public List getOperations() { - return operations; - } - - public void setOperations(List operations) { - this.operations = operations; - } - - public String getOutputDir() { - return outputDir; - } - - public void setOutputDir(String outputDir) { - this.outputDir = outputDir; - } - - public String getOutputPattern() { - return outputPattern; - } - - public void setOutputPattern(String outputPattern) { - this.outputPattern = outputPattern; - } } diff --git a/src/main/java/stirling/software/SPDF/model/PipelineOperation.java b/src/main/java/stirling/software/SPDF/model/PipelineOperation.java index f61835056..30a5ad52b 100644 --- a/src/main/java/stirling/software/SPDF/model/PipelineOperation.java +++ b/src/main/java/stirling/software/SPDF/model/PipelineOperation.java @@ -2,28 +2,10 @@ package stirling.software.SPDF.model; import java.util.Map; +import lombok.Data; + +@Data public class PipelineOperation { private String operation; private Map parameters; - - public String getOperation() { - return operation; - } - - public void setOperation(String operation) { - this.operation = operation; - } - - public Map getParameters() { - return parameters; - } - - public void setParameters(Map parameters) { - this.parameters = parameters; - } - - @Override - public String toString() { - return "PipelineOperation [operation=" + operation + ", parameters=" + parameters + "]"; - } } diff --git a/src/main/java/stirling/software/SPDF/model/Role.java b/src/main/java/stirling/software/SPDF/model/Role.java index 78f93d867..7d45e3da3 100644 --- a/src/main/java/stirling/software/SPDF/model/Role.java +++ b/src/main/java/stirling/software/SPDF/model/Role.java @@ -3,6 +3,11 @@ package stirling.software.SPDF.model; import java.util.LinkedHashMap; import java.util.Map; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor public enum Role { // Unlimited access @@ -33,13 +38,6 @@ public enum Role { private final int webCallsPerDay; private final String roleName; - Role(String roleId, int apiCallsPerDay, int webCallsPerDay, String roleName) { - this.roleId = roleId; - this.apiCallsPerDay = apiCallsPerDay; - this.webCallsPerDay = webCallsPerDay; - this.roleName = roleName; - } - public static String getRoleNameByRoleId(String roleId) { // Using the fromString method to get the Role enum based on the roleId Role role = fromString(roleId); @@ -65,20 +63,4 @@ public enum Role { } throw new IllegalArgumentException("No Role defined for id: " + roleId); } - - public String getRoleId() { - return roleId; - } - - public int getApiCallsPerDay() { - return apiCallsPerDay; - } - - public int getWebCallsPerDay() { - return webCallsPerDay; - } - - public String getRoleName() { - return roleName; - } } diff --git a/src/main/java/stirling/software/SPDF/model/User.java b/src/main/java/stirling/software/SPDF/model/User.java index 233347243..1eb9da991 100644 --- a/src/main/java/stirling/software/SPDF/model/User.java +++ b/src/main/java/stirling/software/SPDF/model/User.java @@ -9,8 +9,19 @@ import java.util.stream.Collectors; import jakarta.persistence.*; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + @Entity @Table(name = "users") +@NoArgsConstructor +@Getter +@Setter +@EqualsAndHashCode(onlyExplicitlyIncluded = true) +@ToString(onlyExplicitlyIncluded = true) public class User implements Serializable { private static final long serialVersionUID = 1L; @@ -63,76 +74,16 @@ public class User implements Serializable { this.isFirstLogin = isFirstLogin; } - public Long getId() { - return id; - } - - public void setId(Long id) { - this.id = id; - } - - public String getApiKey() { - return apiKey; - } - - public void setApiKey(String apiKey) { - this.apiKey = apiKey; - } - - public Map getSettings() { - return settings; - } - - public void setSettings(Map settings) { - this.settings = settings; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public boolean isEnabled() { - return enabled; - } - - public void setEnabled(boolean enabled) { - this.enabled = enabled; - } - - public String getAuthenticationType() { - return authenticationType; - } - public void setAuthenticationType(AuthenticationType authenticationType) { this.authenticationType = authenticationType.toString().toLowerCase(); } - public Set getAuthorities() { - return authorities; - } - - public void setAuthorities(Set authorities) { - this.authorities = authorities; - } - public void addAuthorities(Set authorities) { this.authorities.addAll(authorities); } - public void addAuthority(Authority authorities) { - this.authorities.add(authorities); + public void addAuthority(Authority authority) { + this.authorities.add(authority); } public String getRolesAsString() { diff --git a/src/main/java/stirling/software/SPDF/model/api/Email.java b/src/main/java/stirling/software/SPDF/model/api/Email.java new file mode 100644 index 000000000..21b5152e5 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/api/Email.java @@ -0,0 +1,39 @@ +package stirling.software.SPDF.model.api; + +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; + +import io.swagger.v3.oas.annotations.media.Schema; + + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@EqualsAndHashCode(callSuper = true) +@ConditionalOnProperty(value = "mail.enabled", havingValue = "true", matchIfMissing = false) +public class Email extends GeneralFile { + + @Schema( + description = "The recipient's email address", + requiredMode = Schema.RequiredMode.REQUIRED, + format = "email") + private String to; + + @Schema( + description = "The subject of the email", + defaultValue = "Stirling Software PDF Notification", + requiredMode = Schema.RequiredMode.NOT_REQUIRED) + private String subject; + + @Schema( + description = "The body of the email", + requiredMode = Schema.RequiredMode.NOT_REQUIRED, + defaultValue = + "This message was automatically generated by Stirling-PDF, an innovative" + + " solution from Stirling Software. For more information, visit our website.

Please do" + + " not reply directly to this email.") + private String body; +} diff --git a/src/main/java/stirling/software/SPDF/model/api/GeneralFile.java b/src/main/java/stirling/software/SPDF/model/api/GeneralFile.java index 1c0581cd1..068978fac 100644 --- a/src/main/java/stirling/software/SPDF/model/api/GeneralFile.java +++ b/src/main/java/stirling/software/SPDF/model/api/GeneralFile.java @@ -6,11 +6,9 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; @Data @EqualsAndHashCode -@NoArgsConstructor public class GeneralFile { @Schema(description = "The input file") diff --git a/src/main/java/stirling/software/SPDF/model/api/HandleDataRequest.java b/src/main/java/stirling/software/SPDF/model/api/HandleDataRequest.java index d4a4a6bd6..27a0dc3bb 100644 --- a/src/main/java/stirling/software/SPDF/model/api/HandleDataRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/HandleDataRequest.java @@ -6,10 +6,8 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; @Data -@NoArgsConstructor @EqualsAndHashCode public class HandleDataRequest { diff --git a/src/main/java/stirling/software/SPDF/model/api/ImageFile.java b/src/main/java/stirling/software/SPDF/model/api/ImageFile.java index fdc0e6dcf..9719e2372 100644 --- a/src/main/java/stirling/software/SPDF/model/api/ImageFile.java +++ b/src/main/java/stirling/software/SPDF/model/api/ImageFile.java @@ -6,10 +6,8 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; @Data -@NoArgsConstructor @EqualsAndHashCode public class ImageFile { @Schema(description = "The input image file") diff --git a/src/main/java/stirling/software/SPDF/model/api/MultiplePDFFiles.java b/src/main/java/stirling/software/SPDF/model/api/MultiplePDFFiles.java index 00a34b748..fbca980e2 100644 --- a/src/main/java/stirling/software/SPDF/model/api/MultiplePDFFiles.java +++ b/src/main/java/stirling/software/SPDF/model/api/MultiplePDFFiles.java @@ -6,10 +6,8 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; @Data -@NoArgsConstructor @EqualsAndHashCode public class MultiplePDFFiles { @Schema(description = "The input PDF files", type = "array", format = "binary") diff --git a/src/main/java/stirling/software/SPDF/model/api/PDFComparison.java b/src/main/java/stirling/software/SPDF/model/api/PDFComparison.java index 47377188c..a2702c3f8 100644 --- a/src/main/java/stirling/software/SPDF/model/api/PDFComparison.java +++ b/src/main/java/stirling/software/SPDF/model/api/PDFComparison.java @@ -4,10 +4,8 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; @Data -@NoArgsConstructor @EqualsAndHashCode(callSuper = true) public class PDFComparison extends PDFFile { diff --git a/src/main/java/stirling/software/SPDF/model/api/PDFComparisonAndCount.java b/src/main/java/stirling/software/SPDF/model/api/PDFComparisonAndCount.java index 04042bd81..d850b94ae 100644 --- a/src/main/java/stirling/software/SPDF/model/api/PDFComparisonAndCount.java +++ b/src/main/java/stirling/software/SPDF/model/api/PDFComparisonAndCount.java @@ -4,10 +4,8 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; @Data -@NoArgsConstructor @EqualsAndHashCode(callSuper = true) public class PDFComparisonAndCount extends PDFComparison { @Schema(description = "Count") diff --git a/src/main/java/stirling/software/SPDF/model/api/PDFFile.java b/src/main/java/stirling/software/SPDF/model/api/PDFFile.java index 685621904..930f9b0ff 100644 --- a/src/main/java/stirling/software/SPDF/model/api/PDFFile.java +++ b/src/main/java/stirling/software/SPDF/model/api/PDFFile.java @@ -6,10 +6,12 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; @Data +@NoArgsConstructor @EqualsAndHashCode public class PDFFile { - @Schema(description = "The input PDF file") + @Schema(description = "The input PDF file", format = "binary") private MultipartFile fileInput; } diff --git a/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java b/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java index 0148b7a72..39ace7f1e 100644 --- a/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java +++ b/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java @@ -10,14 +10,10 @@ import io.swagger.v3.oas.annotations.media.Schema.RequiredMode; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import lombok.extern.slf4j.Slf4j; import stirling.software.SPDF.utils.GeneralUtils; @Data -@NoArgsConstructor -@Slf4j @EqualsAndHashCode(callSuper = true) public class PDFWithPageNums extends PDFFile { @@ -32,8 +28,7 @@ public class PDFWithPageNums extends PDFFile { @Hidden public List getPageNumbersList(PDDocument doc, boolean oneBased) { - int pageCount = 0; - pageCount = doc.getNumberOfPages(); + int pageCount = doc.getNumberOfPages(); return GeneralUtils.parsePageList(pageNumbers, pageCount, oneBased); } } diff --git a/src/main/java/stirling/software/SPDF/model/api/SplitPdfByChaptersRequest.java b/src/main/java/stirling/software/SPDF/model/api/SplitPdfByChaptersRequest.java index 17ed03e89..03930009e 100644 --- a/src/main/java/stirling/software/SPDF/model/api/SplitPdfByChaptersRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/SplitPdfByChaptersRequest.java @@ -4,10 +4,8 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; @Data -@NoArgsConstructor @EqualsAndHashCode(callSuper = false) public class SplitPdfByChaptersRequest extends PDFFile { @Schema(description = "Whether to include Metadata or not", example = "true") diff --git a/src/main/java/stirling/software/SPDF/model/api/SplitPdfBySectionsRequest.java b/src/main/java/stirling/software/SPDF/model/api/SplitPdfBySectionsRequest.java index 1ff834b4c..e8557c692 100644 --- a/src/main/java/stirling/software/SPDF/model/api/SplitPdfBySectionsRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/SplitPdfBySectionsRequest.java @@ -4,10 +4,8 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; @Data -@NoArgsConstructor @EqualsAndHashCode(callSuper = true) public class SplitPdfBySectionsRequest extends PDFFile { @Schema(description = "Number of horizontal divisions for each PDF page", example = "2") diff --git a/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java b/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java index b0266f307..d9fe92def 100644 --- a/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/security/SignPDFWithCertRequest.java @@ -20,7 +20,8 @@ public class SignPDFWithCertRequest extends PDFFile { @Schema( description = - "The private key for the digital certificate (required for PEM type certificates)") + "The private key for the digital certificate (required for PEM type" + + " certificates)") private MultipartFile privateKeyFile; @Schema(description = "The digital certificate (required for PEM type certificates)") @@ -32,11 +33,11 @@ public class SignPDFWithCertRequest extends PDFFile { @Schema(description = "The JKS keystore file (Java Key Store)") private MultipartFile jksFile; - @Schema(description = "The password for the keystore or the private key") + @Schema(description = "The password for the keystore or the private key", format = "password") private String password; @Schema(description = "Whether to visually show the signature in the PDF file") - private boolean showSignature; + private Boolean showSignature; @Schema(description = "The reason for signing the PDF") private String reason; @@ -49,9 +50,10 @@ public class SignPDFWithCertRequest extends PDFFile { @Schema( description = - "The page number where the signature should be visible. This is required if showSignature is set to true") + "The page number where the signature should be visible. This is required if" + + " showSignature is set to true") private Integer pageNumber; @Schema(description = "Whether to visually show a signature logo along with the signature") - private boolean showLogo; + private Boolean showLogo; } diff --git a/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserDetails.java b/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserDetails.java index d8cbf7903..80dd2d14e 100644 --- a/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserDetails.java +++ b/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserDetails.java @@ -4,10 +4,8 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; @Data -@NoArgsConstructor @EqualsAndHashCode(callSuper = true) public class UpdateUserDetails extends UpdateUserUsername { diff --git a/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserUsername.java b/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserUsername.java index 8b457605b..c0c14fc08 100644 --- a/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserUsername.java +++ b/src/main/java/stirling/software/SPDF/model/api/user/UpdateUserUsername.java @@ -4,10 +4,8 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; @Data -@NoArgsConstructor @EqualsAndHashCode(callSuper = true) public class UpdateUserUsername extends UsernameAndPass { diff --git a/src/main/java/stirling/software/SPDF/model/api/user/Username.java b/src/main/java/stirling/software/SPDF/model/api/user/Username.java index 167df1b1b..d29a544b7 100644 --- a/src/main/java/stirling/software/SPDF/model/api/user/Username.java +++ b/src/main/java/stirling/software/SPDF/model/api/user/Username.java @@ -4,11 +4,9 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; @Data @EqualsAndHashCode -@NoArgsConstructor public class Username { @Schema(description = "username of user") diff --git a/src/main/java/stirling/software/SPDF/model/api/user/UsernameAndPass.java b/src/main/java/stirling/software/SPDF/model/api/user/UsernameAndPass.java index d925eef1f..ec8f5c08a 100644 --- a/src/main/java/stirling/software/SPDF/model/api/user/UsernameAndPass.java +++ b/src/main/java/stirling/software/SPDF/model/api/user/UsernameAndPass.java @@ -4,10 +4,8 @@ import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; @Data -@NoArgsConstructor @EqualsAndHashCode(callSuper = true) public class UsernameAndPass extends Username { diff --git a/src/main/java/stirling/software/SPDF/service/CustomPDFDocumentFactory.java b/src/main/java/stirling/software/SPDF/service/CustomPDFDocumentFactory.java index 3a3198fbf..e5bb50d73 100644 --- a/src/main/java/stirling/software/SPDF/service/CustomPDFDocumentFactory.java +++ b/src/main/java/stirling/software/SPDF/service/CustomPDFDocumentFactory.java @@ -19,6 +19,7 @@ import org.apache.pdfbox.pdmodel.PDDocument; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import stirling.software.SPDF.model.api.PDFFile; @@ -29,6 +30,7 @@ import stirling.software.SPDF.model.api.PDFFile; */ @Component @Slf4j +@RequiredArgsConstructor public class CustomPDFDocumentFactory { private final PdfMetadataService pdfMetadataService; @@ -63,10 +65,6 @@ public class CustomPDFDocumentFactory { // Counter for tracking temporary resources private static final AtomicLong tempCounter = new AtomicLong(0); - public CustomPDFDocumentFactory(PdfMetadataService pdfMetadataService) { - this.pdfMetadataService = pdfMetadataService; - } - /** * Main entry point for loading a PDF document from a file. Automatically selects the most * appropriate loading strategy. diff --git a/src/main/java/stirling/software/SPDF/service/MetricsAggregatorService.java b/src/main/java/stirling/software/SPDF/service/MetricsAggregatorService.java index 1a61d03bd..8cc0a243f 100644 --- a/src/main/java/stirling/software/SPDF/service/MetricsAggregatorService.java +++ b/src/main/java/stirling/software/SPDF/service/MetricsAggregatorService.java @@ -6,16 +6,18 @@ import java.util.concurrent.ConcurrentHashMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; import io.micrometer.core.instrument.MeterRegistry; import io.micrometer.core.instrument.search.Search; +import lombok.RequiredArgsConstructor; + import stirling.software.SPDF.config.EndpointInspector; @Service +@RequiredArgsConstructor public class MetricsAggregatorService { private static final Logger logger = LoggerFactory.getLogger(MetricsAggregatorService.class); @@ -24,16 +26,6 @@ public class MetricsAggregatorService { private final EndpointInspector endpointInspector; private final Map lastSentMetrics = new ConcurrentHashMap<>(); - @Autowired - public MetricsAggregatorService( - MeterRegistry meterRegistry, - PostHogService postHogService, - EndpointInspector endpointInspector) { - this.meterRegistry = meterRegistry; - this.postHogService = postHogService; - this.endpointInspector = endpointInspector; - } - @Scheduled(fixedRate = 7200000) // Run every 2 hours public void aggregateAndSendMetrics() { Map metrics = new HashMap<>(); diff --git a/src/main/java/stirling/software/SPDF/service/PdfMetadataService.java b/src/main/java/stirling/software/SPDF/service/PdfMetadataService.java index 173de33f4..b44ba59be 100644 --- a/src/main/java/stirling/software/SPDF/service/PdfMetadataService.java +++ b/src/main/java/stirling/software/SPDF/service/PdfMetadataService.java @@ -19,7 +19,6 @@ public class PdfMetadataService { private final UserServiceInterface userService; private final boolean runningProOrHigher; - @Autowired public PdfMetadataService( ApplicationProperties applicationProperties, @Qualifier("StirlingPDFLabel") String stirlingPDFLabel, diff --git a/src/main/java/stirling/software/SPDF/service/PostHogService.java b/src/main/java/stirling/software/SPDF/service/PostHogService.java index 51faba5be..69cb52061 100644 --- a/src/main/java/stirling/software/SPDF/service/PostHogService.java +++ b/src/main/java/stirling/software/SPDF/service/PostHogService.java @@ -29,7 +29,6 @@ public class PostHogService { private final Environment env; private boolean configDirMounted; - @Autowired public PostHogService( PostHog postHog, @Qualifier("UUID") String uuid, diff --git a/src/main/java/stirling/software/SPDF/service/misc/ReplaceAndInvertColorService.java b/src/main/java/stirling/software/SPDF/service/misc/ReplaceAndInvertColorService.java index 29df742a3..e2a4e7ea5 100644 --- a/src/main/java/stirling/software/SPDF/service/misc/ReplaceAndInvertColorService.java +++ b/src/main/java/stirling/software/SPDF/service/misc/ReplaceAndInvertColorService.java @@ -2,24 +2,21 @@ package stirling.software.SPDF.service.misc; import java.io.IOException; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.io.InputStreamResource; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; +import lombok.RequiredArgsConstructor; + import stirling.software.SPDF.Factories.ReplaceAndInvertColorFactory; import stirling.software.SPDF.model.api.misc.HighContrastColorCombination; import stirling.software.SPDF.model.api.misc.ReplaceAndInvert; import stirling.software.SPDF.utils.misc.ReplaceAndInvertColorStrategy; @Service +@RequiredArgsConstructor public class ReplaceAndInvertColorService { - private ReplaceAndInvertColorFactory replaceAndInvertColorFactory; - - @Autowired - public ReplaceAndInvertColorService(ReplaceAndInvertColorFactory replaceAndInvertColorFactory) { - this.replaceAndInvertColorFactory = replaceAndInvertColorFactory; - } + private final ReplaceAndInvertColorFactory replaceAndInvertColorFactory; public InputStreamResource replaceAndInvertColor( MultipartFile file, diff --git a/src/main/java/stirling/software/SPDF/utils/FileMonitor.java b/src/main/java/stirling/software/SPDF/utils/FileMonitor.java index 214f430e4..e0b3fc2cf 100644 --- a/src/main/java/stirling/software/SPDF/utils/FileMonitor.java +++ b/src/main/java/stirling/software/SPDF/utils/FileMonitor.java @@ -12,7 +12,6 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.function.Predicate; import java.util.stream.Stream; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; @@ -38,7 +37,6 @@ public class FileMonitor { * @param pathFilter the filter to apply to the paths, return true if the path should be * monitored, false otherwise */ - @Autowired public FileMonitor( @Qualifier("directoryFilter") Predicate pathFilter, RuntimePathConfig runtimePathConfig) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 9f58a93c6..d7d074223 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -39,5 +39,6 @@ server.servlet.session.timeout:30m springdoc.api-docs.path=/v1/api-docs # Set the URL of the OpenAPI JSON for the Swagger UI springdoc.swagger-ui.url=/v1/api-docs +springdoc.swagger-ui.path=/index.html posthog.api.key=phc_fiR65u5j6qmXTYL56MNrLZSWqLaDW74OrZH0Insd2xq -posthog.host=https://eu.i.posthog.com \ No newline at end of file +posthog.host=https://eu.i.posthog.com diff --git a/src/main/resources/messages_ar_AR.properties b/src/main/resources/messages_ar_AR.properties index d4acec354..78f42cafa 100644 --- a/src/main/resources/messages_ar_AR.properties +++ b/src/main/resources/messages_ar_AR.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=ضغط ملفات home.compressPdfs.desc=ضغط ملفات PDF لتقليل حجم الملف. compressPdfs.tags=ضغط,صغير,ضئيل +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=تغيير البيانات الوصفية home.changeMetadata.desc=تغيير / إزالة / إضافة بيانات أولية من مستند PDF @@ -377,7 +380,6 @@ home.ocr.title=تشغيل OCR على PDF و / أو مسح ضوئي home.ocr.desc=يقوم برنامج التنظيف بمسح واكتشاف النص من الصور داخل ملف PDF ويعيد إضافته كنص ocr.tags=تعرف,نص,صورة,مسح,قراءة,تحديد,كشف,قابل للتحرير - home.extractImages.title=استخراج الصور home.extractImages.desc=يستخرج جميع الصور من ملف PDF ويحفظها في الرمز البريدي extractImages.tags=صورة,صورة فوتوغرافية,حفظ,أرشيف,ملف مضغوط,التقاط,انتزاع @@ -607,6 +609,7 @@ login.userIsDisabled=تم تعطيل المستخدم، تم حظر تسجيل login.alreadyLoggedIn=لقد تسجل دخولًا إلى login.alreadyLoggedIn2=أجهزة أخرى. يرجى تسجيل الخروج من الأجهزة وحاول مرة أخرى. login.toManySessions=لديك عدة جلسات نشطة +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=حجب تلقائي @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=بيانات وصفية أخرى: changeMetadata.selectText.5=إضافة إدخال بيانات أولية مخصص changeMetadata.submit=تغيير +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF إلى PDF/A diff --git a/src/main/resources/messages_az_AZ.properties b/src/main/resources/messages_az_AZ.properties index a7c5e8230..7a47878b0 100644 --- a/src/main/resources/messages_az_AZ.properties +++ b/src/main/resources/messages_az_AZ.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=Sıx home.compressPdfs.desc=PDF fayllarını sıxaraq onların ölçüsünü azalt. compressPdfs.tags=sıx,balaca,kiçik +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=Metadatanı Dəyiş home.changeMetadata.desc=PDF sənədindəki Metadatanı Dəyiş/Sil/Əlavə et @@ -377,7 +380,6 @@ home.ocr.title=OCR / Skanları Təmizlə home.ocr.desc=Skanları təmizləyir və PDF-in içərisindəki şəkillərdəki yazını tapıb mətn olaraq əlavə edir. ocr.tags=tanıma,mətn,şəkil,skan,oxu,tanı,təyin et,redaktəediləbilən - home.extractImages.title=Şəkilləri Xaric Et home.extractImages.desc=PDF-dəki şəkilləri xaric edib onları zip faylında saxlayır extractImages.tags=şəkil,foto,saxla,arxiv,zip,çək,götür @@ -607,6 +609,7 @@ login.userIsDisabled=İstifadəçi deaktivləşdirilmişdir, bu istifadəçi ad login.alreadyLoggedIn=Siz artıq daxil olmusunuz login.alreadyLoggedIn2=cihazlar. Zəhmət olmasa, cihazlardan çıxış edin və yenidən cəhd edin. login.toManySessions=Həddindən artıq aktiv sessiyanız var +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=Avtomatik Gizlətmə @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Digər Metadata: changeMetadata.selectText.5=Xüsusi Metadata girişi əlavə edin changeMetadata.submit=Dəyiş +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF-i PDF/A-ya diff --git a/src/main/resources/messages_bg_BG.properties b/src/main/resources/messages_bg_BG.properties index 53174c7f1..9230985ce 100644 --- a/src/main/resources/messages_bg_BG.properties +++ b/src/main/resources/messages_bg_BG.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=Компресиране home.compressPdfs.desc=Компресирайте PDF файлове, за да намалите размера на файла. compressPdfs.tags=мачкам,малък,мъничък +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=Промяна на метаданни home.changeMetadata.desc=Промяна/Премахване/Добавяне на метаданни от PDF документ @@ -377,7 +380,6 @@ home.ocr.title=OCR / Почистващи сканирания home.ocr.desc=Почиства, сканира и открива текст от изображения в PDF и го добавя отново като текст. ocr.tags=разпознаване,текст,изображение,сканиране,четене,идентифициране,откриване,редактиране - home.extractImages.title=Извличане на изображения home.extractImages.desc=Извлича всички изображения от PDF и ги записва към архив extractImages.tags=изображение,снимка,запазване,архивиране,архив,заснемане,грабване @@ -607,6 +609,7 @@ login.userIsDisabled=Потребителят е деактивиран, вли login.alreadyLoggedIn=Вече сте влезли в login.alreadyLoggedIn2=устройства. Моля, излезте от устройствата и опитайте отново. login.toManySessions=Имате твърде много активни сесии +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=Автоматично редактиране @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Други метаданни: changeMetadata.selectText.5=Добавяне на персонализиране метаданни changeMetadata.submit=Промени +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF към PDF/A diff --git a/src/main/resources/messages_ca_CA.properties b/src/main/resources/messages_ca_CA.properties index 70e48c3f3..271fddff5 100644 --- a/src/main/resources/messages_ca_CA.properties +++ b/src/main/resources/messages_ca_CA.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=Comprimeix home.compressPdfs.desc=Comprimeix PDFs per reduir-ne la mida. compressPdfs.tags=estrènyer,petit,minúscul +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=Canvia Metadades home.changeMetadata.desc=Canvia/Treu/Afegeix metadades al document PDF. @@ -377,7 +380,6 @@ home.ocr.title=Executa OCR i neteja escaneigs home.ocr.desc=Neteja escanejats i detecta text d'imatges dins d'un PDF, tornant-lo a afegir com a text. ocr.tags=reconeixement,text,imatge,escaneig,lectura,identificació,detecció,editable - home.extractImages.title=Extreu Imatges home.extractImages.desc=Extreu les imatges del PDF i desa-les en un arxiu zip extractImages.tags=imatge,foto,desa,arxiva,zip,captura,agafa @@ -607,6 +609,7 @@ login.userIsDisabled=L'usuari està desactivat, l'inici de sessió està actualm login.alreadyLoggedIn=Ja has iniciat sessió a login.alreadyLoggedIn2=dispositius. Si us plau, tanca la sessió en els dispositius i torna-ho a intentar. login.toManySessions=Tens massa sessions actives +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=Redacció Automàtica @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Altres Metadades: changeMetadata.selectText.5=Afegir entrada personalitzada changeMetadata.submit=Canvia +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF a PDF/A diff --git a/src/main/resources/messages_cs_CZ.properties b/src/main/resources/messages_cs_CZ.properties index 6f8cfec76..5dccf032f 100644 --- a/src/main/resources/messages_cs_CZ.properties +++ b/src/main/resources/messages_cs_CZ.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=Komprimovat home.compressPdfs.desc=Komprimovat PDF pro zmenšení jejich velikosti. compressPdfs.tags=stlačit,malý,drobný +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=Změnit metadata home.changeMetadata.desc=Změnit/odstranit/přidat metadata z PDF dokumentu @@ -377,7 +380,6 @@ home.ocr.title=OCR / Vyčištění skenů home.ocr.desc=Vyčistí skeny a detekuje text z obrázků v PDF a znovu ho přidá jako text. ocr.tags=rozpoznání,text,obrázek,sken,číst,identifikovat,detekce,upravitelný - home.extractImages.title=Extrahovat obrázky home.extractImages.desc=Extrahuje všechny obrázky z PDF a uloží je do zipu extractImages.tags=obrázek,fotka,uložit,archiv,zip,zachytit,získat @@ -607,6 +609,7 @@ login.userIsDisabled=Uživatel je deaktivován, přihlášení je momentálně p login.alreadyLoggedIn=Již jste přihlášeni na login.alreadyLoggedIn2=zařízeních. Odhlaste se prosím z těchto zařízení a zkuste to znovu. login.toManySessions=Máte příliš mnoho aktivních relací +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=Automatické začernění @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Ostatní metadata: changeMetadata.selectText.5=Přidat vlastní položku metadat changeMetadata.submit=Změnit +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF na PDF/A diff --git a/src/main/resources/messages_da_DK.properties b/src/main/resources/messages_da_DK.properties index 076130e31..309ea1748 100644 --- a/src/main/resources/messages_da_DK.properties +++ b/src/main/resources/messages_da_DK.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=Komprimer home.compressPdfs.desc=Komprimer PDF'er for at reducere deres filstørrelse. compressPdfs.tags=klem,lille,tiny +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=Ændre Metadata home.changeMetadata.desc=Ændre/Fjern/Tilføj metadata fra et PDF-dokument @@ -377,7 +380,6 @@ home.ocr.title=OCR / Oprydning af scanninger home.ocr.desc=Oprydning af scanninger og genkender tekst fra billeder i en PDF og tilføjer den igen som tekst. ocr.tags=genkendelse,tekst,billede,scan,læs,identificér,detektion,redigerbar - home.extractImages.title=Udtræk Billeder home.extractImages.desc=Udtrækker alle billeder fra en PDF og gemmer dem som zip extractImages.tags=billede,foto,gem,arkiv,zip,fang,grib @@ -607,6 +609,7 @@ login.userIsDisabled=Bruger er deaktiveret, login er i øjeblikket blokeret med login.alreadyLoggedIn=Du er allerede logget ind på login.alreadyLoggedIn2=enheder. Log ud af disse enheder og prøv igen. login.toManySessions=Du har for mange aktive sessoner +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=Auto Rediger @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Anden Metadata: changeMetadata.selectText.5=Tilføj Brugerdefineret Metadata Post changeMetadata.submit=Ændre +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF Til PDF/A diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties index dfe973fb2..363fd8e45 100644 --- a/src/main/resources/messages_de_DE.properties +++ b/src/main/resources/messages_de_DE.properties @@ -10,9 +10,9 @@ multiPdfPrompt=PDFs auswählen(2+) multiPdfDropPrompt=Wählen Sie alle gewünschten PDFs aus (oder ziehen Sie sie per Drag & Drop hierhin) imgPrompt=Wählen Sie ein Bild genericSubmit=Absenden -uploadLimit=Maximum file size: -uploadLimitExceededSingular=is too large. Maximum allowed size is -uploadLimitExceededPlural=are too large. Maximum allowed size is +uploadLimit=Maximale Dateigröße: +uploadLimitExceededSingular=ist zu groß. Die maximal zulässige Größe ist +uploadLimitExceededPlural=sind zu groß. Die maximal zulässige Größe ist processTimeWarning=Achtung: Abhängig von der Dateigröße kann dieser Prozess bis zu einer Minute dauern pageOrderPrompt=Seitenreihenfolge (Geben Sie eine durch Komma getrennte Liste von Seitenzahlen ein): pageSelectionPrompt=Benutzerdefinierte Seitenauswahl (Geben Sie eine durch Kommas getrennte Liste von Seitenzahlen 1,5,6 oder Funktionen wie 2n+1 ein): @@ -86,14 +86,14 @@ loading=Laden... addToDoc=In Dokument hinzufügen reset=Zurücksetzen apply=Anwenden -noFileSelected=No file selected. Please upload one. +noFileSelected=Keine Datei ausgewählt. Bitte laden Sie eine hoch. legal.privacy=Datenschutz legal.terms=AGB legal.accessibility=Barrierefreiheit legal.cookie=Cookie-Richtlinie legal.impressum=Impressum -legal.showCookieBanner=Cookie Preferences +legal.showCookieBanner=Cookie Einstellungen ############### # Pipeline # @@ -237,31 +237,31 @@ adminUserSettings.activeUsers=Aktive Benutzer: adminUserSettings.disabledUsers=Deaktivierte Benutzer: adminUserSettings.totalUsers=Gesamtzahl der Benutzer: adminUserSettings.lastRequest=Letzte Anfrage -adminUserSettings.usage=View Usage +adminUserSettings.usage=Statistiken -endpointStatistics.title=Endpoint Statistics -endpointStatistics.header=Endpoint Statistics +endpointStatistics.title=Endpunktstatistik +endpointStatistics.header=Endpunktstatistik endpointStatistics.top10=Top 10 endpointStatistics.top20=Top 20 -endpointStatistics.all=All -endpointStatistics.refresh=Refresh -endpointStatistics.includeHomepage=Include Homepage ('/') -endpointStatistics.includeLoginPage=Include Login Page ('/login') -endpointStatistics.totalEndpoints=Total Endpoints -endpointStatistics.totalVisits=Total Visits -endpointStatistics.showing=Showing -endpointStatistics.selectedVisits=Selected Visits -endpointStatistics.endpoint=Endpoint -endpointStatistics.visits=Visits -endpointStatistics.percentage=Percentage -endpointStatistics.loading=Loading... -endpointStatistics.failedToLoad=Failed to load endpoint data. Please try refreshing. -endpointStatistics.home=Home -endpointStatistics.login=Login -endpointStatistics.top=Top -endpointStatistics.numberOfVisits=Number of Visits -endpointStatistics.visitsTooltip=Visits: {0} ({1}% of total) -endpointStatistics.retry=Retry +endpointStatistics.all=Alle +endpointStatistics.refresh=Aktualisieren +endpointStatistics.includeHomepage=Startseite ('/') einschließen +endpointStatistics.includeLoginPage=Anmeldeseite einschließen ('/login') +endpointStatistics.totalEndpoints=Gesamtendpunkte +endpointStatistics.totalVisits=Gesamtbesuche +endpointStatistics.showing=Zeigen +endpointStatistics.selectedVisits=Ausgewählte Besuche +endpointStatistics.endpoint=Endpunkt +endpointStatistics.visits=Besuche +endpointStatistics.percentage=Prozentsatz +endpointStatistics.loading=Laden... +endpointStatistics.failedToLoad=Endpunktdaten nicht geladen, bitte aktualisieren Sie die Seite. +endpointStatistics.home=Startseite +endpointStatistics.login=Anmeldeseite +endpointStatistics.top=Spitze +endpointStatistics.numberOfVisits=Anzahl der Besuche +endpointStatistics.visitsTooltip=Besuche: {0} ({1}% des Gesamten) +endpointStatistics.retry=Wiederholen database.title=Datenbank Import/Export database.header=Datenbank Import/Export @@ -364,6 +364,9 @@ home.compressPdfs.title=Komprimieren home.compressPdfs.desc=PDF komprimieren um die Dateigröße zu reduzieren compressPdfs.tags=komprimieren,verkleinern,minimieren +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=Metadaten ändern home.changeMetadata.desc=Ändern/Entfernen/Hinzufügen von Metadaten aus einem PDF-Dokument @@ -377,7 +380,6 @@ home.ocr.title=Führe OCR/Cleanup-Scans aus home.ocr.desc=Cleanup scannt und erkennt Text aus Bildern in einer PDF-Datei und fügt ihn erneut als Text hinzu ocr.tags=erkennung,text,bild,scannen,lesen,identifizieren,erkennung,bearbeitbar - home.extractImages.title=Bilder extrahieren home.extractImages.desc=Extrahiert alle Bilder aus einer PDF-Datei und speichert sie als Zip-Archiv extractImages.tags=bild,foto,speichern,archivieren,zippen,erfassen,greifen @@ -607,6 +609,7 @@ login.userIsDisabled=Benutzer ist deaktiviert, die Anmeldung ist mit diesem Benu login.alreadyLoggedIn=Sie sind bereits an login.alreadyLoggedIn2=Geräten angemeldet. Bitte melden Sie sich dort ab und versuchen es dann erneut. login.toManySessions=Sie haben zu viele aktive Sitzungen +login.logoutMessage=Sie wurden erfolgreich abgemeldet. #auto-redact autoRedact.title=Automatisch zensieren/schwärzen @@ -739,10 +742,10 @@ sanitizePDF.title=PDF Bereinigen sanitizePDF.header=PDF Bereinigen sanitizePDF.selectText.1=Javascript-Aktionen entfernen sanitizePDF.selectText.2=Eingebettete Dateien entfernen -sanitizePDF.selectText.3=Remove XMP metadata +sanitizePDF.selectText.3=XMP-Metadaten entfernen sanitizePDF.selectText.4=Links entfernen sanitizePDF.selectText.5=Schriftarten entfernen -sanitizePDF.selectText.6=Remove Document Info Metadata +sanitizePDF.selectText.6=Dokumenten-Metadaten entfernen sanitizePDF.submit=Bereinigen @@ -891,8 +894,8 @@ sign.last=Letzte Seite sign.next=Nächste Seite sign.previous=Vorherige Seite sign.maintainRatio=Seitenverhältnis beibehalten ein-/ausschalten -sign.undo=Undo -sign.redo=Redo +sign.undo=Rückgängig +sign.redo=Wiederherstellen #repair repair.title=Reparieren @@ -963,8 +966,8 @@ compress.title=Komprimieren compress.header=PDF komprimieren compress.credit=Dieser Dienst verwendet qpdf für die PDF-Komprimierung/-Optimierung. compress.grayscale.label=Graustufen für Komprimierung anwenden -compress.selectText.1=Compression Settings -compress.selectText.1.1=1-3 PDF compression,
4-6 lite image compression,
7-9 intense image compression Will dramatically reduce image quality +compress.selectText.1=Kompressionseinstellungen +compress.selectText.1.1=1-3 PDF-Komprimierung,
4-6 Leichte Bildkomprimierung,
7-9 Intensive Bildkomprimierung verringert die Bildqualität dramatisch compress.selectText.2=Optimierungsstufe: compress.selectText.4=Automatischer Modus – Passt die Qualität automatisch an, um das PDF auf die exakte Größe zu bringen compress.selectText.5=Erwartete PDF-Größe (z.B. 25 MB, 10,8 MB, 25 KB) @@ -1003,7 +1006,7 @@ pdfOrganiser.mode.7=Erste entfernen pdfOrganiser.mode.8=Letzte entfernen pdfOrganiser.mode.9=Erste und letzte entfernen pdfOrganiser.mode.10=Ungerade-Gerade-Zusammenführung -pdfOrganiser.mode.11=Duplicate all pages +pdfOrganiser.mode.11=Alle Seiten duplizieren pdfOrganiser.placeholder=(z.B. 1,3,2 oder 4-8,2,10-12 oder 2n-1) @@ -1046,7 +1049,7 @@ decrypt.success=Datei erfolgreich entschlüsselt. multiTool-advert.message=Diese Funktion ist auch auf unserer PDF-Multitool-Seite verfügbar. Probieren Sie sie aus, denn sie bietet eine verbesserte Benutzeroberfläche und zusätzliche Funktionen! #view pdf -viewPdf.title=View/Edit PDF +viewPdf.title=PDF anzeigen/bearbeiten viewPdf.header=PDF anzeigen #pageRemover @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Andere Metadaten: changeMetadata.selectText.5=Benutzerdefinierten Metadateneintrag hinzufügen changeMetadata.submit=Ändern +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF zu PDF/A @@ -1408,25 +1415,25 @@ validateSignature.cert.bits=bits #################### # Cookie banner # #################### -cookieBanner.popUp.title=How we use Cookies -cookieBanner.popUp.description.1=We use cookies and other technologies to make Stirling PDF work better for you—helping us improve our tools and keep building features you'll love. -cookieBanner.popUp.description.2=If you’d rather not, clicking 'No Thanks' will only enable the essential cookies needed to keep things running smoothly. +cookieBanner.popUp.title=Wie wir Cookies verwenden +cookieBanner.popUp.description.1=Wir verwenden Cookies und andere Technologien, damit Stirling PDF für Sie besser funktioniert. Dies hilft uns dabei, unsere Tools zu verbessern und weiterhin Funktionen zu entwickeln, die Ihnen gefallen werden. +cookieBanner.popUp.description.2=Wenn Sie dies nicht möchten, klicken Sie auf „Nein, Danke“. Dadurch werden nur die unbedingt erforderlichen Cookies aktiviert, die für einen reibungslosen Ablauf erforderlich sind. cookieBanner.popUp.acceptAllBtn=Okay -cookieBanner.popUp.acceptNecessaryBtn=No Thanks -cookieBanner.popUp.showPreferencesBtn=Manage preferences -cookieBanner.preferencesModal.title=Consent Preferences Center -cookieBanner.preferencesModal.acceptAllBtn=Accept all -cookieBanner.preferencesModal.acceptNecessaryBtn=Reject all -cookieBanner.preferencesModal.savePreferencesBtn=Save preferences -cookieBanner.preferencesModal.closeIconLabel=Close modal -cookieBanner.preferencesModal.serviceCounterLabel=Service|Services -cookieBanner.preferencesModal.subtitle=Cookie Usage -cookieBanner.preferencesModal.description.1=Stirling PDF uses cookies and similar technologies to enhance your experience and understand how our tools are used. This helps us improve performance, develop the features you care about, and provide ongoing support to our users. -cookieBanner.preferencesModal.description.2=Stirling PDF cannot—and will never—track or access the content of the documents you use. -cookieBanner.preferencesModal.description.3=Your privacy and trust are at the core of what we do. -cookieBanner.preferencesModal.necessary.title.1=Strictly Necessary Cookies -cookieBanner.preferencesModal.necessary.title.2=Always Enabled -cookieBanner.preferencesModal.necessary.description=These cookies are essential for the website to function properly. They enable core features like setting your privacy preferences, logging in, and filling out forms—which is why they can’t be turned off. -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. +cookieBanner.popUp.acceptNecessaryBtn=Nein Danke +cookieBanner.popUp.showPreferencesBtn=Einstellungen verwalten +cookieBanner.preferencesModal.title=Einwilligungszentrum +cookieBanner.preferencesModal.acceptAllBtn=Akzeptiere alle +cookieBanner.preferencesModal.acceptNecessaryBtn=Alle ablehnen +cookieBanner.preferencesModal.savePreferencesBtn=Einstellungen speichern +cookieBanner.preferencesModal.closeIconLabel=Anzeige schließen +cookieBanner.preferencesModal.serviceCounterLabel=Service | Dienstleistungen +cookieBanner.preferencesModal.subtitle=Cookie-Nutzung +cookieBanner.preferencesModal.description.1=Stirling PDF verwendet Cookies und ähnliche Technologien, um Ihr Erlebnis zu verbessern und den Einsatz unserer Tools zu verstehen. Dies hilft uns, die Leistung zu verbessern, die für Sie wichtigen Funktionen zu entwickeln und unseren Nutzern kontinuierlichen Support zu bieten. +cookieBanner.preferencesModal.description.2=Stirling PDF kann und wird niemals den Inhalt der von Ihnen verwendeten Dokumente verfolgen oder darauf zugreifen. +cookieBanner.preferencesModal.description.3=Ihre Privatsphäre und Ihr Vertrauen stehen bei uns im Mittelpunkt. +cookieBanner.preferencesModal.necessary.title.1=Streng notwendige Cookies +cookieBanner.preferencesModal.necessary.title.2=Immer aktiviert +cookieBanner.preferencesModal.necessary.description=Diese Cookies sind für das ordnungsgemäße Funktionieren der Website unerlässlich. Sie ermöglichen grundlegende Funktionen wie das Festlegen Ihrer Datenschutzeinstellungen, das Anmelden und das Ausfüllen von Formularen. Daher können sie nicht deaktiviert werden. +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. diff --git a/src/main/resources/messages_el_GR.properties b/src/main/resources/messages_el_GR.properties index 2914c019a..feac46f78 100644 --- a/src/main/resources/messages_el_GR.properties +++ b/src/main/resources/messages_el_GR.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=Συμπίεση home.compressPdfs.desc=Συμπίεση PDF για μείωση του μεγέθους αρχείου. compressPdfs.tags=συμπίεση,μικρό,μικροσκοπικό +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=Αλλαγή μεταδεδομένων home.changeMetadata.desc=Αλλαγή/Αφαίρεση/Προσθήκη μεταδεδομένων από ένα έγγραφο PDF @@ -377,7 +380,6 @@ home.ocr.title=OCR / Καθαρισμός σαρώσεων home.ocr.desc=Καθαρισμός σαρώσεων και ανίχνευση κειμένου από εικόνες μέσα σε PDF και επαναπροσθήκη ως κείμενο. ocr.tags=αναγνώριση,κείμενο,εικόνα,σάρωση,ανάγνωση,αναγνώριση,ανίχνευση,επεξεργάσιμο - home.extractImages.title=Εξαγωγή εικόνων home.extractImages.desc=Εξαγωγή όλων των εικόνων από PDF και αποθήκευση σε zip extractImages.tags=εικόνα,φωτογραφία,αποθήκευση,αρχείο,zip,σύλληψη,λήψη @@ -607,6 +609,7 @@ login.userIsDisabled=Ο χρήστης είναι απενεργοποιημέν login.alreadyLoggedIn=Είστε ήδη συνδεδεμένοι σε login.alreadyLoggedIn2=συσκευές. Παρακαλώ αποσυνδεθείτε από τις συσκευές και προσπαθήστε ξανά. login.toManySessions=Έχετε πάρα πολλές ενεργές συνεδρίες +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=Αυτόματη απόκρυψη @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Άλλα μεταδεδομένα: changeMetadata.selectText.5=Προσθήκη προσαρμοσμένης καταχώρησης μεταδεδομένων changeMetadata.submit=Αλλαγή +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF σε PDF/A diff --git a/src/main/resources/messages_en_GB.properties b/src/main/resources/messages_en_GB.properties index 5b7efbab4..6b2935747 100644 --- a/src/main/resources/messages_en_GB.properties +++ b/src/main/resources/messages_en_GB.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=Compress home.compressPdfs.desc=Compress PDFs to reduce their file size. compressPdfs.tags=squish,small,tiny +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=Change Metadata home.changeMetadata.desc=Change/Remove/Add metadata from a PDF document @@ -377,7 +380,6 @@ home.ocr.title=OCR / Cleanup scans home.ocr.desc=Cleanup scans and detects text from images within a PDF and re-adds it as text. ocr.tags=recognition,text,image,scan,read,identify,detection,editable - home.extractImages.title=Extract Images home.extractImages.desc=Extracts all images from a PDF and saves them to zip extractImages.tags=picture,photo,save,archive,zip,capture,grab @@ -607,6 +609,7 @@ login.userIsDisabled=User is deactivated, login is currently blocked with this u login.alreadyLoggedIn=You are already logged in to login.alreadyLoggedIn2=devices. Please log out of the devices and try again. login.toManySessions=You have too many active sessions +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=Auto Redact @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Other Metadata: changeMetadata.selectText.5=Add Custom Metadata Entry changeMetadata.submit=Change +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF To PDF/A @@ -1426,7 +1433,7 @@ cookieBanner.preferencesModal.description.2=Stirling PDF cannot—and will never cookieBanner.preferencesModal.description.3=Your privacy and trust are at the core of what we do. cookieBanner.preferencesModal.necessary.title.1=Strictly Necessary Cookies cookieBanner.preferencesModal.necessary.title.2=Always Enabled -cookieBanner.preferencesModal.necessary.description=These cookies are essential for the website to function properly. They enable core features like setting your privacy preferences, logging in, and filling out forms—which is why they can’t be turned off. +cookieBanner.preferencesModal.necessary.description=These cookies are essential for the website to function properly. They enable core features like setting your privacy preferences, logging in, and filling out forms—which is why they can’t be turned off. 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. diff --git a/src/main/resources/messages_en_US.properties b/src/main/resources/messages_en_US.properties index e2a2eeb75..2176814bc 100644 --- a/src/main/resources/messages_en_US.properties +++ b/src/main/resources/messages_en_US.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=Compress home.compressPdfs.desc=Compress PDFs to reduce their file size. compressPdfs.tags=squish,small,tiny +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=Change Metadata home.changeMetadata.desc=Change/Remove/Add metadata from a PDF document @@ -377,7 +380,6 @@ home.ocr.title=OCR / Cleanup scans home.ocr.desc=Cleanup scans and detects text from images within a PDF and re-adds it as text. ocr.tags=recognition,text,image,scan,read,identify,detection,editable - home.extractImages.title=Extract Images home.extractImages.desc=Extracts all images from a PDF and saves them to zip extractImages.tags=picture,photo,save,archive,zip,capture,grab @@ -607,6 +609,7 @@ login.userIsDisabled=User is deactivated, login is currently blocked with this u login.alreadyLoggedIn=You are already logged in to login.alreadyLoggedIn2=devices. Please log out of the devices and try again. login.toManySessions=You have too many active sessions +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=Auto Redact @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Other Metadata: changeMetadata.selectText.5=Add Custom Metadata Entry changeMetadata.submit=Change +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF To PDF/A diff --git a/src/main/resources/messages_es_ES.properties b/src/main/resources/messages_es_ES.properties index f50d3c8b6..9442e3d8f 100644 --- a/src/main/resources/messages_es_ES.properties +++ b/src/main/resources/messages_es_ES.properties @@ -10,18 +10,18 @@ multiPdfPrompt=Seleccionar PDFs (2+) multiPdfDropPrompt=Seleccione (o arrastre y suelte) todos los PDFs que quiera imgPrompt=Seleccionar Imagen(es) genericSubmit=Enviar -uploadLimit=Maximum file size: -uploadLimitExceededSingular=is too large. Maximum allowed size is -uploadLimitExceededPlural=are too large. Maximum allowed size is +uploadLimit=Tamaño máximo de archivo: +uploadLimitExceededSingular=es demasiado grande. El tamaño máximo permitido es +uploadLimitExceededPlural=son demasiado grandes. El tamaño máximo permitido es processTimeWarning=Advertencia: este proceso puede tardar hasta un minuto dependiendo del tamaño del archivo pageOrderPrompt=Orden de páginas (Introduzca una lista de números de página separados por coma): -pageSelectionPrompt=Selección de página personalizada (Intruduzca una lista de números de página separados por comas 1,5,6 o funciones como 2n+1) : +pageSelectionPrompt=Selección de página personalizada (Introduzca una lista de números de página separados por comas 1,5,6 o funciones como 2n+1): goToPage=Ir a true=Verdadero false=Falso unknown=Desconocido save=Guardar -saveToBrowser=Guardar en el Navegador +saveToBrowser=Guardar en el navegador close=Cerrar filesSelected=archivos seleccionados noFavourites=No se agregaron favoritos @@ -59,7 +59,7 @@ userNotFoundMessage=Usuario no encontrado. incorrectPasswordMessage=La contraseña actual no es correcta. usernameExistsMessage=El nuevo nombre de usuario está en uso. invalidUsernameMessage=Nombre de usuario no válido, el nombre de usuario solo puede contener letras, números y los siguientes caracteres especiales @._+- o debe ser una dirección de correo electrónico válida. -invalidPasswordMessage=La contraseña no puede dejarse en blanco y no puede ni empezar ni terminar con espacios. +invalidPasswordMessage=La contraseña no puede dejarse en blanco y no puede empezar ni terminar con espacios. confirmPasswordErrorMessage=Deben coincidir Nueva Contraseña y Confirmar Nueva Contraseña. deleteCurrentUserMessage=No puede eliminar el usuario que tiene la sesión actualmente en uso. deleteUsernameExistsMessage=El usuario no existe y no puede eliminarse. @@ -86,37 +86,37 @@ loading=Cargando... addToDoc=Agregar al Documento reset=Restablecer apply=Aplicar -noFileSelected=No file selected. Please upload one. +noFileSelected=No ha seleccionado ningún archivo. Por favor, cargue uno. legal.privacy=Política de Privacidad legal.terms=Términos y Condiciones legal.accessibility=Accesibilidad legal.cookie=Política de Cookies legal.impressum=Impresión -legal.showCookieBanner=Cookie Preferences +legal.showCookieBanner=Preferencias de cookies ############### # Pipeline # ############### -pipeline.header=Menú de canalización (Alfa) +pipeline.header=Menú de automatización (Alfa) pipeline.uploadButton=Cargar personalización pipeline.configureButton=Configurar pipeline.defaultOption=Personalizar pipeline.submitButton=Enviar -pipeline.help=Ayuda de Canalización +pipeline.help=Ayuda de automatización pipeline.scanHelp=Ayuda de escaneado de carpetas -pipeline.deletePrompt=¿Seguro que quiere eliminar la canalización? +pipeline.deletePrompt=¿Seguro que quiere eliminar la automatización? ###################### # Pipeline Options # ###################### -pipelineOptions.header=Configuración de la canalización -pipelineOptions.pipelineNameLabel=Nombre de la canalización -pipelineOptions.saveSettings=Guardar configuración de la canalización -pipelineOptions.pipelineNamePrompt=Introduzca aquí el nombre de la canalización +pipelineOptions.header=Configuración de la automatización +pipelineOptions.pipelineNameLabel=Nombre de la automatización +pipelineOptions.saveSettings=Guardar configuración de la automatización +pipelineOptions.pipelineNamePrompt=Introduzca aquí el nombre de la automatización pipelineOptions.selectOperation=Seleccione la operación pipelineOptions.addOperationButton=Añadir operación -pipelineOptions.pipelineHeader=Canalización: +pipelineOptions.pipelineHeader=Automatización: pipelineOptions.saveButton=Descargar pipelineOptions.validateButton=Validar @@ -237,31 +237,31 @@ adminUserSettings.activeUsers=Usuarios Activos: adminUserSettings.disabledUsers=Usuarios deshabilitados: adminUserSettings.totalUsers=Usuarios totales: adminUserSettings.lastRequest=Última petición -adminUserSettings.usage=View Usage +adminUserSettings.usage=Ver uso -endpointStatistics.title=Endpoint Statistics -endpointStatistics.header=Endpoint Statistics +endpointStatistics.title=Estadísticas de funciones +endpointStatistics.header=Estadísticas de funciones endpointStatistics.top10=Top 10 endpointStatistics.top20=Top 20 -endpointStatistics.all=All -endpointStatistics.refresh=Refresh -endpointStatistics.includeHomepage=Include Homepage ('/') -endpointStatistics.includeLoginPage=Include Login Page ('/login') -endpointStatistics.totalEndpoints=Total Endpoints -endpointStatistics.totalVisits=Total Visits -endpointStatistics.showing=Showing -endpointStatistics.selectedVisits=Selected Visits -endpointStatistics.endpoint=Endpoint -endpointStatistics.visits=Visits -endpointStatistics.percentage=Percentage -endpointStatistics.loading=Loading... -endpointStatistics.failedToLoad=Failed to load endpoint data. Please try refreshing. -endpointStatistics.home=Home -endpointStatistics.login=Login -endpointStatistics.top=Top -endpointStatistics.numberOfVisits=Number of Visits -endpointStatistics.visitsTooltip=Visits: {0} ({1}% of total) -endpointStatistics.retry=Retry +endpointStatistics.all=Todas +endpointStatistics.refresh=Refrescar +endpointStatistics.includeHomepage=Incluir página de inicio ('/') +endpointStatistics.includeLoginPage=Incluir página de inicio de sesión ('/login') +endpointStatistics.totalEndpoints=Funciones totales +endpointStatistics.totalVisits=Visitas totales +endpointStatistics.showing=Mostrando +endpointStatistics.selectedVisits=Visitas seleccionadas +endpointStatistics.endpoint=Funciones +endpointStatistics.visits=Visitas +endpointStatistics.percentage=Porcentaje +endpointStatistics.loading=Cargando... +endpointStatistics.failedToLoad=Falló la carga de los datos de funciones. Por favor, recargue para volver a intentarlo. +endpointStatistics.home=Inicio +endpointStatistics.login=Inicio de sesión +endpointStatistics.top=Lo más usado +endpointStatistics.numberOfVisits=Número de visitas +endpointStatistics.visitsTooltip=Visitas: {0} ({1}% del total) +endpointStatistics.retry=Reintentar database.title=Base de Datos Importar/Exportar database.header=Base de Datos Importar/Exportar @@ -275,14 +275,14 @@ database.downloadBackupFile=Descargar archivo de copia de seguridad database.info_1=Al importar datos, es fundamental garantizar la estructura correcta. Si no está seguro de lo que está haciendo, busque consejo y apoyo de un profesional. Un error en la estructura puede causar un mal funcionamiento de la aplicación, incluyendo la imposibilidad total de ejecutar la aplicación. database.info_2=El nombre del archivo no importa al cargarlo. Posteriormente se le cambiará el nombre para que siga el formato backup_user_yyyyMMddHHmm.sql, lo que garantiza una convención de nomenclatura coherente. database.submit=Importar Copia de Seguridad -database.importIntoDatabaseSuccessed=Importación a la base de datos ha sido exitosa +database.importIntoDatabaseSuccessed=La importación a la base de datos ha sido exitosa database.backupCreated=Respaldo de la Base de Datos exitoso database.fileNotFound=Archivo no encontrado -database.fileNullOrEmpty=El archivo no debe ser nulo o vacío. +database.fileNullOrEmpty=El archivo no puede ser nulo o vacío. database.failedImportFile=Archivo de importación fallido database.notSupported=Esta función no esta disponible para su conexión de Base de Datos -session.expired=Tu sesión ha caducado. Actualice la página e inténtelo de nuevo. +session.expired=Su sesión ha caducado. Actualice la página e inténtelo de nuevo. session.refreshPage=Refrescar Página ############# @@ -301,8 +301,8 @@ home.hideFavorites=Ocultar Favoritos home.showFavorites=Mostrar Favoritos home.legacyHomepage=Página de inicio anterior home.newHomePage=¡Prueba nuestra nueva página de inicio! -home.alphabetical=Alfabetico -home.globalPopularity=Popularidad Global +home.alphabetical=Alfabético +home.globalPopularity=Las más populares home.sortBy=Ordenado por: home.multiTool.title=Multi-herramienta PDF @@ -311,15 +311,15 @@ multiTool.tags=Multi-herramienta,Multi-operación,Interfaz de usuario,Arrastrar home.merge.title=Unir home.merge.desc=Unir fácilmente múltiples PDFs en uno -merge.tags=Unir,Operaciones de página,Back end,lado del servidor +merge.tags=Unir,Operaciones de página,Back end,Backend home.split.title=Dividir home.split.desc=Dividir PDFs en múltiples documentos -split.tags=Operaciones de página,dividir,Multi-página,cortar,lado del servidor +split.tags=Operaciones de página,dividir,Multi-página,cortar,Backend home.rotate.title=Rotar home.rotate.desc=Rotar fácilmente sus PDFs -rotate.tags=lado del servidor +rotate.tags=Backend home.imageToPdf.title=Imagen a PDF @@ -364,6 +364,9 @@ home.compressPdfs.title=Comprimir home.compressPdfs.desc=Comprimir PDFs para reducir el tamaño del archivo compressPdfs.tags=aplastar,pequeño,diminuto +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=Cambiar metadatos home.changeMetadata.desc=Cambiar/Eliminar/Añadir metadatos al documento PDF @@ -377,7 +380,6 @@ home.ocr.title=Ejecutar OCR en PDF y/o tareas de limpieza home.ocr.desc=Tareas de limpieza y detectar texto en imágenes dentro de un PDF y volver a incrustarlo como texto ocr.tags=reconocimiento,texto,imagen,escanear,leer,identificar,detección,editable - home.extractImages.title=Extraer imágenes home.extractImages.desc=Extraer todas las imágenes de un PDF y guardarlas en ZIP extractImages.tags=imagen,fotografía,guardar,archivo,zip,capturar,coger @@ -451,7 +453,7 @@ home.scalePages.title=Escalar/ajustar tamaño de página home.scalePages.desc=Escalar/cambiar el tamaño de una pagina y/o su contenido scalePages.tags=cambiar tamaño,modificar,dimensionar,adaptar -home.pipeline.title=Secuencia +home.pipeline.title=Automatización home.pipeline.desc=Ejecutar varias tareas a PDFs definiendo una secuencia de comandos pipeline.tags=automatizar,secuencia,con script,proceso por lotes @@ -548,7 +550,7 @@ AddStampRequest.tags=Sello, Añadir imagen, centrar imagen, Marca de agua, PDF, home.removeImagePdf.title=Eliminar imagen home.removeImagePdf.desc=Eliminar imagen del PDF> para reducir el tamaño de archivo -removeImagePdf.tags=Eliminar imagen,Operaciones de página,Back end,lado del servidor +removeImagePdf.tags=Eliminar imagen,Operaciones de página,Back end,Backend home.splitPdfByChapters.title=Dividir PDF por capítulos @@ -564,7 +566,7 @@ replace-color.title=Reemplazar-Invertir-Color replace-color.header=Reemplazar-Invertir Color en PDF home.replaceColorPdf.title=Reemplazar e Invertir Color home.replaceColorPdf.desc=Reemplaza el color del texto y el fondo en el PDF e invierte el color completo del PDF para reducir el tamaño del archivo -replaceColorPdf.tags=Reemplazar Color,Operaciones de Página,Back end,Lado del servidor +replaceColorPdf.tags=Reemplazar Color,Operaciones de Página,Back end,Backend replace-color.selectText.1=Opciones para Reemplazar o Invertir color replace-color.selectText.2=Predeterminado (Colores de alto contraste predeterminados) replace-color.selectText.3=Personalizado (Colores personalizados) @@ -595,7 +597,7 @@ login.locked=Su cuenta se ha bloqueado. login.signinTitle=Por favor, inicie sesión login.ssoSignIn=Iniciar sesión a través del inicio de sesión único login.oAuth2AutoCreateDisabled=Usuario de creación automática de OAUTH2 DESACTIVADO -login.oAuth2AdminBlockedUser=El registro o inicio de sesión de usuarios no registrados está actualmente bloqueado. Por favor, contáctese con el administrador. +login.oAuth2AdminBlockedUser=El registro o inicio de sesión de usuarios no registrados está actualmente bloqueado. Por favor, póngase en contacto con el administrador. login.oauth2RequestNotFound=Solicitud de autorización no encontrada login.oauth2InvalidUserInfoResponse=Respuesta de información de usuario no válida login.oauth2invalidRequest=Solicitud no válida @@ -604,9 +606,10 @@ login.oauth2InvalidTokenResponse=Respuesta de token no válida login.oauth2InvalidIdToken=Token de identificación no válido login.relyingPartyRegistrationNotFound=No hay registro de terceros confiables login.userIsDisabled=El usuario está desactivado, actualmente el acceso está bloqueado para ese nombre de usuario. Por favor, póngase en contacto con el administrador. -login.alreadyLoggedIn=Ya has iniciado sesión en -login.alreadyLoggedIn2=dispositivos. Cierra sesión en los dispositivos y vuelve a intentarlo. -login.toManySessions=Tienes demasiadas sesiones activas +login.alreadyLoggedIn=Ya ha iniciado sesión en +login.alreadyLoggedIn2=dispositivos. Cierre sesión en los dispositivos y vuelva a intentarlo. +login.toManySessions=Tiene demasiadas sesiones activas +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=Auto Censurar Texto @@ -616,7 +619,7 @@ autoRedact.textsToRedactLabel=Texto para Censurar (separado por líneas) autoRedact.textsToRedactPlaceholder=por ej. \nConfidencial \nAlto-Secreto autoRedact.useRegexLabel=Usar Regex autoRedact.wholeWordSearchLabel=Búsqueda por palabra completa -autoRedact.customPaddingLabel=Extra Padding personalizado +autoRedact.customPaddingLabel=Espaciado adicional personalizado autoRedact.convertPDFToImageLabel=Convertir PDF a imagen PDF (Utilizado para eliminar el texto detrás del cajetín de censura) autoRedact.submitButton=Enviar @@ -626,26 +629,26 @@ redact.header=Censurar texto Manualmente redact.submit=Enviar redact.textBasedRedaction=Censura basada en texto redact.pageBasedRedaction=Censura basada en la página -redact.convertPDFToImageLabel=Convertir PDF a PDF-Image (Utilizado para eliminar el texto detrás del cajetín de censura) +redact.convertPDFToImageLabel=Convertir PDF a PDF-Imagen (Utilizado para eliminar el texto detrás del cajetín de censura) redact.pageRedactionNumbers.title=Páginas -redact.pageRedactionNumbers.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1) +redact.pageRedactionNumbers.placeholder=(por ejemplo 1,2,8 o 4,7,12-16 o 2n-1) redact.redactionColor.title=Color del cajetín redact.export=Exportar redact.upload=Cargar redact.boxRedaction=Dibujar cajetín de censura redact.zoom=Zoom -redact.zoomIn=Zoom in -redact.zoomOut=Zoom out -redact.nextPage=Siguiente página -redact.previousPage=Pagina Anterior +redact.zoomIn=Acercar +redact.zoomOut=Alejar +redact.nextPage=Página siguiente +redact.previousPage=Pagina anterior redact.toggleSidebar=Activar/desactivar barra lateral redact.showThumbnails=Mostrar Miniaturas -redact.showDocumentOutline=Mostra Esquema del documento (doble-click para expandir/colapsar elementos) +redact.showDocumentOutline=Mostrar esquema del documento (doble clic para expandir/contraer elementos) redact.showAttatchments=Mostrar Adjuntos -redact.showLayers=Mostrar Capas (doble-click para reiniciar las capas a su estado inicial) -redact.colourPicker=Seleccionador de Color -redact.findCurrentOutlineItem=Buscar elemento actual de esquema -redact.applyChanges=Aplicar Cambios +redact.showLayers=Mostrar Capas (doble clic para restablecer las capas a su estado inicial) +redact.colourPicker=Selector de color +redact.findCurrentOutlineItem=Resaltar el marcador +redact.applyChanges=Aplicar cambios #showJS showJS.title=Mostrar Javascript @@ -664,7 +667,7 @@ pdfToSinglePage.submit=Convertir a página única pageExtracter.title=Extraer Páginas pageExtracter.header=Extraer Páginas pageExtracter.submit=Extraer -pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1) +pageExtracter.placeholder=(por ejemplo, 1,2,8 o 4,7,12-16 o 2n-1) #getPdfInfo @@ -739,10 +742,10 @@ sanitizePDF.title=Limpiar archivo PDF sanitizePDF.header=Limpiar un archivo PDF sanitizePDF.selectText.1=Eliminar código JavaScript sanitizePDF.selectText.2=Eliminar archivos incrustados -sanitizePDF.selectText.3=Remove XMP metadata +sanitizePDF.selectText.3=Eliminar metadatos XMP sanitizePDF.selectText.4=Eliminar enlaces sanitizePDF.selectText.5=Eliminar fuentes -sanitizePDF.selectText.6=Remove Document Info Metadata +sanitizePDF.selectText.6=Eliminar metadatos asociados al documento sanitizePDF.submit=Limpiar PDF @@ -797,7 +800,7 @@ autoSplitPDF.submit=Entregar #pipeline -pipeline.title=Canalización +pipeline.title=Automatización #pageLayout @@ -891,8 +894,8 @@ sign.last=Última página sign.next=Siguiente página sign.previous=Página anterior sign.maintainRatio=Activar/desactivar la relación de aspecto -sign.undo=Undo -sign.redo=Redo +sign.undo=Deshacer +sign.redo=Rehacer #repair repair.title=Reparar @@ -964,7 +967,7 @@ compress.header=Comprimir PDF compress.credit=Este servicio utiliza qpdf para compresión/optimización de PDF compress.grayscale.label=Aplicar escala de grises para compresión compress.selectText.1=Compression Settings -compress.selectText.1.1=1-3 PDF compression,
4-6 lite image compression,
7-9 intense image compression Will dramatically reduce image quality +compress.selectText.1.1=1-3 compresión PDF,
4-6 compresión de imagen suave,
7-9 compresión de imágenes intensa reducirá drásticamente la calidad de imagen compress.selectText.2=Nivel de optimización: compress.selectText.4=Modo automático: ajusta automáticamente la calidad para que el PDF tenga el tamaño exacto compress.selectText.5=Tamaño esperado del PDF (por ejemplo, 25 MB, 10.8 MB, 25 KB) @@ -1003,8 +1006,8 @@ pdfOrganiser.mode.7=Quitar primera pdfOrganiser.mode.8=Quitar última pdfOrganiser.mode.9=Quitar primera y última pdfOrganiser.mode.10=Unir impar-par -pdfOrganiser.mode.11=Duplicate all pages -pdfOrganiser.placeholder=(por ej., 1,3,2 o 4-8,2,10-12 o 2n-1) +pdfOrganiser.mode.11=Duplicar todas las páginas +pdfOrganiser.placeholder=(por ejemplo, 1,3,2 o 4-8,2,10-12 o 2n-1) #multiTool @@ -1054,7 +1057,7 @@ pageRemover.title=Eliminador de páginas pageRemover.header=Eliminador de páginas PDF pageRemover.pagesToDelete=Páginas a eliminar (introducir una lista de números de página separados por coma): pageRemover.submit=Eliminar Páginas -pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30) +pageRemover.placeholder=(por ejemplo 1,2,6 o 1-10,15-30) #rotate @@ -1074,7 +1077,7 @@ split.desc.4=Documento #2: Páginas 2 y 3 split.desc.5=Documento #3: Páginas 4, 5, 6 y 7 split.desc.6=Documento #4: Página 8 split.desc.7=Documento #5: Página 9 -split.desc.8=Documento #6: Páginas 10 +split.desc.8=Documento #6: Página 10 split.splitPages=Introducir las páginas para dividir: split.submit=Dividir @@ -1106,7 +1109,7 @@ pdfToImage.grey=Escala de grises pdfToImage.blackwhite=Blanco y Negro (¡Puede perder datos!) pdfToImage.submit=Convertir pdfToImage.info=Python no está instalado. Se requiere para la conversión WebP. -pdfToImage.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1) +pdfToImage.placeholder=(por ejemplo 1,2,8 o 4,7,12-16 o 2n-1) #addPassword @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Otros Metadatos: changeMetadata.selectText.5=Agregar entrada de metadatos personalizados changeMetadata.submit=Cambiar +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF a PDF/A @@ -1201,7 +1208,7 @@ pdfToPDFA.credit=Este servicio usa libreoffice para la conversión a PDF/A pdfToPDFA.submit=Convertir pdfToPDFA.tip=Actualmente no funciona para múltiples entrada a la vez pdfToPDFA.outputFormat=Formato de salida -pdfToPDFA.pdfWithDigitalSignature=El PDF contiene una firma digital. Esto se eliminará en el siguiente paso. +pdfToPDFA.pdfWithDigitalSignature=El PDF contiene una firma digital. Ésta se eliminará en el siguiente paso. #PDFToWord @@ -1312,14 +1319,14 @@ survey.please=¡Considere realizar nuestra encuesta! survey.disabled=(La ventana emergente de la encuesta se desactivará en las siguientes actualizaciones, pero estará disponible al pie de la página.) survey.button=Realizar encuesta survey.dontShowAgain=No volver a mostrar -survey.meeting.1=Si estás utilizando Stirling PDF en el trabajo, nos encantaría hablar contigo. Ofrecemos sesiones de soporte técnico a cambio de una sesión de descubrimiento de usuario de 15 minutos. -survey.meeting.2=Esta es una oportunidad para: -survey.meeting.3=Obtén ayuda con la implementación, integraciones o solución de problemas -survey.meeting.4=Brinda comentarios directos sobre el rendimiento, casos extremos y carencias de funciones -survey.meeting.5=Ayudanos a mejorar Stirling PDF para su uso en entornos empresariales reales -survey.meeting.6=Si estás interesado, puedes agendar una reunión con nuestro equipo directamente. (Solo en inglés) -survey.meeting.7=¡Esperamos conocer tus casos de uso y mejorar aún más Stirling PDF! -survey.meeting.notInterested=¿No eres una empresa o no estás interesado en una reunión? +survey.meeting.1=Si está utilizando Stirling-PDF en el trabajo, nos encantaría hablar con usted. Ofrecemos sesiones de soporte técnico a cambio de una sesión de descubrimiento de usuario de 15 minutos. +survey.meeting.2=Es una oportunidad para: +survey.meeting.3=Obtenga ayuda con la implementación, integraciones o solución de problemas +survey.meeting.4=Brinde comentarios directos sobre el rendimiento, casos extremos y carencia de funciones +survey.meeting.5=Ayúdenos a mejorar Stirling-PDF para su uso en entornos empresariales reales +survey.meeting.6=Si está interesado, puede agendar una reunión con nuestro equipo directamente. (Sólo en inglés) +survey.meeting.7=¡Esperamos conocer sus casos de uso y mejorar aún más Stirling-PDF! +survey.meeting.notInterested=¿No es una empresa o no está interesado en una reunión? survey.meeting.button=Reservar reunión #error @@ -1375,13 +1382,13 @@ validateSignature.title=Validar firmas del PDF validateSignature.header=Validar firmas del PDF validateSignature.selectPDF=Seleccione el archivo PDF firmado validateSignature.submit=Validar firmas -validateSignature.results=Resultados de la Validación -validateSignature.status=Estador +validateSignature.results=Resultados de la validación +validateSignature.status=Estado de la validación validateSignature.signer=Firmante validateSignature.date=Fecha -validateSignature.reason=Razón +validateSignature.reason=Motivo validateSignature.location=Ubicación -validateSignature.noSignatures=No se encontrario firmas digiales en este documento +validateSignature.noSignatures=No se encontraron firmas digiales en este documento validateSignature.status.valid=Válido validateSignature.status.invalid=Inválido validateSignature.chain.invalid=Error en la validación de la cadena de certificados: no se puede verificar la identidad del firmante @@ -1394,39 +1401,39 @@ validateSignature.signature.mathValid=La firma es matemáticamente válida aunqu validateSignature.selectCustomCert=Archivo de certificado personalizado X.509 (opcional) validateSignature.cert.info=Detalles Certificado validateSignature.cert.issuer=Emisor -validateSignature.cert.subject=Subject -validateSignature.cert.serialNumber=Número Serie +validateSignature.cert.subject=Asunto +validateSignature.cert.serialNumber=Número de Serie validateSignature.cert.validFrom=Válido desde validateSignature.cert.validUntil=Válido hasta validateSignature.cert.algorithm=Algoritmo -validateSignature.cert.keySize=Tamaño llave +validateSignature.cert.keySize=Tamaño de la clave validateSignature.cert.version=Versión -validateSignature.cert.keyUsage=Uso de la llave +validateSignature.cert.keyUsage=Uso de la clave validateSignature.cert.selfSigned=Autofirmado validateSignature.cert.bits=bits #################### # Cookie banner # #################### -cookieBanner.popUp.title=How we use Cookies -cookieBanner.popUp.description.1=We use cookies and other technologies to make Stirling PDF work better for you—helping us improve our tools and keep building features you'll love. -cookieBanner.popUp.description.2=If you’d rather not, clicking 'No Thanks' will only enable the essential cookies needed to keep things running smoothly. -cookieBanner.popUp.acceptAllBtn=Okay -cookieBanner.popUp.acceptNecessaryBtn=No Thanks -cookieBanner.popUp.showPreferencesBtn=Manage preferences -cookieBanner.preferencesModal.title=Consent Preferences Center -cookieBanner.preferencesModal.acceptAllBtn=Accept all -cookieBanner.preferencesModal.acceptNecessaryBtn=Reject all -cookieBanner.preferencesModal.savePreferencesBtn=Save preferences -cookieBanner.preferencesModal.closeIconLabel=Close modal -cookieBanner.preferencesModal.serviceCounterLabel=Service|Services -cookieBanner.preferencesModal.subtitle=Cookie Usage -cookieBanner.preferencesModal.description.1=Stirling PDF uses cookies and similar technologies to enhance your experience and understand how our tools are used. This helps us improve performance, develop the features you care about, and provide ongoing support to our users. -cookieBanner.preferencesModal.description.2=Stirling PDF cannot—and will never—track or access the content of the documents you use. -cookieBanner.preferencesModal.description.3=Your privacy and trust are at the core of what we do. -cookieBanner.preferencesModal.necessary.title.1=Strictly Necessary Cookies -cookieBanner.preferencesModal.necessary.title.2=Always Enabled -cookieBanner.preferencesModal.necessary.description=These cookies are essential for the website to function properly. They enable core features like setting your privacy preferences, logging in, and filling out forms—which is why they can’t be turned off. -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. +cookieBanner.popUp.title=Cómo usamos las cookies +cookieBanner.popUp.description.1=Usamos cookies y otras tecnologías para optimizar el funcionamiento de Stirling PDF, lo que contribuye a mejorar nuestras herramientas y a seguir desarrollando funciones que serán de su interés. +cookieBanner.popUp.description.2=Si prefiere no hacerlo, al hacer clic en 'No gracias' se activarán únicamente las cookies esenciales necesarias para que todo funcione correctamente. +cookieBanner.popUp.acceptAllBtn=De acuerdo +cookieBanner.popUp.acceptNecessaryBtn=No, gracias +cookieBanner.popUp.showPreferencesBtn=Gestionar preferencias +cookieBanner.preferencesModal.title=Centro de Preferencias de Consentimiento +cookieBanner.preferencesModal.acceptAllBtn=Aceptar todo +cookieBanner.preferencesModal.acceptNecessaryBtn=Rechazar todo +cookieBanner.preferencesModal.savePreferencesBtn=Guardar preferencias +cookieBanner.preferencesModal.closeIconLabel=Cerrar diálogo +cookieBanner.preferencesModal.serviceCounterLabel=Servicio|Servicios +cookieBanner.preferencesModal.subtitle=Uso de cookies +cookieBanner.preferencesModal.description.1=Stirling PDF utiliza cookies y tecnologías similares para mejorar su experiencia y entender cómo se usan nuestras herramientas. Esto nos ayuda a mejorar el rendimiento, desarrollar las funciones que le interesan y proporcionar soporte continuo a nuestros usuarios. +cookieBanner.preferencesModal.description.2=Stirling PDF no puede—y nunca podrá—rastrear ni acceder al contenido de los documentos que utiliza. +cookieBanner.preferencesModal.description.3=Su privacidad y confianza son el núcleo de lo que hacemos. +cookieBanner.preferencesModal.necessary.title.1=Cookies estrictsamente necesarias +cookieBanner.preferencesModal.necessary.title.2=Siempre activado +cookieBanner.preferencesModal.necessary.description=Estas cookies son esenciales para que el sitio web funcione correctamente. Permiten funciones básicas como configurar sus preferencias de privacidad, iniciar sesión y completar formularios, por lo que no se pueden desactivar. +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. diff --git a/src/main/resources/messages_eu_ES.properties b/src/main/resources/messages_eu_ES.properties index 2282a0fd7..e35abae90 100644 --- a/src/main/resources/messages_eu_ES.properties +++ b/src/main/resources/messages_eu_ES.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=Konprimatu home.compressPdfs.desc=Konprimatu PDFak fitxategiaren tamaina murrizteko compressPdfs.tags=squish,small,tiny +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=Aldatu metadatuak home.changeMetadata.desc=Aldatu/Ezabatu/Gehitu metadatuak PDF dokumentuari @@ -377,7 +380,6 @@ home.ocr.title=OCR exekutatu PDFan eta/edo garbiketa-eskaneatzeak home.ocr.desc=Garbiketa-eskaneatzeak eta irudi-testuak detektatu PDF baten barruan eta berriz ere gehitu testu gisa ocr.tags=recognition,text,image,scan,read,identify,detection,editable - home.extractImages.title=Atera irudiak home.extractImages.desc=Atera irudi guztiak PDF batetik eta ZIPen gorde extractImages.tags=picture,photo,save,archive,zip,capture,grab @@ -607,6 +609,7 @@ login.userIsDisabled=User is deactivated, login is currently blocked with this u login.alreadyLoggedIn=You are already logged in to login.alreadyLoggedIn2=devices. Please log out of the devices and try again. login.toManySessions=You have too many active sessions +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=Auto Idatzi @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Beste metadatu batzuk: changeMetadata.selectText.5=Gehitu metadatu pertsonalizatuen sarrera changeMetadata.submit=Aldatu +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDFa PDF/A bihurtu diff --git a/src/main/resources/messages_fa_IR.properties b/src/main/resources/messages_fa_IR.properties index cb16dab70..a0a8b0393 100644 --- a/src/main/resources/messages_fa_IR.properties +++ b/src/main/resources/messages_fa_IR.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=فشرده‌سازی home.compressPdfs.desc=فشرده‌سازی فایل‌های PDF برای کاهش اندازه آن‌ها. compressPdfs.tags=فشرده،کوچک،ریز +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=تغییر متاداده home.changeMetadata.desc=تغییر/حذف/افزودن متاداده به یک سند PDF @@ -377,7 +380,6 @@ home.ocr.title=OCR / پاکسازی اسکن‌ها home.ocr.desc=پاکسازی اسکن‌ها و تشخیص متن از تصاویر درون یک فایل PDF و بازافزودن آن به عنوان متن. ocr.tags=تشخیص،متن،تصویر،اسکن،خواندن،شناسایی،آشکارسازی،قابل ویرایش - home.extractImages.title=استخراج تصاویر home.extractImages.desc=استخراج تمام تصاویر از یک PDF و ذخیره آن‌ها به صورت فایل زیپ extractImages.tags=عکس،عکس،ذخیره،آرشیو،زیپ،گرفتن،برداشتن @@ -607,6 +609,7 @@ login.userIsDisabled=کاربر غیرفعال شده است، ورود با ا login.alreadyLoggedIn=شما قبلاً وارد شده‌اید در login.alreadyLoggedIn2=دستگاه‌ها. لطفاً از دستگاه‌ها خارج شده و دوباره تلاش کنید. login.toManySessions=شما تعداد زیادی نشست فعال دارید. +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=سانسور خودکار @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=سایر متاداده‌ها: changeMetadata.selectText.5=افزودن ورودی متاداده سفارشی changeMetadata.submit=تغییر +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF به PDF/A diff --git a/src/main/resources/messages_fr_FR.properties b/src/main/resources/messages_fr_FR.properties index 34395c125..83510d6f0 100644 --- a/src/main/resources/messages_fr_FR.properties +++ b/src/main/resources/messages_fr_FR.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=Compresser home.compressPdfs.desc=Compressez les PDF pour réduire leur tailles. compressPdfs.tags=compresser,réduire,taille,squish,small,tiny +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=Modifier les métadonnées home.changeMetadata.desc=Modifiez, supprimez ou ajoutez des métadonnées à un PDF. @@ -377,7 +380,6 @@ home.ocr.title=OCR / Nettoyage des numérisations home.ocr.desc=Utilisez l'OCR pour analyser et détecter le texte des images d'un PDF et le rajouter en tant que tel. ocr.tags=ocr,reconnaissance,texte,image,numérisation,scan,read,identify,detection,editable - home.extractImages.title=Extraire les images home.extractImages.desc=Extrayez toutes les images d'un PDF et enregistrez-les dans un ZIP. extractImages.tags=image,photo,save,archive,zip,capture,grab @@ -607,6 +609,7 @@ login.userIsDisabled=L'utilisateur est désactivé, la connexion est actuellemen login.alreadyLoggedIn=Vous êtes déjà connecté sur login.alreadyLoggedIn2=appareils. Veuillez vous déconnecter des appareils et réessayer. login.toManySessions=Vous avez trop de sessions actives. +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=Caviarder automatiquement @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Autres métadonnées changeMetadata.selectText.5=Ajouter une entrée de métadonnées personnalisée changeMetadata.submit=Modifier +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF en PDF/A diff --git a/src/main/resources/messages_ga_IE.properties b/src/main/resources/messages_ga_IE.properties index beba9a2fe..b6fca57cb 100644 --- a/src/main/resources/messages_ga_IE.properties +++ b/src/main/resources/messages_ga_IE.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=Comhbhrúigh home.compressPdfs.desc=Comhbhrúigh PDFanna chun a méid comhaid a laghdú. compressPdfs.tags=squish, beag, beag bídeach +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=Athraigh Meiteashonraí home.changeMetadata.desc=Athraigh/Bain/Cuir meiteashonraí ó dhoiciméad PDF @@ -377,7 +380,6 @@ home.ocr.title=OCR / Scananna glanta home.ocr.desc=Scanann glantachán agus aimsíonn sé téacs ó íomhánna laistigh de PDF agus cuireann sé isteach arís é mar théacs. ocr.tags=aithint, téacs, íomhá, scanadh, léamh, a aithint, a bhrath, in eagar - home.extractImages.title=Sliocht Íomhánna home.extractImages.desc=Sliochtann sé gach íomhá ó PDF agus sábhálann sé iad a zip extractImages.tags=pictiúr, grianghraf, shábháil, cartlann, zip, gabháil, grab @@ -607,6 +609,7 @@ login.userIsDisabled=Úsáideoir díghníomhachtaithe, tá bac ar logáil isteac login.alreadyLoggedIn=Tá tú logáilte isteach cheana login.alreadyLoggedIn2=gléasanna. Logáil amach as na gléasanna agus bain triail eile as. login.toManySessions=Tá an iomarca seisiún gníomhach agat +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=Auto Redact @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Meiteashonraí Eile: changeMetadata.selectText.5=Cuir Iontráil Meiteashonraí Saincheaptha leis changeMetadata.submit=Athrú +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF Go PDF/A diff --git a/src/main/resources/messages_hi_IN.properties b/src/main/resources/messages_hi_IN.properties index 157e1306e..d00773452 100644 --- a/src/main/resources/messages_hi_IN.properties +++ b/src/main/resources/messages_hi_IN.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=कम्प्रेस home.compressPdfs.desc=PDF को कम्प्रेस करें ताकि उनका फ़ाइल आकार कम हो जाए। compressPdfs.tags=कम्प्रेस,छोटा,छोटा +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=मेटाडेटा बदलें home.changeMetadata.desc=PDF दस्तावेज से मेटाडेटा बदलें/हटाएं/जोड़ें @@ -377,7 +380,6 @@ home.ocr.title=OCR / स्कैन साफ करें home.ocr.desc=स्कैन को साफ करें और PDF के अंदर छवियों से टेक्स्ट का पता लगाएं और उसे टेक्स्ट के रूप में फिर से जोड़ें। ocr.tags=पहचान,टेक्स्ट,छवि,स्कैन,पढ़ें,पहचानें,पहचान,संपादन योग्य - home.extractImages.title=छवियां निकालें home.extractImages.desc=PDF से सभी छवियों को निकालें और उन्हें ज़िप में सहेजें extractImages.tags=चित्र,फोटो,सहेजें,संग्रह,ज़िप,कैप्चर,ग्रैब @@ -607,6 +609,7 @@ login.userIsDisabled=उपयोगकर्ता निष्क्रिय login.alreadyLoggedIn=आप पहले से ही login.alreadyLoggedIn2=उपकरणों में लॉग इन हैं। कृपया उपकरणों से लॉग आउट करें और पुनः प्रयास करें। login.toManySessions=आपके बहुत सारे सक्रिय सत्र हैं +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=स्वतः गोपनीयकरण @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=अन्य मेटाडेटा: changeMetadata.selectText.5=कस्टम मेटाडेटा प्रविष्टि जोड़ें changeMetadata.submit=बदलें +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF से PDF/A diff --git a/src/main/resources/messages_hr_HR.properties b/src/main/resources/messages_hr_HR.properties index 5b67ac31b..0cb13abb8 100644 --- a/src/main/resources/messages_hr_HR.properties +++ b/src/main/resources/messages_hr_HR.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=Komprimiraj home.compressPdfs.desc=Komprimirajte PDF-ove kako biste smanjili njihovu veličinu. compressPdfs.tags=squish, mali, maleni +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=Promjena metapodataka home.changeMetadata.desc=Promjeni/Ukloni/Dodaj metapodatke iz PDF dokumenta @@ -377,7 +380,6 @@ home.ocr.title=OCR / Čišćenje skeniranih dokumenata home.ocr.desc=Čišćenje skenira i otkriva tekst sa slika unutar PDF-a i ponovno ga dodaje kao tekst. ocr.tags=prepoznavanje,tekst,slika,sken,čitanje,identifikacija,detektiranje,uređivanje - home.extractImages.title=Ekstrakt slika home.extractImages.desc=Izdvaja sve slike iz PDF-a i sprema ih u zip format extractImages.tags=slika, fotografija, spremanje, arhiva, zip, snimanje, zgrabi @@ -607,6 +609,7 @@ login.userIsDisabled=Korisnik je deaktiviran, prijava sa ovim korisničkim imeno login.alreadyLoggedIn=Već ste se prijavili na login.alreadyLoggedIn2=ure. Odjavite se s ure i pokušajte ponovo. login.toManySessions=Imate preko mrežne sesije aktivnih +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=Automatsko uređivanje @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Ostali metapodaci: changeMetadata.selectText.5=Dodaj prilagođeni unos metapodataka changeMetadata.submit=Promijeniti +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF u PDF/A diff --git a/src/main/resources/messages_hu_HU.properties b/src/main/resources/messages_hu_HU.properties index dcee34b6c..f475edbf6 100644 --- a/src/main/resources/messages_hu_HU.properties +++ b/src/main/resources/messages_hu_HU.properties @@ -11,8 +11,8 @@ multiPdfDropPrompt=Válassza ki (vagy húzza ide) az összes szükséges PDF-fá imgPrompt=Kép kiválasztása genericSubmit=Küldés uploadLimit=Maximum file size: -uploadLimitExceededSingular=is too large. Maximum allowed size is -uploadLimitExceededPlural=are too large. Maximum allowed size is +uploadLimitExceededSingular=túl nagy. A maximálisan megengedett méret +uploadLimitExceededPlural=túl nagyok. A maximálisan megengedett méretek processTimeWarning=Figyelmeztetés: A folyamat akár egy percig is eltarthat a fájlmérettől függően pageOrderPrompt=Egyedi oldalsorrend (Adja meg az oldalszámokat vesszővel elválasztva vagy használjon függvényeket, pl. 2n+1): pageSelectionPrompt=Egyedi oldalválasztás (Adja meg az oldalszámokat vesszővel elválasztva, pl. 1,5,6 vagy használjon függvényeket, pl. 2n+1): @@ -86,14 +86,14 @@ loading=Betöltés... addToDoc=Hozzáadás a dokumentumhoz reset=Visszaállítás apply=Alkalmaz -noFileSelected=No file selected. Please upload one. +noFileSelected=Nincs fájl kiválasztva. Kérjük, töltsön fel egyet. legal.privacy=Adatvédelmi irányelvek legal.terms=Felhasználási feltételek legal.accessibility=Akadálymentesítési nyilatkozat legal.cookie=Süti szabályzat legal.impressum=Impresszum -legal.showCookieBanner=Cookie Preferences +legal.showCookieBanner=Süti beállítások ############### # Pipeline # @@ -237,31 +237,31 @@ adminUserSettings.activeUsers=Aktív felhasználók: adminUserSettings.disabledUsers=Letiltott felhasználók: adminUserSettings.totalUsers=Összes felhasználó: adminUserSettings.lastRequest=Utolsó kérés -adminUserSettings.usage=View Usage +adminUserSettings.usage=Használat megtekintése -endpointStatistics.title=Endpoint Statistics -endpointStatistics.header=Endpoint Statistics +endpointStatistics.title=Végpont Statisztika +endpointStatistics.header=Végpont Statisztika endpointStatistics.top10=Top 10 endpointStatistics.top20=Top 20 -endpointStatistics.all=All -endpointStatistics.refresh=Refresh -endpointStatistics.includeHomepage=Include Homepage ('/') -endpointStatistics.includeLoginPage=Include Login Page ('/login') -endpointStatistics.totalEndpoints=Total Endpoints -endpointStatistics.totalVisits=Total Visits -endpointStatistics.showing=Showing -endpointStatistics.selectedVisits=Selected Visits -endpointStatistics.endpoint=Endpoint -endpointStatistics.visits=Visits -endpointStatistics.percentage=Percentage -endpointStatistics.loading=Loading... -endpointStatistics.failedToLoad=Failed to load endpoint data. Please try refreshing. -endpointStatistics.home=Home -endpointStatistics.login=Login -endpointStatistics.top=Top -endpointStatistics.numberOfVisits=Number of Visits -endpointStatistics.visitsTooltip=Visits: {0} ({1}% of total) -endpointStatistics.retry=Retry +endpointStatistics.all=Összes +endpointStatistics.refresh=Frissítés +endpointStatistics.includeHomepage=Tartalmazza a honlapot ('/') +endpointStatistics.includeLoginPage=Tartalmazza a bejelentkezési oldat ('/login') +endpointStatistics.totalEndpoints=Összes végpont +endpointStatistics.totalVisits=Összes megtekintés +endpointStatistics.showing=Mutatás +endpointStatistics.selectedVisits=Kiválasztott megtekintések +endpointStatistics.endpoint=Végpont +endpointStatistics.visits=Megtekintések +endpointStatistics.percentage=Százalék +endpointStatistics.loading=Betöltés... +endpointStatistics.failedToLoad=Nem sikerült betölteni a végpont adatokat. Próbálja meg frissíteni. +endpointStatistics.home=Kezdőlap +endpointStatistics.login=Bejelentkezés +endpointStatistics.top=Legnépszerűbb +endpointStatistics.numberOfVisits=Megtekintések száma +endpointStatistics.visitsTooltip=Megtekintések: {0} ({1}% az összes megtekintésből) +endpointStatistics.retry=Újrapróbálás database.title=Adatbázis importálás/exportálás database.header=Adatbázis importálás/exportálás @@ -292,18 +292,18 @@ home.desc=Az Ön helyi PDF-szükségleteinek teljes körű megoldása. home.searchBar=Funkciók keresése... -home.viewPdf.title=View/Edit PDF +home.viewPdf.title=PDF Megtekintése/Szerkesztése home.viewPdf.desc=Megtekintés, jegyzetelés, szöveg vagy képek hozzáadása viewPdf.tags=megtekintés,olvasás,jegyzetelés,szöveg,kép -home.setFavorites=Set Favourites -home.hideFavorites=Hide Favourites -home.showFavorites=Show Favourites -home.legacyHomepage=Old homepage -home.newHomePage=Try our new homepage! -home.alphabetical=Alphabetical -home.globalPopularity=Global Popularity -home.sortBy=Sort by: +home.setFavorites=Kedvencek beállítása +home.hideFavorites=Kedvencek elrejtése +home.showFavorites=Kedvencek megjelenítése +home.legacyHomepage=Régi kezdőlap +home.newHomePage=Próbálja ki új kezdőlapunkat! +home.alphabetical=ABC sorrend +home.globalPopularity=Teljes népszerűség +home.sortBy=Rendezés: home.multiTool.title=PDF többfunkciós eszköz home.multiTool.desc=Egyesítés, forgatás, átrendezés és oldalak eltávolítása @@ -364,6 +364,9 @@ home.compressPdfs.title=Tömörítés home.compressPdfs.desc=PDF-ek tömörítése a fájlméret csökkentése érdekében compressPdfs.tags=tömörítés,kicsi,kompakt +home.unlockPDFForms.title=PDF űrlapok feloldása +home.unlockPDFForms.desc=PDF dokumentumban lévő űrlapmezők írásvédettségének eltávolítása. +unlockPDFForms.tags=eltávolítás,törlés,űrlap,mező,írásvédett home.changeMetadata.title=Metaadatok módosítása home.changeMetadata.desc=PDF dokumentum metaadatainak módosítása/törlése/hozzáadása @@ -377,7 +380,6 @@ home.ocr.title=OCR / Szkennelt dokumentumok tisztítása home.ocr.desc=Szkennelt dokumentumok tisztítása és szövegfelismerés képekből, majd visszaadása szerkeszthető szövegként ocr.tags=felismerés,szöveg,kép,szkennelés,olvasás,azonosítás,észlelés,szerkeszthető - home.extractImages.title=Képek kinyerése home.extractImages.desc=Minden kép kinyerése a PDF-ből és mentése ZIP fájlba extractImages.tags=kép,fotó,mentés,archívum,tömörítés,kinyerés,gyűjtés @@ -492,9 +494,9 @@ home.MarkdownToPDF.title=Markdown konvertálása PDF-be home.MarkdownToPDF.desc=Markdown fájl konvertálása PDF-be MarkdownToPDF.tags=jelölőnyelv,webtartalom,átalakítás,konvertálás -home.PDFToMarkdown.title=PDF to Markdown -home.PDFToMarkdown.desc=Converts any PDF to Markdown -PDFToMarkdown.tags=markup,web-content,transformation,convert,md +home.PDFToMarkdown.title=PDF konvertálása Markdown-ba +home.PDFToMarkdown.desc=Akármilyen PDF konvertálása Markdown-ba +PDFToMarkdown.tags=markup,webtartalom,átalakítás,konvertálás,md home.getPdfInfo.title=PDF összes információjának lekérése home.getPdfInfo.desc=Minden elérhető információ lekérése PDF-ekről @@ -602,11 +604,12 @@ login.oauth2invalidRequest=Érvénytelen kérés login.oauth2AccessDenied=Hozzáférés megtagadva login.oauth2InvalidTokenResponse=Érvénytelen token válasz login.oauth2InvalidIdToken=Érvénytelen azonosító token -login.relyingPartyRegistrationNotFound=No relying party registration found +login.relyingPartyRegistrationNotFound=Kliens regisztráció nem található login.userIsDisabled=A felhasználó letiltva, a bejelentkezés jelenleg nem lehetséges ezzel a felhasználónévvel. Kérjük, forduljon a rendszergazdához. login.alreadyLoggedIn=Már be van jelentkezve login.alreadyLoggedIn2=eszközön. Kérjük, jelentkezzen ki az eszközökről és próbálja újra. login.toManySessions=Túl sok aktív munkamenet +login.logoutMessage=Sikeresen kijelentkezett. #auto-redact autoRedact.title=Automatikus kitakarás @@ -621,31 +624,31 @@ autoRedact.convertPDFToImageLabel=PDF konvertálása PDF-képpé (a doboz mögö autoRedact.submitButton=Küldés #redact -redact.title=Manual Redaction -redact.header=Manual Redaction -redact.submit=Redact -redact.textBasedRedaction=Text based Redaction -redact.pageBasedRedaction=Page-based Redaction -redact.convertPDFToImageLabel=Convert PDF to PDF-Image (Used to remove text behind the box) -redact.pageRedactionNumbers.title=Pages -redact.pageRedactionNumbers.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1) -redact.redactionColor.title=Redaction Color -redact.export=Export -redact.upload=Upload -redact.boxRedaction=Box draw redaction -redact.zoom=Zoom -redact.zoomIn=Zoom in -redact.zoomOut=Zoom out -redact.nextPage=Next Page -redact.previousPage=Previous Page -redact.toggleSidebar=Toggle Sidebar -redact.showThumbnails=Show Thumbnails -redact.showDocumentOutline=Show Document Outline (double-click to expand/collapse all items) -redact.showAttatchments=Show Attachments -redact.showLayers=Show Layers (double-click to reset all layers to the default state) -redact.colourPicker=Colour Picker -redact.findCurrentOutlineItem=Find current outline item -redact.applyChanges=Apply Changes +redact.title=Kézi kitakarás +redact.header=Kézi kitakarás +redact.submit=Kitakarás +redact.textBasedRedaction=Szöveg alapú kitakarás +redact.pageBasedRedaction=Oldal alapú kitakarás +redact.convertPDFToImageLabel=PDF konvertálása képpé (a doboz mögötti szöveg eltávolításához) +redact.pageRedactionNumbers.title=Oldalszámok +redact.pageRedactionNumbers.placeholder=(például 1,2,8 vagy 4,7,12-16 vagy 2n-1) +redact.redactionColor.title=Kitakarás színe +redact.export=Exportálás +redact.upload=Feltöltés +redact.boxRedaction=Kiválasztott doboz kitakarása +redact.zoom=Nagyítás/kicsinyítés +redact.zoomIn=Nagyítás +redact.zoomOut=Kicsinyítés +redact.nextPage=Következő oldal +redact.previousPage=Előző oldal +redact.toggleSidebar=Oldalsáv megjelenítése/elrejtése +redact.showThumbnails=Előnézet megjelenítése +redact.showDocumentOutline=Dokumentumvázlat megjelenítése (dupla kattintás a kibővítéshez/összecsukáshoz) +redact.showAttatchments=Mellékletek megjelenítése +redact.showLayers=Rétegek megjelenítése (dupla kattintás az összes réteg alaphelyzetbe állításához) +redact.colourPicker=Színválasztó +redact.findCurrentOutlineItem=Keresés a jelenlegi vázlatban +redact.applyChanges=Változtatások mentése #showJS showJS.title=JavaScript megjelenítése @@ -683,9 +686,9 @@ MarkdownToPDF.credit=WeasyPrint használatával #pdf-to-markdown -PDFToMarkdown.title=PDF To Markdown -PDFToMarkdown.header=PDF To Markdown -PDFToMarkdown.submit=Convert +PDFToMarkdown.title=PDF fájl konvertálása Markdown fájlba +PDFToMarkdown.header=PDF fájl konvertálása Markdown fájlba +PDFToMarkdown.submit=Konvertálás #url-to-pdf @@ -739,10 +742,10 @@ sanitizePDF.title=PDF tisztítása sanitizePDF.header=PDF fájl tisztítása sanitizePDF.selectText.1=JavaScript műveletek eltávolítása sanitizePDF.selectText.2=Beágyazott fájlok eltávolítása -sanitizePDF.selectText.3=Remove XMP metadata +sanitizePDF.selectText.3=XMP metaadatok eltávolítása sanitizePDF.selectText.4=Hivatkozások eltávolítása sanitizePDF.selectText.5=Betűtípusok eltávolítása -sanitizePDF.selectText.6=Remove Document Info Metadata +sanitizePDF.selectText.6=Dokumentum metainformációk eltávolítása sanitizePDF.submit=PDF tisztítása @@ -963,8 +966,8 @@ compress.title=Tömörítés compress.header=PDF tömörítése compress.credit=Ez a szolgáltatás a qpdf használatával végzi a PDF tömörítését/optimalizálását. compress.grayscale.label=Szürkeárnyalatok alkalmazása tömörítéshez -compress.selectText.1=Compression Settings -compress.selectText.1.1=1-3 PDF compression,
4-6 lite image compression,
7-9 intense image compression Will dramatically reduce image quality +compress.selectText.1=Tömörítési beállítások +compress.selectText.1.1=1-3 PDF tömörítés,
4-6 enyhe kép tömörítés,
7-9 intenzív kép tömörítés Jelentősen csökkenti a kép minőségét compress.selectText.2=Optimalizálási szint: compress.selectText.4=Automatikus mód - Automatikusan állítja a minőséget a megadott PDF méret eléréséhez compress.selectText.5=Kívánt PDF méret (pl. 25MB, 10.8MB, 25KB) @@ -1003,7 +1006,7 @@ pdfOrganiser.mode.7=Első oldal eltávolítása pdfOrganiser.mode.8=Utolsó oldal eltávolítása pdfOrganiser.mode.9=Első és utolsó oldal eltávolítása pdfOrganiser.mode.10=Páros-páratlan egyesítés -pdfOrganiser.mode.11=Duplicate all pages +pdfOrganiser.mode.11=Minden oldal megkettőzése pdfOrganiser.placeholder=(pl. 1,3,2 vagy 4-8,2,10-12 vagy 2n-1) @@ -1046,7 +1049,7 @@ decrypt.success=A fájl visszafejtése sikeres. multiTool-advert.message=Ez a funkció elérhető a többfunkciós eszköz oldalon is. Nézze meg a fejlett oldalankénti felületet és további funkciókat! #view pdf -viewPdf.title=View/Edit PDF +viewPdf.title=PDF megtekintése/szerkesztése viewPdf.header=PDF megtekintése #pageRemover @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Egyéb metaadatok: changeMetadata.selectText.5=Egyéni metaadat hozzáadása changeMetadata.submit=Módosítás +#unlockPDFForms +unlockPDFForms.title=Írásvédettség eltávolítása az űrlapmezőkről +unlockPDFForms.header=PDF űrlapok feloldása +unlockPDFForms.submit=Eltávolítás #pdfToPDFA pdfToPDFA.title=PDF konvertálása PDF/A formátumba @@ -1312,15 +1319,15 @@ survey.please=Kérjük, vegyen részt felmérésünkben! survey.disabled=(A kérdőív felugró ablaka a következő frissítésekben letiltásra kerül, de továbbra is elérhető lesz a lap alján) survey.button=Kérdőív kitöltése survey.dontShowAgain=Ne jelenjen meg újra -survey.meeting.1=If you're using Stirling PDF at work, we'd love to speak to you. We're offering technical support sessions in exchange for a 15 minute user discovery session. -survey.meeting.2=This is a chance to: -survey.meeting.3=Get help with deployment, integrations, or troubleshooting -survey.meeting.4=Provide direct feedback on performance, edge cases, and feature gaps -survey.meeting.5=Help us refine Stirling PDF for real-world enterprise use -survey.meeting.6=If you're interested, you can book time with our team directly. (English speaking only) -survey.meeting.7=Looking forward to digging into your use cases and making Stirling PDF even better! -survey.meeting.notInterested=Not a business and/or interested in a meeting? -survey.meeting.button=Book meeting +survey.meeting.1=Ha a Stirling PDF-t munkahelyén használja, szívesen beszélgetnénk Önnel. 15 perces felhasználói felfedező konzultációért cserébe technikai támogatási üléseket kínálunk. +survey.meeting.2=Ez egy lehetőség arra, hogy: +survey.meeting.3=Segítséget kapjon a telepítéshez, integrációkhoz vagy hibaelhárításhoz +survey.meeting.4=Adjon közvetlen visszajelzést a teljesítményről, határesetekről és hiányzó funkciókról +survey.meeting.5=Segítsen nekünk finomítani a Stirling PDF-et a valós vállalati használatra +survey.meeting.6=Amennyiben érdekli, közvetlenül foglalhat időpontot csapatunkkal. (Csak angol nyelven) +survey.meeting.7=Várjuk, hogy megismerhessük az Ön felhasználási eseteit és még jobbá tehessük a Stirling PDF-et! +survey.meeting.notInterested=Nem üzleti felhasználó és/vagy nem érdekli a konzultáció +survey.meeting.button=Konzultáció foglalása #error error.sorry=Sajnáljuk a kellemetlenséget! @@ -1408,25 +1415,25 @@ validateSignature.cert.bits=bit #################### # Cookie banner # #################### -cookieBanner.popUp.title=How we use Cookies -cookieBanner.popUp.description.1=We use cookies and other technologies to make Stirling PDF work better for you—helping us improve our tools and keep building features you'll love. -cookieBanner.popUp.description.2=If you’d rather not, clicking 'No Thanks' will only enable the essential cookies needed to keep things running smoothly. -cookieBanner.popUp.acceptAllBtn=Okay -cookieBanner.popUp.acceptNecessaryBtn=No Thanks -cookieBanner.popUp.showPreferencesBtn=Manage preferences -cookieBanner.preferencesModal.title=Consent Preferences Center -cookieBanner.preferencesModal.acceptAllBtn=Accept all -cookieBanner.preferencesModal.acceptNecessaryBtn=Reject all -cookieBanner.preferencesModal.savePreferencesBtn=Save preferences -cookieBanner.preferencesModal.closeIconLabel=Close modal -cookieBanner.preferencesModal.serviceCounterLabel=Service|Services -cookieBanner.preferencesModal.subtitle=Cookie Usage -cookieBanner.preferencesModal.description.1=Stirling PDF uses cookies and similar technologies to enhance your experience and understand how our tools are used. This helps us improve performance, develop the features you care about, and provide ongoing support to our users. -cookieBanner.preferencesModal.description.2=Stirling PDF cannot—and will never—track or access the content of the documents you use. -cookieBanner.preferencesModal.description.3=Your privacy and trust are at the core of what we do. -cookieBanner.preferencesModal.necessary.title.1=Strictly Necessary Cookies -cookieBanner.preferencesModal.necessary.title.2=Always Enabled -cookieBanner.preferencesModal.necessary.description=These cookies are essential for the website to function properly. They enable core features like setting your privacy preferences, logging in, and filling out forms—which is why they can’t be turned off. -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. +cookieBanner.popUp.title=Hogy használjuk a sütiket +cookieBanner.popUp.description.1=Sütiket és egyéb technológiákat használunk, hogy a Stirling PDF jobban működjön az Ön számára, segítve minket abban, hogy javítsuk eszközeinket és olyan funkciókat fejlesszünk, amelyeket szeretni fog +cookieBanner.popUp.description.2=Ha inkább nem szeretné, a 'Nem, köszönöm' gombra kattintva csak azok az alapvető sütik lesznek engedélyezve, amelyek a zavartalan működéshez szükségesek. +cookieBanner.popUp.acceptAllBtn=Elfogadom +cookieBanner.popUp.acceptNecessaryBtn=Nem, köszönöm +cookieBanner.popUp.showPreferencesBtn=Preferenciák kezelése +cookieBanner.preferencesModal.title=Beleegyezési preferenciák központja +cookieBanner.preferencesModal.acceptAllBtn=Minden süti elfogadása +cookieBanner.preferencesModal.acceptNecessaryBtn=Csak a szükséges sütik elfogadása +cookieBanner.preferencesModal.savePreferencesBtn=Preferenciák mentése +cookieBanner.preferencesModal.closeIconLabel=Bezárás +cookieBanner.preferencesModal.serviceCounterLabel=Szolgáltatás|Szolgáltatások +cookieBanner.preferencesModal.subtitle=Süti használat +cookieBanner.preferencesModal.description.1=A Stirling PDF sütiket és hasonló technológiákat használ az Ön élményének javítása, valamint eszközeink használatának megértése érdekében. Ez segít nekünk abban, hogy javítsuk a teljesítményt, fejlesszük az Ön számára fontos funkciókat, és folyamatos támogatást nyújtsunk felhasználóinknak. +cookieBanner.preferencesModal.description.2=A Stirling PDF nem képes-és soha nem is fog-nyomon követni vagy hozzáférni az Ön által használt dokumentumok tartalmához. +cookieBanner.preferencesModal.description.3=Az Ön bizalma és adatainak védelme a tevékenységünk középpontjában áll. +cookieBanner.preferencesModal.necessary.title.1=Szükséges sütik +cookieBanner.preferencesModal.necessary.title.2=Mindig aktív +cookieBanner.preferencesModal.necessary.description=Ezek a sütik elengedhetetlenek a weboldal megfelelő működéséhez. Olyan alapvető funkciókat tesznek lehetővé, mint az adatvédelmi beállítások megadása, a bejelentkezés és az űrlapok kitöltése-ezért nem kapcsolhatók ki. +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. diff --git a/src/main/resources/messages_id_ID.properties b/src/main/resources/messages_id_ID.properties index 14ed3fc1d..243e705b0 100644 --- a/src/main/resources/messages_id_ID.properties +++ b/src/main/resources/messages_id_ID.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=Kompres home.compressPdfs.desc=Kompres PDF untuk mengurangi ukuran berkas. compressPdfs.tags=remas, kecil, mini +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=Ubah Metadata home.changeMetadata.desc=Mengubah/Menghapus/Menambahkan metadata dari dokumen PDF @@ -377,7 +380,6 @@ home.ocr.title=Pemindaian/Pembersihan OCR home.ocr.desc=Memindai dan mendeteksi teks dari gambar di dalam PDF dan menambahkannya kembali sebagai teks. ocr.tags=rekognisi,teks,gambar,pindai,baca,identifikasi,deteksi,dapat diedit - home.extractImages.title=Ekstrak Gambar home.extractImages.desc=Mengekstrak semua gambar dari PDF dan menyimpannya ke zip extractImages.tags=gambar, foto, simpan, arsip, zip, tangkap, ambil @@ -607,6 +609,7 @@ login.userIsDisabled=Pengguna dinonaktifkan, login saat ini diblokir dengan nama login.alreadyLoggedIn=Anda sudah login ke login.alreadyLoggedIn2=perangkat. Silakan keluar dari perangkat dan coba lagi. login.toManySessions=Anda memiliki terlalu banyak sesi aktif +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=Redaksional Otomatis @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Metadata Lain-lain: changeMetadata.selectText.5=Tambahkan Metadata Khusus changeMetadata.submit=Ganti +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF Ke PDF/A diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index 30368524f..9e2a54af4 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=Comprimi home.compressPdfs.desc=Comprimi PDF per ridurne le dimensioni. compressPdfs.tags=comprimere,piccolo,minuscolo +home.unlockPDFForms.title=Sblocca moduli PDF +home.unlockPDFForms.desc=Rimuovi la proprietà di sola lettura dei campi del modulo in un documento PDF. +unlockPDFForms.tags=rimuovi,elimina,modulo,campo,sola lettura home.changeMetadata.title=Modifica Proprietà home.changeMetadata.desc=Modifica/Aggiungi/Rimuovi le proprietà di un documento PDF. @@ -377,7 +380,6 @@ home.ocr.title=OCR / Pulisci scansioni home.ocr.desc=Pulisci scansioni ed estrai testo da immagini, convertendo le immagini in testo puro. ocr.tags=riconoscimento,testo,immagine,scansione,lettura,identificazione,rilevamento,modificabile - home.extractImages.title=Estrai immagini home.extractImages.desc=Estrai tutte le immagini da un PDF e salvale come zip. extractImages.tags=immagine,foto,salva,archivio,zip,catturare,prendere @@ -607,6 +609,7 @@ login.userIsDisabled=L'utente è disattivato, l'accesso è attualmente bloccato login.alreadyLoggedIn=Hai già effettuato l'accesso a login.alreadyLoggedIn2=dispositivi. Esci dai dispositivi e riprova. login.toManySessions=Hai troppe sessioni attive +login.logoutMessage=Sei stato disconnesso. #auto-redact autoRedact.title=Redazione automatica @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Altre proprietà: changeMetadata.selectText.5=Aggiungi proprietà personalizzata: changeMetadata.submit=Cambia proprietà +#unlockPDFForms +unlockPDFForms.title=Rimuovi la sola lettura dai campi del modulo +unlockPDFForms.header=Sbloccare i moduli PDF +unlockPDFForms.submit=Rimuovi #pdfToPDFA pdfToPDFA.title=Da PDF a PDF/A diff --git a/src/main/resources/messages_ja_JP.properties b/src/main/resources/messages_ja_JP.properties index 0c75570b6..010c91327 100644 --- a/src/main/resources/messages_ja_JP.properties +++ b/src/main/resources/messages_ja_JP.properties @@ -10,9 +10,9 @@ multiPdfPrompt=PDFを選択 (2つ以上) multiPdfDropPrompt=PDFを選択 (又はドラッグ&ドロップ) imgPrompt=画像を選択 genericSubmit=送信 -uploadLimit=Maximum file size: -uploadLimitExceededSingular=is too large. Maximum allowed size is -uploadLimitExceededPlural=are too large. Maximum allowed size is +uploadLimit=最大ファイルサイズ: +uploadLimitExceededSingular=のサイズが大きすぎます。許可された最大サイズは +uploadLimitExceededPlural=のサイズが大きすぎます。許可された最大サイズは processTimeWarning=警告:この処理はファイルサイズによって1分程度かかることがあります pageOrderPrompt=ページ順序 (ページ番号をカンマ区切り又は2n+1のような関数で入力): pageSelectionPrompt=カスタムページ選択(ページ番号1、5、6または2n + 1などの関数のコンマ区切りリストを入力します): @@ -78,14 +78,14 @@ visitGithub=Githubリポジトリを訪問する donate=寄付する color=色 sponsor=スポンサー -info=Info -pro=pro +info=情報 +pro=Pro page=ページ pages=ページ loading=読込中... addToDoc=ドキュメントに追加 reset=リセット -apply=Apply +apply=適用 noFileSelected=No file selected. Please upload one. legal.privacy=プライバシーポリシー @@ -237,31 +237,31 @@ adminUserSettings.activeUsers=アクティブユーザー: adminUserSettings.disabledUsers=無効なユーザー: adminUserSettings.totalUsers=ユーザー合計: adminUserSettings.lastRequest=最後のリクエスト -adminUserSettings.usage=View Usage +adminUserSettings.usage=使用状況を表示 -endpointStatistics.title=Endpoint Statistics -endpointStatistics.header=Endpoint Statistics -endpointStatistics.top10=Top 10 -endpointStatistics.top20=Top 20 -endpointStatistics.all=All -endpointStatistics.refresh=Refresh -endpointStatistics.includeHomepage=Include Homepage ('/') -endpointStatistics.includeLoginPage=Include Login Page ('/login') -endpointStatistics.totalEndpoints=Total Endpoints -endpointStatistics.totalVisits=Total Visits -endpointStatistics.showing=Showing -endpointStatistics.selectedVisits=Selected Visits -endpointStatistics.endpoint=Endpoint -endpointStatistics.visits=Visits -endpointStatistics.percentage=Percentage -endpointStatistics.loading=Loading... -endpointStatistics.failedToLoad=Failed to load endpoint data. Please try refreshing. -endpointStatistics.home=Home -endpointStatistics.login=Login -endpointStatistics.top=Top -endpointStatistics.numberOfVisits=Number of Visits -endpointStatistics.visitsTooltip=Visits: {0} ({1}% of total) -endpointStatistics.retry=Retry +endpointStatistics.title=エンドポイント統計 +endpointStatistics.header=エンドポイント統計 +endpointStatistics.top10=トップ10 +endpointStatistics.top20=トップ20 +endpointStatistics.all=すべて +endpointStatistics.refresh=更新 +endpointStatistics.includeHomepage=ホームページを含める ('/') +endpointStatistics.includeLoginPage=ログインページを含める ('/login') +endpointStatistics.totalEndpoints=エンドポイント合計 +endpointStatistics.totalVisits=総訪問数 +endpointStatistics.showing=表示 +endpointStatistics.selectedVisits=選択された訪問先 +endpointStatistics.endpoint=エンドポイント +endpointStatistics.visits=訪問 +endpointStatistics.percentage=比率 +endpointStatistics.loading=読込中... +endpointStatistics.failedToLoad=エンドポイントデータのロードに失敗しました。更新してみてください。 +endpointStatistics.home=ホーム +endpointStatistics.login=ログイン +endpointStatistics.top=トップ +endpointStatistics.numberOfVisits=訪問回数 +endpointStatistics.visitsTooltip=訪問数: {0} (合計の{1}%) +endpointStatistics.retry=再試行 database.title=データベースのインポート/エクスポート database.header=データベースのインポート/エクスポート @@ -292,7 +292,7 @@ home.desc=PDFのあらゆるニーズに対応するローカルホスティン home.searchBar=機能検索... -home.viewPdf.title=View/Edit PDF +home.viewPdf.title=PDFの表示/編集 home.viewPdf.desc=表示、注釈、テキストや画像の追加 viewPdf.tags=view,read,annotate,text,image @@ -307,7 +307,7 @@ home.sortBy=ソート順: home.multiTool.title=PDFマルチツール home.multiTool.desc=ページの結合、回転、並べ替え、削除します。 -multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side,interactive,intractable,move +multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side,interactive,intractable,move,delete,migrate,divide home.merge.title=結合 home.merge.desc=複数のPDFを1つに結合します。 @@ -364,6 +364,9 @@ home.compressPdfs.title=圧縮 home.compressPdfs.desc=PDFを圧縮してファイルサイズを小さくします。 compressPdfs.tags=squish,small,tiny +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=メタデータの変更 home.changeMetadata.desc=PDFのメタデータを変更/削除/追加します。 @@ -377,7 +380,6 @@ home.ocr.title=OCR / クリーンアップ home.ocr.desc=クリーンアップはPDF内の画像からテキストを検出してテキストとして再追加します。 ocr.tags=recognition,text,image,scan,read,identify,detection,editable - home.extractImages.title=画像の抽出 home.extractImages.desc=PDFからすべての画像を抽出してzipで保存します。 extractImages.tags=picture,photo,save,archive,zip,capture,grab @@ -515,12 +517,12 @@ home.showJS.title=JavaScriptを表示 home.showJS.desc=PDFに挿入されたJavaScriptを検索して表示します。 showJS.tags=JS -home.autoRedact.title=自動塗りつぶし -home.autoRedact.desc=入力したテキストに基づいてPDF内のテキストを自動で塗りつぶし(黒塗り)ます。 +home.autoRedact.title=自動墨消し +home.autoRedact.desc=入力したテキストに基づいてPDF内のテキストを自動で墨消し(黒塗り)ます。 autoRedact.tags=Redact,Hide,black out,black,marker,hidden -home.redact.title=手動塗りつぶし -home.redact.desc=選択したテキスト、描画した図形、選択したページに基づいてPDFを塗りつぶします。 +home.redact.title=手動墨消し +home.redact.desc=選択したテキスト、描画した図形、選択したページに基づいてPDFを墨消します。 redact.tags=Redact,Hide,black out,black,marker,hidden,manual home.tableExtraxt.title=PDFをCSVに変換 @@ -607,32 +609,33 @@ login.userIsDisabled=ユーザーは非アクティブ化されており、現 login.alreadyLoggedIn=すでにログインしています login.alreadyLoggedIn2=デバイスからログアウトしてもう一度お試しください。 login.toManySessions=アクティブなセッションが多すぎます +login.logoutMessage=You have been logged out. #auto-redact -autoRedact.title=自動塗りつぶし -autoRedact.header=自動塗りつぶし +autoRedact.title=自動墨消し +autoRedact.header=自動墨消し autoRedact.colorLabel=カラー autoRedact.textsToRedactLabel=編集するテキスト(行区切り) autoRedact.textsToRedactPlaceholder=例: \n機密 \n極秘 autoRedact.useRegexLabel=正規表現を使用する autoRedact.wholeWordSearchLabel=単語単位の検索 autoRedact.customPaddingLabel=追加の余白 -autoRedact.convertPDFToImageLabel=PDFをPDF画像に変換 (塗りつぶしの後ろのテキストを削除するために使用) +autoRedact.convertPDFToImageLabel=PDFをPDF画像に変換 (墨消しの後ろのテキストを削除するために使用) autoRedact.submitButton=送信 #redact -redact.title=手動編集 -redact.header=手動編集 +redact.title=手動墨消し +redact.header=手動墨消し redact.submit=編集 -redact.textBasedRedaction=テキストベースの編集 -redact.pageBasedRedaction=ページベースの編集 +redact.textBasedRedaction=テキストベースの墨消し +redact.pageBasedRedaction=ページベースの墨消し redact.convertPDFToImageLabel=PDFをPDF画像に変換します (ボックスの背後のテキストを削除するために使用します) redact.pageRedactionNumbers.title=ページ redact.pageRedactionNumbers.placeholder=(例:1,2,8、4,7,12-16、2n-1) redact.redactionColor.title=編集色 redact.export=出力 redact.upload=アップロード -redact.boxRedaction=ボックス描画編集 +redact.boxRedaction=ボックス描画の墨消し redact.zoom=ズーム redact.zoomIn=拡大 redact.zoomOut=縮小 @@ -739,10 +742,10 @@ sanitizePDF.title=PDFをサニタイズ sanitizePDF.header=PDFファイルをサニタイズ sanitizePDF.selectText.1=JavaScriptアクションを削除 sanitizePDF.selectText.2=埋め込みファイルを削除 -sanitizePDF.selectText.3=Remove XMP metadata +sanitizePDF.selectText.3=XMPメタデータを削除 sanitizePDF.selectText.4=リンクを削除 sanitizePDF.selectText.5=フォントを削除 -sanitizePDF.selectText.6=Remove Document Info Metadata +sanitizePDF.selectText.6=ドキュメント情報のメタデータを削除 sanitizePDF.submit=PDFをサニタイズする @@ -891,8 +894,8 @@ sign.last=最後のページ sign.next=次のページ sign.previous=前のページ sign.maintainRatio=アスペクト比を維持を切替え -sign.undo=Undo -sign.redo=Redo +sign.undo=元に戻す +sign.redo=やり直す #repair repair.title=修復 @@ -963,8 +966,8 @@ compress.title=圧縮 compress.header=PDFを圧縮 compress.credit=本サービスはPDFの圧縮/最適化にqpdfを使用しています。 compress.grayscale.label=圧縮にグレースケールを適用する -compress.selectText.1=Compression Settings -compress.selectText.1.1=1-3 PDF compression,
4-6 lite image compression,
7-9 intense image compression Will dramatically reduce image quality +compress.selectText.1=圧縮設定 +compress.selectText.1.1=1-3 PDF圧縮、
4-6 弱い画像圧縮、
7-9 強い画像圧縮により画質が大幅に低下します compress.selectText.2=品質レベル: compress.selectText.4=自動モード - PDFを正確なサイズにするために品質を自動調整する。 compress.selectText.5=PDFサイズ (例:25MB, 10.8MB, 25KB) @@ -1003,7 +1006,7 @@ pdfOrganiser.mode.7=最初に削除 pdfOrganiser.mode.8=最後を削除 pdfOrganiser.mode.9=最初と最後を削除 pdfOrganiser.mode.10=奇数-偶数の結合 -pdfOrganiser.mode.11=Duplicate all pages +pdfOrganiser.mode.11=すべてのページを複製 pdfOrganiser.placeholder=(例:1,3,2または4-8,2,10-12または2n-1) @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=その他のメタデータ: changeMetadata.selectText.5=カスタムメタデータの追加 changeMetadata.submit=変更 +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDFをPDF/Aに変換 @@ -1408,25 +1415,25 @@ validateSignature.cert.bits=ビット #################### # Cookie banner # #################### -cookieBanner.popUp.title=How we use Cookies -cookieBanner.popUp.description.1=We use cookies and other technologies to make Stirling PDF work better for you—helping us improve our tools and keep building features you'll love. -cookieBanner.popUp.description.2=If you’d rather not, clicking 'No Thanks' will only enable the essential cookies needed to keep things running smoothly. -cookieBanner.popUp.acceptAllBtn=Okay -cookieBanner.popUp.acceptNecessaryBtn=No Thanks -cookieBanner.popUp.showPreferencesBtn=Manage preferences -cookieBanner.preferencesModal.title=Consent Preferences Center -cookieBanner.preferencesModal.acceptAllBtn=Accept all -cookieBanner.preferencesModal.acceptNecessaryBtn=Reject all -cookieBanner.preferencesModal.savePreferencesBtn=Save preferences -cookieBanner.preferencesModal.closeIconLabel=Close modal -cookieBanner.preferencesModal.serviceCounterLabel=Service|Services -cookieBanner.preferencesModal.subtitle=Cookie Usage -cookieBanner.preferencesModal.description.1=Stirling PDF uses cookies and similar technologies to enhance your experience and understand how our tools are used. This helps us improve performance, develop the features you care about, and provide ongoing support to our users. -cookieBanner.preferencesModal.description.2=Stirling PDF cannot—and will never—track or access the content of the documents you use. -cookieBanner.preferencesModal.description.3=Your privacy and trust are at the core of what we do. -cookieBanner.preferencesModal.necessary.title.1=Strictly Necessary Cookies -cookieBanner.preferencesModal.necessary.title.2=Always Enabled -cookieBanner.preferencesModal.necessary.description=These cookies are essential for the website to function properly. They enable core features like setting your privacy preferences, logging in, and filling out forms—which is why they can’t be turned off. -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. +cookieBanner.popUp.title=クッキーの使用方法 +cookieBanner.popUp.description.1=私たちはStirling PDFをより快適にご利用いただけるようCookieやその他のテクノロジーを使用しています。これによりツールの改善やお気に入りの機能の構築を継続できます。 +cookieBanner.popUp.description.2=希望しない場合は「いいえ」をクリックすると、スムーズに動作するために必要なCookieのみが有効になります。 +cookieBanner.popUp.acceptAllBtn=Ok +cookieBanner.popUp.acceptNecessaryBtn=いいえ +cookieBanner.popUp.showPreferencesBtn=設定の管理 +cookieBanner.preferencesModal.title=同意管理センター +cookieBanner.preferencesModal.acceptAllBtn=すべて受け入れる +cookieBanner.preferencesModal.acceptNecessaryBtn=すべて拒否する +cookieBanner.preferencesModal.savePreferencesBtn=環境設定の保存 +cookieBanner.preferencesModal.closeIconLabel=モーダルを閉じる +cookieBanner.preferencesModal.serviceCounterLabel=サービス +cookieBanner.preferencesModal.subtitle=Cookieの使用 +cookieBanner.preferencesModal.description.1=Stirling PDFはお客様の体験の向上、ツールの利用状況を把握するためにCookieなどのテクノロジーを使用しています。これによりパフォーマンスの向上、お客様が求める機能の開発、そしてユーザーへの継続的なサポートの提供が可能になります。 +cookieBanner.preferencesModal.description.2=Stirling PDFはユーザーが使用するドキュメントの内容を追跡したりアクセスしたりすることはできません。 +cookieBanner.preferencesModal.description.3=お客様のプライバシーと信頼は当社の活動の中核です。 +cookieBanner.preferencesModal.necessary.title.1=厳密に必要なCookie +cookieBanner.preferencesModal.necessary.title.2=常に有効 +cookieBanner.preferencesModal.necessary.description=これらのCookieはウェブサイトが正常に機能するために不可欠です。プライバシー設定、ログイン、フォームへの入力といったコア機能を有効にするため、無効にすることはできません。 +cookieBanner.preferencesModal.analytics.title=分析 +cookieBanner.preferencesModal.analytics.description=これらのCookieはツールがどのように使用されているかを把握するのに役立ちます。これによりコミュニティが最も重視する機能の開発に集中することができます。ご安心ください。Stirling PDFはお客様が操作するドキュメントの内容を追跡することは決してありません。 diff --git a/src/main/resources/messages_ko_KR.properties b/src/main/resources/messages_ko_KR.properties index 8f292732a..da4cadde4 100644 --- a/src/main/resources/messages_ko_KR.properties +++ b/src/main/resources/messages_ko_KR.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=압축 home.compressPdfs.desc=PDF를 압축하여 파일 크기를 줄입니다. compressPdfs.tags=압축,작게,매우 작게 +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=메타데이터 변경 home.changeMetadata.desc=PDF 문서에서 메타데이터 변경/제거/추가 @@ -377,7 +380,6 @@ home.ocr.title=OCR / 스캔 정리 home.ocr.desc=스캔을 정리하고 PDF 내 이미지에서 텍스트를 감지하여 다시 텍스트로 추가합니다. ocr.tags=인식,텍스트,이미지,스캔,읽기,식별,감지,편집 가능 - home.extractImages.title=이미지 추출 home.extractImages.desc=PDF에서 모든 이미지를 추출하여 zip으로 저장 extractImages.tags=사진,저장,아카이브,zip,캡처,가져오기 @@ -607,6 +609,7 @@ login.userIsDisabled=사용자가 비활성화되어 있어 현재 이 사용자 login.alreadyLoggedIn=이미 다음에 로그인되어 있습니다 login.alreadyLoggedIn2=개의 기기. 해당 기기에서 로그아웃한 후 다시 시도하세요. login.toManySessions=활성 세션이 너무 많습니다 +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=자동 검열 @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=기타 메타데이터: changeMetadata.selectText.5=사용자 지정 메타데이터 항목 추가 changeMetadata.submit=변경 +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF를 PDF/A로 diff --git a/src/main/resources/messages_nl_NL.properties b/src/main/resources/messages_nl_NL.properties index eea0319d9..d1fe5d050 100644 --- a/src/main/resources/messages_nl_NL.properties +++ b/src/main/resources/messages_nl_NL.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=Comprimeren home.compressPdfs.desc=Comprimeer PDF's om hun bestandsgrootte te verkleinen. compressPdfs.tags=comprimeren,klein +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=Metadata wijzigen home.changeMetadata.desc=Wijzig/verwijder/voeg metadata toe van een PDF-document @@ -377,7 +380,6 @@ home.ocr.title=OCR / Scans opruimen home.ocr.desc=Ruim scans op, detecteert tekst van afbeeldingen in een PDF en voegt deze opnieuw toe als tekst. ocr.tags=herkenning,tekst,afbeelding,scan,lezen,identificeren,detectie,bewerkbaar - home.extractImages.title=Afbeeldingen extraheren home.extractImages.desc=Extraheert alle afbeeldingen uit een PDF en slaat ze op in een zip extractImages.tags=foto,opslaan,archief,zip,vastleggen,plukken @@ -607,6 +609,7 @@ login.userIsDisabled=De gebruiker is gedesactiveerd, inloggen is momenteel geblo login.alreadyLoggedIn=U zit reeds ingelogd bij login.alreadyLoggedIn2=apparaten. U moet u a.u.b. uitloggen van de apparaten en opnieuw proberen. login.toManySessions=U heeft te veel actieve sessies +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=Automatisch censureren @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Overige metadata: changeMetadata.selectText.5=Voeg aangepaste metadata-invoer toe changeMetadata.submit=Wijzigen +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF naar PDF/A diff --git a/src/main/resources/messages_no_NB.properties b/src/main/resources/messages_no_NB.properties index c9c348dd9..120b2cd5a 100644 --- a/src/main/resources/messages_no_NB.properties +++ b/src/main/resources/messages_no_NB.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=Komprimer home.compressPdfs.desc=Komprimer PDF-er for å redusere filstørrelsen. compressPdfs.tags=komprimer,liten,tiny +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=Endre Metadata home.changeMetadata.desc=Endre/fjern/legg til metadata fra en PDF-dokument @@ -377,7 +380,6 @@ home.ocr.title=OCR / Rydd opp skanninger home.ocr.desc=Rydd opp skanninger og oppdag tekst fra bilder i en PDF og legg den til som tekst. ocr.tags=gjenkjenning,tekst,bilde,skann,les,identifisere,deteksjon,redigerbar - home.extractImages.title=Ekstraher Bilder home.extractImages.desc=Ekstraherer alle bilder fra en PDF og lagrer dem som zip extractImages.tags=bilde,foto,lagre,arkiv,zip,fangst,hent @@ -607,6 +609,7 @@ login.userIsDisabled=Bruker er deaktivert, innlogging er for øyeblikket blokker login.alreadyLoggedIn=Du er allerede innlogget på login.alreadyLoggedIn2=enheter. Logg ut og forsøk igjen login.toManySessions=Du har for mange aktive økter +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=Automatisk Sensurering @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Annen metadata: changeMetadata.selectText.5=Legg til tilpasset metadataoppføring changeMetadata.submit=Endre +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF til PDF/A diff --git a/src/main/resources/messages_pl_PL.properties b/src/main/resources/messages_pl_PL.properties index e4def0261..1dd04dfdc 100644 --- a/src/main/resources/messages_pl_PL.properties +++ b/src/main/resources/messages_pl_PL.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=Kompresuj home.compressPdfs.desc=Kompresuj dokumenty PDF, aby zmniejszyć ich rozmiar. compressPdfs.tags=zgniatać,mały,malutki +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=Zmień metadane home.changeMetadata.desc=Zmień/Usuń/Dodaj metadane w dokumencie PDF @@ -377,7 +380,6 @@ home.ocr.title=OCR / Zamiana na tekst home.ocr.desc=OCR skanuje i wykrywa tekst z obrazów w dokumencie PDF i zamienia go na tekst. ocr.tags=rozpoznawanie, tekst, obraz, skanowanie, odczyt, identyfikacja, wykrywanie, edytowalność - home.extractImages.title=Wyodrębnij obrazy home.extractImages.desc=Wyodrębnia wszystkie obrazy z dokumentu PDF i zapisuje je w wybranym formacie extractImages.tags=obraz, zdjęcie, zapisz, archiwum, zip, przechwyć, złap @@ -607,6 +609,7 @@ login.userIsDisabled=Użytkownik jest nieaktywny, logowanie przy użyciu tej naz login.alreadyLoggedIn=Jesteś już zalogowany na login.alreadyLoggedIn2=urządzeniach. Wyloguj się z tych urządzeń i spróbuj ponownie. login.toManySessions=Masz zbyt wiele aktywnych sesji +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=Automatyczne zaciemnienie @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Inne metadane: changeMetadata.selectText.5=Dodaj niestandardowy wpis w metadanych changeMetadata.submit=Zmień +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF na PDF/A diff --git a/src/main/resources/messages_pt_BR.properties b/src/main/resources/messages_pt_BR.properties index c6bbddb39..35319d3e9 100644 --- a/src/main/resources/messages_pt_BR.properties +++ b/src/main/resources/messages_pt_BR.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=Comprimir home.compressPdfs.desc=Comprimir PDFs para reduzir o tamanho do arquivo. compressPdfs.tags=compactar,pequeno,mínimo +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=Alterar Metadados home.changeMetadata.desc=Alterar/remover/adicionar metadados de um PDF. @@ -377,7 +380,6 @@ home.ocr.title=Processamento de OCR home.ocr.desc=Reconhecimento Óptico de Caracteres transforma PDFs com imagens em documentos pesquisáveis e com texto selecionável. ocr.tags=reconhecimento,texto,imagem,digitalização,leitura,identificação,detecção,editável - home.extractImages.title=Extrair Imagens home.extractImages.desc=Extrair as imagens de um PDF e salvá-las em um arquivo compactado. extractImages.tags=imagem,foto,salvar,arquivo,zip,captura,coleta @@ -607,6 +609,7 @@ login.userIsDisabled=O usuário está desativado, o login está atualmente bloqu login.alreadyLoggedIn=Você já está conectado em login.alreadyLoggedIn2=aparelhos. Por favor saia dos aparelhos e tente novamente. login.toManySessions=Você tem muitas sessões ativas +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=Ocultação de Texto Automática @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Outros metadados: changeMetadata.selectText.5=Adicionar Entrada de Metadados Personalizada changeMetadata.submit=Alterar +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF para PDF/A diff --git a/src/main/resources/messages_pt_PT.properties b/src/main/resources/messages_pt_PT.properties index 88de5abf7..aff420608 100644 --- a/src/main/resources/messages_pt_PT.properties +++ b/src/main/resources/messages_pt_PT.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=Comprimir home.compressPdfs.desc=Comprimir PDFs para reduzir o seu tamanho. compressPdfs.tags=comprimir,pequeno,minúsculo +home.unlockPDFForms.title=Desbloquear Formulários do PDF +home.unlockPDFForms.desc=Remover propriedades de apenas leitura dos formulários de um PDF +unlockPDFForms.tags=remover,apagar,formulário,campo,apenas leitura home.changeMetadata.title=Alterar Metadados home.changeMetadata.desc=Alterar/Remover/Adicionar metadados de um documento PDF @@ -377,7 +380,6 @@ home.ocr.title=OCR / Limpeza de digitalizações home.ocr.desc=Limpa digitalizações e deteta texto de imagens dentro de um PDF e readiciona-o como texto. ocr.tags=reconhecimento,texto,imagem,digitalização,ler,identificar,deteção,editável - home.extractImages.title=Extrair Imagens home.extractImages.desc=Extrai todas as imagens de um PDF e guarda-as num zip extractImages.tags=imagem,foto,guardar,arquivo,zip,capturar,extrair @@ -607,6 +609,7 @@ login.userIsDisabled=O utilizador está desativado, o login está atualmente blo login.alreadyLoggedIn=Já tem sessão iniciada em login.alreadyLoggedIn2=dispositivos. Por favor termine sessão nesses dispositivos e tente novamente. login.toManySessions=Tem demasiadas sessões ativas +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=Redação Automática @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Outros Metadados: changeMetadata.selectText.5=Adicionar Entrada de Metadados Personalizada changeMetadata.submit=Alterar +#unlockPDFForms +unlockPDFForms.title=Desbloquear Formulários do PDF +unlockPDFForms.header=Desbloquear Formulários do PDF +unlockPDFForms.submit=Remover #pdfToPDFA pdfToPDFA.title=PDF Para PDF/A diff --git a/src/main/resources/messages_ro_RO.properties b/src/main/resources/messages_ro_RO.properties index 833c28329..8f43fa750 100644 --- a/src/main/resources/messages_ro_RO.properties +++ b/src/main/resources/messages_ro_RO.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=Comprimă home.compressPdfs.desc=Comprimă fișierele PDF pentru a reduce dimensiunea lor. compressPdfs.tags=comprimă,mic,minuscul +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=Schimbă Metadatele home.changeMetadata.desc=Schimbă/Elimină/Adaugă metadate într-un document PDF. @@ -377,7 +380,6 @@ home.ocr.title=OCR / Curățare scanări home.ocr.desc=Curăță scanările și detectează textul din imaginile dintr-un PDF și îl adaugă ca text. ocr.tags=recunoaștere,text,imagine,scanare,citește,identifică,detectare,editabil - home.extractImages.title=Extrage Imagini home.extractImages.desc=Extrage toate imaginile dintr-un PDF și le salvează într-un fișier zip. extractImages.tags=poză,fotografie,salvează,arhivă,zip,captură,extrage @@ -607,6 +609,7 @@ login.userIsDisabled=Utilizatorul este dezactivat, conectarea este în prezent b login.alreadyLoggedIn=You are already logged in to login.alreadyLoggedIn2=devices. Please log out of the devices and try again. login.toManySessions=You have too many active sessions +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=Redactare Automată @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Alte Metadate: changeMetadata.selectText.5=Adaugă Intrare Metadate Personalizate changeMetadata.submit=Schimbă +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF către PDF/A diff --git a/src/main/resources/messages_ru_RU.properties b/src/main/resources/messages_ru_RU.properties index 2d7dd4593..24743d85f 100644 --- a/src/main/resources/messages_ru_RU.properties +++ b/src/main/resources/messages_ru_RU.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=Сжать home.compressPdfs.desc=Сжимайте PDF-файлы для уменьшения их размера. compressPdfs.tags=сжатие,маленький,крошечный +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=Изменить метаданные home.changeMetadata.desc=Изменить/удалить/добавить метаданные из PDF-документа @@ -377,7 +380,6 @@ home.ocr.title=OCR / Очистка сканов home.ocr.desc=Очистка сканов и распознавание текста с изображений в PDF с последующим добавлением его как текст. ocr.tags=распознавание,текст,изображение,сканирование,чтение,идентификация,обнаружение,редактируемый - home.extractImages.title=Извлечь изображения home.extractImages.desc=Извлекает все изображения из PDF и сохраняет их в zip-архив extractImages.tags=картинка,фото,сохранение,архив,zip,захват,извлечение @@ -607,6 +609,7 @@ login.userIsDisabled=Пользователь деактивирован, вхо login.alreadyLoggedIn=Вы уже вошли в login.alreadyLoggedIn2=устройств(а). Пожалуйста, выйдите из этих устройств и попробуйте снова. login.toManySessions=У вас слишком много активных сессий +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=Автоматическое редактирование @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Другие метаданные: changeMetadata.selectText.5=Добавить пользовательскую запись метаданных changeMetadata.submit=Изменить +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF в PDF/A diff --git a/src/main/resources/messages_sk_SK.properties b/src/main/resources/messages_sk_SK.properties index 686d03bea..6b13ebbba 100644 --- a/src/main/resources/messages_sk_SK.properties +++ b/src/main/resources/messages_sk_SK.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=Komprimovať home.compressPdfs.desc=Komprimujte PDF na zmenšenie jeho veľkosti. compressPdfs.tags=stlačiť,malé,drobné +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=Zmeniť metadáta home.changeMetadata.desc=Zmena/Odstránenie/Pridanie metadát z PDF dokumentu @@ -377,7 +380,6 @@ home.ocr.title=OCR / Čistenie skenov home.ocr.desc=Čistenie skenov a rozpoznanie textu z obrázkov v PDF a opätovné pridanie ako text. ocr.tags=rozpoznanie,text,obrázok,scan,čítať,identifikovať,detekcia,upraviteľné - home.extractImages.title=Extrahovať obrázky home.extractImages.desc=Extrahuje všetky obrázky z PDF a uloží ich do zipu extractImages.tags=obrázok,fotografia,uložiť,archív,zip,zachytiť,chytiť @@ -607,6 +609,7 @@ login.userIsDisabled=User is deactivated, login is currently blocked with this u login.alreadyLoggedIn=You are already logged in to login.alreadyLoggedIn2=devices. Please log out of the devices and try again. login.toManySessions=You have too many active sessions +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=Automatické redigovanie @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Iné metadáta: changeMetadata.selectText.5=Pridať vlastný záznam metadát changeMetadata.submit=Zmeniť +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF na PDF/A diff --git a/src/main/resources/messages_sl_SI.properties b/src/main/resources/messages_sl_SI.properties index c7bdbb7af..1bd84b5f2 100644 --- a/src/main/resources/messages_sl_SI.properties +++ b/src/main/resources/messages_sl_SI.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=Stisni home.compressPdfs.desc=Stisnite PDF-je, da zmanjšate njihovo velikost. compressPdfs.tags=squish,small,tiny +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=Spremeni metapodatke home.changeMetadata.desc=Spremeni/Odstrani/Dodaj metapodatke iz dokumenta PDF @@ -377,7 +380,6 @@ home.ocr.title=OCR / Čistilni pregledi home.ocr.desc=Cleanup skenira in zazna besedilo iz slik znotraj PDF-ja in ga ponovno doda kot besedilo. ocr.tags=prepoznavanje,besedilo,slika,skeniranje,branje,prepoznavanje,zaznavanje,urejanje - home.extractImages.title=Izvleči slike home.extractImages.desc=Izvleče vse slike iz PDF-ja in jih shrani v zip extractImages.tags=slika,fotografija,shrani,arhiv,zip,zajemi,zgrabi @@ -607,6 +609,7 @@ login.userIsDisabled=Uporabnik je deaktiviran, prijava s tem uporabniškim imeno login.alreadyLoggedIn=Prijavljeni ste že v login.alreadyLoggedIn2=naprave. Odjavite se iz naprav in poskusite znova. login.toManySessions=Imate preveč aktivnih sej +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=Samodejno redigiraj @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Drugi metapodatki: changeMetadata.selectText.5=Dodaj vnos metapodatkov po meri changeMetadata.submit=Spremeni +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF v PDF/A diff --git a/src/main/resources/messages_sr_LATN_RS.properties b/src/main/resources/messages_sr_LATN_RS.properties index a33a47009..5f8cedab9 100644 --- a/src/main/resources/messages_sr_LATN_RS.properties +++ b/src/main/resources/messages_sr_LATN_RS.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=Kompresuj home.compressPdfs.desc=Kompresujte PDF-ove kako bi smanjili veličinu fajla. compressPdfs.tags=smanji,mali,minijaturni +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=Promena metapodataka home.changeMetadata.desc=Promenite/Uklonite/Dodajte metapodatke u PDF dokumentu @@ -377,7 +380,6 @@ home.ocr.title=OCR / Čišćenje skenova home.ocr.desc=Čišćenje skenova i detektovanje teksta sa slika unutar PDF-a i ponovno dodavanje kao teksta. ocr.tags=prepoznavanje,tekst,slika,sken,čitanje,identifikacija,detekcija,uređivanje - home.extractImages.title=Izvuci slike home.extractImages.desc=Izvlači sve slike iz PDF-a i čuva ih u zip formatu extractImages.tags=slika,foto,sačuvaj,arhiva,zip,zahvati,uhvati @@ -607,6 +609,7 @@ login.userIsDisabled=User is deactivated, login is currently blocked with this u login.alreadyLoggedIn=You are already logged in to login.alreadyLoggedIn2=devices. Please log out of the devices and try again. login.toManySessions=You have too many active sessions +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=Auto Cenzura @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Drugi metapodaci: changeMetadata.selectText.5=Dodaj prilagođeni unos metapodataka changeMetadata.submit=Promeni +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF u PDF/A diff --git a/src/main/resources/messages_sv_SE.properties b/src/main/resources/messages_sv_SE.properties index 807aa41c8..8e7d17877 100644 --- a/src/main/resources/messages_sv_SE.properties +++ b/src/main/resources/messages_sv_SE.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=Komprimera home.compressPdfs.desc=Komprimera PDF-filer för att minska deras filstorlek. compressPdfs.tags=pressa ihop,liten,minimal +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=Ändra metadata home.changeMetadata.desc=Ändra/ta bort/lägg till metadata från ett PDF-dokument @@ -377,7 +380,6 @@ home.ocr.title=OCR / Rensningsskanningar home.ocr.desc=Rengör skanningar och upptäcker text från bilder i en PDF och lägger till den igen som text. ocr.tags=igenkänning,text,bild,skanna,läsa,identifiera,detektering,redigerbar - home.extractImages.title=Extrahera bilder home.extractImages.desc=Extraherar alla bilder från en PDF och sparar dem till zip extractImages.tags=bild,foto,spara,arkiv,zip,fånga,ta @@ -607,6 +609,7 @@ login.userIsDisabled=Användaren är inaktiverad, inloggning är för närvarand login.alreadyLoggedIn=Du är redan inloggad på login.alreadyLoggedIn2=enheter. Logga ut från enheterna och försök igen. login.toManySessions=Du har för många aktiva sessioner +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=Auto-redigera @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Andra metadata: changeMetadata.selectText.5=Lägg till anpassad metadatapost changeMetadata.submit=Ändra +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF till PDF/A diff --git a/src/main/resources/messages_th_TH.properties b/src/main/resources/messages_th_TH.properties index a3d3b962c..e434746ea 100644 --- a/src/main/resources/messages_th_TH.properties +++ b/src/main/resources/messages_th_TH.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=บีบอัด home.compressPdfs.desc=บีบอัด PDF เพื่อลดขนาดไฟล์ compressPdfs.tags=ย่อ, เล็ก, จิ๋ว +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=เปลี่ยนข้อมูลเมตา home.changeMetadata.desc=เปลี่ยน/ลบ/เพิ่มข้อมูลเมตาจากเอกสาร PDF @@ -377,7 +380,6 @@ home.ocr.title=OCR / ทำความสะอาดการสแกน home.ocr.desc=ทำความสะอาดการสแกนและตรวจจับข้อความจากภาพภายใน PDF และเพิ่มเป็นข้อความอีกครั้ง ocr.tags=การรู้จำ, ข้อความ, รูปภาพ, การสแกน, อ่าน, ระบุ, ตรวจจับ, แก้ไขได้ - home.extractImages.title=แยกรูปภาพ home.extractImages.desc=แยกรูปภาพทั้งหมดจาก PDF และบันทึกในรูปแบบ zip extractImages.tags=รูปภาพ, ภาพ, บันทึก, เก็บถาวร, zip, จับ, รับ @@ -607,6 +609,7 @@ login.userIsDisabled=ผู้ใช้งานถูกระงับกา login.alreadyLoggedIn=คุณได้เข้าสู่ระบบใน login.alreadyLoggedIn2=อุปกรณ์แล้ว กรุณาออกจากระบบจากอุปกรณ์ที่ใช้งานอยู่แล้ว จากนั้นลองใหม่อีกครั้ง login.toManySessions=คุณมีการเข้าสู่ระบบพร้อมกันเกินกว่ากำหนด +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=ซ่อนข้อมูลอัตโนมัติ @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=ข้อมูลเมตาอื่น ๆ: changeMetadata.selectText.5=เพิ่มรายการข้อมูลเมตาที่กำหนดเอง changeMetadata.submit=เปลี่ยน +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF เป็น PDF/A diff --git a/src/main/resources/messages_tr_TR.properties b/src/main/resources/messages_tr_TR.properties index ba08e4094..2eeb85c08 100644 --- a/src/main/resources/messages_tr_TR.properties +++ b/src/main/resources/messages_tr_TR.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=Sıkıştır home.compressPdfs.desc=PDF'lerin dosya boyutunu azaltmak için sıkıştırın. compressPdfs.tags=sıkıştır,küçük,minik +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=Metaveriyi Değiştir home.changeMetadata.desc=Bir PDF belgesinden metaveriyi değiştir/kaldır/ekle @@ -377,7 +380,6 @@ home.ocr.title=OCR / Taramaları Temizle home.ocr.desc=Taramaları temizler ve bir PDF içindeki resimlerden metni algılar ve tekrar metin olarak ekler. ocr.tags=tanıma,metin,resim,tarama,okuma,tanımlama,algılama,düzenlenebilir - home.extractImages.title=Resimleri Çıkar home.extractImages.desc=Bir PDF'ten tüm resimleri çıkarır ve bunları zip olarak kaydeder. extractImages.tags=fotoğraf,resim,kaydet,arşiv,zip,yakala,al @@ -607,6 +609,7 @@ login.userIsDisabled=Kullanıcı devre dışı bırakıldı, şu anda bu kullan login.alreadyLoggedIn=Zaten şu cihazlarda oturum açılmış: login.alreadyLoggedIn2=Lütfen bu cihazlardan çıkış yaparak tekrar deneyin. login.toManySessions=Çok fazla aktif oturumunuz var +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=Otomatik Karartma @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Diğer Metaveri: changeMetadata.selectText.5=Özel Metaveri Girişi Ekle changeMetadata.submit=Değiştir +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF'den PDF/A'ya diff --git a/src/main/resources/messages_uk_UA.properties b/src/main/resources/messages_uk_UA.properties index ee8a9708a..61b51c533 100644 --- a/src/main/resources/messages_uk_UA.properties +++ b/src/main/resources/messages_uk_UA.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=Стиснути home.compressPdfs.desc=Стискайте PDF-файли, щоб зменшити їх розмір. compressPdfs.tags=стиск,маленький,крихітний +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=Змінити метадані home.changeMetadata.desc=Змінити/видалити/додати метадані з документа PDF @@ -377,7 +380,6 @@ home.ocr.title=OCR/Очищення сканування home.ocr.desc=Очищення сканування та виявлення тексту на зображеннях у файлі PDF та повторне додавання його як текст. ocr.tags=розпізнавання,текст,зображення,сканування,читання,ідентифікація,виявлення,редагований - home.extractImages.title=Витягнути зображення home.extractImages.desc=Витягує всі зображення з PDF і зберігає їх у zip extractImages.tags=зображення,фото,збереження,архів,zip,захоплення,захоплення @@ -607,6 +609,7 @@ login.userIsDisabled=Користувач деактивовано, вхід з login.alreadyLoggedIn=Ви вже увійшли до login.alreadyLoggedIn2=пристроїв (а). Будь ласка, вийдіть із цих пристроїв і спробуйте знову. login.toManySessions=У вас дуже багато активних сесій +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=Автоматичне редагування @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Інші метадані: changeMetadata.selectText.5=Додати користувацький запис метаданих changeMetadata.submit=Змінити +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF в PDF/A diff --git a/src/main/resources/messages_vi_VN.properties b/src/main/resources/messages_vi_VN.properties index 8aa86f96f..4b3d75dd9 100644 --- a/src/main/resources/messages_vi_VN.properties +++ b/src/main/resources/messages_vi_VN.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=Nén home.compressPdfs.desc=Nén PDF để giảm kích thước tệp. compressPdfs.tags=ép,nhỏ,nhỏ gọn +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=Thay đổi Metadata home.changeMetadata.desc=Thay đổi/Xóa/Thêm metadata từ tài liệu PDF @@ -377,7 +380,6 @@ home.ocr.title=OCR / Dọn dẹp bản quét home.ocr.desc=Dọn dẹp bản quét và phát hiện văn bản từ hình ảnh trong PDF và thêm lại dưới dạng văn bản. ocr.tags=nhận dạng,văn bản,hình ảnh,quét,đọc,nhận dạng,phát hiện,có thể chỉnh sửa - home.extractImages.title=Trích xuất hình ảnh home.extractImages.desc=Trích xuất tất cả hình ảnh từ PDF và lưu chúng vào tệp zip extractImages.tags=hình ảnh,ảnh,lưu,lưu trữ,zip,chụp,lấy @@ -607,6 +609,7 @@ login.userIsDisabled=User is deactivated, login is currently blocked with this u login.alreadyLoggedIn=You are already logged in to login.alreadyLoggedIn2=devices. Please log out of the devices and try again. login.toManySessions=You have too many active sessions +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=Tự động biên tập @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=Metadata khác: changeMetadata.selectText.5=Thêm mục metadata tùy chỉnh changeMetadata.submit=Thay đổi +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF sang PDF/A diff --git a/src/main/resources/messages_zh_BO.properties b/src/main/resources/messages_zh_BO.properties index e1ae1e595..8e4e316da 100644 --- a/src/main/resources/messages_zh_BO.properties +++ b/src/main/resources/messages_zh_BO.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=སྡུད་སྒྲིལ། home.compressPdfs.desc=ཡིག་ཆའི་ཆེ་ཆུང་ཆུང་དུ་གཏོང་ཆེད་ PDF སྡུད་སྒྲིལ་བྱེད་པ། compressPdfs.tags=བསྡུས་པ།,ཆུང་ཆུང་།,ཆུང་ཆུང་། +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=གནས་ཆ་སྒྱུར་བཅོས། home.changeMetadata.desc=PDF ཡིག་ཆ་ནས་གནས་ཆ་བསྒྱུར་བའམ་སུབ་པ།སྣོན་པ། @@ -377,7 +380,6 @@ home.ocr.title=OCR / བཤེར་འབེབས་གཙང་སེལ། home.ocr.desc=བཤེར་འབེབས་གཙང་སེལ་དང་ PDF ནང་གི་པར་རིས་ནས་ཡི་གེ་ངོས་འཛིན་བྱས་ཏེ་ཡི་གེའི་རྣམ་པར་བསྐྱར་སྣོན་བྱེད་པ། ocr.tags=ངོས་འཛིན།,ཡི་གེ,པར་རིས།,བཤེར་འབེབས།,ཀློག་པ།,ངོས་འཛིན།,འཚོལ་ཞིབ།,རྩོམ་སྒྲིག་རུང་བ། - home.extractImages.title=པར་རིས་ཕྱིར་འདོན། home.extractImages.desc=PDF ནས་པར་རིས་ཚང་མ་ཕྱིར་བཏོན་ནས་ zip ནང་ཉར་ཚགས་བྱེད་པ། extractImages.tags=པར།,འདྲ་པར།,ཉར་ཚགས།,ཡིག་མཛོད།,zip,འཛིན་པ།,ལེན་པ། @@ -607,6 +609,7 @@ login.userIsDisabled=སྤྱོད་མཁན་བཀག་སྡོམ་ login.alreadyLoggedIn=ཁྱེད་རང་ login.alreadyLoggedIn2=སྒྲིག་ཆས་ནང་ནང་འཛུལ་བྱས་ཟིན། སྒྲིག་ཆས་ནས་ཕྱིར་འཐེན་བྱས་ནས་ཡང་བསྐྱར་ཚོད་ལྟ་བྱེད་རོགས། login.toManySessions=ཁྱེད་ལ་འཛུལ་ཞུགས་བྱས་པའི་གནས་སྐབས་མང་དྲགས་འདུག +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=རང་འགུལ་སྒྲིབ་སྲུང་། @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=གནས་ཚུལ་ཞིབ་ཕྲ་གཞ changeMetadata.selectText.5=རང་སྒྲིག་གནས་ཚུལ་ཞིབ་ཕྲ་གསར་སྣོན། changeMetadata.submit=བསྒྱུར་བ། +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF ནས་ PDF/A ལ། diff --git a/src/main/resources/messages_zh_CN.properties b/src/main/resources/messages_zh_CN.properties index d617cebae..e04c77fbd 100644 --- a/src/main/resources/messages_zh_CN.properties +++ b/src/main/resources/messages_zh_CN.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=压缩 home.compressPdfs.desc=压缩 PDF 文件以减小文件大小。 compressPdfs.tags=压缩、小、微小 +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=更改元数据 home.changeMetadata.desc=更改/删除/添加 PDF 文档的元数据。 @@ -377,7 +380,6 @@ home.ocr.title=运行 OCR /清理扫描 home.ocr.desc=清理和识别 PDF 中的图像文本,并将其转换为可编辑文本。 ocr.tags=识别、文本、图像、扫描、阅读、识别、检测、可编辑 - home.extractImages.title=提取图像 home.extractImages.desc=从 PDF 中提取所有图像并保存到压缩包中。 extractImages.tags=图片、照片、保存、归档、压缩包、截取、抓取 @@ -607,6 +609,7 @@ login.userIsDisabled=用户被禁用,登录已被阻止。请联系管理员 login.alreadyLoggedIn=您已经登录到了 login.alreadyLoggedIn2=设备,请注销设备后重试。 login.toManySessions=你已经有太多的会话了。请注销一些设备后重试。 +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=自动删除 @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=其他元数据: changeMetadata.selectText.5=添加自定义元数据条目 changeMetadata.submit=更改 +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF 转 PDF/A diff --git a/src/main/resources/messages_zh_TW.properties b/src/main/resources/messages_zh_TW.properties index 80f85457d..ea67d4ce3 100644 --- a/src/main/resources/messages_zh_TW.properties +++ b/src/main/resources/messages_zh_TW.properties @@ -364,6 +364,9 @@ home.compressPdfs.title=壓縮 home.compressPdfs.desc=壓縮 PDF 以減少其檔案大小。 compressPdfs.tags=壓縮,小,微小 +home.unlockPDFForms.title=Unlock PDF Forms +home.unlockPDFForms.desc=Remove read-only property of form fields in a PDF document. +unlockPDFForms.tags=remove,delete,form,field,readonly home.changeMetadata.title=變更中繼資料 home.changeMetadata.desc=從 PDF 檔案中變更/移除/新增中繼資料 @@ -377,7 +380,6 @@ home.ocr.title=OCR / 清理掃描 home.ocr.desc=清理掃描並從 PDF 中的影像中偵測文字並重新新增為文字。 ocr.tags=識別,文字,影像,掃描,讀取,識別,偵測,可編輯 - home.extractImages.title=提取圖片 home.extractImages.desc=從 PDF 中提取所有圖片並將它們儲存到壓縮檔中 extractImages.tags=圖片,照片,儲存,存檔,壓縮檔,捕獲,抓取 @@ -607,6 +609,7 @@ login.userIsDisabled=使用者已停用,目前此使用者無法登入。請 login.alreadyLoggedIn=您已經登入了 login.alreadyLoggedIn2=部裝置。請先從這些裝置登出後再試一次。 login.toManySessions=您有太多使用中的工作階段 +login.logoutMessage=You have been logged out. #auto-redact autoRedact.title=自動塗黑 @@ -1193,6 +1196,10 @@ changeMetadata.selectText.4=其他中繼資料: changeMetadata.selectText.5=新增自訂中繼資料項目 changeMetadata.submit=變更 +#unlockPDFForms +unlockPDFForms.title=Remove Read-Only from Form Fields +unlockPDFForms.header=Unlock PDF Forms +unlockPDFForms.submit=Remove #pdfToPDFA pdfToPDFA.title=PDF 轉 PDF/A diff --git a/src/main/resources/settings.yml.template b/src/main/resources/settings.yml.template index 1c3ee32ae..201f875dd 100644 --- a/src/main/resources/settings.yml.template +++ b/src/main/resources/settings.yml.template @@ -76,6 +76,14 @@ premium: apiKey: '' appId: '' +mail: + enabled: true # set to 'true' to enable sending emails + host: smtp.example.com # SMTP server hostname + port: 587 # SMTP server port + username: '' # SMTP server username + password: '' # SMTP server password + from: '' # sender email address + legal: termsAndConditions: https://www.stirlingpdf.com/terms-and-conditions # URL to the terms and conditions of your application (e.g. https://example.com/terms). Empty string to disable or filename to load from local file in static folder privacyPolicy: https://www.stirlingpdf.com/privacy-policy # URL to the privacy policy of your application (e.g. https://example.com/privacy). Empty string to disable or filename to load from local file in static folder diff --git a/src/main/resources/static/3rdPartyLicenses.json b/src/main/resources/static/3rdPartyLicenses.json index 8d07e6104..da8718489 100644 --- a/src/main/resources/static/3rdPartyLicenses.json +++ b/src/main/resources/static/3rdPartyLicenses.json @@ -128,7 +128,7 @@ }, { "moduleName": "com.fathzer:javaluator", - "moduleVersion": "3.0.5", + "moduleVersion": "3.0.6", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, @@ -270,7 +270,7 @@ { "moduleName": "com.opencsv:opencsv", "moduleUrl": "http://opencsv.sf.net", - "moduleVersion": "5.10", + "moduleVersion": "5.11", "moduleLicense": "Apache 2", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, @@ -546,7 +546,7 @@ { "moduleName": "io.micrometer:micrometer-commons", "moduleUrl": "https://github.com/micrometer-metrics/micrometer", - "moduleVersion": "1.14.5", + "moduleVersion": "1.14.6", "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, @@ -560,21 +560,21 @@ { "moduleName": "io.micrometer:micrometer-jakarta9", "moduleUrl": "https://github.com/micrometer-metrics/micrometer", - "moduleVersion": "1.14.5", + "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", - "moduleVersion": "1.14.5", + "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-registry-prometheus", "moduleUrl": "https://github.com/micrometer-metrics/micrometer", - "moduleVersion": "1.14.5", + "moduleVersion": "1.14.6", "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, @@ -623,21 +623,21 @@ { "moduleName": "io.swagger.core.v3:swagger-annotations-jakarta", "moduleUrl": "https://github.com/swagger-api/swagger-core/modules/swagger-annotations", - "moduleVersion": "2.2.15", + "moduleVersion": "2.2.30", "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.15", + "moduleVersion": "2.2.30", "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.15", + "moduleVersion": "2.2.30", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, @@ -871,7 +871,7 @@ { "moduleName": "org.apache.pdfbox:fontbox", "moduleUrl": "https://pdfbox.apache.org", - "moduleVersion": "3.0.4", + "moduleVersion": "3.0.5", "moduleLicense": "Apache-2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, @@ -884,28 +884,28 @@ { "moduleName": "org.apache.pdfbox:pdfbox", "moduleUrl": "https://pdfbox.apache.org", - "moduleVersion": "3.0.4", + "moduleVersion": "3.0.5", "moduleLicense": "Apache-2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, { "moduleName": "org.apache.pdfbox:pdfbox-io", "moduleUrl": "https://pdfbox.apache.org", - "moduleVersion": "3.0.4", + "moduleVersion": "3.0.5", "moduleLicense": "Apache-2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, { "moduleName": "org.apache.pdfbox:preflight", "moduleUrl": "https://pdfbox.apache.org", - "moduleVersion": "3.0.4", + "moduleVersion": "3.0.5", "moduleLicense": "Apache-2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, { "moduleName": "org.apache.pdfbox:xmpbox", "moduleUrl": "https://pdfbox.apache.org", - "moduleVersion": "3.0.4", + "moduleVersion": "3.0.5", "moduleLicense": "Apache-2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, @@ -919,7 +919,7 @@ { "moduleName": "org.apache.tomcat.embed:tomcat-embed-el", "moduleUrl": "https://tomcat.apache.org/", - "moduleVersion": "10.1.39", + "moduleVersion": "10.1.40", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, @@ -946,7 +946,7 @@ { "moduleName": "org.aspectj:aspectjweaver", "moduleUrl": "https://www.eclipse.org/aspectj/", - "moduleVersion": "1.9.23", + "moduleVersion": "1.9.24", "moduleLicense": "Eclipse Public License - v 2.0", "moduleLicenseUrl": "https://www.eclipse.org/org/documents/epl-2.0/EPL-2.0.txt" }, @@ -1011,185 +1011,192 @@ "moduleLicense": "GNU General Public License, version 2 with the GNU Classpath Exception", "moduleLicenseUrl": "https://www.gnu.org/software/classpath/license.html" }, + { + "moduleName": "org.eclipse.angus:jakarta.mail", + "moduleUrl": "https://www.eclipse.org", + "moduleVersion": "2.0.3", + "moduleLicense": "GPL2 w/ CPE", + "moduleLicenseUrl": "https://www.gnu.org/software/classpath/license.html" + }, { "moduleName": "org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-client", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.18", + "moduleVersion": "12.0.19", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-common", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.18", + "moduleVersion": "12.0.19", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-server", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.18", + "moduleVersion": "12.0.19", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jetty-server", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.18", + "moduleVersion": "12.0.19", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-servlet", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.18", + "moduleVersion": "12.0.19", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.ee10:jetty-ee10-annotations", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.18", + "moduleVersion": "12.0.19", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.ee10:jetty-ee10-plus", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.18", + "moduleVersion": "12.0.19", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.ee10:jetty-ee10-servlet", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.18", + "moduleVersion": "12.0.19", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.ee10:jetty-ee10-servlets", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.18", + "moduleVersion": "12.0.19", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.ee10:jetty-ee10-webapp", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.18", + "moduleVersion": "12.0.19", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.websocket:jetty-websocket-core-client", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.18", + "moduleVersion": "12.0.19", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.websocket:jetty-websocket-core-common", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.18", + "moduleVersion": "12.0.19", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.websocket:jetty-websocket-core-server", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.18", + "moduleVersion": "12.0.19", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.websocket:jetty-websocket-jetty-api", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.18", + "moduleVersion": "12.0.19", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty.websocket:jetty-websocket-jetty-common", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.18", + "moduleVersion": "12.0.19", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-alpn-client", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.18", + "moduleVersion": "12.0.19", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-client", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.18", + "moduleVersion": "12.0.19", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-ee", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.18", + "moduleVersion": "12.0.19", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-http", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.18", + "moduleVersion": "12.0.19", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-io", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.18", + "moduleVersion": "12.0.19", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-plus", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.18", + "moduleVersion": "12.0.19", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-security", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.18", + "moduleVersion": "12.0.19", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-server", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.18", + "moduleVersion": "12.0.19", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-session", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.18", + "moduleVersion": "12.0.19", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-util", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.18", + "moduleVersion": "12.0.19", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, { "moduleName": "org.eclipse.jetty:jetty-xml", "moduleUrl": "https://jetty.org/", - "moduleVersion": "12.0.18", + "moduleVersion": "12.0.19", "moduleLicense": "Eclipse Public License - Version 2.0", "moduleLicenseUrl": "https://www.eclipse.org/legal/epl-2.0/" }, @@ -1231,10 +1238,16 @@ { "moduleName": "org.hibernate.orm:hibernate-core", "moduleUrl": "https://www.hibernate.org/orm/6.6", - "moduleVersion": "6.6.11.Final", + "moduleVersion": "6.6.13.Final", "moduleLicense": "GNU Library General Public License v2.1 or later", "moduleLicenseUrl": "https://www.opensource.org/licenses/LGPL-2.1" }, + { + "moduleName": "org.hibernate.validator:hibernate-validator", + "moduleVersion": "8.0.2.Final", + "moduleLicense": "Apache License 2.0", + "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" + }, { "moduleName": "org.jboss.logging:jboss-logging", "moduleUrl": "http://www.jboss.org", @@ -1256,6 +1269,13 @@ "moduleLicense": "The MIT License", "moduleLicenseUrl": "https://jsoup.org/license" }, + { + "moduleName": "org.jspecify:jspecify", + "moduleUrl": "https://jspecify.dev/docs/start-here", + "moduleVersion": "1.0.0", + "moduleLicense": "The Apache License, Version 2.0", + "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" + }, { "moduleName": "org.latencyutils:LatencyUtils", "moduleUrl": "http://latencyutils.github.io/LatencyUtils/", @@ -1416,292 +1436,313 @@ }, { "moduleName": "org.springdoc:springdoc-openapi-starter-common", - "moduleVersion": "2.2.0", + "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.2.0", + "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.2.0", + "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.4", + "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-actuator", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.4.4", + "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-actuator-autoconfigure", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.4.4", + "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", - "moduleVersion": "3.4.4", + "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-devtools", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.4.4", + "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", - "moduleVersion": "3.4.4", + "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-actuator", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.4.4", + "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-data-jpa", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.4.4", + "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-jdbc", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.4.4", + "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-jetty", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.4.4", + "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", - "moduleVersion": "3.4.4", + "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", - "moduleVersion": "3.4.4", + "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-mail", + "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-oauth2-client", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.4.4", + "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-security", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.4.4", + "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", - "moduleVersion": "3.4.4", + "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-validation", + "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", - "moduleVersion": "3.4.4", + "moduleVersion": "3.4.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.data:spring-data-commons", "moduleUrl": "https://spring.io/projects/spring-data", - "moduleVersion": "3.4.4", + "moduleVersion": "3.4.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.data:spring-data-jpa", "moduleUrl": "https://projects.spring.io/spring-data-jpa", - "moduleVersion": "3.4.4", + "moduleVersion": "3.4.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.security:spring-security-config", "moduleUrl": "https://spring.io/projects/spring-security", - "moduleVersion": "6.4.4", + "moduleVersion": "6.4.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.security:spring-security-core", "moduleUrl": "https://spring.io/projects/spring-security", - "moduleVersion": "6.4.4", + "moduleVersion": "6.4.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.security:spring-security-crypto", "moduleUrl": "https://spring.io/projects/spring-security", - "moduleVersion": "6.4.4", + "moduleVersion": "6.4.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.security:spring-security-oauth2-client", "moduleUrl": "https://spring.io/projects/spring-security", - "moduleVersion": "6.4.4", + "moduleVersion": "6.4.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.security:spring-security-oauth2-core", "moduleUrl": "https://spring.io/projects/spring-security", - "moduleVersion": "6.4.4", + "moduleVersion": "6.4.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.security:spring-security-oauth2-jose", "moduleUrl": "https://spring.io/projects/spring-security", - "moduleVersion": "6.4.4", + "moduleVersion": "6.4.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.security:spring-security-saml2-service-provider", "moduleUrl": "https://spring.io/projects/spring-security", - "moduleVersion": "6.4.4", + "moduleVersion": "6.4.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.security:spring-security-web", "moduleUrl": "https://spring.io/projects/spring-security", - "moduleVersion": "6.4.4", + "moduleVersion": "6.4.5", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.session:spring-session-core", "moduleUrl": "https://spring.io/projects/spring-session", - "moduleVersion": "3.4.2", + "moduleVersion": "3.4.3", "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.5", + "moduleVersion": "6.2.6", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-aspects", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.2.5", + "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", - "moduleVersion": "6.2.5", + "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", - "moduleVersion": "6.2.5", + "moduleVersion": "6.2.6", + "moduleLicense": "Apache License, Version 2.0", + "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" + }, + { + "moduleName": "org.springframework:spring-context-support", + "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", - "moduleVersion": "6.2.5", + "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", - "moduleVersion": "6.2.5", + "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", - "moduleVersion": "6.2.5", + "moduleVersion": "6.2.6", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-jdbc", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.2.5", + "moduleVersion": "6.2.6", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-orm", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.2.5", + "moduleVersion": "6.2.6", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework:spring-tx", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.2.5", + "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", - "moduleVersion": "6.2.5", + "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", - "moduleVersion": "6.2.5", + "moduleVersion": "6.2.6", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, @@ -1738,10 +1779,16 @@ }, { "moduleName": "org.webjars:swagger-ui", - "moduleUrl": "http://webjars.org", - "moduleVersion": "5.2.0", - "moduleLicense": "Apache 2.0", - "moduleLicenseUrl": "https://github.com/swagger-api/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.yaml:snakeyaml", diff --git a/src/main/resources/static/css/footer.css b/src/main/resources/static/css/footer.css index 4a85e7566..3945b1b43 100644 --- a/src/main/resources/static/css/footer.css +++ b/src/main/resources/static/css/footer.css @@ -37,3 +37,24 @@ text-decoration: none; cursor: pointer; } + +.footer-link-list { + display: flex; + flex-direction: row; /* Align links in a row */ +} + +/* Responsive styles for smaller screens */ +@media (max-width: 650px) { + .footer-link { + font-size: 0.8rem; /* Adjust font size for smaller screens */ + } +} + +@media (max-width: 550px) { + .footer-link { + font-size: 1rem; /* Adjust font size for smaller screens */ + } + .footer-link-list{ + flex-direction: column; /* Stack links vertically on smaller screens */ + } +} \ No newline at end of file diff --git a/src/main/resources/static/js/multitool/PdfContainer.js b/src/main/resources/static/js/multitool/PdfContainer.js index 72dd7f4c0..90d130b2f 100644 --- a/src/main/resources/static/js/multitool/PdfContainer.js +++ b/src/main/resources/static/js/multitool/PdfContainer.js @@ -34,7 +34,8 @@ class PdfContainer { this.splitPDF = this.splitPDF.bind(this); this.splitAll = this.splitAll.bind(this); this.deleteSelected = this.deleteSelected.bind(this); - this.toggleSelectAll = this.toggleSelectAll.bind(this); + this.selectAll = this.selectAll.bind(this); + this.deselectAll = this.deselectAll.bind(this); this.updateSelectedPagesDisplay = this.updateSelectedPagesDisplay.bind(this); this.toggleSelectPageVisibility = this.toggleSelectPageVisibility.bind(this); this.updatePagesFromCSV = this.updatePagesFromCSV.bind(this); @@ -63,7 +64,8 @@ class PdfContainer { window.rotateAll = this.rotateAll; window.splitAll = this.splitAll; window.deleteSelected = this.deleteSelected; - window.toggleSelectAll = this.toggleSelectAll; + window.selectAll = this.selectAll; + window.deselectAll = this.deselectAll; window.updateSelectedPagesDisplay = this.updateSelectedPagesDisplay; window.toggleSelectPageVisibility = this.toggleSelectPageVisibility; window.updatePagesFromCSV = this.updatePagesFromCSV; @@ -72,7 +74,6 @@ class PdfContainer { window.addFilesBlankAll = this.addFilesBlankAll; window.removeAllElements = this.removeAllElements; window.resetPages = this.resetPages; - window.selectAll = false; let undoBtn = document.getElementById('undo-btn'); let redoBtn = document.getElementById('redo-btn'); @@ -433,33 +434,43 @@ class PdfContainer { this.undoManager.pushUndoClearRedo(removeSelectedCommand); } - toggleSelectAll() { + selectAll() { const checkboxes = document.querySelectorAll('.pdf-actions_checkbox'); - window.selectAll = !window.selectAll; const selectIcon = document.getElementById('select-All-Container'); const deselectIcon = document.getElementById('deselect-All-Container'); - if (!window.selectAll) { - this.showButton(selectIcon, true); - this.showButton(deselectIcon, false); - } else { - this.showButton(selectIcon, false); - this.showButton(deselectIcon, true); - } + this.showButton(selectIcon, false); + this.showButton(deselectIcon, true); + checkboxes.forEach((checkbox) => { - checkbox.checked = window.selectAll; + checkbox.checked = true; const pageNumber = Array.from(checkbox.parentNode.parentNode.children).indexOf(checkbox.parentNode) + 1; - if (checkbox.checked) { - if (!window.selectedPages.includes(pageNumber)) { - window.selectedPages.push(pageNumber); - } - } else { - const index = window.selectedPages.indexOf(pageNumber); - if (index !== -1) { - window.selectedPages.splice(index, 1); - } + if (!window.selectedPages.includes(pageNumber)) { + window.selectedPages.push(pageNumber); + } + }); + + this.updateSelectedPagesDisplay(); + } + + deselectAll() { + const checkboxes = document.querySelectorAll('.pdf-actions_checkbox'); + const selectIcon = document.getElementById('select-All-Container'); + const deselectIcon = document.getElementById('deselect-All-Container'); + + this.showButton(selectIcon, true); + this.showButton(deselectIcon, false); + + checkboxes.forEach((checkbox) => { + checkbox.checked = false; + + const pageNumber = Array.from(checkbox.parentNode.parentNode.children).indexOf(checkbox.parentNode) + 1; + + const index = window.selectedPages.indexOf(pageNumber); + if (index !== -1) { + window.selectedPages.splice(index, 1); } }); @@ -569,6 +580,34 @@ class PdfContainer { // Update the input field with the formatted page list selectedPagesInput.value = this.formatSelectedPages(window.selectedPages); + + const selectIcon = document.getElementById('select-All-Container'); + const deselectIcon = document.getElementById('deselect-All-Container'); + + if (window.selectPage) { // Check if selectPage mode is active + console.log("Page Select on. Showing buttons"); + //Check if no pages are selected + if (window.selectedPages.length === 0) { + this.showButton(selectIcon, true); + this.showButton(deselectIcon, false); + } else { + this.showButton(deselectIcon, true); + } + + //Check if all pages are selected + const allCheckboxes = document.querySelectorAll('.pdf-actions_checkbox'); + const allSelected = Array.from(allCheckboxes).every((checkbox) => checkbox.checked); + if (allSelected) { + this.showButton(selectIcon, false); + this.showButton(deselectIcon, true); + } else { + this.showButton(selectIcon, true); + } + } else { + console.log("Page Select off. Hidding buttons"); + this.showButton(selectIcon, false); + this.showButton(deselectIcon, false); + } } parsePageRanges(ranges) { @@ -793,13 +832,9 @@ class PdfContainer { }); const checkboxes = document.querySelectorAll('.pdf-actions_checkbox'); - window.selectAll = false; const selectIcon = document.getElementById('select-All-Container'); const deselectIcon = document.getElementById('deselect-All-Container'); - selectIcon.style.display = 'inline'; - deselectIcon.style.display = 'none'; - checkboxes.forEach((checkbox) => { const pageNumber = Array.from(checkbox.parentNode.parentNode.children).indexOf(checkbox.parentNode) + 1; @@ -852,18 +887,30 @@ class PdfContainer { deleteButton.classList.toggle('hidden', !window.selectPage); const selectedPages = document.getElementById('selected-pages-display'); selectedPages.classList.toggle('hidden', !window.selectPage); + if(!window.selectPage) { this.showButton(document.getElementById('deselect-All-Container'), false); this.showButton(document.getElementById('select-All-Container'), false); - } - else if(window.selectAll){ - this.showButton(document.getElementById('deselect-All-Container'), true); - this.showButton(document.getElementById('select-All-Container'), false); + + // Uncheck all checkboxes and clear selected pages + const allCheckboxes = document.querySelectorAll('.pdf-actions_checkbox'); + allCheckboxes.forEach((checkbox) => { + checkbox.checked = false; + }); + window.selectedPages = []; + this.updateSelectedPagesDisplay(); } else{ - this.showButton(document.getElementById('deselect-All-Container'), false); - this.showButton(document.getElementById('select-All-Container'), true); + const allCheckboxes = document.querySelectorAll('.pdf-actions_checkbox'); + const allSelected = Array.from(allCheckboxes).every((checkbox) => checkbox.checked); + if (!allSelected) { + this.showButton(document.getElementById('select-All-Container'), true); + } + + if (window.selectedPages.length > 0) { + this.showButton(document.getElementById('deselect-All-Container'), true); + } } const exportSelected = document.getElementById('export-selected-button'); diff --git a/src/main/resources/static/js/pages/home.js b/src/main/resources/static/js/pages/home.js index 7872374eb..6c48fe81d 100644 --- a/src/main/resources/static/js/pages/home.js +++ b/src/main/resources/static/js/pages/home.js @@ -61,6 +61,10 @@ document.addEventListener('DOMContentLoaded', function () { localStorage.setItem('pageViews', pageViews.toString()); function shouldShowSurvey() { + if(!window.showSurvey) { + return false; + } + if (localStorage.getItem('dontShowSurvey') === 'true' || localStorage.getItem('surveyTaken') === 'true') { return false; } @@ -112,7 +116,7 @@ function setAsDefault(value) { function adjustVisibleElements() { const container = document.querySelector('.recent-features'); - if(!container) return; + if(!container) return; const subElements = Array.from(container.children); let totalWidth = 0; diff --git a/src/main/resources/templates/fragments/footer.html b/src/main/resources/templates/fragments/footer.html index a3c99e46a..324f550d9 100644 --- a/src/main/resources/templates/fragments/footer.html +++ b/src/main/resources/templates/fragments/footer.html @@ -4,7 +4,7 @@
diff --git a/src/main/resources/templates/home-legacy.html b/src/main/resources/templates/home-legacy.html index 62ad658f8..d60ac220e 100644 --- a/src/main/resources/templates/home-legacy.html +++ b/src/main/resources/templates/home-legacy.html @@ -287,6 +287,9 @@
+
+
diff --git a/src/main/resources/templates/home.html b/src/main/resources/templates/home.html index 925aefe8e..3842c1fe7 100644 --- a/src/main/resources/templates/home.html +++ b/src/main/resources/templates/home.html @@ -218,6 +218,8 @@ /**/ + + window.showSurvey = /*[[${showSurveyFromDocker}]]*/ true diff --git a/src/main/resources/templates/login.html b/src/main/resources/templates/login.html index a359b20e3..ae12e5210 100644 --- a/src/main/resources/templates/login.html +++ b/src/main/resources/templates/login.html @@ -112,7 +112,7 @@
OAuth2: Error Message
-
+
Default message if not found
diff --git a/src/main/resources/templates/misc/unlock-pdf-forms.html b/src/main/resources/templates/misc/unlock-pdf-forms.html new file mode 100644 index 000000000..11fc43515 --- /dev/null +++ b/src/main/resources/templates/misc/unlock-pdf-forms.html @@ -0,0 +1,34 @@ + + + + + + + +
+
+ +

+
+
+ +
+
+ preview_off + +
+
+
+
+
+
+ +
+
+
+
+
+ +
+ + diff --git a/src/main/resources/templates/multi-tool.html b/src/main/resources/templates/multi-tool.html index 3c6c60fba..173b92838 100644 --- a/src/main/resources/templates/multi-tool.html +++ b/src/main/resources/templates/multi-tool.html @@ -94,11 +94,11 @@