diff --git a/.github/workflows/PR-Demo-Comment.yml b/.github/workflows/PR-Demo-Comment.yml index c248d657..33321d2e 100644 --- a/.github/workflows/PR-Demo-Comment.yml +++ b/.github/workflows/PR-Demo-Comment.yml @@ -37,7 +37,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit @@ -82,7 +82,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit @@ -103,6 +103,7 @@ jobs: run: ./gradlew clean build env: DOCKER_ENABLE_SECURITY: false + STIRLING_PDF_DESKTOP_UI: false - name: Set up Docker Buildx uses: docker/setup-buildx-action@f7ce87c1d6bead3e36075b2ce75da1f6cc28aaca # v3.9.0 diff --git a/.github/workflows/PR-Demo-cleanup.yml b/.github/workflows/PR-Demo-cleanup.yml index 50ed1396..affe32d4 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@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit diff --git a/.github/workflows/auto-labeler.yml b/.github/workflows/auto-labeler.yml index adb8721a..3056543c 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@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 6acb323c..24321b4b 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@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit @@ -62,7 +62,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit @@ -106,7 +106,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit diff --git a/.github/workflows/check_properties.yml b/.github/workflows/check_properties.yml index 182d1326..037a6284 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@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit diff --git a/.github/workflows/dependency-review.yml b/.github/workflows/dependency-review.yml index 91f392a7..2ab9979a 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@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit diff --git a/.github/workflows/licenses-update.yml b/.github/workflows/licenses-update.yml index 5480ee0d..2db7e023 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@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit - name: Generate GitHub App Token id: generate-token - uses: actions/create-github-app-token@136412a57a7081aa63c935a2cc2918f76c34f514 # v1.11.2 + uses: actions/create-github-app-token@67e27a7eb7db372a1c61a7f9bdab8699e9ee57f7 # v1.11.3 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 c4ea96e4..3b2342e9 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@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit diff --git a/.github/workflows/multiOSReleases.yml b/.github/workflows/multiOSReleases.yml index fccc3344..1f961906 100644 --- a/.github/workflows/multiOSReleases.yml +++ b/.github/workflows/multiOSReleases.yml @@ -16,7 +16,7 @@ jobs: versionMac: ${{ steps.versionNumberMac.outputs.versionNumberMac }} steps: - name: Harden Runner - uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit @@ -51,7 +51,7 @@ jobs: file_suffix: "" steps: - name: Harden Runner - uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit @@ -101,7 +101,7 @@ jobs: file_suffix: "" steps: - name: Harden Runner - uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit @@ -139,7 +139,7 @@ jobs: contents: write steps: - name: Harden Runner - uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit @@ -210,7 +210,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Harden Runner - uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit @@ -271,7 +271,7 @@ jobs: contents: write steps: - name: Harden Runner - uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit diff --git a/.github/workflows/pre_commit.yml b/.github/workflows/pre_commit.yml index 89e4fd3f..9398feb4 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@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit - name: Generate GitHub App Token id: generate-token - uses: actions/create-github-app-token@136412a57a7081aa63c935a2cc2918f76c34f514 # v1.11.2 + uses: actions/create-github-app-token@67e27a7eb7db372a1c61a7f9bdab8699e9ee57f7 # v1.11.3 with: app-id: ${{ secrets.GH_APP_ID }} private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} diff --git a/.github/workflows/push-docker.yml b/.github/workflows/push-docker.yml index a336fcd0..8928bff1 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@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit @@ -38,6 +38,7 @@ jobs: run: ./gradlew clean build env: DOCKER_ENABLE_SECURITY: false + STIRLING_PDF_DESKTOP_UI: false - name: Install cosign if: github.ref == 'refs/heads/master' diff --git a/.github/workflows/releaseArtifacts.yml b/.github/workflows/releaseArtifacts.yml index 2c80e3ff..cc034fdc 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@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit @@ -83,7 +83,7 @@ jobs: file_suffix: "" steps: - name: Harden Runner - uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit @@ -161,7 +161,7 @@ jobs: file_suffix: "" steps: - name: Harden Runner - uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit diff --git a/.github/workflows/scorecards.yml b/.github/workflows/scorecards.yml index da413090..5e49dfab 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@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit diff --git a/.github/workflows/sonarqube.yml b/.github/workflows/sonarqube.yml index c06707ac..5fd87124 100644 --- a/.github/workflows/sonarqube.yml +++ b/.github/workflows/sonarqube.yml @@ -1,23 +1,24 @@ +name: Run Sonarqube + on: push: branches: - master - pull_request: - branches: [ "main" ] + pull_request_target: + branches: + - main workflow_dispatch: permissions: pull-requests: read actions: read -name: Run Sonarqube + jobs: sonarqube: runs-on: ubuntu-latest steps: - - - name: Harden Runner - uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 5ab9886f..06d45934 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@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit diff --git a/.github/workflows/swagger.yml b/.github/workflows/swagger.yml index fc01aeec..95e2529e 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@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit diff --git a/.github/workflows/sync_files.yml b/.github/workflows/sync_files.yml index 0382ec5b..e415ba67 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@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit - name: Generate GitHub App Token id: generate-token - uses: actions/create-github-app-token@136412a57a7081aa63c935a2cc2918f76c34f514 # v1.11.2 + uses: actions/create-github-app-token@67e27a7eb7db372a1c61a7f9bdab8699e9ee57f7 # v1.11.3 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@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit - name: Generate GitHub App Token id: generate-token - uses: actions/create-github-app-token@136412a57a7081aa63c935a2cc2918f76c34f514 # v1.11.2 + uses: actions/create-github-app-token@67e27a7eb7db372a1c61a7f9bdab8699e9ee57f7 # v1.11.3 with: app-id: ${{ vars.GH_APP_ID }} private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} diff --git a/.github/workflows/testdriver.yml b/.github/workflows/testdriver.yml index 8cdfcb0f..199cbfba 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@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit @@ -105,7 +105,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit @@ -134,7 +134,7 @@ jobs: steps: - name: Harden Runner - uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 + uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 with: egress-policy: audit diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 7dc2bc1f..cc11d6a1 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -9,7 +9,6 @@ // "ms-vscode-remote.vscode-remote-extensionpack", // Remote Development Pack for SSH, WSL, and Containers "Oracle.oracle-java", // Oracle Java extension with additional features for Java development "redhat.java", // Java support by Red Hat with IntelliSense, debugging, and code navigation - "shengchen.vscode-checkstyle", // Checkstyle integration for Java code quality checks "streetsidesoftware.code-spell-checker", // Spell checker for code to avoid typos "vmware.vscode-boot-dev-pack", // Developer tools for Spring Boot by VMware "vmware.vscode-spring-boot", // Spring Boot tools by VMware for enhanced Spring development diff --git a/.vscode/settings.json b/.vscode/settings.json index c8ef9888..34f41eb4 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,54 +2,147 @@ "java.compile.nullAnalysis.mode": "automatic", "files.eol": "auto", "java.configuration.updateBuildConfiguration": "interactive", - "black-formatter.args": ["--line-length", "127"], - "flake8.args": ["--max-line-length", "127"], - "pylint.args": ["max-line-length", "127"], + "black-formatter.args": [ + "--line-length", + "127" + ], + "flake8.args": [ + "--max-line-length", + "127" + ], "[java]": { "editor.tabSize": 4, "editor.detectIndentation": false, - "editor.rulers": [127] + "editor.rulers": [ + 127 + ], + "editor.defaultFormatter": "josevseb.google-java-format-for-vs-code" }, "[python]": { "editor.tabSize": 2, "editor.detectIndentation": false, - "editor.rulers": [127] + "editor.rulers": [ + 127 + ] }, "[gradle-build]": { "editor.tabSize": 4, "editor.detectIndentation": false, - "editor.rulers": [127] + "editor.rulers": [ + 127 + ] }, "[gradle]": { "editor.tabSize": 4, "editor.detectIndentation": false, - "editor.rulers": [127] + "editor.rulers": [ + 127 + ] }, "[html]": { "editor.tabSize": 2, - "editor.rulers": [127], + "editor.rulers": [ + 127 + ], "files.trimFinalNewlines": false, "files.insertFinalNewline": false }, "[javascript]": { "editor.tabSize": 2, - "editor.rulers": [127] + "editor.rulers": [ + 127 + ] }, "[yaml]": { "files.trimFinalNewlines": false, "files.insertFinalNewline": false }, - "diffEditor.maxComputationTime": 0, - "editor.wordSegmenterLocales": null, - "editor.guides.bracketPairs": "active", - "editor.guides.bracketPairsHorizontal": "active", "files.insertFinalNewline": true, "files.trimFinalNewlines": true, "files.trimTrailingWhitespace": true, + "files.autoSave": "onFocusChange", + "files.autoSaveWhenNoErrors": true, + "diffEditor.maxComputationTime": 0, + "editor.wordSegmenterLocales": "", + "editor.guides.bracketPairs": "active", + "editor.guides.bracketPairsHorizontal": "active", "editor.indentSize": "tabSize", "editor.stickyScroll.enabled": false, "editor.minimap.enabled": false, "editor.formatOnSave": true, + "editor.insertSpaces": true, + "java.format.enabled": true, + "java.format.settings.profile": "GoogleStyle", + "java.format.settings.google.version": "1.25.2", "java.format.settings.google.mode": "jar-file", - "java.format.settings.google.extra": "--aosp --skip-sorting-imports" + "java.format.settings.google.extra": "--aosp --skip-sorting-imports --skip-javadoc-formatting", + // (DE) Aktiviert Kommentare im Java-Format. + // (EN) Enables comments in Java formatting. + // "java.format.comments.enabled": true, + // (DE) Generiert automatisch Kommentare im Code. + // (EN) Automatically generates comments in code. + // "java.codeGeneration.generateComments": true, + // https://github.com/redhat-developer/vscode-java/blob/master/document/_java.learnMoreAboutCleanUps.md#java-clean-ups + "java.saveActions.cleanup": true, + "java.cleanup.actions": [ + "invertEquals", // Inverts calls to Object.equals(Object) and String.equalsIgnoreCase(String) to avoid useless null pointer exception. + "instanceofPatternMatch" // Replaces instanceof checks with pattern matching. + ], + // (DE) Aktiviert die Code-Vervollständigung für Java. + // (EN) Enables code completion for Java. + "java.completion.engine": "dom", + "java.completion.enabled": true, + "java.completion.importOrder": [ + "java", + "javax", + "org", + "com", + "net", + "io", + "jakarta", + "lombok", + "me", + "stirling", + ], + "java.project.resourceFilters": [ + ".devcontainer/", + ".git/", + ".github/", + ".gradle/", + ".venv/", + ".venv*/", + ".vscode/", + "bin/", + "build/", + "configs/", + "customFiles/", + "docs/", + "exampleYmlFiles", + "gradle/", + "images/", + "logs/", + "pipeline/", + "scripts/", + "testings/", + ".git-blame-ignore-revs", + ".gitattributes", + ".gitignore", + ".pre-commit-config.yaml", + ], + // Enables signature help in Java. + "java.signatureHelp.enabled": true, + // Enables detailed signature help descriptions. + "java.signatureHelp.description.enabled": true, + // Downloads sources for Maven dependencies. + "java.maven.downloadSources": true, + // Enables Gradle project import. + "java.import.gradle.enabled": true, + // Downloads sources for Eclipse projects. + "java.eclipse.downloadSources": true, + // Enables import of the Gradle wrapper. + "java.import.gradle.wrapper.enabled": true, + "spring.initializr.defaultLanguage": "Java", + "spring.initializr.defaultGroupId": "stirling.software.SPDF", + "spring.initializr.defaultArtifactId": "SPDF", + "cSpell.enabled": false, } diff --git a/Dockerfile b/Dockerfile index 45e28df3..ccb8408a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -35,47 +35,56 @@ ENV DOCKER_ENABLE_SECURITY=false \ HOME=/home/stirlingpdfuser \ PUID=1000 \ PGID=1000 \ - UMASK=022 + UMASK=022 \ + PYTHONPATH=/usr/lib/libreoffice/program:/opt/venv/lib/python3.12/site-packages \ + UNO_PATH=/usr/lib/libreoffice/program \ + URE_BOOTSTRAP=file:///usr/lib/libreoffice/program/fundamentalrc # JDK for app -RUN echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/apk/repositories && \ - echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/community" | tee -a /etc/apk/repositories && \ +RUN echo "@main https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/apk/repositories && \ + echo "@community https://dl-cdn.alpinelinux.org/alpine/edge/community" | tee -a /etc/apk/repositories && \ echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/testing" | tee -a /etc/apk/repositories && \ apk upgrade --no-cache -a && \ apk add --no-cache \ - ca-certificates \ - tzdata \ - tini \ - bash \ - curl \ - qpdf \ - shadow \ - su-exec \ - openssl \ - openssl-dev \ - openjdk21-jre \ -# Doc conversion - gcompat \ - libc6-compat \ - libreoffice \ -# pdftohtml - poppler-utils \ -# OCR MY PDF (unpaper for descew and other advanced features) - tesseract-ocr-data-eng \ -# CV - py3-opencv \ -# python3/pip - python3 \ - py3-pip && \ -# uno unoconv and HTML - pip install --break-system-packages --no-cache-dir --upgrade unoconv WeasyPrint pdf2image pillow && \ + ca-certificates \ + tzdata \ + tini \ + bash \ + curl \ + qpdf \ + shadow \ + su-exec \ + openssl \ + openssl-dev \ + openjdk21-jre \ + # Doc conversion + gcompat \ + libc6-compat \ + libreoffice \ + # pdftohtml + poppler-utils \ + # OCR MY PDF (unpaper for descew and other advanced features) + tesseract-ocr-data-eng \ + # CV + py3-opencv \ + python3 \ + py3-pip \ + py3-pillow@testing \ + py3-pdf2image@testing && \ + python3 -m venv /opt/venv && \ + export PATH="/opt/venv/bin:$PATH" && \ + pip install --upgrade pip && \ + pip install --no-cache-dir --upgrade unoserver weasyprint && \ + ln -s /usr/lib/libreoffice/program/uno.py /opt/venv/lib/python3.12/site-packages/ && \ + ln -s /usr/lib/libreoffice/program/unohelper.py /opt/venv/lib/python3.12/site-packages/ && \ + ln -s /usr/lib/libreoffice/program /opt/venv/lib/python3.12/site-packages/LibreOffice && \ mv /usr/share/tessdata /usr/share/tessdata-original && \ mkdir -p $HOME /configs /logs /customFiles /pipeline/watchedFolders /pipeline/finishedFolders && \ fc-cache -f -v && \ chmod +x /scripts/* && \ chmod +x /scripts/init.sh && \ -# User permissions + # User permissions addgroup -S stirlingpdfgroup && adduser -S stirlingpdfuser -G stirlingpdfgroup && \ chown -R stirlingpdfuser:stirlingpdfgroup $HOME /scripts /usr/share/fonts/opentype/noto /configs /customFiles /pipeline && \ chown stirlingpdfuser:stirlingpdfgroup /app.jar @@ -84,4 +93,4 @@ EXPOSE 8080/tcp # Set user and run command ENTRYPOINT ["tini", "--", "/scripts/init.sh"] -CMD ["java", "-Dfile.encoding=UTF-8", "-jar", "/app.jar"] +CMD ["sh", "-c", "java -Dfile.encoding=UTF-8 -jar /app.jar & /opt/venv/bin/unoserver --port 2003 --interface 0.0.0.0"] \ No newline at end of file diff --git a/Dockerfile.fat b/Dockerfile.fat index 5ff49aab..c7b3e203 100644 --- a/Dockerfile.fat +++ b/Dockerfile.fat @@ -9,6 +9,7 @@ COPY . . # Build the application with DOCKER_ENABLE_SECURITY=false RUN DOCKER_ENABLE_SECURITY=true \ +STIRLING_PDF_DESKTOP_UI=false \ ./gradlew clean build # Main stage @@ -37,12 +38,15 @@ ENV DOCKER_ENABLE_SECURITY=false \ PGID=1000 \ UMASK=022 \ FAT_DOCKER=true \ - INSTALL_BOOK_AND_ADVANCED_HTML_OPS=false + INSTALL_BOOK_AND_ADVANCED_HTML_OPS=false \ + PYTHONPATH=/usr/lib/libreoffice/program:/opt/venv/lib/python3.12/site-packages \ + UNO_PATH=/usr/lib/libreoffice/program \ + URE_BOOTSTRAP=file:///usr/lib/libreoffice/program/fundamentalrc # JDK for app -RUN echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/apk/repositories && \ - echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/community" | tee -a /etc/apk/repositories && \ +RUN echo "@main https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/apk/repositories && \ + echo "@community https://dl-cdn.alpinelinux.org/alpine/edge/community" | tee -a /etc/apk/repositories && \ echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/testing" | tee -a /etc/apk/repositories && \ apk upgrade --no-cache -a && \ apk add --no-cache \ @@ -65,14 +69,21 @@ RUN echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /et # OCR MY PDF (unpaper for descew and other advanced featues) qpdf \ tesseract-ocr-data-eng \ + font-terminus font-dejavu font-noto font-noto-cjk font-awesome font-noto-extra \ # CV py3-opencv \ -# python3/pip - python3 \ - py3-pip && \ -# uno unoconv and HTML - pip install --break-system-packages --no-cache-dir --upgrade unoconv WeasyPrint pdf2image pillow && \ + python3 \ + py3-pip \ + py3-pillow@testing \ + py3-pdf2image@testing && \ + python3 -m venv /opt/venv && \ + export PATH="/opt/venv/bin:$PATH" && \ + pip install --upgrade pip && \ + pip install --no-cache-dir --upgrade unoserver weasyprint && \ + ln -s /usr/lib/libreoffice/program/uno.py /opt/venv/lib/python3.12/site-packages/ && \ + ln -s /usr/lib/libreoffice/program/unohelper.py /opt/venv/lib/python3.12/site-packages/ && \ + ln -s /usr/lib/libreoffice/program /opt/venv/lib/python3.12/site-packages/LibreOffice && \ mv /usr/share/tessdata /usr/share/tessdata-original && \ mkdir -p $HOME /configs /logs /customFiles /pipeline/watchedFolders /pipeline/finishedFolders && \ fc-cache -f -v && \ @@ -84,7 +95,6 @@ RUN echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /et chown stirlingpdfuser:stirlingpdfgroup /app.jar EXPOSE 8080/tcp - # Set user and run command ENTRYPOINT ["tini", "--", "/scripts/init.sh"] -CMD ["java", "-Dfile.encoding=UTF-8", "-jar", "/app.jar"] +CMD ["sh", "-c", "java -Dfile.encoding=UTF-8 -jar /app.jar & /opt/venv/bin/unoserver --port 2003 --interface 0.0.0.0"] \ No newline at end of file diff --git a/README.md b/README.md index d8d5c952..cde8e5c4 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,6 @@ [![Docker Pulls](https://img.shields.io/docker/pulls/frooodle/s-pdf)](https://hub.docker.com/r/frooodle/s-pdf) [![Discord](https://img.shields.io/discord/1068636748814483718?label=Discord)](https://discord.gg/HYmhKj45pU) -[![Docker Image Version (tag latest semver)](https://img.shields.io/docker/v/frooodle/s-pdf/latest)](https://github.com/Stirling-Tools/Stirling-PDF/) [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/Stirling-Tools/Stirling-PDF/badge)](https://scorecard.dev/viewer/?uri=github.com/Stirling-Tools/Stirling-PDF) [![GitHub Repo stars](https://img.shields.io/github/stars/stirling-tools/stirling-pdf?style=social)](https://github.com/Stirling-Tools/stirling-pdf) @@ -120,10 +119,10 @@ Stirling-PDF currently supports 39 languages! | Arabic (العربية) (ar_AR) | ![89%](https://geps.dev/progress/89) | | Azerbaijani (Azərbaycan Dili) (az_AZ) | ![88%](https://geps.dev/progress/88) | | Basque (Euskara) (eu_ES) | ![51%](https://geps.dev/progress/51) | -| Bulgarian (Български) (bg_BG) | ![85%](https://geps.dev/progress/85) | +| Bulgarian (Български) (bg_BG) | ![99%](https://geps.dev/progress/99) | | Catalan (Català) (ca_CA) | ![80%](https://geps.dev/progress/80) | -| Croatian (Hrvatski) (hr_HR) | ![87%](https://geps.dev/progress/87) | -| Czech (Česky) (cs_CZ) | ![98%](https://geps.dev/progress/98) | +| Croatian (Hrvatski) (hr_HR) | ![86%](https://geps.dev/progress/86) | +| Czech (Česky) (cs_CZ) | ![97%](https://geps.dev/progress/97) | | Danish (Dansk) (da_DK) | ![85%](https://geps.dev/progress/85) | | Dutch (Nederlands) (nl_NL) | ![85%](https://geps.dev/progress/85) | | English (English) (en_GB) | ![100%](https://geps.dev/progress/100) | @@ -136,23 +135,23 @@ Stirling-PDF currently supports 39 languages! | Indonesian (Bahasa Indonesia) (id_ID) | ![86%](https://geps.dev/progress/86) | | Irish (Gaeilge) (ga_IE) | ![98%](https://geps.dev/progress/98) | | Italian (Italiano) (it_IT) | ![99%](https://geps.dev/progress/99) | -| Japanese (日本語) (ja_JP) | ![93%](https://geps.dev/progress/93) | +| Japanese (日本語) (ja_JP) | ![92%](https://geps.dev/progress/92) | | Korean (한국어) (ko_KR) | ![98%](https://geps.dev/progress/98) | | Norwegian (Norsk) (no_NB) | ![78%](https://geps.dev/progress/78) | | Persian (فارسی) (fa_IR) | ![94%](https://geps.dev/progress/94) | -| Polish (Polski) (pl_PL) | ![86%](https://geps.dev/progress/86) | +| Polish (Polski) (pl_PL) | ![85%](https://geps.dev/progress/85) | | Portuguese (Português) (pt_PT) | ![97%](https://geps.dev/progress/97) | | Portuguese Brazilian (Português) (pt_BR) | ![98%](https://geps.dev/progress/98) | -| Romanian (Română) (ro_RO) | ![81%](https://geps.dev/progress/81) | -| Russian (Русский) (ru_RU) | ![98%](https://geps.dev/progress/98) | +| Romanian (Română) (ro_RO) | ![80%](https://geps.dev/progress/80) | +| Russian (Русский) (ru_RU) | ![97%](https://geps.dev/progress/97) | | Serbian Latin alphabet (Srpski) (sr_LATN_RS) | ![63%](https://geps.dev/progress/63) | -| Simplified Chinese (简体中文) (zh_CN) | ![90%](https://geps.dev/progress/90) | +| Simplified Chinese (简体中文) (zh_CN) | ![99%](https://geps.dev/progress/99) | | Slovakian (Slovensky) (sk_SK) | ![74%](https://geps.dev/progress/74) | -| Slovenian (Slovenščina) (sl_SI) | ![97%](https://geps.dev/progress/97) | -| Spanish (Español) (es_ES) | ![87%](https://geps.dev/progress/87) | +| Slovenian (Slovenščina) (sl_SI) | ![96%](https://geps.dev/progress/96) | +| Spanish (Español) (es_ES) | ![86%](https://geps.dev/progress/86) | | Swedish (Svenska) (sv_SE) | ![92%](https://geps.dev/progress/92) | -| Thai (ไทย) (th_TH) | ![86%](https://geps.dev/progress/86) | -| Tibetan (བོད་ཡིག་) (zh_BO) | ![95%](https://geps.dev/progress/95) | +| Thai (ไทย) (th_TH) | ![85%](https://geps.dev/progress/85) | +| Tibetan (བོད་ཡིག་) (zh_BO) | ![94%](https://geps.dev/progress/94) | | Traditional Chinese (繁體中文) (zh_TW) | ![98%](https://geps.dev/progress/98) | | Turkish (Türkçe) (tr_TR) | ![82%](https://geps.dev/progress/82) | | Ukrainian (Українська) (uk_UA) | ![72%](https://geps.dev/progress/72) | diff --git a/build.gradle b/build.gradle index 4f0d2d57..7d8a9898 100644 --- a/build.gradle +++ b/build.gradle @@ -15,9 +15,8 @@ plugins { import com.github.jk1.license.render.* ext { - springBootVersion = "3.4.1" + springBootVersion = "3.4.2" pdfboxVersion = "3.0.4" - logbackVersion = "1.5.7" imageioVersion = "3.12.0" lombokVersion = "1.18.36" bouncycastleVersion = "1.80" @@ -26,7 +25,7 @@ ext { } group = "stirling.software" -version = "0.41.0" +version = "0.42.0" java { // 17 is lowest but we support and recommend 21 @@ -261,7 +260,7 @@ spotless { googleJavaFormat("1.25.2").aosp().reorderImports(false) - importOrder("java", "javax", "org", "com", "net", "io") + importOrder("java", "javax", "org", "com", "net", "io", "jakarta", "lombok", "me", "stirling") toggleOffOn() trimTrailingWhitespace() leadingTabsToSpaces() @@ -273,7 +272,7 @@ sonar { properties { property "sonar.projectKey", "Stirling-Tools_Stirling-PDF" property "sonar.organization", "stirling-tools" - + property "sonar.exclusions", "**/build-wrapper-dump.json, src/main/java/org/apache/**, src/main/resources/static/pdfjs/**, src/main/resources/static/pdfjs-legacy/**, src/main/resources/static/js/thirdParty/**" property "sonar.coverage.exclusions", "src/main/java/org/apache/**, src/main/resources/static/pdfjs/**, src/main/resources/static/pdfjs-legacy/**, src/main/resources/static/js/thirdParty/**" property "sonar.cpd.exclusions", "src/main/java/org/apache/**, src/main/resources/static/pdfjs/**, src/main/resources/static/pdfjs-legacy/**, src/main/resources/static/js/thirdParty/**" @@ -294,14 +293,27 @@ configurations.all { } dependencies { + //tmp for security bumps + implementation 'ch.qos.logback:logback-core:1.5.15' + implementation 'ch.qos.logback:logback-classic:1.5.15' + + + // Exclude vulnerable BouncyCastle version used in tableau + configurations.all { + exclude group: 'org.bouncycastle', module: 'bcpkix-jdk15on' + exclude group: 'org.bouncycastle', module: 'bcutil-jdk15on' + exclude group: 'org.bouncycastle', module: 'bcmail-jdk15on' + } + if (System.getenv("STIRLING_PDF_DESKTOP_UI") != "false") { + implementation 'org.apache.commons:commons-compress:1.26.0' implementation "me.friwi:jcefmaven:127.3.1" implementation "org.openjfx:javafx-controls:21" implementation "org.openjfx:javafx-swing:21" } //security updates - implementation "org.springframework:spring-webmvc:6.2.2" + implementation "org.springframework:spring-webmvc:6.2.3" implementation("io.github.pixee:java-security-toolkit:1.2.1") @@ -320,8 +332,8 @@ dependencies { implementation "org.springframework.boot:spring-boot-starter-data-jpa:$springBootVersion" implementation "org.springframework.boot:spring-boot-starter-oauth2-client:$springBootVersion" - implementation "org.springframework.session:spring-session-core:$springBootVersion" - implementation "org.springframework:spring-jdbc:6.2.2" + implementation "org.springframework.session:spring-session-core:3.4.1" + implementation "org.springframework:spring-jdbc:6.2.3" implementation 'com.unboundid.product.scim2:scim2-sdk-client:2.3.5' // Don't upgrade h2database @@ -396,7 +408,7 @@ dependencies { implementation "org.bouncycastle:bcprov-jdk18on:$bouncycastleVersion" implementation "org.bouncycastle:bcpkix-jdk18on:$bouncycastleVersion" implementation "org.springframework.boot:spring-boot-starter-actuator:$springBootVersion" - implementation "io.micrometer:micrometer-core:1.14.3" + implementation "io.micrometer:micrometer-core:1.14.4" implementation group: "com.google.zxing", name: "core", version: "3.5.3" // https://mvnrepository.com/artifact/org.commonmark/commonmark implementation "org.commonmark:commonmark:0.24.0" diff --git a/src/main/java/stirling/software/SPDF/UI/impl/DesktopBrowser.java b/src/main/java/stirling/software/SPDF/UI/impl/DesktopBrowser.java index ae5f76fd..b221d019 100644 --- a/src/main/java/stirling/software/SPDF/UI/impl/DesktopBrowser.java +++ b/src/main/java/stirling/software/SPDF/UI/impl/DesktopBrowser.java @@ -41,6 +41,7 @@ import me.friwi.jcefmaven.MavenCefAppHandlerAdapter; import me.friwi.jcefmaven.impl.progress.ConsoleProgressHandler; import stirling.software.SPDF.UI.WebBrowser; import stirling.software.SPDF.config.InstallationPathConfig; +import stirling.software.SPDF.utils.UIScaling; @Component @Slf4j @@ -215,7 +216,7 @@ public class DesktopBrowser implements WebBrowser { } }); - frame.setSize(1280, 768); + frame.setSize(UIScaling.scaleWidth(1280), UIScaling.scaleHeight(800)); frame.setLocationRelativeTo(null); loadIcon(); @@ -264,7 +265,9 @@ public class DesktopBrowser implements WebBrowser { frame.setOpacity(1.0f); frame.setUndecorated(false); frame.pack(); - frame.setSize(1280, 800); + frame.setSize( + UIScaling.scaleWidth(1280), + UIScaling.scaleHeight(800)); frame.setLocationRelativeTo(null); log.debug("Frame reconfigured"); diff --git a/src/main/java/stirling/software/SPDF/UI/impl/LoadingWindow.java b/src/main/java/stirling/software/SPDF/UI/impl/LoadingWindow.java index d6c0d27a..b4479be3 100644 --- a/src/main/java/stirling/software/SPDF/UI/impl/LoadingWindow.java +++ b/src/main/java/stirling/software/SPDF/UI/impl/LoadingWindow.java @@ -1,12 +1,20 @@ package stirling.software.SPDF.UI.impl; import java.awt.*; +import java.io.BufferedReader; import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.TimeUnit; import javax.imageio.ImageIO; import javax.swing.*; +import io.github.pixee.security.BoundedLineReader; + import lombok.extern.slf4j.Slf4j; +import stirling.software.SPDF.utils.UIScaling; @Slf4j public class LoadingWindow extends JDialog { @@ -16,6 +24,13 @@ public class LoadingWindow extends JDialog { private final JLabel brandLabel; private long startTime; + private Timer stuckTimer; + private long stuckThreshold = 4000; + private long timeAt90Percent = -1; + private volatile Process explorerProcess; + private static final boolean IS_WINDOWS = + System.getProperty("os.name").toLowerCase().contains("win"); + public LoadingWindow(Frame parent, String initialUrl) { super(parent, "Initializing Stirling-PDF", true); startTime = System.currentTimeMillis(); @@ -41,12 +56,12 @@ public class LoadingWindow extends JDialog { if (is != null) { Image img = ImageIO.read(is); if (img != null) { - Image scaledImg = img.getScaledInstance(48, 48, Image.SCALE_SMOOTH); + Image scaledImg = UIScaling.scaleIcon(img, 48, 48); JLabel iconLabel = new JLabel(new ImageIcon(scaledImg)); iconLabel.setHorizontalAlignment(SwingConstants.CENTER); gbc.gridy = 0; mainPanel.add(iconLabel, gbc); - log.debug("Icon loaded and scaled successfully"); + log.info("Icon loaded and scaled successfully"); } } } @@ -83,7 +98,8 @@ public class LoadingWindow extends JDialog { setUndecorated(false); // Set size and position - setSize(400, 200); + setSize(UIScaling.scaleWidth(400), UIScaling.scaleHeight(200)); + setLocationRelativeTo(parent); setAlwaysOnTop(true); setProgress(0); @@ -94,6 +110,163 @@ public class LoadingWindow extends JDialog { System.currentTimeMillis() - startTime); } + private void checkAndRefreshExplorer() { + if (!IS_WINDOWS) { + return; + } + if (timeAt90Percent == -1) { + timeAt90Percent = System.currentTimeMillis(); + stuckTimer = + new Timer( + 1000, + e -> { + long currentTime = System.currentTimeMillis(); + if (currentTime - timeAt90Percent > stuckThreshold) { + try { + log.debug( + "Attempting Windows explorer refresh due to 90% stuck state"); + String currentDir = System.getProperty("user.dir"); + + // Store current explorer PIDs before we start new one + Set existingPids = new HashSet<>(); + ProcessBuilder listExplorer = + new ProcessBuilder( + "cmd", + "/c", + "wmic", + "process", + "where", + "name='explorer.exe'", + "get", + "ProcessId", + "/format:csv"); + Process process = listExplorer.start(); + BufferedReader reader = + new BufferedReader( + new InputStreamReader( + process.getInputStream())); + String line; + while ((line = + BoundedLineReader.readLine( + reader, 5_000_000)) + != null) { + if (line.matches(".*\\d+.*")) { // Contains numbers + String[] parts = line.trim().split(","); + if (parts.length >= 2) { + existingPids.add( + parts[parts.length - 1].trim()); + } + } + } + process.waitFor(2, TimeUnit.SECONDS); + + // Start new explorer + ProcessBuilder pb = + new ProcessBuilder( + "cmd", + "/c", + "start", + "/min", + "/b", + "explorer.exe", + currentDir); + pb.redirectErrorStream(true); + explorerProcess = pb.start(); + + // Schedule cleanup + Timer cleanupTimer = + new Timer( + 2000, + cleanup -> { + try { + // Find new explorer processes + ProcessBuilder findNewExplorer = + new ProcessBuilder( + "cmd", + "/c", + "wmic", + "process", + "where", + "name='explorer.exe'", + "get", + "ProcessId", + "/format:csv"); + Process newProcess = + findNewExplorer.start(); + BufferedReader newReader = + new BufferedReader( + new InputStreamReader( + newProcess + .getInputStream())); + String newLine; + while ((newLine = + BoundedLineReader + .readLine( + newReader, + 5_000_000)) + != null) { + if (newLine.matches( + ".*\\d+.*")) { + String[] parts = + newLine.trim() + .split(","); + if (parts.length >= 2) { + String pid = + parts[ + parts.length + - 1] + .trim(); + if (!existingPids + .contains( + pid)) { + log.debug( + "Found new explorer.exe with PID: " + + pid); + ProcessBuilder + killProcess = + new ProcessBuilder( + "taskkill", + "/PID", + pid, + "/F"); + killProcess + .redirectErrorStream( + true); + Process killResult = + killProcess + .start(); + killResult.waitFor( + 2, + TimeUnit + .SECONDS); + log.debug( + "Explorer process terminated: " + + pid); + } + } + } + } + newProcess.waitFor( + 2, TimeUnit.SECONDS); + } catch (Exception ex) { + log.error( + "Error cleaning up Windows explorer process", + ex); + } + }); + cleanupTimer.setRepeats(false); + cleanupTimer.start(); + stuckTimer.stop(); + } catch (Exception ex) { + log.error("Error refreshing Windows explorer", ex); + } + } + }); + stuckTimer.setRepeats(true); + stuckTimer.start(); + } + } + public void setProgress(final int progress) { SwingUtilities.invokeLater( () -> { @@ -115,11 +288,23 @@ public class LoadingWindow extends JDialog { // Add thread state logging Thread currentThread = Thread.currentThread(); - log.debug( + log.info( "Current thread state - Name: {}, State: {}, Priority: {}", currentThread.getName(), currentThread.getState(), currentThread.getPriority()); + + if (validProgress >= 90 && validProgress < 95) { + checkAndRefreshExplorer(); + } else { + // Reset the timer if we move past 95% + if (validProgress >= 95) { + if (stuckTimer != null) { + stuckTimer.stop(); + } + timeAt90Percent = -1; + } + } } progressBar.setValue(validProgress); @@ -145,7 +330,7 @@ public class LoadingWindow extends JDialog { statusLabel.setText(validStatus); // Log UI state when status changes - log.debug( + log.info( "UI State - Window visible: {}, Progress: {}%, Status: {}", isVisible(), progressBar.getValue(), validStatus); diff --git a/src/main/java/stirling/software/SPDF/config/ExternalAppDepConfig.java b/src/main/java/stirling/software/SPDF/config/ExternalAppDepConfig.java index 9d1ac1fc..886244ff 100644 --- a/src/main/java/stirling/software/SPDF/config/ExternalAppDepConfig.java +++ b/src/main/java/stirling/software/SPDF/config/ExternalAppDepConfig.java @@ -21,9 +21,9 @@ public class ExternalAppDepConfig { { put("soffice", List.of("LibreOffice")); - put("weasyprint", List.of("Weasyprint")); + put("/opt/venv/bin/weasyprint", List.of("Weasyprint")); put("pdftohtml", List.of("Pdftohtml")); - put("unoconv", List.of("Unoconv")); + put("/opt/venv/bin/unoconvert", List.of("Unoconv")); put("qpdf", List.of("qpdf")); put("tesseract", List.of("tesseract")); } @@ -101,9 +101,9 @@ public class ExternalAppDepConfig { checkDependencyAndDisableGroup("tesseract"); checkDependencyAndDisableGroup("soffice"); checkDependencyAndDisableGroup("qpdf"); - checkDependencyAndDisableGroup("weasyprint"); + checkDependencyAndDisableGroup("/opt/venv/bin/weasyprint"); checkDependencyAndDisableGroup("pdftohtml"); - checkDependencyAndDisableGroup("unoconv"); + checkDependencyAndDisableGroup("/opt/venv/bin/unoconvert"); // Special handling for Python/OpenCV dependencies boolean pythonAvailable = isCommandAvailable("python3") || isCommandAvailable("python"); if (!pythonAvailable) { 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 eefa5a2c..1c8866d5 100644 --- a/src/main/java/stirling/software/SPDF/config/security/UserService.java +++ b/src/main/java/stirling/software/SPDF/config/security/UserService.java @@ -139,6 +139,9 @@ public class UserService implements UserServiceInterface { User user = findByUsernameIgnoreCase(username) .orElseThrow(() -> new UsernameNotFoundException("User not found")); + if(user.getApiKey() == null || user.getApiKey().length() == 0) { + user = addApiKeyToUser(username); + } return user.getApiKey(); } 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 77601b5d..35f6cf07 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/RearrangePagesPDFController.java @@ -174,7 +174,38 @@ public class RearrangePagesPDFController { return newPageOrderZeroBased; } - private List processSortTypes(String sortTypes, int totalPages) { + private List duplicate(int totalPages, String pageOrder) { + List newPageOrder = new ArrayList<>(); + int duplicateCount; + + try { + // Parse the duplicate count from pageOrder + duplicateCount = + pageOrder != null && !pageOrder.isEmpty() + ? Integer.parseInt(pageOrder.trim()) + : 2; // Default to 2 if not specified + } catch (NumberFormatException e) { + log.error("Invalid duplicate count specified", e); + duplicateCount = 2; // Default to 2 if invalid input + } + + // Validate duplicate count + if (duplicateCount < 1) { + duplicateCount = 2; // Default to 2 if invalid input + } + + // For each page in the document + for (int pageNum = 0; pageNum < totalPages; pageNum++) { + // Add the current page index duplicateCount times + for (int dupCount = 0; dupCount < duplicateCount; dupCount++) { + newPageOrder.add(pageNum); + } + } + + return newPageOrder; + } + + private List processSortTypes(String sortTypes, int totalPages, String pageOrder) { try { SortTypes mode = SortTypes.valueOf(sortTypes.toUpperCase()); switch (mode) { @@ -196,6 +227,8 @@ public class RearrangePagesPDFController { return removeLast(totalPages); case REMOVE_FIRST_AND_LAST: return removeFirstAndLast(totalPages); + case DUPLICATE: + return duplicate(totalPages, pageOrder); default: throw new IllegalArgumentException("Unsupported custom mode"); } @@ -223,8 +256,10 @@ public class RearrangePagesPDFController { String[] pageOrderArr = pageOrder != null ? pageOrder.split(",") : new String[0]; int totalPages = document.getNumberOfPages(); List newPageOrder; - if (sortType != null && sortType.length() > 0) { - newPageOrder = processSortTypes(sortType, totalPages); + if (sortType != null + && sortType.length() > 0 + && !"custom".equals(sortType.toLowerCase())) { + newPageOrder = processSortTypes(sortType, totalPages, pageOrder); } else { newPageOrder = GeneralUtils.parsePageList(pageOrderArr, totalPages, false); } 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 50a251e4..b7bb699c 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 @@ -61,13 +61,13 @@ public class ConvertOfficeController { List command = new ArrayList<>( Arrays.asList( - "unoconv", - "-vvv", - "-f", + "/opt/venv/bin/unoconvert", + "--port", + "2003", + "--convert-to", "pdf", - "-o", - tempOutputFile.toString(), - tempInputFile.toString())); + tempInputFile.toString(), + tempOutputFile.toString())); ProcessExecutorResult returnCode = ProcessExecutor.getInstance(ProcessExecutor.Processes.LIBRE_OFFICE) .runCommandWithOutputHandling(command); 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 d6ae1a47..dccc4dff 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 @@ -65,7 +65,7 @@ public class ConvertWebsiteToPDF { // Prepare the WeasyPrint command List command = new ArrayList<>(); - command.add("weasyprint"); + command.add("/opt/venv/bin/weasyprint"); command.add(URL); command.add(tempOutputFile.toString()); 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 f0a4c267..7f8e7087 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 @@ -1,7 +1,14 @@ package stirling.software.SPDF.controller.api.converters; +import java.io.ByteArrayOutputStream; +import java.io.IOException; import java.io.StringWriter; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.QuoteMode; @@ -18,18 +25,18 @@ import org.springframework.web.bind.annotation.RestController; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; - -import stirling.software.SPDF.model.api.extract.PDFFilePage; +import lombok.extern.slf4j.Slf4j; +import stirling.software.SPDF.model.api.PDFWithPageNums; import stirling.software.SPDF.pdf.FlexibleCSVWriter; import technology.tabula.ObjectExtractor; import technology.tabula.Page; import technology.tabula.Table; import technology.tabula.extractors.SpreadsheetExtractionAlgorithm; -import technology.tabula.writers.Writer; @RestController @RequestMapping("/api/v1/convert") @Tag(name = "Convert", description = "Convert APIs") +@Slf4j public class ExtractCSVController { @PostMapping(value = "/pdf/csv", consumes = "multipart/form-data") @@ -37,31 +44,80 @@ public class ExtractCSVController { summary = "Extracts a CSV document from a PDF", description = "This operation takes an input PDF file and returns CSV file of whole page. Input:PDF Output:CSV Type:SISO") - public ResponseEntity PdfToCsv(@ModelAttribute PDFFilePage form) throws Exception { - StringWriter writer = new StringWriter(); + public ResponseEntity pdfToCsv(@ModelAttribute PDFWithPageNums form) throws Exception { + String baseName = getBaseName(form.getFileInput().getOriginalFilename()); + List csvEntries = new ArrayList<>(); + try (PDDocument document = Loader.loadPDF(form.getFileInput().getBytes())) { - CSVFormat format = - CSVFormat.EXCEL.builder().setEscape('"').setQuoteMode(QuoteMode.ALL).build(); - Writer csvWriter = new FlexibleCSVWriter(format); + List pages = form.getPageNumbersList(document, true); SpreadsheetExtractionAlgorithm sea = new SpreadsheetExtractionAlgorithm(); - try (ObjectExtractor extractor = new ObjectExtractor(document)) { - Page page = extractor.extract(form.getPageId()); - List tables = sea.extract(page); - csvWriter.write(writer, tables); + CSVFormat format = CSVFormat.EXCEL.builder() + .setEscape('"') + .setQuoteMode(QuoteMode.ALL) + .build(); + + for (int pageNum : pages) { + try (ObjectExtractor extractor = new ObjectExtractor(document)) { + log.info("{}",pageNum); + Page page = extractor.extract(pageNum); + List
tables = sea.extract(page); + + for (int i = 0; i < tables.size(); i++) { + StringWriter sw = new StringWriter(); + FlexibleCSVWriter csvWriter = new FlexibleCSVWriter(format); + csvWriter.write(sw, Collections.singletonList(tables.get(i))); + + String entryName = generateEntryName(baseName, pageNum, i + 1); + csvEntries.add(new CsvEntry(entryName, sw.toString())); + } + } + } + + if (csvEntries.isEmpty()) { + return ResponseEntity.noContent().build(); + } else if (csvEntries.size() == 1) { + return createCsvResponse(csvEntries.get(0), baseName); + } else { + return createZipResponse(csvEntries, baseName); } } - - HttpHeaders headers = new HttpHeaders(); - headers.setContentDisposition( - ContentDisposition.builder("attachment") - .filename( - form.getFileInput() - .getOriginalFilename() - .replaceFirst("[.][^.]+$", "") - + "_extracted.csv") - .build()); - headers.setContentType(MediaType.parseMediaType("text/csv")); - - return ResponseEntity.ok().headers(headers).body(writer.toString()); } + + private ResponseEntity createZipResponse(List entries, String baseName) throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + try (ZipOutputStream zipOut = new ZipOutputStream(baos)) { + for (CsvEntry entry : entries) { + ZipEntry zipEntry = new ZipEntry(entry.filename()); + zipOut.putNextEntry(zipEntry); + zipOut.write(entry.content().getBytes(StandardCharsets.UTF_8)); + zipOut.closeEntry(); + } + } + + HttpHeaders headers = new HttpHeaders(); + headers.setContentDisposition(ContentDisposition.builder("attachment") + .filename(baseName + "_extracted.zip").build()); + headers.setContentType(MediaType.parseMediaType("application/zip")); + + return ResponseEntity.ok().headers(headers).body(baos.toByteArray()); + } + + private ResponseEntity createCsvResponse(CsvEntry entry, String baseName) { + HttpHeaders headers = new HttpHeaders(); + headers.setContentDisposition(ContentDisposition.builder("attachment") + .filename(baseName + "_extracted.csv").build()); + headers.setContentType(MediaType.parseMediaType("text/csv")); + + return ResponseEntity.ok().headers(headers).body(entry.content()); + } + + private String generateEntryName(String baseName, int pageNum, int tableIndex) { + return String.format("%s_p%d_t%d.csv", baseName, pageNum, tableIndex); + } + + private String getBaseName(String filename) { + return filename.replaceFirst("[.][^.]+$", ""); + } + + private record CsvEntry(String filename, String content) {} } diff --git a/src/main/java/stirling/software/SPDF/model/SortTypes.java b/src/main/java/stirling/software/SPDF/model/SortTypes.java index a7a699b8..14d12b5a 100644 --- a/src/main/java/stirling/software/SPDF/model/SortTypes.java +++ b/src/main/java/stirling/software/SPDF/model/SortTypes.java @@ -1,6 +1,7 @@ package stirling.software.SPDF.model; public enum SortTypes { + CUSTOM, REVERSE_ORDER, DUPLEX_SORT, BOOKLET_SORT, @@ -10,4 +11,5 @@ public enum SortTypes { REMOVE_FIRST, REMOVE_LAST, REMOVE_FIRST_AND_LAST, + DUPLICATE } 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 4eaabe87..1e7ae22a 100644 --- a/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java +++ b/src/main/java/stirling/software/SPDF/model/api/PDFWithPageNums.java @@ -8,6 +8,7 @@ import org.apache.pdfbox.pdmodel.PDDocument; import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.media.Schema.RequiredMode; import lombok.Data; import lombok.EqualsAndHashCode; @@ -25,7 +26,9 @@ public class PDFWithPageNums extends PDFFile { description = "The pages to select, Supports ranges (e.g., '1,3,5-9'), or 'all' or functions in the" + " format 'an+b' where 'a' is the multiplier of the page number 'n', and 'b' is a" - + " constant (e.g., '2n+1', '3n', '6n-5')\"") + + " constant (e.g., '2n+1', '3n', '6n-5')\"", + defaultValue = "all", + requiredMode = RequiredMode.NOT_REQUIRED) private String pageNumbers; @Hidden @@ -41,9 +44,9 @@ public class PDFWithPageNums extends PDFFile { } @Hidden - public List getPageNumbersList(PDDocument doc, boolean zeroCount) { + public List getPageNumbersList(PDDocument doc, boolean oneBased) { int pageCount = 0; pageCount = doc.getNumberOfPages(); - return GeneralUtils.parsePageList(pageNumbers, pageCount, zeroCount); + return GeneralUtils.parsePageList(pageNumbers, pageCount, oneBased); } } diff --git a/src/main/java/stirling/software/SPDF/model/api/extract/PDFFilePage.java b/src/main/java/stirling/software/SPDF/model/api/extract/PDFFilePage.java deleted file mode 100644 index faf955c6..00000000 --- a/src/main/java/stirling/software/SPDF/model/api/extract/PDFFilePage.java +++ /dev/null @@ -1,15 +0,0 @@ -package stirling.software.SPDF.model.api.extract; - -import io.swagger.v3.oas.annotations.media.Schema; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import stirling.software.SPDF.model.api.PDFFile; - -@Data -@EqualsAndHashCode(callSuper = true) -public class PDFFilePage extends PDFFile { - - @Schema(description = "Number of chosen page", type = "number") - private int pageId; -} diff --git a/src/main/java/stirling/software/SPDF/model/api/general/RearrangePagesRequest.java b/src/main/java/stirling/software/SPDF/model/api/general/RearrangePagesRequest.java index 7ba2d84c..7cda530e 100644 --- a/src/main/java/stirling/software/SPDF/model/api/general/RearrangePagesRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/general/RearrangePagesRequest.java @@ -15,6 +15,8 @@ public class RearrangePagesRequest extends PDFWithPageNums { implementation = SortTypes.class, description = "The custom mode for page rearrangement. Valid values are:\n" + + "CUSTOM: Uses order defined in PageNums " + + "DUPLICATE: Duplicate pages n times (if Page order defined as 4, then duplicates each page 4 times)" + "REVERSE_ORDER: Reverses the order of all pages.\n" + "DUPLEX_SORT: Sorts pages as if all fronts were scanned then all backs in reverse (1, n, 2, n-1, ...). " + "BOOKLET_SORT: Arranges pages for booklet printing (last, first, second, second last, ...).\n" diff --git a/src/main/java/stirling/software/SPDF/model/api/misc/AddPageNumbersRequest.java b/src/main/java/stirling/software/SPDF/model/api/misc/AddPageNumbersRequest.java index 9f3b5266..4776ddc0 100644 --- a/src/main/java/stirling/software/SPDF/model/api/misc/AddPageNumbersRequest.java +++ b/src/main/java/stirling/software/SPDF/model/api/misc/AddPageNumbersRequest.java @@ -1,6 +1,7 @@ package stirling.software.SPDF.model.api.misc; import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.media.Schema.RequiredMode; import lombok.Data; import lombok.EqualsAndHashCode; @@ -11,24 +12,49 @@ import stirling.software.SPDF.model.api.PDFWithPageNums; public class AddPageNumbersRequest extends PDFWithPageNums { @Schema( - description = "Custom margin: small/medium/large", - allowableValues = {"small", "medium", "large"}) + description = "Custom margin: small/medium/large/x-large", + allowableValues = {"small", "medium", "large", "x-large"}, + defaultValue = "medium", + requiredMode = RequiredMode.NOT_REQUIRED) private String customMargin; + @Schema( + description = "Font size for page numbers", + minimum = "1", + requiredMode = RequiredMode.REQUIRED) private float fontSize; + + @Schema( + description = "Font type for page numbers", + allowableValues = {"helvetica", "courier", "times"}, + requiredMode = RequiredMode.REQUIRED) private String fontType; - @Schema(description = "Position: 1 of 9 positions", minimum = "1", maximum = "9") + @Schema( + description = + "Position: 1-9 representing positions on the page (1=top-left, 5=center, 9=bottom-right)", + minimum = "1", + maximum = "9", + requiredMode = RequiredMode.REQUIRED) private int position; - @Schema(description = "Starting number", minimum = "1") + @Schema( + description = "Starting number for page numbering", + minimum = "1", + requiredMode = RequiredMode.REQUIRED) private int startingNumber; - @Schema(description = "Which pages to number, default all") + @Schema( + description = "Which pages to number (e.g. '1,3-5,7' or 'all')", + defaultValue = "all", + requiredMode = RequiredMode.NOT_REQUIRED) private String pagesToNumber; @Schema( description = - "Custom text: defaults to just number but can have things like \"Page {n} of {p}\"") + "Custom text pattern. Available variables: {n}=current page number, {total}=total pages, {filename}=original filename", + example = "Page {n} of {total}", + defaultValue = "{n}", + requiredMode = RequiredMode.NOT_REQUIRED) private String customText; } diff --git a/src/main/java/stirling/software/SPDF/utils/FileToPdf.java b/src/main/java/stirling/software/SPDF/utils/FileToPdf.java index e46bcb16..c28cda6e 100644 --- a/src/main/java/stirling/software/SPDF/utils/FileToPdf.java +++ b/src/main/java/stirling/software/SPDF/utils/FileToPdf.java @@ -50,7 +50,7 @@ public class FileToPdf { List command = new ArrayList<>(); if (!htmlFormatsInstalled) { - command.add("weasyprint"); + command.add("/opt/venv/bin/weasyprint"); command.add("-e"); command.add("utf-8"); command.add("-v"); diff --git a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java index 15d866e2..ea4b235b 100644 --- a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java @@ -210,8 +210,7 @@ public class GeneralUtils { result.addAll(handlePart(page, totalPages, offset)); } } - return new ArrayList<>( - new java.util.LinkedHashSet<>(result)); // Remove duplicates and maintain order + return result; } public static List evaluateNFunc(String expression, int maxValue) { diff --git a/src/main/java/stirling/software/SPDF/utils/UIScaling.java b/src/main/java/stirling/software/SPDF/utils/UIScaling.java new file mode 100644 index 00000000..fe1364c9 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/utils/UIScaling.java @@ -0,0 +1,67 @@ +package stirling.software.SPDF.utils; + +import java.awt.*; + +import javax.swing.*; + +public class UIScaling { + private static final double BASE_RESOLUTION_WIDTH = 1920.0; + private static final double BASE_RESOLUTION_HEIGHT = 1080.0; + + public static double getWidthScaleFactor() { + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + return screenSize.getWidth() / BASE_RESOLUTION_WIDTH; + } + + public static double getHeightScaleFactor() { + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); + return screenSize.getHeight() / BASE_RESOLUTION_HEIGHT; + } + + public static int scaleWidth(int value) { + return (int) Math.round(value * getWidthScaleFactor()); + } + + public static int scaleHeight(int value) { + return (int) Math.round(value * getHeightScaleFactor()); + } + + public static Dimension scale(Dimension dim) { + return new Dimension(scaleWidth(dim.width), scaleHeight(dim.height)); + } + + public static Insets scale(Insets insets) { + return new Insets( + scaleHeight(insets.top), + scaleWidth(insets.left), + scaleHeight(insets.bottom), + scaleWidth(insets.right)); + } + + public static Font scaleFont(Font font) { + // For fonts, we'll use the smaller scale factor to ensure readability + double scaleFactor = Math.min(getWidthScaleFactor(), getHeightScaleFactor()); + return font.deriveFont((float) (font.getSize() * scaleFactor)); + } + + // Utility method for aspect ratio aware icon scaling + public static Image scaleIcon(Image icon, int targetWidth, int targetHeight) { + if (icon == null) return null; + + double widthScale = getWidthScaleFactor(); + double heightScale = getHeightScaleFactor(); + + int scaledWidth = (int) Math.round(targetWidth * widthScale); + int scaledHeight = (int) Math.round(targetHeight * heightScale); + + // Maintain aspect ratio for icons + double aspectRatio = (double) icon.getWidth(null) / icon.getHeight(null); + if (scaledWidth / scaledHeight > aspectRatio) { + scaledWidth = (int) (scaledHeight * aspectRatio); + } else { + scaledHeight = (int) (scaledWidth / aspectRatio); + } + + return icon.getScaledInstance(scaledWidth, scaledHeight, Image.SCALE_SMOOTH); + } +} diff --git a/src/main/resources/messages_ar_AR.properties b/src/main/resources/messages_ar_AR.properties index 8461d1e9..9b116fdf 100644 --- a/src/main/resources/messages_ar_AR.properties +++ b/src/main/resources/messages_ar_AR.properties @@ -262,7 +262,7 @@ home.desc=متجرك الشامل المستضاف محليًا لجميع اح home.searchBar=البحث عن الميزات... -home.viewPdf.title=عرض PDF +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=عرض وتعليق وإضافة نص أو صور viewPdf.tags=عرض,قراءة,تعليق,نص,صورة @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=إزالة الأول pdfOrganiser.mode.8=إزالة الأخير pdfOrganiser.mode.9=إزالة pdfOrganiser.mode.10=دمج فردي-زوجي +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(مثال: 1,3,2 أو 4-8,2,10-12 أو 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully. multiTool-advert.message=هذه الميزة متوفرة في صفحة الأدوات المتعددة لدينا. اطلع عليها للحصول على واجهة مستخدم محسّنة لكل صفحة وميزات إضافية! #view pdf -viewPdf.title=عرض PDF +viewPdf.title=View/Edit PDF viewPdf.header=عرض PDF #pageRemover diff --git a/src/main/resources/messages_az_AZ.properties b/src/main/resources/messages_az_AZ.properties index 9055e64c..1854f882 100644 --- a/src/main/resources/messages_az_AZ.properties +++ b/src/main/resources/messages_az_AZ.properties @@ -262,7 +262,7 @@ home.desc=Bütün PDF ehtiyaclarınız üçün lokal-host edilən biraddımlıq home.searchBar=Xüsusiyyətləri axtar... -home.viewPdf.title=PDF-ə bax +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=Bax, sitat götür, mətn və ya şəkil əlavə et viewPdf.tags=bax,oxu,sitat götür,mətn,şəkil @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Birincini Sil pdfOrganiser.mode.8=Sonuncunu Sil pdfOrganiser.mode.9=Birinci və Sonuncunu Sil pdfOrganiser.mode.10=Tək-Cüt Birləşdirmə +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(məs., 1,3,2 və ya 4-8,2,10-12 və ya 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully. multiTool-advert.message=Bu xüsusiyyət bizim multi-alət səhifəmizdə də mövcuddur. Əlavə xüsusiyyətlər və səhifə-səhifə interfeys üçün sınaqdan keçirin! #view pdf -viewPdf.title=PDF-ə baxın +viewPdf.title=View/Edit PDF viewPdf.header=PDF-ə baxın #pageRemover diff --git a/src/main/resources/messages_bg_BG.properties b/src/main/resources/messages_bg_BG.properties index 403af0a0..5f7702b6 100644 --- a/src/main/resources/messages_bg_BG.properties +++ b/src/main/resources/messages_bg_BG.properties @@ -79,10 +79,10 @@ info=Информация pro=Pro page=Страница pages=Страници -loading=Loading... -addToDoc=Add to Document -reset=Reset -apply=Apply +loading=Зареждане на... +addToDoc=Добавяне към документ +reset=Нулиране +apply=Приложи legal.privacy=Политика за поверителност legal.terms=Правила и условия @@ -138,13 +138,13 @@ analytics.settings=Можете да промените настройките # NAVBAR # ############# navbar.favorite=Любими -navbar.recent=New and recently updated +navbar.recent=Нови и наскоро актуализирани navbar.darkmode=Тъмна тема navbar.language=Езици navbar.settings=Настройки navbar.allTools=Инструменти navbar.multiTool=Мулти инструменти -navbar.search=Search +navbar.search=Търсене navbar.sections.organize=Организирайте navbar.sections.convertTo=Преобразуване в PDF navbar.sections.convertFrom=Преобразуване от PDF @@ -240,20 +240,20 @@ database.creationDate=Дата на създаване database.fileSize=Размер на файла database.deleteBackupFile=Изтриване на архивен файл database.importBackupFile=Импортиране на архивен файл -database.createBackupFile=Create Backup File +database.createBackupFile=Създаване на файл с резервно копие database.downloadBackupFile=Изтеглете архивен файл database.info_1=Когато импортирате данни, е от решаващо значение да осигурите правилната структура. Ако не сте сигурни в това, което правите, потърсете съвет и подкрепа от професионалист. Грешка в структурата може да причини неизправност на приложението, включително пълна невъзможност за стартиране на приложението. database.info_2=Името на файла няма значение при качване. След това ще бъде преименуван, за да следва формата backup_user_yyyyMMddHHmm.sql, осигурявайки последователна конвенция за именуване. database.submit=Импортиране на резервно копие database.importIntoDatabaseSuccessed=Импортирането в базата данни бе успешно -database.backupCreated=Database backup successful +database.backupCreated=Успешно архивиране на базата данни database.fileNotFound=Файлът не е намерен database.fileNullOrEmpty=Файлът не трябва да е нулев или празен database.failedImportFile=Неуспешно импортиране на файл -database.notSupported=This function is not available for your database connection. +database.notSupported=Тази функция не е налична за вашата връзка с база данни. session.expired=Вашата сесия е изтекла. Моля, опреснете страницата и опитайте отново. -session.refreshPage=Refresh Page +session.refreshPage=Презареждане на страницата ############# # HOME-PAGE # @@ -262,18 +262,18 @@ home.desc=Вашето локално хоствано обслужване на home.searchBar=Търсене на функции... -home.viewPdf.title=Преглед на PDF +home.viewPdf.title=Преглед/Редактиране PDF home.viewPdf.desc=Преглеждайте, коментирайте, добавяйте текст или изображения viewPdf.tags=преглед,четене,анотиране,текст,изображение -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=Задаване на предпочитани +home.hideFavorites=Скриване на предпочитани +home.showFavorites=Покажи предпочитани +home.legacyHomepage=Стара начална страница +home.newHomePage=Опитайте новата ни начална страница! +home.alphabetical=По азбучен ред +home.globalPopularity=Световна популярност +home.sortBy=Сортиране по: home.multiTool.title=PDF Мулти инструмент home.multiTool.desc=Обединяване, завъртане, пренареждане и премахване на страници @@ -462,9 +462,9 @@ home.MarkdownToPDF.title=Markdown към PDF home.MarkdownToPDF.desc=Преобразува всеки Markdown файл към PDF MarkdownToPDF.tags=маркиране,уеб-съдържание,трансформация,преобразуване -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 към Markdown +home.PDFToMarkdown.desc=Преобразува всеки PDF файл в Markdown +PDFToMarkdown.tags=маркиране, уеб-съдържание, трансформация, конвертиране, MD home.getPdfInfo.title=Вземете ЦЯЛАТА информация от PDF home.getPdfInfo.desc=Взима всяка възможна информация от PDF файлове @@ -489,11 +489,11 @@ home.autoRedact.title=Автоматично редактиране home.autoRedact.desc=Автоматично редактира (зачернява) текст в PDF въз основа на въведен текст autoRedact.tags=Редактиране,Скриване,затъмняване,черен,маркер,скрит -home.redact.title=Manual Redaction -home.redact.desc=Redacts a PDF based on selected text, drawn shapes and/or selected page(s) -redact.tags=Redact,Hide,black out,black,marker,hidden,manual +home.redact.title=Ръчно редактиране +home.redact.desc=Редактиране на PDF файл въз основа на избран текст, нарисувани форми и/или избрана страница(и) +redact.tags=Редактиране, скриване, затъмнение, черно, маркер, скрито, ръчно -home.tableExtraxt.title=PDF в CSV +home.tableExtraxt.title=PDF към CSV home.tableExtraxt.desc=Извлича таблици от PDF, като ги конвертира в CSV tableExtraxt.tags=CSV,извличане на таблица,извличане,конвертиране @@ -533,9 +533,9 @@ home.splitPdfByChapters.title=Разделете PDF по глави home.splitPdfByChapters.desc=Разделете PDF на множество файлове въз основа на неговата структура на глави. splitPdfByChapters.tags=разделяне, глави, отметки, организиране -home.validateSignature.title=Validate PDF Signature -home.validateSignature.desc=Verify digital signatures and certificates in PDF documents -validateSignature.tags=signature,verify,validate,pdf,certificate,digital signature,Validate Signature,Validate certificate +home.validateSignature.title=Валидиране на PDF подпис +home.validateSignature.desc=Проверка на цифрови подписи и сертификати в PDF документи +validateSignature.tags=подпис,проверка,валидиране,pdf,сертификат,цифров подпис,валидиране на подпис,валидиране на сертификат #replace-invert-color replace-color.title=Замени-инвертиране-на-цвят @@ -580,7 +580,7 @@ login.oauth2invalidRequest=Невалидна заявка login.oauth2AccessDenied=Отказан достъп login.oauth2InvalidTokenResponse=Невалиден отговор на токена login.oauth2InvalidIdToken=Невалиден токен за идентификатор -login.relyingPartyRegistrationNotFound=No relying party registration found +login.relyingPartyRegistrationNotFound=Не е открита регистрация на доверяваща се страна login.userIsDisabled=Потребителят е деактивиран, влизането в момента е блокирано с това потребителско име. Моля, свържете се с администратора. login.alreadyLoggedIn=Вече сте влезли в login.alreadyLoggedIn2=устройства. Моля, излезте от устройствата и опитайте отново. @@ -599,31 +599,31 @@ autoRedact.convertPDFToImageLabel=Преобразуване на PDF към PDF autoRedact.submitButton=Изпращане #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=Ръчно редактиране +redact.header=Ръчно редактиране +redact.submit=Редактиране +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.zoom=Увеличаване +redact.zoomIn=Увеличаване на мащаба +redact.zoomOut=Намаляване на мащаба +redact.nextPage=Следваща страница +redact.previousPage=Предишна страница +redact.toggleSidebar=Превключване на страничната лента +redact.showThumbnails=Показване на миниатюри +redact.showDocumentOutline=Показване на контура на документа (кликнете два пъти, за да разгънете/свиете всички елементи) +redact.showAttatchments=Показване на прикачени файлове +redact.showLayers=Показване на слоеве (щракнете два пъти, за да върнете всички слоеве в състояние по подразбиране) +redact.colourPicker=Избор на цвят +redact.findCurrentOutlineItem=Намиране на текущия елемент от контура +redact.applyChanges=Прилагане на промените #showJS showJS.title=Покажи Javascript @@ -661,9 +661,9 @@ MarkdownToPDF.credit=Използва WeasyPrint #pdf-to-markdown -PDFToMarkdown.title=PDF To Markdown -PDFToMarkdown.header=PDF To Markdown -PDFToMarkdown.submit=Convert +PDFToMarkdown.title=PDF към Markdown +PDFToMarkdown.header=PDF към Markdown +PDFToMarkdown.submit=Преобразуване #url-to-pdf @@ -809,7 +809,7 @@ certSign.showSig=Показване на подпис certSign.reason=Причина certSign.location=Местоположение certSign.name=Име -certSign.showLogo=Show Logo +certSign.showLogo=Покажи лого certSign.submit=Подпишете PDF @@ -844,9 +844,9 @@ compare.highlightColor.2=Цвят на маркирането 2: compare.document.1=Документ 1 compare.document.2=Документ 2 compare.submit=Сравнявай -compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced -compare.large.file.message=One or Both of the provided documents are too large to process -compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison. +compare.complex.message=Един или и двата предоставени документа са големи файлове, точността на сравнението може да бъде намалена. +compare.large.file.message=Един или и двата предоставени документа са твърде големи за обработка +compare.no.text.message=Един или и двата избрани PDF файла нямат текстово съдържание. Моля, изберете PDF файлове с текст за сравнение. #BookToPDF BookToPDF.title=Книги и комикси в PDF @@ -869,18 +869,18 @@ sign.draw=Начертайте подпис sign.text=Въвеждане на текст sign.clear=Изчисти sign.add=Добави -sign.saved=Saved Signatures -sign.save=Save Signature -sign.personalSigs=Personal Signatures -sign.sharedSigs=Shared Signatures -sign.noSavedSigs=No saved signatures found -sign.addToAll=Add to all pages -sign.delete=Delete -sign.first=First page -sign.last=Last page -sign.next=Next page -sign.previous=Previous page -sign.maintainRatio=Toggle maintain aspect ratio +sign.saved=Съхранени подписи +sign.save=Запазване на подпис +sign.personalSigs=Лични подписи +sign.sharedSigs=Споделени подписи +sign.noSavedSigs=Не са намерени запазени подписи +sign.addToAll=Дибави към всички страници +sign.delete=Изтрий +sign.first=Първа страница +sign.last=Последна страница +sign.next=Следваща страница +sign.previous=Предишна стараница +sign.maintainRatio=Превключване за поддържане на съотношението на страните #repair @@ -952,7 +952,7 @@ compress.title=Компресиране compress.header=Компресиране на PDF compress.credit=Тази услуга използва qpdf за PDF компресиране/оптимизиране. compress.selectText.1=Ръчен режим - от 1 до 5 -compress.selectText.1.1=In optimization levels 6 to 9, in addition to general PDF compression, image resolution is scaled down to further reduce file size. Higher levels result in stronger image compression (up to 50% of the original size), achieving greater size reduction but with potential quality loss in images. +compress.selectText.1.1=При нива на оптимизация от 6 до 9, в допълнение към общото компресиране на PDF, резолюцията на изображението се намалява, за да се намали допълнително размерът на файла. По-високите нива водят до по-силна компресия на изображенията (до 50% от оригиналния размер), като се постига по-голямо намаляване на размера, но с потенциална загуба на качество на изображенията. compress.selectText.2=Ниво на оптимизация: compress.selectText.3=4 (Ужасно за текстови изображения) compress.selectText.4=Автоматичен режим - Автоматично настройва качеството, за да получи PDF с точен размер @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Премахни първо pdfOrganiser.mode.8=Премахване на последния pdfOrganiser.mode.9=Премахване на първия и последния pdfOrganiser.mode.10=Обединяване на четно и нечетно +pdfOrganiser.mode.11=Дублиране на всички страници pdfOrganiser.placeholder=(напр. 1,3,2 или 4-8,2,10-12 или 2n-1) @@ -999,42 +1000,42 @@ pdfOrganiser.placeholder=(напр. 1,3,2 или 4-8,2,10-12 или 2n-1) multiTool.title=PDF Мулти инструмент multiTool.header=PDF Мулти инструмент multiTool.uploadPrompts=Име на файл -multiTool.selectAll=Select All -multiTool.deselectAll=Deselect All -multiTool.selectPages=Page Select -multiTool.selectedPages=Selected Pages -multiTool.page=Page -multiTool.deleteSelected=Delete Selected -multiTool.downloadAll=Export -multiTool.downloadSelected=Export Selected +multiTool.selectAll=Изберете всички +multiTool.deselectAll=Отмяна на избора на всички +multiTool.selectPages=Избор на страница +multiTool.selectedPages=Избрани страници +multiTool.page=Страница +multiTool.deleteSelected=Изтриване на избраното +multiTool.downloadAll=Експорт +multiTool.downloadSelected=Избрано за експортиране -multiTool.insertPageBreak=Insert Page Break -multiTool.addFile=Add File -multiTool.rotateLeft=Rotate Left -multiTool.rotateRight=Rotate Right -multiTool.split=Split -multiTool.moveLeft=Move Left -multiTool.moveRight=Move Right -multiTool.delete=Delete -multiTool.dragDropMessage=Page(s) Selected -multiTool.undo=Undo -multiTool.redo=Redo +multiTool.insertPageBreak=Вмъкване на прекъсване на страница +multiTool.addFile=Добавяне на файл +multiTool.rotateLeft=Завъртете наляво +multiTool.rotateRight=Завъртете надясно +multiTool.split=Разделяне +multiTool.moveLeft=Преместване наляво +multiTool.moveRight=Преместване надясно +multiTool.delete=Изтрий +multiTool.dragDropMessage=Избран(и) страница(/и) +multiTool.undo=Отмяна на +multiTool.redo=Повтори #decrypt -decrypt.passwordPrompt=This file is password-protected. Please enter the password: -decrypt.cancelled=Operation cancelled for PDF: {0} -decrypt.noPassword=No password provided for encrypted PDF: {0} -decrypt.invalidPassword=Please try again with the correct password. -decrypt.invalidPasswordHeader=Incorrect password or unsupported encryption for PDF: {0} -decrypt.unexpectedError=There was an error processing the file. Please try again. -decrypt.serverError=Server error while decrypting: {0} -decrypt.success=File decrypted successfully. +decrypt.passwordPrompt=Този файл е защитен с парола. Моля, въведете паролата: +decrypt.cancelled=Операцията за PDF е отменена: {0} +decrypt.noPassword=Не е предоставена парола за шифрирания PDF: {0} +decrypt.invalidPassword=Моля, опитайте отново с правилната парола. +decrypt.invalidPasswordHeader=Неправилна парола или неподдържано криптиране за PDF: {0} +decrypt.unexpectedError=Възникна грешка при обработката на файла. Моля, опитайте отново. +decrypt.serverError=Грешка в работата на сървъра повреме на дешифриране: {0} +decrypt.success=Файлът е успешно дешифриран. #multiTool-advert -multiTool-advert.message=This feature is also available in our multi-tool page. Check it out for enhanced page-by-page UI and additional features! +multiTool-advert.message=Тази функция е налична и в нашата страница с множество инструменти. Проверете го за подобрен потребителски интерфейс страница по страница и допълнителни функции! #view pdf -viewPdf.title=Преглед на PDF +viewPdf.title=Преглед/Редактиране на PDF viewPdf.header=Преглед на PDF #pageRemover @@ -1335,51 +1336,51 @@ splitByChapters.desc.4=Разрешаване на дубликати: Ако е splitByChapters.submit=Разделяне на PDF #File Chooser -fileChooser.click=Click -fileChooser.or=or -fileChooser.dragAndDrop=Drag & Drop -fileChooser.dragAndDropPDF=Drag & Drop PDF file -fileChooser.dragAndDropImage=Drag & Drop Image file -fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here +fileChooser.click=Щракнете +fileChooser.or=или +fileChooser.dragAndDrop=Влачете и пуснете +fileChooser.dragAndDropPDF=Влачете и пуснете PDF файл +fileChooser.dragAndDropImage=Влачете и пуснете изображение +fileChooser.hoveredDragAndDrop=Влачете и пуснете файл(ове) тук #release notes -releases.footer=Releases -releases.title=Release Notes -releases.header=Release Notes -releases.current.version=Current Release -releases.note=Release notes are only available in English +releases.footer=Версии +releases.title=Бележки към версиите +releases.header=Бележки към версиите +releases.current.version=Текуща версия +releases.note=Бележките към изданието са налични само на английски език #Validate Signature -validateSignature.title=Validate PDF Signatures -validateSignature.header=Validate Digital Signatures -validateSignature.selectPDF=Select signed PDF file -validateSignature.submit=Validate Signatures -validateSignature.results=Validation Results -validateSignature.status=Status -validateSignature.signer=Signer -validateSignature.date=Date -validateSignature.reason=Reason -validateSignature.location=Location -validateSignature.noSignatures=No digital signatures found in this document -validateSignature.status.valid=Valid -validateSignature.status.invalid=Invalid -validateSignature.chain.invalid=Certificate chain validation failed - cannot verify signer's identity -validateSignature.trust.invalid=Certificate not in trust store - source cannot be verified -validateSignature.cert.expired=Certificate has expired -validateSignature.cert.revoked=Certificate has been revoked -validateSignature.signature.info=Signature Information -validateSignature.signature=Signature -validateSignature.signature.mathValid=Signature is mathematically valid BUT: -validateSignature.selectCustomCert=Custom Certificate File X.509 (Optional) -validateSignature.cert.info=Certificate Details -validateSignature.cert.issuer=Issuer -validateSignature.cert.subject=Subject -validateSignature.cert.serialNumber=Serial Number -validateSignature.cert.validFrom=Valid From -validateSignature.cert.validUntil=Valid Until -validateSignature.cert.algorithm=Algorithm -validateSignature.cert.keySize=Key Size -validateSignature.cert.version=Version -validateSignature.cert.keyUsage=Key Usage -validateSignature.cert.selfSigned=Self-Signed -validateSignature.cert.bits=bits +validateSignature.title=Удостоверяване на PDF подписи +validateSignature.header=Потвърждаване на цифрови подписи +validateSignature.selectPDF=Изберете подписания PDF файл +validateSignature.submit=Потвърждаване на подписите +validateSignature.results=Резултати от валидирането +validateSignature.status=Статус +validateSignature.signer=Подписващ +validateSignature.date=Дата +validateSignature.reason=Причина +validateSignature.location=Местоположение +validateSignature.noSignatures=В този документ не са открити цифрови подписи +validateSignature.status.valid=Валиден +validateSignature.status.invalid=Невалиден +validateSignature.chain.invalid=Удостоверяването на веригата на сертификата е неуспешно - не може да се провери самоличността на подписващия +validateSignature.trust.invalid=Сертификатът не е в хранилището за доверие - източникът не може да бъде проверен +validateSignature.cert.expired=Сертификатът е изтекъл +validateSignature.cert.revoked=Сертификатът е отменен +validateSignature.signature.info=Информация за подписа +validateSignature.signature=Подпис +validateSignature.signature.mathValid=Подписът е математически валиден, НО: +validateSignature.selectCustomCert=Файл със сертификат X.509 по поръчка (по избор) +validateSignature.cert.info=Подробности за сертификата +validateSignature.cert.issuer=Издател +validateSignature.cert.subject=Тема +validateSignature.cert.serialNumber=Сериен номер +validateSignature.cert.validFrom=Валиден от +validateSignature.cert.validUntil=Валиден до +validateSignature.cert.algorithm=Алгоритъм +validateSignature.cert.keySize=Размер на ключ +validateSignature.cert.version=Версия +validateSignature.cert.keyUsage=Предназначение на ключа за използване +validateSignature.cert.selfSigned=Самостоятелно подписан +validateSignature.cert.bits=битове diff --git a/src/main/resources/messages_ca_CA.properties b/src/main/resources/messages_ca_CA.properties index 40736e96..3a366142 100644 --- a/src/main/resources/messages_ca_CA.properties +++ b/src/main/resources/messages_ca_CA.properties @@ -262,7 +262,7 @@ home.desc=L'eina allotjada localment per a necessitats de PDF. home.searchBar=Cerca funcions... -home.viewPdf.title=Visualitza PDF +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=Visualitza, anota, afegeix text o imatges viewPdf.tags=view,read,annotate,text,image @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Eliminar Primer pdfOrganiser.mode.8=Eliminar Últim pdfOrganiser.mode.9=Eliminar Primer i Últim pdfOrganiser.mode.10=Fusionar Parells-Senars +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(p. ex. 1,3,2 o 4-8,2,10-12 o 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully. multiTool-advert.message=This feature is also available in our multi-tool page. Check it out for enhanced page-by-page UI and additional features! #view pdf -viewPdf.title=Visualitza PDF +viewPdf.title=View/Edit PDF viewPdf.header=Visualitza PDF #pageRemover diff --git a/src/main/resources/messages_cs_CZ.properties b/src/main/resources/messages_cs_CZ.properties index 7b387258..c77901d0 100644 --- a/src/main/resources/messages_cs_CZ.properties +++ b/src/main/resources/messages_cs_CZ.properties @@ -262,7 +262,7 @@ home.desc=Vaše lokálně hostované řešení pro všechny vaše potřeby PDF. home.searchBar=Hledat funkce... -home.viewPdf.title=Zobrazit PDF +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=Zobrazit, anotovat, přidat text nebo obrázky viewPdf.tags=zobrazit,číst,anotovat,text,obrázek @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Odstranit první pdfOrganiser.mode.8=Odstranit poslední pdfOrganiser.mode.9=Odstranit první a poslední pdfOrganiser.mode.10=Sloučení sudé-liché +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(např. 1,3,2 nebo 4-8,2,10-12 nebo 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=Soubor byl úspěšně dešifrován. multiTool-advert.message=Tato funkce je také k dispozici na naší stránce multi-nástroje. Podívejte se na ni pro vylepšené rozhraní pro práci se stránkami a další funkce! #view pdf -viewPdf.title=Zobrazit PDF +viewPdf.title=View/Edit PDF viewPdf.header=Zobrazit PDF #pageRemover diff --git a/src/main/resources/messages_da_DK.properties b/src/main/resources/messages_da_DK.properties index 4d4ea7f8..7db1bd53 100644 --- a/src/main/resources/messages_da_DK.properties +++ b/src/main/resources/messages_da_DK.properties @@ -262,7 +262,7 @@ home.desc=Dit lokalt hostede one-stop-shop for alle dine PDF-behov. home.searchBar=Søg efter funktioner... -home.viewPdf.title=Se PDF +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=Se, annotér, tilføj tekst eller billeder viewPdf.tags=se,læs,annotér,tekst,billede @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Fjern Første pdfOrganiser.mode.8=Fjern Sidste pdfOrganiser.mode.9=Fjern Første og Sidste pdfOrganiser.mode.10=Ulige-Lige Sammenføjning +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(f.eks. 1,3,2 eller 4-8,2,10-12 eller 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully. multiTool-advert.message=This feature is also available in our multi-tool page. Check it out for enhanced page-by-page UI and additional features! #view pdf -viewPdf.title=Se PDF +viewPdf.title=View/Edit PDF viewPdf.header=Se PDF #pageRemover diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties index 76de8ded..ef442185 100644 --- a/src/main/resources/messages_de_DE.properties +++ b/src/main/resources/messages_de_DE.properties @@ -262,7 +262,7 @@ home.desc=Ihr lokal gehosteter One-Stop-Shop für alle Ihre PDF-Anforderungen. home.searchBar=Suche nach Funktionen... -home.viewPdf.title=PDF anzeigen +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=Anzeigen, Kommentieren, Text oder Bilder hinzufügen viewPdf.tags=anzeigen,lesen,kommentieren,text,bild @@ -992,6 +992,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.placeholder=(z.B. 1,3,2 oder 4-8,2,10-12 oder 2n-1) @@ -1034,7 +1035,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=PDF anzeigen +viewPdf.title=View/Edit PDF viewPdf.header=PDF anzeigen #pageRemover diff --git a/src/main/resources/messages_el_GR.properties b/src/main/resources/messages_el_GR.properties index ab7c7e32..554ff22e 100644 --- a/src/main/resources/messages_el_GR.properties +++ b/src/main/resources/messages_el_GR.properties @@ -262,7 +262,7 @@ home.desc=Ο τοπικά φιλοξενούμενος προορισμός σα home.searchBar=Αναζήτηση λειτουργιών... -home.viewPdf.title=Προβολή PDF +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=Προβολή, σχολιασμός, προσθήκη κειμένου ή εικόνων viewPdf.tags=προβολή,ανάγνωση,σχολιασμός,κείμενο,εικόνα @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Αφαίρεση πρώτης pdfOrganiser.mode.8=Αφαίρεση τελευταίας pdfOrganiser.mode.9=Αφαίρεση πρώτης και τελευταίας pdfOrganiser.mode.10=Συγχώνευση μονών-ζυγών +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(π.χ. 1,3,2 ή 4-8,2,10-12 ή 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=Το αρχείο αποκρυπτογραφήθηκε με επ multiTool-advert.message=Αυτή η λειτουργία είναι επίσης διαθέσιμη στη σελίδα πολυεργαλείου μας. Δείτε την για βελτιωμένο περιβάλλον χρήστη σελίδα-προς-σελίδα και επιπλέον λειτουργίες! #view pdf -viewPdf.title=Προβολή PDF +viewPdf.title=View/Edit PDF viewPdf.header=Προβολή PDF #pageRemover diff --git a/src/main/resources/messages_en_GB.properties b/src/main/resources/messages_en_GB.properties index 6e6b234b..a77d3671 100644 --- a/src/main/resources/messages_en_GB.properties +++ b/src/main/resources/messages_en_GB.properties @@ -262,9 +262,9 @@ home.desc=Your locally hosted one-stop-shop for all your PDF needs. home.searchBar=Search for features... -home.viewPdf.title=View PDF -home.viewPdf.desc=View, annotate, add text or images -viewPdf.tags=view,read,annotate,text,image +home.viewPdf.title=View/Edit PDF +home.viewPdf.desc=View, annotate, draw, add text or images +viewPdf.tags=view,read,annotate,text,image,highlight,edit home.setFavorites=Set Favourites home.hideFavorites=Hide Favourites @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Remove First pdfOrganiser.mode.8=Remove Last pdfOrganiser.mode.9=Remove First and Last pdfOrganiser.mode.10=Odd-Even Merge +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully. multiTool-advert.message=This feature is also available in our multi-tool page. Check it out for enhanced page-by-page UI and additional features! #view pdf -viewPdf.title=View PDF +viewPdf.title=View/Edit PDF viewPdf.header=View PDF #pageRemover diff --git a/src/main/resources/messages_en_US.properties b/src/main/resources/messages_en_US.properties index 3073a6ea..b1bfeaab 100644 --- a/src/main/resources/messages_en_US.properties +++ b/src/main/resources/messages_en_US.properties @@ -262,9 +262,9 @@ home.desc=Your locally hosted one-stop-shop for all your PDF needs. home.searchBar=Search for features... -home.viewPdf.title=View PDF -home.viewPdf.desc=View, annotate, add text or images -viewPdf.tags=view,read,annotate,text,image +home.viewPdf.title=View/Edit PDF +home.viewPdf.desc=View, annotate, draw, add text or images +viewPdf.tags=view,read,annotate,text,image,highlight,edit home.setFavorites=Set Favourites home.hideFavorites=Hide Favourites @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Remove First pdfOrganiser.mode.8=Remove Last pdfOrganiser.mode.9=Remove First and Last pdfOrganiser.mode.10=Odd-Even Merge +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully. multiTool-advert.message=This feature is also available in our multi-tool page. Check it out for enhanced page-by-page UI and additional features! #view pdf -viewPdf.title=View PDF +viewPdf.title=View/Edit PDF viewPdf.header=View PDF #pageRemover diff --git a/src/main/resources/messages_es_ES.properties b/src/main/resources/messages_es_ES.properties index e6e16738..0124b9e4 100644 --- a/src/main/resources/messages_es_ES.properties +++ b/src/main/resources/messages_es_ES.properties @@ -262,7 +262,7 @@ home.desc=Su ventanilla única autohospedada para todas sus necesidades PDF home.searchBar=Buscar características... -home.viewPdf.title=Ver PDF +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=Ver, anotar, añadir texto o imágenes viewPdf.tags=ver,leer,anotar,texto,imagen @@ -992,6 +992,7 @@ 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) @@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully. multiTool-advert.message=This feature is also available in our multi-tool page. Check it out for enhanced page-by-page UI and additional features! #view pdf -viewPdf.title=Ver PDF +viewPdf.title=View/Edit PDF viewPdf.header=Ver PDF #pageRemover diff --git a/src/main/resources/messages_eu_ES.properties b/src/main/resources/messages_eu_ES.properties index cfff26a8..2a62b8fa 100644 --- a/src/main/resources/messages_eu_ES.properties +++ b/src/main/resources/messages_eu_ES.properties @@ -262,7 +262,7 @@ home.desc=Zure leihatila bakarra autoostatatua zure PDF behar guztietarako home.searchBar=Search for features... -home.viewPdf.title=View PDF +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=View, annotate, add text or images viewPdf.tags=view,read,annotate,text,image @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Remove First pdfOrganiser.mode.8=Remove Last pdfOrganiser.mode.9=Remove First and Last pdfOrganiser.mode.10=Odd-Even Merge +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully. multiTool-advert.message=This feature is also available in our multi-tool page. Check it out for enhanced page-by-page UI and additional features! #view pdf -viewPdf.title=View PDF +viewPdf.title=View/Edit PDF viewPdf.header=View PDF #pageRemover diff --git a/src/main/resources/messages_fa_IR.properties b/src/main/resources/messages_fa_IR.properties index dea48cf1..ffac791c 100644 --- a/src/main/resources/messages_fa_IR.properties +++ b/src/main/resources/messages_fa_IR.properties @@ -262,7 +262,7 @@ home.desc=مغازه‌ همه‌کاره میزبانی‌شده به صورت home.searchBar=جستجو برای ویژگی‌ها... -home.viewPdf.title=مشاهده PDF +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=مشاهده، حاشیه‌نویسی، افزودن متن یا تصاویر viewPdf.tags=مشاهده،خواندن،حاشیه‌نویسی،متن،تصویر @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=حذف اولین pdfOrganiser.mode.8=حذف آخرین pdfOrganiser.mode.9=حذف اول و آخر pdfOrganiser.mode.10=ادغام فرد-زوج +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(مثال: ۱,۳,۲ یا ۴-۸,۲,۱۰-۱۲ یا 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully. multiTool-advert.message=این ویژگی همچنین در صفحه ابزار چندگانه ما موجود است. برای رابط کاربری صفحه به صفحه پیشرفته و ویژگی‌های اضافی بررسی کنید! #view pdf -viewPdf.title=مشاهده PDF +viewPdf.title=View/Edit PDF viewPdf.header=مشاهده PDF #pageRemover diff --git a/src/main/resources/messages_fr_FR.properties b/src/main/resources/messages_fr_FR.properties index e935e06f..08a669f5 100644 --- a/src/main/resources/messages_fr_FR.properties +++ b/src/main/resources/messages_fr_FR.properties @@ -262,7 +262,7 @@ home.desc=Votre application Web hébergée localement pour répondre à tous vos home.searchBar=Rechercher des fonctionnalités... -home.viewPdf.title=Visionner le PDF +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=Visionner, annoter, ajouter du texte ou des images. viewPdf.tags=visualiser,lire,annoter,texte,image @@ -485,13 +485,13 @@ home.showJS.title=Afficher le JavaScript home.showJS.desc=Recherche et affiche tout JavaScript injecté dans un PDF. showJS.tags=JS -home.autoRedact.title=Caviarder automatiquement -home.autoRedact.desc=Caviardez automatiquement les informations sensibles d'un PDF. -autoRedact.tags=caviarder,redact,auto +home.autoRedact.title=Censure automatique +home.autoRedact.desc=Censurer automatiquement les informations sensibles d'un PDF. +autoRedact.tags=caviarder,rédiger,censurer,redact,auto -home.redact.title=Rédaction manuelle -home.redact.desc=Rédiger un PDF en fonction de texte sélectionné, formes dessinées et/ou des pages sélectionnées. -redact.tags=Redact,Hide,black out,black,marker,hidden,manual +home.redact.title=Censure manuelle +home.redact.desc=Censurer un PDF en fonction de texte sélectionné, formes dessinées et/ou des pages sélectionnées. +redact.tags=Redact,Hide,black out,black,marker,hidden,manual,caviarder,rédiger,censurer home.tableExtraxt.title=PDF en CSV home.tableExtraxt.desc=Extrait les tableaux d'un PDF et les transforme en CSV. @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Supprimer le premier pdfOrganiser.mode.8=Supprimer le dernier pdfOrganiser.mode.9=Supprimer le premier et le dernier pdfOrganiser.mode.10=Méger Impair-Pair +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(par exemple 1,3,2 ou 4-8,2,10-12 ou 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=Fichier déchiffré avec succès. multiTool-advert.message=Cette fonctionnalité est aussi disponible dans la page de l'outil multifonction. Allez-y pour une interface page par page améliorée et des fonctionnalités additionnelles ! #view pdf -viewPdf.title=Visualiser un PDF +viewPdf.title=View/Edit PDF viewPdf.header=Visualiser un PDF #pageRemover diff --git a/src/main/resources/messages_ga_IE.properties b/src/main/resources/messages_ga_IE.properties index 395a96c3..34b571c5 100644 --- a/src/main/resources/messages_ga_IE.properties +++ b/src/main/resources/messages_ga_IE.properties @@ -262,7 +262,7 @@ home.desc=Do shiopa ilfhreastail arna óstáil go háitiúil do do riachtanais P home.searchBar=Cuardaigh gnéithe... -home.viewPdf.title=Féach PDF +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=Féach ar, nótáil, cuir téacs nó íomhánna leis viewPdf.tags=amharc, léamh, anótáil, téacs, íomhá @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Bain Ar dtús pdfOrganiser.mode.8=Bain Last pdfOrganiser.mode.9=Bain An Chéad agus an Deireadh pdfOrganiser.mode.10=Corr-Fiú Cumaisc +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(m.sh. 1,3,2 nó 4-8,2,10-12 nó 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=D'éirigh le díchriptiú an chomhaid. multiTool-advert.message=Tá an ghné seo ar fáil inár leathanach il-uirlisí freisin. Seiceáil é le haghaidh Chomhéadain leathanach ar leathanach feabhsaithe agus gnéithe breise! #view pdf -viewPdf.title=Féach PDF +viewPdf.title=View/Edit PDF viewPdf.header=Féach PDF #pageRemover diff --git a/src/main/resources/messages_hi_IN.properties b/src/main/resources/messages_hi_IN.properties index be389931..472b71c6 100644 --- a/src/main/resources/messages_hi_IN.properties +++ b/src/main/resources/messages_hi_IN.properties @@ -262,7 +262,7 @@ home.desc=आपकी सभी PDF आवश्यकताओं के ल home.searchBar=सुविधाएं खोजें... -home.viewPdf.title=PDF देखें +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=देखें, टिप्पणी करें, टेक्स्ट या छवियां जोड़ें viewPdf.tags=देखें,पढ़ें,टिप्पणी,टेक्स्ट,छवि @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=प्रथम हटाएं pdfOrganiser.mode.8=अंतिम हटाएं pdfOrganiser.mode.9=प्रथम और अंतिम हटाएं pdfOrganiser.mode.10=विषम-सम मर्ज +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(जैसे 1,3,2 या 4-8,2,10-12 या 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=फ़ाइल सफलतापूर्वक डिक् multiTool-advert.message=यह सुविधा हमारे मल्टी-टूल पृष्ठ में भी उपलब्ध है। बेहतर पृष्ठ-दर-पृष्ठ UI और अतिरिक्त सुविधाओं के लिए इसे देखें! #view pdf -viewPdf.title=PDF देखें +viewPdf.title=View/Edit PDF viewPdf.header=PDF देखें #pageRemover diff --git a/src/main/resources/messages_hr_HR.properties b/src/main/resources/messages_hr_HR.properties index a474a776..e25d901a 100644 --- a/src/main/resources/messages_hr_HR.properties +++ b/src/main/resources/messages_hr_HR.properties @@ -262,7 +262,7 @@ home.desc=Sve na jednom mjestu za sve vaše PDF potrebe. home.searchBar=Pretraži funkcije... -home.viewPdf.title=Pregledaj PDF +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=Pregledaj, komentiraj, dodaj tekst ili slike viewPdf.tags=pregled,čitanje,komentiranje,tekst,slika @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Ukloni Prvu pdfOrganiser.mode.8=Ukloni Zadnju pdfOrganiser.mode.9=Ukloni Prvu i Zadnju pdfOrganiser.mode.10=Neparno-parna kombinacija +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(npr. 1,3,2 ili 4-8,2,10-12 ili 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully. multiTool-advert.message=This feature is also available in our multi-tool page. Check it out for enhanced page-by-page UI and additional features! #view pdf -viewPdf.title=Pogledaj +viewPdf.title=View/Edit PDF viewPdf.header=Pogledaj PDF #pageRemover diff --git a/src/main/resources/messages_hu_HU.properties b/src/main/resources/messages_hu_HU.properties index 085f229e..e89e8cda 100644 --- a/src/main/resources/messages_hu_HU.properties +++ b/src/main/resources/messages_hu_HU.properties @@ -262,7 +262,7 @@ home.desc=Az Ön helyi PDF-szükségleteinek teljes körű megoldása. home.searchBar=Funkciók keresése... -home.viewPdf.title=PDF megtekintése +home.viewPdf.title=View/Edit PDF 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 @@ -992,6 +992,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.placeholder=(pl. 1,3,2 vagy 4-8,2,10-12 vagy 2n-1) @@ -1034,7 +1035,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=PDF megtekintése +viewPdf.title=View/Edit PDF viewPdf.header=PDF megtekintése #pageRemover diff --git a/src/main/resources/messages_id_ID.properties b/src/main/resources/messages_id_ID.properties index 003e0df7..4f2cc88c 100644 --- a/src/main/resources/messages_id_ID.properties +++ b/src/main/resources/messages_id_ID.properties @@ -262,7 +262,7 @@ home.desc=Semua kebutuhan PDF Anda, langsung dari komputer lokal Anda. home.searchBar=Mencari fitur... -home.viewPdf.title=Lihat PDF +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=Melihat, membuat anotasi, menambahkan teks atau gambar viewPdf.tags=melihat,membaca,membuat anotasi,teks,gambar @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Hapus Pertama pdfOrganiser.mode.8=Hapus Terakhir pdfOrganiser.mode.9=Hapus Pertama dan Terakhir pdfOrganiser.mode.10=Penggabungan Genap-Ganjil +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(misalnya 1,3,2 atau 4-8,2,10-12 atau 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully. multiTool-advert.message=This feature is also available in our multi-tool page. Check it out for enhanced page-by-page UI and additional features! #view pdf -viewPdf.title=Lihat PDF +viewPdf.title=View/Edit PDF viewPdf.header=Lihat PDF #pageRemover diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index 353e4c7c..bbd88bd0 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -262,7 +262,7 @@ home.desc=La tua pagina auto-gestita per modificare qualsiasi PDF. home.searchBar=Cerca funzionalità... -home.viewPdf.title=Visualizza PDF +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=Visualizza, annota, aggiungi testo o immagini viewPdf.tags=visualizzare,leggere,annotare,testo,immagine @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Rimuovi prima pdfOrganiser.mode.8=Rimuovi ultima pdfOrganiser.mode.9=Rimuovi la prima e l'ultima pdfOrganiser.mode.10=Unione pari-dispari +pdfOrganiser.mode.11=Duplica tutte le pagine pdfOrganiser.placeholder=(ad es. 1,3,2 o 4-8,2,10-12 o 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=File decrittografato con successo. multiTool-advert.message=Questa funzione è disponibile anche nella nostra pagina multi-strumento. Scoprila per un'interfaccia utente pagina per pagina migliorata e funzionalità aggiuntive! #view pdf -viewPdf.title=Visualizza PDF +viewPdf.title=Visualizza/Modifica PDF viewPdf.header=Visualizza PDF #pageRemover diff --git a/src/main/resources/messages_ja_JP.properties b/src/main/resources/messages_ja_JP.properties index f2ba01ad..1f0e4d71 100644 --- a/src/main/resources/messages_ja_JP.properties +++ b/src/main/resources/messages_ja_JP.properties @@ -262,7 +262,7 @@ home.desc=PDFのあらゆるニーズに対応するローカルホスティン home.searchBar=機能検索... -home.viewPdf.title=PDFを表示 +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=表示、注釈、テキストや画像の追加 viewPdf.tags=view,read,annotate,text,image @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=最初に削除 pdfOrganiser.mode.8=最後を削除 pdfOrganiser.mode.9=最初と最後を削除 pdfOrganiser.mode.10=奇数-偶数の結合 +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(例:1,3,2または4-8,2,10-12または2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=ファイルの暗号化が正常に完了しました。 multiTool-advert.message=この機能は、マルチツールでもご利用いただけます。強化されたページごとのUIと追加機能についてはこちらをご覧ください。 #view pdf -viewPdf.title=PDFを表示 +viewPdf.title=View/Edit PDF viewPdf.header=PDFを表示 #pageRemover diff --git a/src/main/resources/messages_ko_KR.properties b/src/main/resources/messages_ko_KR.properties index 13906d2a..c102b0fa 100644 --- a/src/main/resources/messages_ko_KR.properties +++ b/src/main/resources/messages_ko_KR.properties @@ -262,7 +262,7 @@ home.desc=PDF 관련 모든 작업을 위한 로컬 호스팅 원스톱 솔루 home.searchBar=기능 검색... -home.viewPdf.title=PDF 보기 +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=보기, 주석 달기, 텍스트 또는 이미지 추가 viewPdf.tags=보기,읽기,주석,텍스트,이미지 @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=첫 페이지 제거 pdfOrganiser.mode.8=마지막 페이지 제거 pdfOrganiser.mode.9=첫 페이지와 마지막 페이지 제거 pdfOrganiser.mode.10=홀수-짝수 병합 +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(예: 1,3,2 또는 4-8,2,10-12 또는 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=파일이 성공적으로 복호화되었습니다. multiTool-advert.message=이 기능은 멀티 도구 페이지에서도 사용할 수 있습니다. 향상된 페이지별 UI와 추가 기능을 확인해보세요! #view pdf -viewPdf.title=PDF 보기 +viewPdf.title=View/Edit PDF viewPdf.header=PDF 보기 #pageRemover diff --git a/src/main/resources/messages_nl_NL.properties b/src/main/resources/messages_nl_NL.properties index d0a14236..0820703f 100644 --- a/src/main/resources/messages_nl_NL.properties +++ b/src/main/resources/messages_nl_NL.properties @@ -262,7 +262,7 @@ home.desc=Jouw lokaal gehoste one-stop-shop voor al je PDF-behoeften. home.searchBar=Zoek naar functies... -home.viewPdf.title=PDF bekijken +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=Bekijk, annoteer, voeg tekst of afbeeldingen toe viewPdf.tags=bekijken,lezen,annoteren,tekst,afbeelding @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Eerste verwijderen pdfOrganiser.mode.8=Laatste verwijderen pdfOrganiser.mode.9=Eerste en laaste verwijderen pdfOrganiser.mode.10=Oneven-even samenvoeken +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(bijv. 1,3,2 of 4-8,2,10-12 of 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully. multiTool-advert.message=This feature is also available in our multi-tool page. Check it out for enhanced page-by-page UI and additional features! #view pdf -viewPdf.title=PDF bekijken +viewPdf.title=View/Edit PDF viewPdf.header=PDF bekijken #pageRemover diff --git a/src/main/resources/messages_no_NB.properties b/src/main/resources/messages_no_NB.properties index fc68e560..8b820a7b 100644 --- a/src/main/resources/messages_no_NB.properties +++ b/src/main/resources/messages_no_NB.properties @@ -262,7 +262,7 @@ home.desc=Din lokale one-stop-shop for alle dine PDF-behov. home.searchBar=Søk etter funksjoner... -home.viewPdf.title=Vis PDF +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=Vis, annoter, legg til tekst eller bilder viewPdf.tags=vis,les,annoter,tekst,bilde @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Fjern først pdfOrganiser.mode.8=Fjern sist pdfOrganiser.mode.9=Fjern først og sist pdfOrganiser.mode.10=Partall-Oddetall Sammenslåing +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(f.eks. 1,3,2 eller 4-8,2,10-12 eller 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully. multiTool-advert.message=This feature is also available in our multi-tool page. Check it out for enhanced page-by-page UI and additional features! #view pdf -viewPdf.title=Vis PDF +viewPdf.title=View/Edit PDF viewPdf.header=Vis PDF #pageRemover diff --git a/src/main/resources/messages_pl_PL.properties b/src/main/resources/messages_pl_PL.properties index c092ec21..c7575ecc 100644 --- a/src/main/resources/messages_pl_PL.properties +++ b/src/main/resources/messages_pl_PL.properties @@ -262,7 +262,7 @@ home.desc=Twoja lokalna aplikacja do kompleksowej obsługi Twoich potrzeb związ home.searchBar=Szukaj opcji ... -home.viewPdf.title=Podejrzyj PDF +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=Wyświetl, adnotuj, dodaj tekst lub obrazy viewPdf.tags=wyświetl,czytaj,adnotuj,tekst,obraz @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Usuń pierwszą pdfOrganiser.mode.8=Usuń ostatnią pdfOrganiser.mode.9=Usuń pierwszą i ostatnią pdfOrganiser.mode.10=Połącz parzyste i nieparzyste +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(przykład 1,3,2 lub 4-8,2,10-12 lub 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully. multiTool-advert.message=This feature is also available in our multi-tool page. Check it out for enhanced page-by-page UI and additional features! #view pdf -viewPdf.title=Podejrzyj PDF +viewPdf.title=View/Edit PDF viewPdf.header=Podejrzyj PDF #pageRemover diff --git a/src/main/resources/messages_pt_BR.properties b/src/main/resources/messages_pt_BR.properties index fc88cf60..30a57ee5 100644 --- a/src/main/resources/messages_pt_BR.properties +++ b/src/main/resources/messages_pt_BR.properties @@ -262,7 +262,7 @@ home.desc=Seu tudo-em-um hospedado localmente para tudo relacionado a PDFs home.searchBar=Pesquisar funcionalidades... -home.viewPdf.title=Visualizar PDF +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=Visualizar, anotar, adicionar texto ou imagens ao PDF. viewPdf.tags=visualizar,ler,anotar,texto,imagem @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Remover primeiro pdfOrganiser.mode.8=Remover último pdfOrganiser.mode.9=Remover o primeiro e o último pdfOrganiser.mode.10=Mesclagem ímpar-par +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(por exemplo 1,3,2 ou 4-8,2,10-12 ou 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully. multiTool-advert.message=Esta função também está disponível em Multiferramentas de PDF. Com uma interface mais completa e funções adicionais. #view pdf -viewPdf.title=Visualizar PDF +viewPdf.title=View/Edit PDF viewPdf.header=Visualizar PDF #pageRemover diff --git a/src/main/resources/messages_pt_PT.properties b/src/main/resources/messages_pt_PT.properties index 977197bd..9c0ce181 100644 --- a/src/main/resources/messages_pt_PT.properties +++ b/src/main/resources/messages_pt_PT.properties @@ -262,7 +262,7 @@ home.desc=O seu centro local para todas as suas necessidades de PDF. home.searchBar=Pesquisar funcionalidades... -home.viewPdf.title=Ver PDF +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=Ver, anotar, adicionar texto ou imagens viewPdf.tags=ver,ler,anotar,texto,imagem @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Remover Primeira pdfOrganiser.mode.8=Remover Última pdfOrganiser.mode.9=Remover Primeira e Última pdfOrganiser.mode.10=Junção Par-Ímpar +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(ex. 1,3,2 ou 4-8,2,10-12 ou 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=Ficheiro desencriptado com sucesso. multiTool-advert.message=Esta funcionalidade também está disponível na nossa página multi-ferramenta. Experimente para uma interface melhorada página a página e funcionalidades adicionais! #view pdf -viewPdf.title=Ver PDF +viewPdf.title=View/Edit PDF viewPdf.header=Ver PDF #pageRemover diff --git a/src/main/resources/messages_ro_RO.properties b/src/main/resources/messages_ro_RO.properties index d8238471..b12368e7 100644 --- a/src/main/resources/messages_ro_RO.properties +++ b/src/main/resources/messages_ro_RO.properties @@ -262,7 +262,7 @@ home.desc=Un singur punct de oprire găzduit local pentru toate nevoile tale leg home.searchBar=Caută funcționalități... -home.viewPdf.title=Vizualizează PDF +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=Vizualizează, adnotează, adaugă text sau imagini viewPdf.tags=vizualizare,citește,adnotează,text,imagine @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Elimină Prima pdfOrganiser.mode.8=Elimină Ultima pdfOrganiser.mode.9=Elimină Prima și Ultima pdfOrganiser.mode.10=Îmbinare Impar-Par +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(ex. 1,3,2 sau 4-8,2,10-12 sau 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully. multiTool-advert.message=This feature is also available in our multi-tool page. Check it out for enhanced page-by-page UI and additional features! #view pdf -viewPdf.title=Vizualizează PDF +viewPdf.title=View/Edit PDF viewPdf.header=Vizualizează PDF #pageRemover diff --git a/src/main/resources/messages_ru_RU.properties b/src/main/resources/messages_ru_RU.properties index 2315e009..6e4d1b47 100644 --- a/src/main/resources/messages_ru_RU.properties +++ b/src/main/resources/messages_ru_RU.properties @@ -262,7 +262,7 @@ home.desc=Ваше локальное решение для всех потре home.searchBar=Поиск функций... -home.viewPdf.title=Просмотр PDF +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=Просмотр, аннотирование, добавление текста или изображений viewPdf.tags=просмотр,чтение,аннотации,текст,изображение @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Удалить первую pdfOrganiser.mode.8=Удалить последнюю pdfOrganiser.mode.9=Удалить первую и последнюю pdfOrganiser.mode.10=Объединение четных-нечетных +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(например, 1,3,2 или 4-8,2,10-12 или 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=Файл успешно расшифрован. multiTool-advert.message=Эта функция также доступна на нашей странице мультиинструмента. Попробуйте её для улучшенного постраничного интерфейса и дополнительных возможностей! #view pdf -viewPdf.title=Просмотр PDF +viewPdf.title=View/Edit PDF viewPdf.header=Просмотр PDF #pageRemover diff --git a/src/main/resources/messages_sk_SK.properties b/src/main/resources/messages_sk_SK.properties index 477e54c1..3c192ce1 100644 --- a/src/main/resources/messages_sk_SK.properties +++ b/src/main/resources/messages_sk_SK.properties @@ -262,7 +262,7 @@ home.desc=Vaša lokálne hostovaná jednorazová zástavka pre všetky potreby P home.searchBar=Vyhľadať funkcie... -home.viewPdf.title=Zobraziť PDF +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=Zobraziť, anotovať, pridať text alebo obrázky viewPdf.tags=zobraziť,čítať,anotovať,text,obrázok @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Odstrániť prvú pdfOrganiser.mode.8=Odstrániť poslednú pdfOrganiser.mode.9=Odstrániť prvú aj poslednú pdfOrganiser.mode.10=Odd-Even Merge +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(napr. 1,3,2 alebo 4-8,2,10-12 alebo 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully. multiTool-advert.message=This feature is also available in our multi-tool page. Check it out for enhanced page-by-page UI and additional features! #view pdf -viewPdf.title=Zobraziť PDF +viewPdf.title=View/Edit PDF viewPdf.header=Zobraziť PDF #pageRemover diff --git a/src/main/resources/messages_sl_SI.properties b/src/main/resources/messages_sl_SI.properties index 1834c206..aa18879c 100644 --- a/src/main/resources/messages_sl_SI.properties +++ b/src/main/resources/messages_sl_SI.properties @@ -262,7 +262,7 @@ home.desc=Vaša lokalna trgovina na enem mestu za vse vaše potrebe po PDF-jih. home.searchBar=Išči funkcije... -home.viewPdf.title=Ogled PDF-ja +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=Oglejte si, komentirajte, dodajte besedilo ali slike viewPdf.tags=ogled, branje, opomba, besedilo, slika @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Najprej odstrani pdfOrganiser.mode.8=Odstrani zadnjega pdfOrganiser.mode.9=Odstrani prvega in zadnjega pdfOrganiser.mode.10=Sodo-liho spajanje +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(npr. 1,3,2 ali 4-8,2,10-12 ali 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=Datoteka uspešno dešifrirana. multiTool-advert.message=Ta funkcija je na voljo tudi na naši strani z več orodji. Oglejte si izboljšan uporabniški vmesnik od strani do strani in dodatne funkcije! #view pdf -viewPdf.title=Oglejte si PDF +viewPdf.title=View/Edit PDF viewPdf.header=Ogled PDF-ja #pageRemover diff --git a/src/main/resources/messages_sr_LATN_RS.properties b/src/main/resources/messages_sr_LATN_RS.properties index a428bb5c..078c097d 100644 --- a/src/main/resources/messages_sr_LATN_RS.properties +++ b/src/main/resources/messages_sr_LATN_RS.properties @@ -262,7 +262,7 @@ home.desc=Vaš lokalno hostovan jedinstveni alat za sve vaše potrebe vezane za home.searchBar=Pretraži funkcije... -home.viewPdf.title=Pregledaj PDF +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=Pregledaj, anotiraj, dodaj tekst ili slike viewPdf.tags=pregled,čitanje,anotiranje,tekst,slika @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Remove First pdfOrganiser.mode.8=Remove Last pdfOrganiser.mode.9=Remove First and Last pdfOrganiser.mode.10=Odd-Even Merge +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully. multiTool-advert.message=This feature is also available in our multi-tool page. Check it out for enhanced page-by-page UI and additional features! #view pdf -viewPdf.title=Prikaz +viewPdf.title=View/Edit PDF viewPdf.header=Prikaz PDF-a #pageRemover diff --git a/src/main/resources/messages_sv_SE.properties b/src/main/resources/messages_sv_SE.properties index 9340d86e..4c0c4113 100644 --- a/src/main/resources/messages_sv_SE.properties +++ b/src/main/resources/messages_sv_SE.properties @@ -262,7 +262,7 @@ home.desc=Din lokala one-stop-shop för alla dina PDF-behov. home.searchBar=Sök efter funktioner... -home.viewPdf.title=Visa PDF +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=Visa, kommentera, lägg till text eller bilder viewPdf.tags=visa,läs,kommentera,text,bild @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Ta bort första pdfOrganiser.mode.8=Ta bort sista pdfOrganiser.mode.9=Ta bort första och sista pdfOrganiser.mode.10=Udda-jämn sammanslagning +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(t.ex. 1,3,2 eller 4-8,2,10-12 eller 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=Fil avkrypterad. multiTool-advert.message=Denna funktion finns också tillgänglig i vår multi-tool page. Spana in den för bättre sida-för-sida anpassning och ytterligare funktioner! #view pdf -viewPdf.title=Visa PDF +viewPdf.title=View/Edit PDF viewPdf.header=Visa PDF #pageRemover diff --git a/src/main/resources/messages_th_TH.properties b/src/main/resources/messages_th_TH.properties index 7c4b2e56..96c68f1f 100644 --- a/src/main/resources/messages_th_TH.properties +++ b/src/main/resources/messages_th_TH.properties @@ -262,7 +262,7 @@ home.desc=ศูนย์รวมทุกความต้องการข home.searchBar=ค้นหาคุณสมบัติ... -home.viewPdf.title=ดู PDF +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=ดู เพิ่มคำอธิบาย เพิ่มข้อความหรือรูปภาพ viewPdf.tags=ดู, อ่าน, เพิ่มคำอธิบาย, ข้อความ, รูปภาพ @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=ลบหน้าหมายเลขแรก pdfOrganiser.mode.8=ลบหน้าหมายเลขสุดท้าย pdfOrganiser.mode.9=ลบหน้าหมายเลขแรกและสุดท้าย pdfOrganiser.mode.10=รวมหน้าแบบคี่-คู่ +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(เช่น 1,3,2 หรือ 4-8,2,10-12 หรือ 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully. multiTool-advert.message=This feature is also available in our multi-tool page. Check it out for enhanced page-by-page UI and additional features! #view pdf -viewPdf.title=ดู PDF +viewPdf.title=View/Edit PDF viewPdf.header=ดู PDF #pageRemover diff --git a/src/main/resources/messages_tr_TR.properties b/src/main/resources/messages_tr_TR.properties index a3d62dd0..3ecafba0 100644 --- a/src/main/resources/messages_tr_TR.properties +++ b/src/main/resources/messages_tr_TR.properties @@ -262,7 +262,7 @@ home.desc=Yerel olarak barındırılan tüm PDF ihtiyaçlarınız için tek dura home.searchBar=Özellikleri arayın... -home.viewPdf.title=PDF Görüntüle +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=Görüntüleyin, açıklama ekleyin, metin veya resim ekleyin viewPdf.tags=görüntüle,oku,açıklama ekle,metin,görüntü @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=İlk Önce Kaldır pdfOrganiser.mode.8=Sonuncuyu Kaldır pdfOrganiser.mode.9=İlk ve Sonu Kaldır pdfOrganiser.mode.10=Tek-Çift Birleştirme +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(örn. 1,3,2 veya 4-8,2,10-12 veya 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully. multiTool-advert.message=This feature is also available in our multi-tool page. Check it out for enhanced page-by-page UI and additional features! #view pdf -viewPdf.title=PDF Görüntüle +viewPdf.title=View/Edit PDF viewPdf.header=PDF Görüntüle #pageRemover diff --git a/src/main/resources/messages_uk_UA.properties b/src/main/resources/messages_uk_UA.properties index ee7f8d9b..edabc7c1 100644 --- a/src/main/resources/messages_uk_UA.properties +++ b/src/main/resources/messages_uk_UA.properties @@ -262,7 +262,7 @@ home.desc=Ваш локальний універсальний магазин д home.searchBar=Пошук функцій... -home.viewPdf.title=Перегляд PDF +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=Перегляд, анотація, додавання тексту або зображень viewPdf.tags=view,read,annotate,text,image @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Видалити першу pdfOrganiser.mode.8=Видалити останню pdfOrganiser.mode.9=Видалити першу та останню pdfOrganiser.mode.10=Odd-Even Merge +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(наприклад, 1,3,2 або 4-8,2,10-12 або 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully. multiTool-advert.message=This feature is also available in our multi-tool page. Check it out for enhanced page-by-page UI and additional features! #view pdf -viewPdf.title=Переглянути PDF +viewPdf.title=View/Edit PDF viewPdf.header=Переглянути PDF #pageRemover diff --git a/src/main/resources/messages_vi_VN.properties b/src/main/resources/messages_vi_VN.properties index 8b91ad11..e3b6d5b1 100644 --- a/src/main/resources/messages_vi_VN.properties +++ b/src/main/resources/messages_vi_VN.properties @@ -262,7 +262,7 @@ home.desc=Giải pháp toàn diện cho mọi nhu cầu về PDF ngay trên máy home.searchBar=Tìm kiếm tính năng... -home.viewPdf.title=Xem PDF +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=Xem, chú thích, thêm văn bản hoặc hình ảnh viewPdf.tags=xem,đọc,chú thích,văn bản,hình ảnh @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Xóa trang đầu pdfOrganiser.mode.8=Xóa trang cuối pdfOrganiser.mode.9=Xóa trang đầu và cuối pdfOrganiser.mode.10=Trộn lẻ-chẵn +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(ví dụ: 1,3,2 hoặc 4-8,2,10-12 hoặc 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=File decrypted successfully. multiTool-advert.message=This feature is also available in our multi-tool page. Check it out for enhanced page-by-page UI and additional features! #view pdf -viewPdf.title=Xem PDF +viewPdf.title=View/Edit PDF viewPdf.header=Xem PDF #pageRemover diff --git a/src/main/resources/messages_zh_BO.properties b/src/main/resources/messages_zh_BO.properties index 601775eb..be8aae05 100644 --- a/src/main/resources/messages_zh_BO.properties +++ b/src/main/resources/messages_zh_BO.properties @@ -262,7 +262,7 @@ home.desc=ཁྱེད་ཀྱི་ PDF དགོས་མཁོ་ཚང་ home.searchBar=ནུས་པ་འཚོལ་བཤེར། -home.viewPdf.title=PDF ལྟ་བ། +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=ལྟ་བ། མཆན་འགྲེལ། ཡི་གེ་དང་པར་རིས་སྣོན་པ། viewPdf.tags=ལྟ་བ།,ཀློག་པ།,མཆན་འགྲེལ།,ཡི་གེ,པར་རིས། @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=Remove First pdfOrganiser.mode.8=Remove Last pdfOrganiser.mode.9=དང་པོ་དང་མཐའ་མ་སུབ་པ། pdfOrganiser.mode.10=ཡ་ཟུང་སྡེབ་སྦྱོར། +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(དཔེར་ན། 1,3,2 ཡང་ན་ 4-8,2,10-12 ཡང་ན་ 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=ཡིག་ཆའི་གསང་སྡོམ་གྲོལ multiTool-advert.message=This feature is also available in our multi-tool page. Check it out for enhanced page-by-page UI and additional features! #view pdf -viewPdf.title=PDF ལྟ་བ། +viewPdf.title=View/Edit PDF viewPdf.header=PDF ལྟ་བ། #pageRemover diff --git a/src/main/resources/messages_zh_CN.properties b/src/main/resources/messages_zh_CN.properties index 8d700596..7261a243 100644 --- a/src/main/resources/messages_zh_CN.properties +++ b/src/main/resources/messages_zh_CN.properties @@ -76,11 +76,11 @@ donate=捐款 color=颜色 sponsor=赞助 info=信息 -pro=Pro -page=Page -pages=Pages +pro=专业版 +page=页面 +pages=页码 loading=加载中... -addToDoc=Add to Document +addToDoc=添加至文件 reset=重置 apply=应用 @@ -120,19 +120,19 @@ pipelineOptions.validateButton=验证 ######################## enterpriseEdition.button=升级到 Pro 版本 enterpriseEdition.warning=此功能仅适用于 Pro 版本 -enterpriseEdition.yamlAdvert=Stirling PDF Pro supports YAML configuration files and other SSO features. -enterpriseEdition.ssoAdvert=Looking for more user management features? Check out Stirling PDF Pro +enterpriseEdition.yamlAdvert=Stirling PDF Pro支持YAML配置文件和其他SSO功能。 +enterpriseEdition.ssoAdvert=寻找更多的用户管理功能?查看Stirling PDF Pro ################# # Analytics # ################# -analytics.title=Do you want make Stirling PDF better? -analytics.paragraph1=Stirling PDF has opt in analytics to help us improve the product. We do not track any personal information or file contents. -analytics.paragraph2=Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better. -analytics.enable=Enable analytics -analytics.disable=Disable analytics -analytics.settings=You can change the settings for analytics in the config/settings.yml file +analytics.title=你想协助改善Stirling PDF吗 +analytics.paragraph1=Stirling PDF有选择性分析功能,可以帮助我们改进产品。我们不跟踪任何个人信息或文件内容。 +analytics.paragraph2=请考虑启用分析来帮助Stirling-PDF的发展,并让我们更好地了解我们的用户。 +analytics.enable=启用分析功能 +analytics.disable=禁用分析功能 +analytics.settings=您可以在 config/settings.yml 文件中变更分析功能的设定 ############# # NAVBAR # @@ -240,17 +240,17 @@ database.creationDate=创建时间 database.fileSize=文件大小 database.deleteBackupFile=删除备份文件 database.importBackupFile=导入备份文件 -database.createBackupFile=Create Backup File +database.createBackupFile=创建备份文件 database.downloadBackupFile=下载备份文件 database.info_1=导入数据时,确保结构正确至关重要。如果您不确定自己在做什么,请寻求专业人士的建议和支持。结构错误会导致应用程序故障,甚至完全无法运行应用程序。 database.info_2=上传文件时,文件名并不重要。上传后,文件名将重命名为 backup_user_yyyyMMddHHmm.sql,以确保命名规范的一致性。 database.submit=导入备份 database.importIntoDatabaseSuccessed=导入数据库成功 -database.backupCreated=Database backup successful +database.backupCreated=数据库备份成功 database.fileNotFound=未找到文件 database.fileNullOrEmpty=文件不能为空 database.failedImportFile=导入文件失败 -database.notSupported=This function is not available for your database connection. +database.notSupported=此功能不适用于您的数据库连接。 session.expired=您的会话已过期。请刷新页面并重试。 session.refreshPage=刷新页面 @@ -262,13 +262,13 @@ home.desc=本地部署的一站式服务,满足您的所有 PDF 需求。 home.searchBar=搜索您需要的功能... -home.viewPdf.title=浏览 PDF +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=浏览、注释、添加文本或图像 viewPdf.tags=浏览、阅读、注释、文本、图像 home.setFavorites=编辑收藏夹 -home.hideFavorites=Hide Favourites -home.showFavorites=Show Favourites +home.hideFavorites=隐藏收藏夹 +home.showFavorites=显示收藏夹 home.legacyHomepage=使用旧版主页 home.newHomePage=试用新版主页! home.alphabetical=按字母顺序 @@ -462,9 +462,9 @@ home.MarkdownToPDF.title=Markdown 转 PDF home.MarkdownToPDF.desc=将任何 Markdown 文件转换为 PDF MarkdownToPDF.tags=标记、网页内容、转换、转换 -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 转 Markdown +home.PDFToMarkdown.desc=将任何pdf文件转换为Markdown文件 +PDFToMarkdown.tags=标记,网页内容,转换,转档,md home.getPdfInfo.title=获取 PDF 的所有信息 home.getPdfInfo.desc=获取 PDF 的所有可能的信息 @@ -489,9 +489,9 @@ home.autoRedact.title=自动删除 home.autoRedact.desc=根据输入文本自动删除(覆盖)PDF 中的文本 autoRedact.tags=脱敏、隐藏、涂黑、标记、不可见 -home.redact.title=Manual Redaction -home.redact.desc=Redacts a PDF based on selected text, drawn shapes and/or selected page(s) -redact.tags=Redact,Hide,black out,black,marker,hidden,manual +home.redact.title=手动修订 +home.redact.desc=根据选定的文本、绘制的形状和/或选定的页面编辑PDF +redact.tags=涂改,隐藏,涂黑,黑色,标记,遮蔽,手动 home.tableExtraxt.title=PDF 转 CSV home.tableExtraxt.desc=从 PDF 中提取表格并将其转换为 CSV @@ -542,19 +542,19 @@ replace-color.title=替换-反转-颜色 replace-color.header=替换-反转 PDF 颜色 home.replaceColorPdf.title=替换和反转颜色 home.replaceColorPdf.desc=替换 PDF 中文本和背景的颜色,并将PDF全色反转以减小文件大小 -replaceColorPdf.tags=Replace Color,Page operations,Back end,server side +replaceColorPdf.tags=更换颜色,页面操作,后端,服务器端 replace-color.selectText.1=替换或反转颜色选项 -replace-color.selectText.2=Default(Default high contrast colors) -replace-color.selectText.3=Custom(Customized colors) -replace-color.selectText.4=Full-Invert(Invert all colors) -replace-color.selectText.5=High contrast color options -replace-color.selectText.6=white text on black background -replace-color.selectText.7=Black text on white background -replace-color.selectText.8=Yellow text on black background -replace-color.selectText.9=Green text on black background -replace-color.selectText.10=Choose text Color -replace-color.selectText.11=Choose background Color -replace-color.submit=Replace +replace-color.selectText.2=默认(默认高对比度颜色) +replace-color.selectText.3=定制(定制的颜色) +replace-color.selectText.4=全反转(反转所有颜色) +replace-color.selectText.5=高对比度颜色选项 +replace-color.selectText.6=黑底白字 +replace-color.selectText.7=白底黑字 +replace-color.selectText.8=黑底黄字 +replace-color.selectText.9=黑底绿字 +replace-color.selectText.10=选择文本颜色 +replace-color.selectText.11=选择背景颜色 +replace-color.submit=取代 @@ -599,31 +599,31 @@ autoRedact.convertPDFToImageLabel=将PDF转换为PDF-Image(用于删除方框 autoRedact.submitButton=提交 #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=手动纠正 +redact.header=手动纠正 +redact.submit=纠正 +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.zoom=缩放 +redact.zoomIn=放大 +redact.zoomOut=缩小 +redact.nextPage=下一页 +redact.previousPage=上一页 +redact.toggleSidebar=切换侧边栏 +redact.showThumbnails=显示缩略图 +redact.showDocumentOutline=显示文档大纲(双击展开/折叠所有项目) +redact.showAttatchments=显示附件 +redact.showLayers=显示图层(双击将所有图层重置为默认状态) +redact.colourPicker=颜色选择器 +redact.findCurrentOutlineItem=查找当前大纲项目 +redact.applyChanges=应用 #showJS showJS.title=显示 JavaScript @@ -661,9 +661,9 @@ MarkdownToPDF.credit=此服务使用 WeasyPrint 进行文件转换。 #pdf-to-markdown -PDFToMarkdown.title=PDF To Markdown -PDFToMarkdown.header=PDF To Markdown -PDFToMarkdown.submit=Convert +PDFToMarkdown.title=PDF转Markdown +PDFToMarkdown.header=PDF转Markdown +PDFToMarkdown.submit=转换 #url-to-pdf @@ -872,7 +872,7 @@ sign.add=添加 sign.saved=已保存签名 sign.save=保存签名 sign.personalSigs=个人签名 -sign.sharedSigs=Shared Signatures +sign.sharedSigs=共享签名 sign.noSavedSigs=未找到已保存的签名 sign.addToAll=添加到所有页面 sign.delete=删除 @@ -880,7 +880,7 @@ sign.first=首页 sign.last=末页 sign.next=下一页 sign.previous=上一页 -sign.maintainRatio=Toggle maintain aspect ratio +sign.maintainRatio=切换保持长宽比 #repair @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=删除第一页 pdfOrganiser.mode.8=删除最后一页 pdfOrganiser.mode.9=删除第一页和最后一页 pdfOrganiser.mode.10=奇偶合并 +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(例如:1,3,2 或 4-8,2,10-12 或 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=文件解密成功。 multiTool-advert.message=此功能也适用于我们的“多功能工具页面”。查看它以获得增强的逐页 UI 以及其他功能! #view pdf -viewPdf.title=浏览 PDF +viewPdf.title=View/Edit PDF viewPdf.header=浏览 PDF #pageRemover @@ -1328,18 +1329,18 @@ splitByChapters.header=按章节拆分 PDF splitByChapters.bookmarkLevel=书签级别 splitByChapters.includeMetadata=包含元数据 splitByChapters.allowDuplicates=允许重复 -splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure. -splitByChapters.desc.2=Bookmark Level: Choose the level of bookmarks to use for splitting (0 for top-level, 1 for second-level, etc.). -splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF. -splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs. +splitByChapters.desc.1=此工具根据章节结构将PDF文件拆分为多个PDF。 +splitByChapters.desc.2=书签级别:选择用于拆分的书签级别(0表示顶级,1表示二级等)。 +splitByChapters.desc.3=包含元数据:如果选中,原始PDF的元数据将包含在每个拆分的PDF中。 +splitByChapters.desc.4=允许重复:如果选中,允许同一页面上的多个书签创建单独的PDF。 splitByChapters.submit=拆分 PDF #File Chooser fileChooser.click=单击 fileChooser.or=或 fileChooser.dragAndDrop=拖放文件 -fileChooser.dragAndDropPDF=Drag & Drop PDF file -fileChooser.dragAndDropImage=Drag & Drop Image file +fileChooser.dragAndDropPDF=拖放PDF文件 +fileChooser.dragAndDropImage=拖放图片文件 fileChooser.hoveredDragAndDrop=拖放文件到此处 #release notes @@ -1350,36 +1351,36 @@ releases.current.version=当前版本 releases.note=版本说明仅提供英文版本 #Validate Signature -validateSignature.title=Validate PDF Signatures -validateSignature.header=Validate Digital Signatures -validateSignature.selectPDF=Select signed PDF file -validateSignature.submit=Validate Signatures -validateSignature.results=Validation Results -validateSignature.status=Status -validateSignature.signer=Signer -validateSignature.date=Date -validateSignature.reason=Reason -validateSignature.location=Location -validateSignature.noSignatures=No digital signatures found in this document -validateSignature.status.valid=Valid -validateSignature.status.invalid=Invalid -validateSignature.chain.invalid=Certificate chain validation failed - cannot verify signer's identity -validateSignature.trust.invalid=Certificate not in trust store - source cannot be verified -validateSignature.cert.expired=Certificate has expired -validateSignature.cert.revoked=Certificate has been revoked -validateSignature.signature.info=Signature Information -validateSignature.signature=Signature -validateSignature.signature.mathValid=Signature is mathematically valid BUT: -validateSignature.selectCustomCert=Custom Certificate File X.509 (Optional) -validateSignature.cert.info=Certificate Details -validateSignature.cert.issuer=Issuer -validateSignature.cert.subject=Subject -validateSignature.cert.serialNumber=Serial Number -validateSignature.cert.validFrom=Valid From -validateSignature.cert.validUntil=Valid Until -validateSignature.cert.algorithm=Algorithm -validateSignature.cert.keySize=Key Size -validateSignature.cert.version=Version -validateSignature.cert.keyUsage=Key Usage -validateSignature.cert.selfSigned=Self-Signed -validateSignature.cert.bits=bits +validateSignature.title=验证pdf签名 +validateSignature.header=验证数字签名 +validateSignature.selectPDF=选择已签名的pdf文件 +validateSignature.submit=验证签名 +validateSignature.results=验证结果 +validateSignature.status=状态 +validateSignature.signer=签署者 +validateSignature.date=日期 +validateSignature.reason=原因 +validateSignature.location=位置 +validateSignature.noSignatures=此文件中未找到电子签名 +validateSignature.status.valid=有效 +validateSignature.status.invalid=无效 +validateSignature.chain.invalid=证书链验证失败 - 无法验证签名者的身份 +validateSignature.trust.invalid=证书不在信任存储区中 - 无法验证来源 +validateSignature.cert.expired=凭证已过期 +validateSignature.cert.revoked=凭证已被撤销 +validateSignature.signature.info=签名信息 +validateSignature.signature=签名 +validateSignature.signature.mathValid=签名在数学上有效,但: +validateSignature.selectCustomCert=X.509 自签名证书(可选) +validateSignature.cert.info=凭证信息 +validateSignature.cert.issuer=发行者 +validateSignature.cert.subject=主题 +validateSignature.cert.serialNumber=序列号 +validateSignature.cert.validFrom=有效期自 +validateSignature.cert.validUntil=有效期至 +validateSignature.cert.algorithm=算法 +validateSignature.cert.keySize=密钥长度 +validateSignature.cert.version=版本 +validateSignature.cert.keyUsage=密钥用途 +validateSignature.cert.selfSigned=自签名 +validateSignature.cert.bits=比特 diff --git a/src/main/resources/messages_zh_TW.properties b/src/main/resources/messages_zh_TW.properties index 247b9e0d..3547fdad 100644 --- a/src/main/resources/messages_zh_TW.properties +++ b/src/main/resources/messages_zh_TW.properties @@ -262,7 +262,7 @@ home.desc=您的本機一站式 PDF 解決方案。 home.searchBar=搜尋功能... -home.viewPdf.title=檢視 PDF +home.viewPdf.title=View/Edit PDF home.viewPdf.desc=檢視、註釋、新增文字或圖片 viewPdf.tags=檢視,閱讀,註釋,文字,圖片 @@ -992,6 +992,7 @@ pdfOrganiser.mode.7=刪除第一頁 pdfOrganiser.mode.8=刪除最後一頁 pdfOrganiser.mode.9=刪除第一頁和最後一頁 pdfOrganiser.mode.10=奇偶合併 +pdfOrganiser.mode.11=Duplicate all pages pdfOrganiser.placeholder=(例如 1,3,2 或 4-8,2,10-12 或 2n-1) @@ -1034,7 +1035,7 @@ decrypt.success=檔案已成功解密。 multiTool-advert.message=此功能也可以在我們的複合工具頁面中使用。前往查看並體驗更強大的逐頁操作介面及其他進階功能! #view pdf -viewPdf.title=檢視 PDF +viewPdf.title=View/Edit PDF viewPdf.header=檢視 PDF #pageRemover diff --git a/src/main/resources/static/3rdPartyLicenses.json b/src/main/resources/static/3rdPartyLicenses.json index 2620d907..0cd33d7c 100644 --- a/src/main/resources/static/3rdPartyLicenses.json +++ b/src/main/resources/static/3rdPartyLicenses.json @@ -3,14 +3,14 @@ { "moduleName": "ch.qos.logback:logback-classic", "moduleUrl": "http://www.qos.ch", - "moduleVersion": "1.5.12", + "moduleVersion": "1.5.15", "moduleLicense": "GNU Lesser General Public License", "moduleLicenseUrl": "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html" }, { "moduleName": "ch.qos.logback:logback-core", "moduleUrl": "http://www.qos.ch", - "moduleVersion": "1.5.12", + "moduleVersion": "1.5.15", "moduleLicense": "GNU Lesser General Public License", "moduleLicenseUrl": "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html" }, @@ -560,7 +560,7 @@ { "moduleName": "io.micrometer:micrometer-core", "moduleUrl": "https://github.com/micrometer-metrics/micrometer", - "moduleVersion": "1.14.3", + "moduleVersion": "1.14.4", "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, @@ -781,8 +781,8 @@ { "moduleName": "org.apache.commons:commons-compress", "moduleUrl": "https://commons.apache.org/proper/commons-compress/", - "moduleVersion": "1.21", - "moduleLicense": "Apache License, Version 2.0", + "moduleVersion": "1.26.0", + "moduleLicense": "Apache-2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, { @@ -921,20 +921,6 @@ "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, - { - "moduleName": "org.bouncycastle:bcmail-jdk15on", - "moduleUrl": "https://www.bouncycastle.org/java.html", - "moduleVersion": "1.69", - "moduleLicense": "Bouncy Castle Licence", - "moduleLicenseUrl": "https://www.bouncycastle.org/licence.html" - }, - { - "moduleName": "org.bouncycastle:bcpkix-jdk15on", - "moduleUrl": "https://www.bouncycastle.org/java.html", - "moduleVersion": "1.69", - "moduleLicense": "Bouncy Castle Licence", - "moduleLicenseUrl": "https://www.bouncycastle.org/licence.html" - }, { "moduleName": "org.bouncycastle:bcpkix-jdk18on", "moduleUrl": "https://www.bouncycastle.org/download/bouncy-castle-java/", @@ -949,13 +935,6 @@ "moduleLicense": "Bouncy Castle Licence", "moduleLicenseUrl": "https://www.bouncycastle.org/licence.html" }, - { - "moduleName": "org.bouncycastle:bcutil-jdk15on", - "moduleUrl": "https://www.bouncycastle.org/java.html", - "moduleVersion": "1.69", - "moduleLicense": "Bouncy Castle Licence", - "moduleLicenseUrl": "https://www.bouncycastle.org/licence.html" - }, { "moduleName": "org.bouncycastle:bcutil-jdk18on", "moduleUrl": "https://www.bouncycastle.org/download/bouncy-castle-java/", @@ -1441,7 +1420,7 @@ { "moduleName": "org.springframework.boot:spring-boot-devtools", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.4.1", + "moduleVersion": "3.4.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, @@ -1455,14 +1434,14 @@ { "moduleName": "org.springframework.boot:spring-boot-starter-actuator", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.4.1", + "moduleVersion": "3.4.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter-data-jpa", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.4.1", + "moduleVersion": "3.4.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, @@ -1476,7 +1455,7 @@ { "moduleName": "org.springframework.boot:spring-boot-starter-jetty", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.4.1", + "moduleVersion": "3.4.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, @@ -1497,28 +1476,28 @@ { "moduleName": "org.springframework.boot:spring-boot-starter-oauth2-client", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.4.1", + "moduleVersion": "3.4.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter-security", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.4.1", + "moduleVersion": "3.4.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter-thymeleaf", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.4.1", + "moduleVersion": "3.4.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, { "moduleName": "org.springframework.boot:spring-boot-starter-web", "moduleUrl": "https://spring.io/projects/spring-boot", - "moduleVersion": "3.4.1", + "moduleVersion": "3.4.2", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, @@ -1651,7 +1630,7 @@ { "moduleName": "org.springframework:spring-jdbc", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.2.2", + "moduleVersion": "6.2.3", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, @@ -1679,7 +1658,7 @@ { "moduleName": "org.springframework:spring-webmvc", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.2.2", + "moduleVersion": "6.2.3", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, diff --git a/src/main/resources/static/js/pages/pdf-to-csv.js b/src/main/resources/static/js/pages/pdf-to-csv.js index 6be3c2ed..9a06aac5 100644 --- a/src/main/resources/static/js/pages/pdf-to-csv.js +++ b/src/main/resources/static/js/pages/pdf-to-csv.js @@ -17,7 +17,7 @@ let fileInput = document.getElementById('fileInput-input'); let file; let pdfDoc = null; -let pageId = document.getElementById('pageId'); +let pageNumbers = document.getElementById('pageNumbers'); let currentPage = 1; let totalPages = 0; @@ -31,7 +31,7 @@ let timeId = null; // timeout id for resizing canvases event btn1Object.addEventListener('click', function (e) { if (currentPage !== 1) { currentPage = currentPage - 1; - pageId.value = currentPage; + pageNumbers.value = currentPage; if (file.type === 'application/pdf') { let reader = new FileReader(); @@ -52,7 +52,7 @@ btn1Object.addEventListener('click', function (e) { btn2Object.addEventListener('click', function (e) { if (currentPage !== totalPages) { currentPage = currentPage + 1; - pageId.value = currentPage; + pageNumbers.value = currentPage; if (file.type === 'application/pdf') { let reader = new FileReader(); @@ -81,7 +81,7 @@ function renderPageFromFile(file) { totalPages = pdf.numPages; renderPage(currentPage); }); - pageId.value = currentPage; + pageNumbers.value = currentPage; }; reader.readAsArrayBuffer(file); document.getElementById('pagination-button-container').style.display = 'flex'; diff --git a/src/main/resources/templates/convert/pdf-to-csv.html b/src/main/resources/templates/convert/pdf-to-csv.html index b9e27b72..3272766a 100644 --- a/src/main/resources/templates/convert/pdf-to-csv.html +++ b/src/main/resources/templates/convert/pdf-to-csv.html @@ -17,7 +17,7 @@
- +
diff --git a/src/main/resources/templates/pdf-organizer.html b/src/main/resources/templates/pdf-organizer.html index 8d698869..746a6baf 100644 --- a/src/main/resources/templates/pdf-organizer.html +++ b/src/main/resources/templates/pdf-organizer.html @@ -36,6 +36,7 @@ + @@ -51,7 +52,7 @@