Compare commits

..

2 Commits

Author SHA1 Message Date
Connor Yoh
1ad348b9a7 Removed duplicate package paths 2025-02-15 18:45:29 +00:00
Connor Yoh
84e0b4caa7 Replaced pip breaking installs of dependencies with APK Edge versions 2025-02-15 16:58:41 +00:00
89 changed files with 612 additions and 1153 deletions

View File

@@ -37,7 +37,7 @@ jobs:
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -82,7 +82,7 @@ jobs:
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -103,7 +103,6 @@ jobs:
run: ./gradlew clean build run: ./gradlew clean build
env: env:
DOCKER_ENABLE_SECURITY: false DOCKER_ENABLE_SECURITY: false
STIRLING_PDF_DESKTOP_UI: false
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@f7ce87c1d6bead3e36075b2ce75da1f6cc28aaca # v3.9.0 uses: docker/setup-buildx-action@f7ce87c1d6bead3e36075b2ce75da1f6cc28aaca # v3.9.0

View File

@@ -21,7 +21,7 @@ jobs:
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -13,7 +13,7 @@ jobs:
pull-requests: write pull-requests: write
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -24,7 +24,7 @@ jobs:
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -62,7 +62,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -106,7 +106,7 @@ jobs:
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -18,7 +18,7 @@ jobs:
pull-requests: write pull-requests: write
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -17,7 +17,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -18,13 +18,13 @@ jobs:
pull-requests: write pull-requests: write
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
- name: Generate GitHub App Token - name: Generate GitHub App Token
id: generate-token id: generate-token
uses: actions/create-github-app-token@67e27a7eb7db372a1c61a7f9bdab8699e9ee57f7 # v1.11.3 uses: actions/create-github-app-token@136412a57a7081aa63c935a2cc2918f76c34f514 # v1.11.2
with: with:
app-id: ${{ secrets.GH_APP_ID }} app-id: ${{ secrets.GH_APP_ID }}
private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}

View File

@@ -15,7 +15,7 @@ jobs:
issues: write issues: write
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -16,7 +16,7 @@ jobs:
versionMac: ${{ steps.versionNumberMac.outputs.versionNumberMac }} versionMac: ${{ steps.versionNumberMac.outputs.versionNumberMac }}
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -51,7 +51,7 @@ jobs:
file_suffix: "" file_suffix: ""
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -101,7 +101,7 @@ jobs:
file_suffix: "" file_suffix: ""
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -139,7 +139,7 @@ jobs:
contents: write contents: write
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -210,7 +210,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -224,7 +224,7 @@ jobs:
- name: Install Cosign - name: Install Cosign
if: matrix.os == 'windows-latest' if: matrix.os == 'windows-latest'
uses: sigstore/cosign-installer@c56c2d3e59e4281cc41dea2217323ba5694b171e # v3.8.0 uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da # v3.7.0
- name: Generate key pair - name: Generate key pair
if: matrix.os == 'windows-latest' if: matrix.os == 'windows-latest'
@@ -271,7 +271,7 @@ jobs:
contents: write contents: write
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -16,13 +16,13 @@ jobs:
pull-requests: write pull-requests: write
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
- name: Generate GitHub App Token - name: Generate GitHub App Token
id: generate-token id: generate-token
uses: actions/create-github-app-token@67e27a7eb7db372a1c61a7f9bdab8699e9ee57f7 # v1.11.3 uses: actions/create-github-app-token@136412a57a7081aa63c935a2cc2918f76c34f514 # v1.11.2
with: with:
app-id: ${{ secrets.GH_APP_ID }} app-id: ${{ secrets.GH_APP_ID }}
private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}

View File

@@ -18,7 +18,7 @@ jobs:
id-token: write id-token: write
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -38,11 +38,10 @@ jobs:
run: ./gradlew clean build run: ./gradlew clean build
env: env:
DOCKER_ENABLE_SECURITY: false DOCKER_ENABLE_SECURITY: false
STIRLING_PDF_DESKTOP_UI: false
- name: Install cosign - name: Install cosign
if: github.ref == 'refs/heads/master' if: github.ref == 'refs/heads/master'
uses: sigstore/cosign-installer@c56c2d3e59e4281cc41dea2217323ba5694b171e # v3.8.0 uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da # v3.7.0
with: with:
cosign-release: "v2.4.1" cosign-release: "v2.4.1"

View File

@@ -23,7 +23,7 @@ jobs:
version: ${{ steps.versionNumber.outputs.versionNumber }} version: ${{ steps.versionNumber.outputs.versionNumber }}
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -83,7 +83,7 @@ jobs:
file_suffix: "" file_suffix: ""
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -95,7 +95,7 @@ jobs:
run: ls -R run: ls -R
- name: Install Cosign - name: Install Cosign
uses: sigstore/cosign-installer@c56c2d3e59e4281cc41dea2217323ba5694b171e # v3.8.0 uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da # v3.7.0
- name: Generate key pair - name: Generate key pair
run: cosign generate-key-pair run: cosign generate-key-pair
@@ -161,7 +161,7 @@ jobs:
file_suffix: "" file_suffix: ""
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -34,7 +34,7 @@ jobs:
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -1,24 +1,23 @@
name: Run Sonarqube
on: on:
push: push:
branches: branches:
- master - master
pull_request_target: pull_request:
branches: branches: [ "main" ]
- main
workflow_dispatch: workflow_dispatch:
permissions: permissions:
pull-requests: read pull-requests: read
actions: read actions: read
name: Run Sonarqube
jobs: jobs:
sonarqube: sonarqube:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -16,7 +16,7 @@ jobs:
pull-requests: write pull-requests: write
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -14,7 +14,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -24,13 +24,13 @@ jobs:
committer: ${{ steps.committer.outputs.committer }} committer: ${{ steps.committer.outputs.committer }}
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
- name: Generate GitHub App Token - name: Generate GitHub App Token
id: generate-token id: generate-token
uses: actions/create-github-app-token@67e27a7eb7db372a1c61a7f9bdab8699e9ee57f7 # v1.11.3 uses: actions/create-github-app-token@136412a57a7081aa63c935a2cc2918f76c34f514 # v1.11.2
with: with:
app-id: ${{ secrets.GH_APP_ID }} app-id: ${{ secrets.GH_APP_ID }}
private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}
@@ -57,13 +57,13 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
- name: Generate GitHub App Token - name: Generate GitHub App Token
id: generate-token id: generate-token
uses: actions/create-github-app-token@67e27a7eb7db372a1c61a7f9bdab8699e9ee57f7 # v1.11.3 uses: actions/create-github-app-token@136412a57a7081aa63c935a2cc2918f76c34f514 # v1.11.2
with: with:
app-id: ${{ vars.GH_APP_ID }} app-id: ${{ vars.GH_APP_ID }}
private-key: ${{ secrets.GH_APP_PRIVATE_KEY }} private-key: ${{ secrets.GH_APP_PRIVATE_KEY }}

View File

@@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -105,7 +105,7 @@ jobs:
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit
@@ -134,7 +134,7 @@ jobs:
steps: steps:
- name: Harden Runner - name: Harden Runner
uses: step-security/harden-runner@4d991eb9b905ef189e4c376166672c3f2f230481 # v2.11.0 uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4
with: with:
egress-policy: audit egress-policy: audit

View File

@@ -9,6 +9,7 @@
// "ms-vscode-remote.vscode-remote-extensionpack", // Remote Development Pack for SSH, WSL, and Containers // "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 "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 "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 "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-boot-dev-pack", // Developer tools for Spring Boot by VMware
"vmware.vscode-spring-boot", // Spring Boot tools by VMware for enhanced Spring development "vmware.vscode-spring-boot", // Spring Boot tools by VMware for enhanced Spring development

121
.vscode/settings.json vendored
View File

@@ -2,147 +2,54 @@
"java.compile.nullAnalysis.mode": "automatic", "java.compile.nullAnalysis.mode": "automatic",
"files.eol": "auto", "files.eol": "auto",
"java.configuration.updateBuildConfiguration": "interactive", "java.configuration.updateBuildConfiguration": "interactive",
"black-formatter.args": [ "black-formatter.args": ["--line-length", "127"],
"--line-length", "flake8.args": ["--max-line-length", "127"],
"127" "pylint.args": ["max-line-length", "127"],
],
"flake8.args": [
"--max-line-length",
"127"
],
"[java]": { "[java]": {
"editor.tabSize": 4, "editor.tabSize": 4,
"editor.detectIndentation": false, "editor.detectIndentation": false,
"editor.rulers": [ "editor.rulers": [127]
127
],
"editor.defaultFormatter": "josevseb.google-java-format-for-vs-code"
}, },
"[python]": { "[python]": {
"editor.tabSize": 2, "editor.tabSize": 2,
"editor.detectIndentation": false, "editor.detectIndentation": false,
"editor.rulers": [ "editor.rulers": [127]
127
]
}, },
"[gradle-build]": { "[gradle-build]": {
"editor.tabSize": 4, "editor.tabSize": 4,
"editor.detectIndentation": false, "editor.detectIndentation": false,
"editor.rulers": [ "editor.rulers": [127]
127
]
}, },
"[gradle]": { "[gradle]": {
"editor.tabSize": 4, "editor.tabSize": 4,
"editor.detectIndentation": false, "editor.detectIndentation": false,
"editor.rulers": [ "editor.rulers": [127]
127
]
}, },
"[html]": { "[html]": {
"editor.tabSize": 2, "editor.tabSize": 2,
"editor.rulers": [ "editor.rulers": [127],
127
],
"files.trimFinalNewlines": false, "files.trimFinalNewlines": false,
"files.insertFinalNewline": false "files.insertFinalNewline": false
}, },
"[javascript]": { "[javascript]": {
"editor.tabSize": 2, "editor.tabSize": 2,
"editor.rulers": [ "editor.rulers": [127]
127
]
}, },
"[yaml]": { "[yaml]": {
"files.trimFinalNewlines": false, "files.trimFinalNewlines": false,
"files.insertFinalNewline": false "files.insertFinalNewline": false
}, },
"diffEditor.maxComputationTime": 0,
"editor.wordSegmenterLocales": null,
"editor.guides.bracketPairs": "active",
"editor.guides.bracketPairsHorizontal": "active",
"files.insertFinalNewline": true, "files.insertFinalNewline": true,
"files.trimFinalNewlines": true, "files.trimFinalNewlines": true,
"files.trimTrailingWhitespace": 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.indentSize": "tabSize",
"editor.stickyScroll.enabled": false, "editor.stickyScroll.enabled": false,
"editor.minimap.enabled": false, "editor.minimap.enabled": false,
"editor.formatOnSave": true, "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.mode": "jar-file",
"java.format.settings.google.extra": "--aosp --skip-sorting-imports --skip-javadoc-formatting", "java.format.settings.google.extra": "--aosp --skip-sorting-imports"
// (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,
} }

View File

@@ -1,5 +1,5 @@
# Main stage # Main stage
FROM alpine:3.21.3@sha256:a8560b36e8b8210634f77d9f7f9efd7ffa463e380b75e2e74aff4511df3ef88c FROM alpine:3.21.2@sha256:56fa17d2a7e7f168a043a2712e63aed1f8543aeafdcee47c58dcffe38ed51099
# Copy necessary files # Copy necessary files
COPY scripts /scripts COPY scripts /scripts
@@ -35,10 +35,7 @@ ENV DOCKER_ENABLE_SECURITY=false \
HOME=/home/stirlingpdfuser \ HOME=/home/stirlingpdfuser \
PUID=1000 \ PUID=1000 \
PGID=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 # JDK for app
@@ -69,16 +66,10 @@ RUN echo "@main https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/a
# CV # CV
py3-opencv \ py3-opencv \
python3 \ python3 \
py3-pip \ py3-unoconv@testing \
py3-pillow@testing \ py3-pillow@testing \
py3-pdf2image@testing && \ py3-pdf2image@testing \
python3 -m venv /opt/venv && \ weasyprint@community && \
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 && \ mv /usr/share/tessdata /usr/share/tessdata-original && \
mkdir -p $HOME /configs /logs /customFiles /pipeline/watchedFolders /pipeline/finishedFolders && \ mkdir -p $HOME /configs /logs /customFiles /pipeline/watchedFolders /pipeline/finishedFolders && \
fc-cache -f -v && \ fc-cache -f -v && \
@@ -93,4 +84,4 @@ EXPOSE 8080/tcp
# Set user and run command # Set user and run command
ENTRYPOINT ["tini", "--", "/scripts/init.sh"] ENTRYPOINT ["tini", "--", "/scripts/init.sh"]
CMD ["sh", "-c", "java -Dfile.encoding=UTF-8 -jar /app.jar & /opt/venv/bin/unoserver --port 2003 --interface 0.0.0.0"] CMD ["java", "-Dfile.encoding=UTF-8", "-jar", "/app.jar"]

View File

@@ -9,11 +9,10 @@ COPY . .
# Build the application with DOCKER_ENABLE_SECURITY=false # Build the application with DOCKER_ENABLE_SECURITY=false
RUN DOCKER_ENABLE_SECURITY=true \ RUN DOCKER_ENABLE_SECURITY=true \
STIRLING_PDF_DESKTOP_UI=false \ ./gradlew clean build
./gradlew clean build
# Main stage # Main stage
FROM alpine:3.21.3@sha256:a8560b36e8b8210634f77d9f7f9efd7ffa463e380b75e2e74aff4511df3ef88c FROM alpine:3.21.2@sha256:56fa17d2a7e7f168a043a2712e63aed1f8543aeafdcee47c58dcffe38ed51099
# Copy necessary files # Copy necessary files
COPY scripts /scripts COPY scripts /scripts
@@ -38,10 +37,7 @@ ENV DOCKER_ENABLE_SECURITY=false \
PGID=1000 \ PGID=1000 \
UMASK=022 \ UMASK=022 \
FAT_DOCKER=true \ 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 # JDK for app
@@ -50,51 +46,47 @@ RUN echo "@main https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/a
echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/testing" | 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 upgrade --no-cache -a && \
apk add --no-cache \ apk add --no-cache \
ca-certificates \ ca-certificates \
tzdata \ tzdata \
tini \ tini \
bash \ bash \
curl \ curl \
shadow \ shadow \
su-exec \ su-exec \
openssl \ openssl \
openssl-dev \ openssl-dev \
openjdk21-jre \ openjdk21-jre \
# Doc conversion # Doc conversion
gcompat \ gcompat \
libc6-compat \ libc6-compat \
libreoffice \ libreoffice \
# pdftohtml # pdftohtml
poppler-utils \ poppler-utils \
# OCR MY PDF (unpaper for descew and other advanced featues) # OCR MY PDF (unpaper for descew and other advanced featues)
qpdf \ qpdf \
tesseract-ocr-data-eng \ tesseract-ocr-data-eng \
font-terminus font-dejavu font-noto font-noto-cjk font-awesome font-noto-extra \
font-terminus font-dejavu font-noto font-noto-cjk font-awesome font-noto-extra \ # CV
# CV py3-opencv \
py3-opencv \ # python3/pip
python3 \ python3 \
py3-pip \ py3-unoconv@testing \
py3-pillow@testing \ py3-pillow@testing \
py3-pdf2image@testing && \ py3-pdf2image@testing \
python3 -m venv /opt/venv && \ weasyprint@community && \
export PATH="/opt/venv/bin:$PATH" && \ # uno unoconv and HTML
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 && \ mv /usr/share/tessdata /usr/share/tessdata-original && \
mkdir -p $HOME /configs /logs /customFiles /pipeline/watchedFolders /pipeline/finishedFolders && \ mkdir -p $HOME /configs /logs /customFiles /pipeline/watchedFolders /pipeline/finishedFolders && \
fc-cache -f -v && \ fc-cache -f -v && \
chmod +x /scripts/* && \ chmod +x /scripts/* && \
chmod +x /scripts/init.sh && \ chmod +x /scripts/init.sh && \
# User permissions # User permissions
addgroup -S stirlingpdfgroup && adduser -S stirlingpdfuser -G stirlingpdfgroup && \ addgroup -S stirlingpdfgroup && adduser -S stirlingpdfuser -G stirlingpdfgroup && \
chown -R stirlingpdfuser:stirlingpdfgroup $HOME /scripts /usr/share/fonts/opentype/noto /configs /customFiles /pipeline && \ chown -R stirlingpdfuser:stirlingpdfgroup $HOME /scripts /usr/share/fonts/opentype/noto /configs /customFiles /pipeline && \
chown stirlingpdfuser:stirlingpdfgroup /app.jar chown stirlingpdfuser:stirlingpdfgroup /app.jar
EXPOSE 8080/tcp EXPOSE 8080/tcp
# Set user and run command # Set user and run command
ENTRYPOINT ["tini", "--", "/scripts/init.sh"] ENTRYPOINT ["tini", "--", "/scripts/init.sh"]
CMD ["sh", "-c", "java -Dfile.encoding=UTF-8 -jar /app.jar & /opt/venv/bin/unoserver --port 2003 --interface 0.0.0.0"] CMD ["java", "-Dfile.encoding=UTF-8", "-jar", "/app.jar"]

View File

@@ -1,5 +1,5 @@
# use alpine # use alpine
FROM alpine:3.21.3@sha256:a8560b36e8b8210634f77d9f7f9efd7ffa463e380b75e2e74aff4511df3ef88c FROM alpine:3.21.2@sha256:56fa17d2a7e7f168a043a2712e63aed1f8543aeafdcee47c58dcffe38ed51099
ARG VERSION_TAG ARG VERSION_TAG

View File

@@ -3,6 +3,7 @@
[![Docker Pulls](https://img.shields.io/docker/pulls/frooodle/s-pdf)](https://hub.docker.com/r/frooodle/s-pdf) [![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) [![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) [![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) [![GitHub Repo stars](https://img.shields.io/github/stars/stirling-tools/stirling-pdf?style=social)](https://github.com/Stirling-Tools/stirling-pdf)
@@ -119,10 +120,10 @@ Stirling-PDF currently supports 39 languages!
| Arabic (العربية) (ar_AR) | ![89%](https://geps.dev/progress/89) | | Arabic (العربية) (ar_AR) | ![89%](https://geps.dev/progress/89) |
| Azerbaijani (Azərbaycan Dili) (az_AZ) | ![88%](https://geps.dev/progress/88) | | Azerbaijani (Azərbaycan Dili) (az_AZ) | ![88%](https://geps.dev/progress/88) |
| Basque (Euskara) (eu_ES) | ![51%](https://geps.dev/progress/51) | | Basque (Euskara) (eu_ES) | ![51%](https://geps.dev/progress/51) |
| Bulgarian (Български) (bg_BG) | ![99%](https://geps.dev/progress/99) | | Bulgarian (Български) (bg_BG) | ![85%](https://geps.dev/progress/85) |
| Catalan (Català) (ca_CA) | ![80%](https://geps.dev/progress/80) | | Catalan (Català) (ca_CA) | ![80%](https://geps.dev/progress/80) |
| Croatian (Hrvatski) (hr_HR) | ![86%](https://geps.dev/progress/86) | | Croatian (Hrvatski) (hr_HR) | ![87%](https://geps.dev/progress/87) |
| Czech (Česky) (cs_CZ) | ![97%](https://geps.dev/progress/97) | | Czech (Česky) (cs_CZ) | ![98%](https://geps.dev/progress/98) |
| Danish (Dansk) (da_DK) | ![85%](https://geps.dev/progress/85) | | Danish (Dansk) (da_DK) | ![85%](https://geps.dev/progress/85) |
| Dutch (Nederlands) (nl_NL) | ![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) | | English (English) (en_GB) | ![100%](https://geps.dev/progress/100) |
@@ -135,23 +136,23 @@ Stirling-PDF currently supports 39 languages!
| Indonesian (Bahasa Indonesia) (id_ID) | ![86%](https://geps.dev/progress/86) | | Indonesian (Bahasa Indonesia) (id_ID) | ![86%](https://geps.dev/progress/86) |
| Irish (Gaeilge) (ga_IE) | ![98%](https://geps.dev/progress/98) | | Irish (Gaeilge) (ga_IE) | ![98%](https://geps.dev/progress/98) |
| Italian (Italiano) (it_IT) | ![99%](https://geps.dev/progress/99) | | Italian (Italiano) (it_IT) | ![99%](https://geps.dev/progress/99) |
| Japanese (日本語) (ja_JP) | ![92%](https://geps.dev/progress/92) | | Japanese (日本語) (ja_JP) | ![93%](https://geps.dev/progress/93) |
| Korean (한국어) (ko_KR) | ![98%](https://geps.dev/progress/98) | | Korean (한국어) (ko_KR) | ![98%](https://geps.dev/progress/98) |
| Norwegian (Norsk) (no_NB) | ![78%](https://geps.dev/progress/78) | | Norwegian (Norsk) (no_NB) | ![78%](https://geps.dev/progress/78) |
| Persian (فارسی) (fa_IR) | ![94%](https://geps.dev/progress/94) | | Persian (فارسی) (fa_IR) | ![94%](https://geps.dev/progress/94) |
| Polish (Polski) (pl_PL) | ![85%](https://geps.dev/progress/85) | | Polish (Polski) (pl_PL) | ![86%](https://geps.dev/progress/86) |
| Portuguese (Português) (pt_PT) | ![97%](https://geps.dev/progress/97) | | Portuguese (Português) (pt_PT) | ![97%](https://geps.dev/progress/97) |
| Portuguese Brazilian (Português) (pt_BR) | ![98%](https://geps.dev/progress/98) | | Portuguese Brazilian (Português) (pt_BR) | ![98%](https://geps.dev/progress/98) |
| Romanian (Română) (ro_RO) | ![80%](https://geps.dev/progress/80) | | Romanian (Română) (ro_RO) | ![81%](https://geps.dev/progress/81) |
| Russian (Русский) (ru_RU) | ![97%](https://geps.dev/progress/97) | | Russian (Русский) (ru_RU) | ![98%](https://geps.dev/progress/98) |
| Serbian Latin alphabet (Srpski) (sr_LATN_RS) | ![63%](https://geps.dev/progress/63) | | Serbian Latin alphabet (Srpski) (sr_LATN_RS) | ![63%](https://geps.dev/progress/63) |
| Simplified Chinese (简体中文) (zh_CN) | ![99%](https://geps.dev/progress/99) | | Simplified Chinese (简体中文) (zh_CN) | ![90%](https://geps.dev/progress/90) |
| Slovakian (Slovensky) (sk_SK) | ![74%](https://geps.dev/progress/74) | | Slovakian (Slovensky) (sk_SK) | ![74%](https://geps.dev/progress/74) |
| Slovenian (Slovenščina) (sl_SI) | ![96%](https://geps.dev/progress/96) | | Slovenian (Slovenščina) (sl_SI) | ![97%](https://geps.dev/progress/97) |
| Spanish (Español) (es_ES) | ![86%](https://geps.dev/progress/86) | | Spanish (Español) (es_ES) | ![87%](https://geps.dev/progress/87) |
| Swedish (Svenska) (sv_SE) | ![92%](https://geps.dev/progress/92) | | Swedish (Svenska) (sv_SE) | ![92%](https://geps.dev/progress/92) |
| Thai (ไทย) (th_TH) | ![85%](https://geps.dev/progress/85) | | Thai (ไทย) (th_TH) | ![86%](https://geps.dev/progress/86) |
| Tibetan (བོད་ཡིག་) (zh_BO) | ![94%](https://geps.dev/progress/94) | | Tibetan (བོད་ཡིག་) (zh_BO) | ![95%](https://geps.dev/progress/95) |
| Traditional Chinese (繁體中文) (zh_TW) | ![98%](https://geps.dev/progress/98) | | Traditional Chinese (繁體中文) (zh_TW) | ![98%](https://geps.dev/progress/98) |
| Turkish (Türkçe) (tr_TR) | ![82%](https://geps.dev/progress/82) | | Turkish (Türkçe) (tr_TR) | ![82%](https://geps.dev/progress/82) |
| Ukrainian (Українська) (uk_UA) | ![72%](https://geps.dev/progress/72) | | Ukrainian (Українська) (uk_UA) | ![72%](https://geps.dev/progress/72) |

View File

@@ -15,8 +15,9 @@ plugins {
import com.github.jk1.license.render.* import com.github.jk1.license.render.*
ext { ext {
springBootVersion = "3.4.2" springBootVersion = "3.4.1"
pdfboxVersion = "3.0.4" pdfboxVersion = "3.0.4"
logbackVersion = "1.5.7"
imageioVersion = "3.12.0" imageioVersion = "3.12.0"
lombokVersion = "1.18.36" lombokVersion = "1.18.36"
bouncycastleVersion = "1.80" bouncycastleVersion = "1.80"
@@ -25,7 +26,7 @@ ext {
} }
group = "stirling.software" group = "stirling.software"
version = "0.42.0" version = "0.41.0"
java { java {
// 17 is lowest but we support and recommend 21 // 17 is lowest but we support and recommend 21
@@ -260,7 +261,7 @@ spotless {
googleJavaFormat("1.25.2").aosp().reorderImports(false) googleJavaFormat("1.25.2").aosp().reorderImports(false)
importOrder("java", "javax", "org", "com", "net", "io", "jakarta", "lombok", "me", "stirling") importOrder("java", "javax", "org", "com", "net", "io")
toggleOffOn() toggleOffOn()
trimTrailingWhitespace() trimTrailingWhitespace()
leadingTabsToSpaces() leadingTabsToSpaces()
@@ -272,7 +273,7 @@ sonar {
properties { properties {
property "sonar.projectKey", "Stirling-Tools_Stirling-PDF" property "sonar.projectKey", "Stirling-Tools_Stirling-PDF"
property "sonar.organization", "stirling-tools" 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.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.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/**" 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/**"
@@ -293,27 +294,14 @@ configurations.all {
} }
dependencies { 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") { 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 "me.friwi:jcefmaven:127.3.1"
implementation "org.openjfx:javafx-controls:21" implementation "org.openjfx:javafx-controls:21"
implementation "org.openjfx:javafx-swing:21" implementation "org.openjfx:javafx-swing:21"
} }
//security updates //security updates
implementation "org.springframework:spring-webmvc:6.2.3" implementation "org.springframework:spring-webmvc:6.2.2"
implementation("io.github.pixee:java-security-toolkit:1.2.1") implementation("io.github.pixee:java-security-toolkit:1.2.1")
@@ -332,8 +320,8 @@ dependencies {
implementation "org.springframework.boot:spring-boot-starter-data-jpa:$springBootVersion" implementation "org.springframework.boot:spring-boot-starter-data-jpa:$springBootVersion"
implementation "org.springframework.boot:spring-boot-starter-oauth2-client:$springBootVersion" implementation "org.springframework.boot:spring-boot-starter-oauth2-client:$springBootVersion"
implementation "org.springframework.session:spring-session-core:3.4.1" implementation "org.springframework.session:spring-session-core:$springBootVersion"
implementation "org.springframework:spring-jdbc:6.2.3" implementation "org.springframework:spring-jdbc:6.2.2"
implementation 'com.unboundid.product.scim2:scim2-sdk-client:2.3.5' implementation 'com.unboundid.product.scim2:scim2-sdk-client:2.3.5'
// Don't upgrade h2database // Don't upgrade h2database
@@ -408,7 +396,7 @@ dependencies {
implementation "org.bouncycastle:bcprov-jdk18on:$bouncycastleVersion" implementation "org.bouncycastle:bcprov-jdk18on:$bouncycastleVersion"
implementation "org.bouncycastle:bcpkix-jdk18on:$bouncycastleVersion" implementation "org.bouncycastle:bcpkix-jdk18on:$bouncycastleVersion"
implementation "org.springframework.boot:spring-boot-starter-actuator:$springBootVersion" implementation "org.springframework.boot:spring-boot-starter-actuator:$springBootVersion"
implementation "io.micrometer:micrometer-core:1.14.4" implementation "io.micrometer:micrometer-core:1.14.3"
implementation group: "com.google.zxing", name: "core", version: "3.5.3" implementation group: "com.google.zxing", name: "core", version: "3.5.3"
// https://mvnrepository.com/artifact/org.commonmark/commonmark // https://mvnrepository.com/artifact/org.commonmark/commonmark
implementation "org.commonmark:commonmark:0.24.0" implementation "org.commonmark:commonmark:0.24.0"

View File

@@ -41,7 +41,6 @@ import me.friwi.jcefmaven.MavenCefAppHandlerAdapter;
import me.friwi.jcefmaven.impl.progress.ConsoleProgressHandler; import me.friwi.jcefmaven.impl.progress.ConsoleProgressHandler;
import stirling.software.SPDF.UI.WebBrowser; import stirling.software.SPDF.UI.WebBrowser;
import stirling.software.SPDF.config.InstallationPathConfig; import stirling.software.SPDF.config.InstallationPathConfig;
import stirling.software.SPDF.utils.UIScaling;
@Component @Component
@Slf4j @Slf4j
@@ -216,7 +215,7 @@ public class DesktopBrowser implements WebBrowser {
} }
}); });
frame.setSize(UIScaling.scaleWidth(1280), UIScaling.scaleHeight(800)); frame.setSize(1280, 768);
frame.setLocationRelativeTo(null); frame.setLocationRelativeTo(null);
loadIcon(); loadIcon();
@@ -265,9 +264,7 @@ public class DesktopBrowser implements WebBrowser {
frame.setOpacity(1.0f); frame.setOpacity(1.0f);
frame.setUndecorated(false); frame.setUndecorated(false);
frame.pack(); frame.pack();
frame.setSize( frame.setSize(1280, 800);
UIScaling.scaleWidth(1280),
UIScaling.scaleHeight(800));
frame.setLocationRelativeTo(null); frame.setLocationRelativeTo(null);
log.debug("Frame reconfigured"); log.debug("Frame reconfigured");

View File

@@ -1,20 +1,12 @@
package stirling.software.SPDF.UI.impl; package stirling.software.SPDF.UI.impl;
import java.awt.*; import java.awt.*;
import java.io.BufferedReader;
import java.io.InputStream; 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.imageio.ImageIO;
import javax.swing.*; import javax.swing.*;
import io.github.pixee.security.BoundedLineReader;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.utils.UIScaling;
@Slf4j @Slf4j
public class LoadingWindow extends JDialog { public class LoadingWindow extends JDialog {
@@ -24,13 +16,6 @@ public class LoadingWindow extends JDialog {
private final JLabel brandLabel; private final JLabel brandLabel;
private long startTime; 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) { public LoadingWindow(Frame parent, String initialUrl) {
super(parent, "Initializing Stirling-PDF", true); super(parent, "Initializing Stirling-PDF", true);
startTime = System.currentTimeMillis(); startTime = System.currentTimeMillis();
@@ -56,12 +41,12 @@ public class LoadingWindow extends JDialog {
if (is != null) { if (is != null) {
Image img = ImageIO.read(is); Image img = ImageIO.read(is);
if (img != null) { if (img != null) {
Image scaledImg = UIScaling.scaleIcon(img, 48, 48); Image scaledImg = img.getScaledInstance(48, 48, Image.SCALE_SMOOTH);
JLabel iconLabel = new JLabel(new ImageIcon(scaledImg)); JLabel iconLabel = new JLabel(new ImageIcon(scaledImg));
iconLabel.setHorizontalAlignment(SwingConstants.CENTER); iconLabel.setHorizontalAlignment(SwingConstants.CENTER);
gbc.gridy = 0; gbc.gridy = 0;
mainPanel.add(iconLabel, gbc); mainPanel.add(iconLabel, gbc);
log.info("Icon loaded and scaled successfully"); log.debug("Icon loaded and scaled successfully");
} }
} }
} }
@@ -98,8 +83,7 @@ public class LoadingWindow extends JDialog {
setUndecorated(false); setUndecorated(false);
// Set size and position // Set size and position
setSize(UIScaling.scaleWidth(400), UIScaling.scaleHeight(200)); setSize(400, 200);
setLocationRelativeTo(parent); setLocationRelativeTo(parent);
setAlwaysOnTop(true); setAlwaysOnTop(true);
setProgress(0); setProgress(0);
@@ -110,163 +94,6 @@ public class LoadingWindow extends JDialog {
System.currentTimeMillis() - startTime); 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<String> 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) { public void setProgress(final int progress) {
SwingUtilities.invokeLater( SwingUtilities.invokeLater(
() -> { () -> {
@@ -288,23 +115,11 @@ public class LoadingWindow extends JDialog {
// Add thread state logging // Add thread state logging
Thread currentThread = Thread.currentThread(); Thread currentThread = Thread.currentThread();
log.info( log.debug(
"Current thread state - Name: {}, State: {}, Priority: {}", "Current thread state - Name: {}, State: {}, Priority: {}",
currentThread.getName(), currentThread.getName(),
currentThread.getState(), currentThread.getState(),
currentThread.getPriority()); 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); progressBar.setValue(validProgress);
@@ -330,7 +145,7 @@ public class LoadingWindow extends JDialog {
statusLabel.setText(validStatus); statusLabel.setText(validStatus);
// Log UI state when status changes // Log UI state when status changes
log.info( log.debug(
"UI State - Window visible: {}, Progress: {}%, Status: {}", "UI State - Window visible: {}, Progress: {}%, Status: {}",
isVisible(), progressBar.getValue(), validStatus); isVisible(), progressBar.getValue(), validStatus);

View File

@@ -21,9 +21,9 @@ public class ExternalAppDepConfig {
{ {
put("soffice", List.of("LibreOffice")); put("soffice", List.of("LibreOffice"));
put("/opt/venv/bin/weasyprint", List.of("Weasyprint")); put("weasyprint", List.of("Weasyprint"));
put("pdftohtml", List.of("Pdftohtml")); put("pdftohtml", List.of("Pdftohtml"));
put("/opt/venv/bin/unoconvert", List.of("Unoconv")); put("unoconv", List.of("Unoconv"));
put("qpdf", List.of("qpdf")); put("qpdf", List.of("qpdf"));
put("tesseract", List.of("tesseract")); put("tesseract", List.of("tesseract"));
} }
@@ -101,9 +101,9 @@ public class ExternalAppDepConfig {
checkDependencyAndDisableGroup("tesseract"); checkDependencyAndDisableGroup("tesseract");
checkDependencyAndDisableGroup("soffice"); checkDependencyAndDisableGroup("soffice");
checkDependencyAndDisableGroup("qpdf"); checkDependencyAndDisableGroup("qpdf");
checkDependencyAndDisableGroup("/opt/venv/bin/weasyprint"); checkDependencyAndDisableGroup("weasyprint");
checkDependencyAndDisableGroup("pdftohtml"); checkDependencyAndDisableGroup("pdftohtml");
checkDependencyAndDisableGroup("/opt/venv/bin/unoconvert"); checkDependencyAndDisableGroup("unoconv");
// Special handling for Python/OpenCV dependencies // Special handling for Python/OpenCV dependencies
boolean pythonAvailable = isCommandAvailable("python3") || isCommandAvailable("python"); boolean pythonAvailable = isCommandAvailable("python3") || isCommandAvailable("python");
if (!pythonAvailable) { if (!pythonAvailable) {

View File

@@ -139,9 +139,6 @@ public class UserService implements UserServiceInterface {
User user = User user =
findByUsernameIgnoreCase(username) findByUsernameIgnoreCase(username)
.orElseThrow(() -> new UsernameNotFoundException("User not found")); .orElseThrow(() -> new UsernameNotFoundException("User not found"));
if(user.getApiKey() == null || user.getApiKey().length() == 0) {
user = addApiKeyToUser(username);
}
return user.getApiKey(); return user.getApiKey();
} }

View File

@@ -174,38 +174,7 @@ public class RearrangePagesPDFController {
return newPageOrderZeroBased; return newPageOrderZeroBased;
} }
private List<Integer> duplicate(int totalPages, String pageOrder) { private List<Integer> processSortTypes(String sortTypes, int totalPages) {
List<Integer> 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<Integer> processSortTypes(String sortTypes, int totalPages, String pageOrder) {
try { try {
SortTypes mode = SortTypes.valueOf(sortTypes.toUpperCase()); SortTypes mode = SortTypes.valueOf(sortTypes.toUpperCase());
switch (mode) { switch (mode) {
@@ -227,8 +196,6 @@ public class RearrangePagesPDFController {
return removeLast(totalPages); return removeLast(totalPages);
case REMOVE_FIRST_AND_LAST: case REMOVE_FIRST_AND_LAST:
return removeFirstAndLast(totalPages); return removeFirstAndLast(totalPages);
case DUPLICATE:
return duplicate(totalPages, pageOrder);
default: default:
throw new IllegalArgumentException("Unsupported custom mode"); throw new IllegalArgumentException("Unsupported custom mode");
} }
@@ -256,10 +223,8 @@ public class RearrangePagesPDFController {
String[] pageOrderArr = pageOrder != null ? pageOrder.split(",") : new String[0]; String[] pageOrderArr = pageOrder != null ? pageOrder.split(",") : new String[0];
int totalPages = document.getNumberOfPages(); int totalPages = document.getNumberOfPages();
List<Integer> newPageOrder; List<Integer> newPageOrder;
if (sortType != null if (sortType != null && sortType.length() > 0) {
&& sortType.length() > 0 newPageOrder = processSortTypes(sortType, totalPages);
&& !"custom".equals(sortType.toLowerCase())) {
newPageOrder = processSortTypes(sortType, totalPages, pageOrder);
} else { } else {
newPageOrder = GeneralUtils.parsePageList(pageOrderArr, totalPages, false); newPageOrder = GeneralUtils.parsePageList(pageOrderArr, totalPages, false);
} }

View File

@@ -61,13 +61,13 @@ public class ConvertOfficeController {
List<String> command = List<String> command =
new ArrayList<>( new ArrayList<>(
Arrays.asList( Arrays.asList(
"/opt/venv/bin/unoconvert", "unoconv",
"--port", "-vvv",
"2003", "-f",
"--convert-to",
"pdf", "pdf",
tempInputFile.toString(), "-o",
tempOutputFile.toString())); tempOutputFile.toString(),
tempInputFile.toString()));
ProcessExecutorResult returnCode = ProcessExecutorResult returnCode =
ProcessExecutor.getInstance(ProcessExecutor.Processes.LIBRE_OFFICE) ProcessExecutor.getInstance(ProcessExecutor.Processes.LIBRE_OFFICE)
.runCommandWithOutputHandling(command); .runCommandWithOutputHandling(command);

View File

@@ -65,7 +65,7 @@ public class ConvertWebsiteToPDF {
// Prepare the WeasyPrint command // Prepare the WeasyPrint command
List<String> command = new ArrayList<>(); List<String> command = new ArrayList<>();
command.add("/opt/venv/bin/weasyprint"); command.add("weasyprint");
command.add(URL); command.add(URL);
command.add(tempOutputFile.toString()); command.add(tempOutputFile.toString());

View File

@@ -1,14 +1,7 @@
package stirling.software.SPDF.controller.api.converters; package stirling.software.SPDF.controller.api.converters;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.StringWriter; import java.io.StringWriter;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List; 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.CSVFormat;
import org.apache.commons.csv.QuoteMode; import org.apache.commons.csv.QuoteMode;
@@ -25,18 +18,18 @@ import org.springframework.web.bind.annotation.RestController;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.model.api.PDFWithPageNums; import stirling.software.SPDF.model.api.extract.PDFFilePage;
import stirling.software.SPDF.pdf.FlexibleCSVWriter; import stirling.software.SPDF.pdf.FlexibleCSVWriter;
import technology.tabula.ObjectExtractor; import technology.tabula.ObjectExtractor;
import technology.tabula.Page; import technology.tabula.Page;
import technology.tabula.Table; import technology.tabula.Table;
import technology.tabula.extractors.SpreadsheetExtractionAlgorithm; import technology.tabula.extractors.SpreadsheetExtractionAlgorithm;
import technology.tabula.writers.Writer;
@RestController @RestController
@RequestMapping("/api/v1/convert") @RequestMapping("/api/v1/convert")
@Tag(name = "Convert", description = "Convert APIs") @Tag(name = "Convert", description = "Convert APIs")
@Slf4j
public class ExtractCSVController { public class ExtractCSVController {
@PostMapping(value = "/pdf/csv", consumes = "multipart/form-data") @PostMapping(value = "/pdf/csv", consumes = "multipart/form-data")
@@ -44,80 +37,31 @@ public class ExtractCSVController {
summary = "Extracts a CSV document from a PDF", summary = "Extracts a CSV document from a PDF",
description = description =
"This operation takes an input PDF file and returns CSV file of whole page. Input:PDF Output:CSV Type:SISO") "This operation takes an input PDF file and returns CSV file of whole page. Input:PDF Output:CSV Type:SISO")
public ResponseEntity<?> pdfToCsv(@ModelAttribute PDFWithPageNums form) throws Exception { public ResponseEntity<String> PdfToCsv(@ModelAttribute PDFFilePage form) throws Exception {
String baseName = getBaseName(form.getFileInput().getOriginalFilename()); StringWriter writer = new StringWriter();
List<CsvEntry> csvEntries = new ArrayList<>();
try (PDDocument document = Loader.loadPDF(form.getFileInput().getBytes())) { try (PDDocument document = Loader.loadPDF(form.getFileInput().getBytes())) {
List<Integer> pages = form.getPageNumbersList(document, true); CSVFormat format =
CSVFormat.EXCEL.builder().setEscape('"').setQuoteMode(QuoteMode.ALL).build();
Writer csvWriter = new FlexibleCSVWriter(format);
SpreadsheetExtractionAlgorithm sea = new SpreadsheetExtractionAlgorithm(); SpreadsheetExtractionAlgorithm sea = new SpreadsheetExtractionAlgorithm();
CSVFormat format = CSVFormat.EXCEL.builder() try (ObjectExtractor extractor = new ObjectExtractor(document)) {
.setEscape('"') Page page = extractor.extract(form.getPageId());
.setQuoteMode(QuoteMode.ALL) List<Table> tables = sea.extract(page);
.build(); csvWriter.write(writer, tables);
for (int pageNum : pages) {
try (ObjectExtractor extractor = new ObjectExtractor(document)) {
log.info("{}",pageNum);
Page page = extractor.extract(pageNum);
List<Table> 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);
} }
} }
}
private ResponseEntity<byte[]> createZipResponse(List<CsvEntry> 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(); HttpHeaders headers = new HttpHeaders();
headers.setContentDisposition(ContentDisposition.builder("attachment") headers.setContentDisposition(
.filename(baseName + "_extracted.zip").build()); ContentDisposition.builder("attachment")
headers.setContentType(MediaType.parseMediaType("application/zip")); .filename(
form.getFileInput()
return ResponseEntity.ok().headers(headers).body(baos.toByteArray()); .getOriginalFilename()
} .replaceFirst("[.][^.]+$", "")
+ "_extracted.csv")
private ResponseEntity<String> createCsvResponse(CsvEntry entry, String baseName) { .build());
HttpHeaders headers = new HttpHeaders();
headers.setContentDisposition(ContentDisposition.builder("attachment")
.filename(baseName + "_extracted.csv").build());
headers.setContentType(MediaType.parseMediaType("text/csv")); headers.setContentType(MediaType.parseMediaType("text/csv"));
return ResponseEntity.ok().headers(headers).body(entry.content());
}
private String generateEntryName(String baseName, int pageNum, int tableIndex) { return ResponseEntity.ok().headers(headers).body(writer.toString());
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) {}
} }

View File

@@ -1,7 +1,6 @@
package stirling.software.SPDF.model; package stirling.software.SPDF.model;
public enum SortTypes { public enum SortTypes {
CUSTOM,
REVERSE_ORDER, REVERSE_ORDER,
DUPLEX_SORT, DUPLEX_SORT,
BOOKLET_SORT, BOOKLET_SORT,
@@ -11,5 +10,4 @@ public enum SortTypes {
REMOVE_FIRST, REMOVE_FIRST,
REMOVE_LAST, REMOVE_LAST,
REMOVE_FIRST_AND_LAST, REMOVE_FIRST_AND_LAST,
DUPLICATE
} }

View File

@@ -8,7 +8,6 @@ import org.apache.pdfbox.pdmodel.PDDocument;
import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.Hidden;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@@ -26,9 +25,7 @@ public class PDFWithPageNums extends PDFFile {
description = description =
"The pages to select, Supports ranges (e.g., '1,3,5-9'), or 'all' or functions in the" "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" + " 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; private String pageNumbers;
@Hidden @Hidden
@@ -44,9 +41,9 @@ public class PDFWithPageNums extends PDFFile {
} }
@Hidden @Hidden
public List<Integer> getPageNumbersList(PDDocument doc, boolean oneBased) { public List<Integer> getPageNumbersList(PDDocument doc, boolean zeroCount) {
int pageCount = 0; int pageCount = 0;
pageCount = doc.getNumberOfPages(); pageCount = doc.getNumberOfPages();
return GeneralUtils.parsePageList(pageNumbers, pageCount, oneBased); return GeneralUtils.parsePageList(pageNumbers, pageCount, zeroCount);
} }
} }

View File

@@ -0,0 +1,15 @@
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;
}

View File

@@ -15,8 +15,6 @@ public class RearrangePagesRequest extends PDFWithPageNums {
implementation = SortTypes.class, implementation = SortTypes.class,
description = description =
"The custom mode for page rearrangement. Valid values are:\n" "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" + "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, ...). " + "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" + "BOOKLET_SORT: Arranges pages for booklet printing (last, first, second, second last, ...).\n"

View File

@@ -1,7 +1,6 @@
package stirling.software.SPDF.model.api.misc; package stirling.software.SPDF.model.api.misc;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.media.Schema.RequiredMode;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@@ -12,49 +11,24 @@ import stirling.software.SPDF.model.api.PDFWithPageNums;
public class AddPageNumbersRequest extends PDFWithPageNums { public class AddPageNumbersRequest extends PDFWithPageNums {
@Schema( @Schema(
description = "Custom margin: small/medium/large/x-large", description = "Custom margin: small/medium/large",
allowableValues = {"small", "medium", "large", "x-large"}, allowableValues = {"small", "medium", "large"})
defaultValue = "medium",
requiredMode = RequiredMode.NOT_REQUIRED)
private String customMargin; private String customMargin;
@Schema(
description = "Font size for page numbers",
minimum = "1",
requiredMode = RequiredMode.REQUIRED)
private float fontSize; private float fontSize;
@Schema(
description = "Font type for page numbers",
allowableValues = {"helvetica", "courier", "times"},
requiredMode = RequiredMode.REQUIRED)
private String fontType; private String fontType;
@Schema( @Schema(description = "Position: 1 of 9 positions", minimum = "1", maximum = "9")
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; private int position;
@Schema( @Schema(description = "Starting number", minimum = "1")
description = "Starting number for page numbering",
minimum = "1",
requiredMode = RequiredMode.REQUIRED)
private int startingNumber; private int startingNumber;
@Schema( @Schema(description = "Which pages to number, default all")
description = "Which pages to number (e.g. '1,3-5,7' or 'all')",
defaultValue = "all",
requiredMode = RequiredMode.NOT_REQUIRED)
private String pagesToNumber; private String pagesToNumber;
@Schema( @Schema(
description = description =
"Custom text pattern. Available variables: {n}=current page number, {total}=total pages, {filename}=original filename", "Custom text: defaults to just number but can have things like \"Page {n} of {p}\"")
example = "Page {n} of {total}",
defaultValue = "{n}",
requiredMode = RequiredMode.NOT_REQUIRED)
private String customText; private String customText;
} }

View File

@@ -50,7 +50,7 @@ public class FileToPdf {
List<String> command = new ArrayList<>(); List<String> command = new ArrayList<>();
if (!htmlFormatsInstalled) { if (!htmlFormatsInstalled) {
command.add("/opt/venv/bin/weasyprint"); command.add("weasyprint");
command.add("-e"); command.add("-e");
command.add("utf-8"); command.add("utf-8");
command.add("-v"); command.add("-v");

View File

@@ -210,7 +210,8 @@ public class GeneralUtils {
result.addAll(handlePart(page, totalPages, offset)); result.addAll(handlePart(page, totalPages, offset));
} }
} }
return result; return new ArrayList<>(
new java.util.LinkedHashSet<>(result)); // Remove duplicates and maintain order
} }
public static List<Integer> evaluateNFunc(String expression, int maxValue) { public static List<Integer> evaluateNFunc(String expression, int maxValue) {

View File

@@ -1,67 +0,0 @@
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);
}
}

View File

@@ -30,69 +30,52 @@ public class InvertFullColorStrategy extends ReplaceAndInvertColorStrategy {
@Override @Override
public InputStreamResource replace() throws IOException { public InputStreamResource replace() throws IOException {
File file = null; // Create a temporary file, with the original filename from the multipart file
try { File file = Files.createTempFile("temp", getFileInput().getOriginalFilename()).toFile();
// Create a temporary file, with the original filename from the multipart file
file = Files.createTempFile("temp", getFileInput().getOriginalFilename()).toFile();
// Transfer the content of the multipart file to the file // Transfer the content of the multipart file to the file
getFileInput().transferTo(file); getFileInput().transferTo(file);
// Load the uploaded PDF // Load the uploaded PDF
PDDocument document = Loader.loadPDF(file); PDDocument document = Loader.loadPDF(file);
// Render each page and invert colors // Render each page and invert colors
PDFRenderer pdfRenderer = new PDFRenderer(document); PDFRenderer pdfRenderer = new PDFRenderer(document);
for (int page = 0; page < document.getNumberOfPages(); page++) { for (int page = 0; page < document.getNumberOfPages(); page++) {
BufferedImage image = BufferedImage image =
pdfRenderer.renderImageWithDPI(page, 300); // Render page at 300 DPI pdfRenderer.renderImageWithDPI(page, 300); // Render page at 300 DPI
// Invert the colors // Invert the colors
invertImageColors(image); invertImageColors(image);
// Create a new PDPage from the inverted image // Create a new PDPage from the inverted image
PDPage pdPage = document.getPage(page); PDPage pdPage = document.getPage(page);
File tempImageFile = null; PDImageXObject pdImage =
try { PDImageXObject.createFromFileByContent(
tempImageFile = convertToBufferedImageTpFile(image); convertToBufferedImageTpFile(image), document);
PDImageXObject pdImage =
PDImageXObject.createFromFileByContent(tempImageFile, document);
PDPageContentStream contentStream = PDPageContentStream contentStream =
new PDPageContentStream( new PDPageContentStream(
document, document, pdPage, PDPageContentStream.AppendMode.OVERWRITE, true);
pdPage, contentStream.drawImage(
PDPageContentStream.AppendMode.OVERWRITE, pdImage,
true); 0,
contentStream.drawImage( 0,
pdImage, pdPage.getMediaBox().getWidth(),
0, pdPage.getMediaBox().getHeight());
0, contentStream.close();
pdPage.getMediaBox().getWidth(),
pdPage.getMediaBox().getHeight());
contentStream.close();
} finally {
if (tempImageFile != null && tempImageFile.exists()) {
Files.delete(tempImageFile.toPath());
}
}
}
// Save the modified PDF to a ByteArrayOutputStream
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
document.save(byteArrayOutputStream);
document.close();
// Prepare the modified PDF for download
ByteArrayInputStream inputStream =
new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
InputStreamResource resource = new InputStreamResource(inputStream);
return resource;
} finally {
if (file != null && file.exists()) {
Files.delete(file.toPath());
}
} }
// Save the modified PDF to a ByteArrayOutputStream
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
document.save(byteArrayOutputStream);
document.close();
// Prepare the modified PDF for download
ByteArrayInputStream inputStream =
new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
InputStreamResource resource = new InputStreamResource(inputStream);
return resource;
} }
// Method to invert image colors // Method to invert image colors
@@ -115,7 +98,7 @@ public class InvertFullColorStrategy extends ReplaceAndInvertColorStrategy {
// Helper method to convert BufferedImage to InputStream // Helper method to convert BufferedImage to InputStream
private File convertToBufferedImageTpFile(BufferedImage image) throws IOException { private File convertToBufferedImageTpFile(BufferedImage image) throws IOException {
File file = File.createTempFile("image", ".png"); File file = new File("image.png");
ImageIO.write(image, "png", file); ImageIO.write(image, "png", file);
return file; return file;
} }

View File

@@ -262,7 +262,7 @@ home.desc=متجرك الشامل المستضاف محليًا لجميع اح
home.searchBar=البحث عن الميزات... home.searchBar=البحث عن الميزات...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=عرض PDF
home.viewPdf.desc=عرض وتعليق وإضافة نص أو صور home.viewPdf.desc=عرض وتعليق وإضافة نص أو صور
viewPdf.tags=عرض,قراءة,تعليق,نص,صورة viewPdf.tags=عرض,قراءة,تعليق,نص,صورة
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=إزالة الأول
pdfOrganiser.mode.8=إزالة الأخير pdfOrganiser.mode.8=إزالة الأخير
pdfOrganiser.mode.9=إزالة pdfOrganiser.mode.9=إزالة
pdfOrganiser.mode.10=دمج فردي-زوجي pdfOrganiser.mode.10=دمج فردي-زوجي
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(مثال: 1,3,2 أو 4-8,2,10-12 أو 2n-1) pdfOrganiser.placeholder=(مثال: 1,3,2 أو 4-8,2,10-12 أو 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=هذه الميزة متوفرة في <a href="{0}">صفحة الأدوات المتعددة</a> لدينا. اطلع عليها للحصول على واجهة مستخدم محسّنة لكل صفحة وميزات إضافية! multiTool-advert.message=هذه الميزة متوفرة في <a href="{0}">صفحة الأدوات المتعددة</a> لدينا. اطلع عليها للحصول على واجهة مستخدم محسّنة لكل صفحة وميزات إضافية!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=عرض PDF
viewPdf.header=عرض PDF viewPdf.header=عرض PDF
#pageRemover #pageRemover

View File

@@ -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.searchBar=Xüsusiyyətləri axtar...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=PDF-ə bax
home.viewPdf.desc=Bax, sitat götür, mətn və ya şəkil əlavə et 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 viewPdf.tags=bax,oxu,sitat götür,mətn,şəkil
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Birincini Sil
pdfOrganiser.mode.8=Sonuncunu Sil pdfOrganiser.mode.8=Sonuncunu Sil
pdfOrganiser.mode.9=Birinci və Sonuncunu Sil pdfOrganiser.mode.9=Birinci və Sonuncunu Sil
pdfOrganiser.mode.10=Tək-Cüt Birləşdirmə 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) pdfOrganiser.placeholder=(məs., 1,3,2 və ya 4-8,2,10-12 və ya 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=Bu xüsusiyyət bizim <a href="{0}">multi-alət səhifə</a>mizdə də mövcuddur. Əlavə xüsusiyyətlər və səhifə-səhifə interfeys üçün sınaqdan keçirin! multiTool-advert.message=Bu xüsusiyyət bizim <a href="{0}">multi-alət səhifə</a>mizdə də mövcuddur. Əlavə xüsusiyyətlər və səhifə-səhifə interfeys üçün sınaqdan keçirin!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=PDF-ə baxın
viewPdf.header=PDF-ə baxın viewPdf.header=PDF-ə baxın
#pageRemover #pageRemover

View File

@@ -79,10 +79,10 @@ info=Информация
pro=Pro pro=Pro
page=Страница page=Страница
pages=Страници pages=Страници
loading=Зареждане на... loading=Loading...
addToDoc=Добавяне към документ addToDoc=Add to Document
reset=Нулиране reset=Reset
apply=Приложи apply=Apply
legal.privacy=Политика за поверителност legal.privacy=Политика за поверителност
legal.terms=Правила и условия legal.terms=Правила и условия
@@ -138,13 +138,13 @@ analytics.settings=Можете да промените настройките
# NAVBAR # # NAVBAR #
############# #############
navbar.favorite=Любими navbar.favorite=Любими
navbar.recent=Нови и наскоро актуализирани navbar.recent=New and recently updated
navbar.darkmode=Тъмна тема navbar.darkmode=Тъмна тема
navbar.language=Езици navbar.language=Езици
navbar.settings=Настройки navbar.settings=Настройки
navbar.allTools=Инструменти navbar.allTools=Инструменти
navbar.multiTool=Мулти инструменти navbar.multiTool=Мулти инструменти
navbar.search=Търсене navbar.search=Search
navbar.sections.organize=Организирайте navbar.sections.organize=Организирайте
navbar.sections.convertTo=Преобразуване в PDF navbar.sections.convertTo=Преобразуване в PDF
navbar.sections.convertFrom=Преобразуване от PDF navbar.sections.convertFrom=Преобразуване от PDF
@@ -240,20 +240,20 @@ database.creationDate=Дата на създаване
database.fileSize=Размер на файла database.fileSize=Размер на файла
database.deleteBackupFile=Изтриване на архивен файл database.deleteBackupFile=Изтриване на архивен файл
database.importBackupFile=Импортиране на архивен файл database.importBackupFile=Импортиране на архивен файл
database.createBackupFile=Създаване на файл с резервно копие database.createBackupFile=Create Backup File
database.downloadBackupFile=Изтеглете архивен файл database.downloadBackupFile=Изтеглете архивен файл
database.info_1=Когато импортирате данни, е от решаващо значение да осигурите правилната структура. Ако не сте сигурни в това, което правите, потърсете съвет и подкрепа от професионалист. Грешка в структурата може да причини неизправност на приложението, включително пълна невъзможност за стартиране на приложението. database.info_1=Когато импортирате данни, е от решаващо значение да осигурите правилната структура. Ако не сте сигурни в това, което правите, потърсете съвет и подкрепа от професионалист. Грешка в структурата може да причини неизправност на приложението, включително пълна невъзможност за стартиране на приложението.
database.info_2=Името на файла няма значение при качване. След това ще бъде преименуван, за да следва формата backup_user_yyyyMMddHHmm.sql, осигурявайки последователна конвенция за именуване. database.info_2=Името на файла няма значение при качване. След това ще бъде преименуван, за да следва формата backup_user_yyyyMMddHHmm.sql, осигурявайки последователна конвенция за именуване.
database.submit=Импортиране на резервно копие database.submit=Импортиране на резервно копие
database.importIntoDatabaseSuccessed=Импортирането в базата данни бе успешно database.importIntoDatabaseSuccessed=Импортирането в базата данни бе успешно
database.backupCreated=Успешно архивиране на базата данни database.backupCreated=Database backup successful
database.fileNotFound=Файлът не е намерен database.fileNotFound=Файлът не е намерен
database.fileNullOrEmpty=Файлът не трябва да е нулев или празен database.fileNullOrEmpty=Файлът не трябва да е нулев или празен
database.failedImportFile=Неуспешно импортиране на файл database.failedImportFile=Неуспешно импортиране на файл
database.notSupported=Тази функция не е налична за вашата връзка с база данни. database.notSupported=This function is not available for your database connection.
session.expired=Вашата сесия е изтекла. Моля, опреснете страницата и опитайте отново. session.expired=Вашата сесия е изтекла. Моля, опреснете страницата и опитайте отново.
session.refreshPage=Презареждане на страницата session.refreshPage=Refresh Page
############# #############
# HOME-PAGE # # HOME-PAGE #
@@ -262,18 +262,18 @@ home.desc=Вашето локално хоствано обслужване на
home.searchBar=Търсене на функции... home.searchBar=Търсене на функции...
home.viewPdf.title=Преглед/Редактиране PDF home.viewPdf.title=Преглед на PDF
home.viewPdf.desc=Преглеждайте, коментирайте, добавяйте текст или изображения home.viewPdf.desc=Преглеждайте, коментирайте, добавяйте текст или изображения
viewPdf.tags=преглед,четене,анотиране,текст,изображение viewPdf.tags=преглед,четене,анотиране,текст,изображение
home.setFavorites=Задаване на предпочитани home.setFavorites=Set Favourites
home.hideFavorites=Скриване на предпочитани home.hideFavorites=Hide Favourites
home.showFavorites=Покажи предпочитани home.showFavorites=Show Favourites
home.legacyHomepage=Стара начална страница home.legacyHomepage=Old homepage
home.newHomePage=Опитайте новата ни начална страница! home.newHomePage=Try our new homepage!
home.alphabetical=По азбучен ред home.alphabetical=Alphabetical
home.globalPopularity=Световна популярност home.globalPopularity=Global Popularity
home.sortBy=Сортиране по: home.sortBy=Sort by:
home.multiTool.title=PDF Мулти инструмент home.multiTool.title=PDF Мулти инструмент
home.multiTool.desc=Обединяване, завъртане, пренареждане и премахване на страници home.multiTool.desc=Обединяване, завъртане, пренареждане и премахване на страници
@@ -462,9 +462,9 @@ home.MarkdownToPDF.title=Markdown към PDF
home.MarkdownToPDF.desc=Преобразува всеки Markdown файл към PDF home.MarkdownToPDF.desc=Преобразува всеки Markdown файл към PDF
MarkdownToPDF.tags=маркиране,уеб-съдържание,трансформация,преобразуване MarkdownToPDF.tags=маркиране,уеб-съдържание,трансформация,преобразуване
home.PDFToMarkdown.title=PDF към Markdown home.PDFToMarkdown.title=PDF to Markdown
home.PDFToMarkdown.desc=Преобразува всеки PDF файл в Markdown home.PDFToMarkdown.desc=Converts any PDF to Markdown
PDFToMarkdown.tags=маркиране, уеб-съдържание, трансформация, конвертиране, MD PDFToMarkdown.tags=markup,web-content,transformation,convert,md
home.getPdfInfo.title=Вземете ЦЯЛАТА информация от PDF home.getPdfInfo.title=Вземете ЦЯЛАТА информация от PDF
home.getPdfInfo.desc=Взима всяка възможна информация от PDF файлове home.getPdfInfo.desc=Взима всяка възможна информация от PDF файлове
@@ -489,11 +489,11 @@ home.autoRedact.title=Автоматично редактиране
home.autoRedact.desc=Автоматично редактира (зачернява) текст в PDF въз основа на въведен текст home.autoRedact.desc=Автоматично редактира (зачернява) текст в PDF въз основа на въведен текст
autoRedact.tags=Редактиране,Скриване,затъмняване,черен,маркер,скрит autoRedact.tags=Редактиране,Скриване,затъмняване,черен,маркер,скрит
home.redact.title=Ръчно редактиране home.redact.title=Manual Redaction
home.redact.desc=Редактиране на PDF файл въз основа на избран текст, нарисувани форми и/или избрана страница(и) home.redact.desc=Redacts a PDF based on selected text, drawn shapes and/or selected page(s)
redact.tags=Редактиране, скриване, затъмнение, черно, маркер, скрито, ръчно redact.tags=Redact,Hide,black out,black,marker,hidden,manual
home.tableExtraxt.title=PDF към CSV home.tableExtraxt.title=PDF в CSV
home.tableExtraxt.desc=Извлича таблици от PDF, като ги конвертира в CSV home.tableExtraxt.desc=Извлича таблици от PDF, като ги конвертира в CSV
tableExtraxt.tags=CSV,извличане на таблица,извличане,конвертиране tableExtraxt.tags=CSV,извличане на таблица,извличане,конвертиране
@@ -533,9 +533,9 @@ home.splitPdfByChapters.title=Разделете PDF по глави
home.splitPdfByChapters.desc=Разделете PDF на множество файлове въз основа на неговата структура на глави. home.splitPdfByChapters.desc=Разделете PDF на множество файлове въз основа на неговата структура на глави.
splitPdfByChapters.tags=разделяне, глави, отметки, организиране splitPdfByChapters.tags=разделяне, глави, отметки, организиране
home.validateSignature.title=Валидиране на PDF подпис home.validateSignature.title=Validate PDF Signature
home.validateSignature.desc=Проверка на цифрови подписи и сертификати в PDF документи home.validateSignature.desc=Verify digital signatures and certificates in PDF documents
validateSignature.tags=подпис,проверка,валидиране,pdf,сертификат,цифров подпис,валидиране на подпис,валидиране на сертификат validateSignature.tags=signature,verify,validate,pdf,certificate,digital signature,Validate Signature,Validate certificate
#replace-invert-color #replace-invert-color
replace-color.title=Замени-инвертиране-на-цвят replace-color.title=Замени-инвертиране-на-цвят
@@ -580,7 +580,7 @@ login.oauth2invalidRequest=Невалидна заявка
login.oauth2AccessDenied=Отказан достъп login.oauth2AccessDenied=Отказан достъп
login.oauth2InvalidTokenResponse=Невалиден отговор на токена login.oauth2InvalidTokenResponse=Невалиден отговор на токена
login.oauth2InvalidIdToken=Невалиден токен за идентификатор login.oauth2InvalidIdToken=Невалиден токен за идентификатор
login.relyingPartyRegistrationNotFound=Не е открита регистрация на доверяваща се страна login.relyingPartyRegistrationNotFound=No relying party registration found
login.userIsDisabled=Потребителят е деактивиран, влизането в момента е блокирано с това потребителско име. Моля, свържете се с администратора. login.userIsDisabled=Потребителят е деактивиран, влизането в момента е блокирано с това потребителско име. Моля, свържете се с администратора.
login.alreadyLoggedIn=Вече сте влезли в login.alreadyLoggedIn=Вече сте влезли в
login.alreadyLoggedIn2=устройства. Моля, излезте от устройствата и опитайте отново. login.alreadyLoggedIn2=устройства. Моля, излезте от устройствата и опитайте отново.
@@ -599,31 +599,31 @@ autoRedact.convertPDFToImageLabel=Преобразуване на PDF към PDF
autoRedact.submitButton=Изпращане autoRedact.submitButton=Изпращане
#redact #redact
redact.title=Ръчно редактиране redact.title=Manual Redaction
redact.header=Ръчно редактиране redact.header=Manual Redaction
redact.submit=Редактиране redact.submit=Redact
redact.textBasedRedaction=Редактиране на базата на текст redact.textBasedRedaction=Text based Redaction
redact.pageBasedRedaction=Редактиране на базата на страници redact.pageBasedRedaction=Page-based Redaction
redact.convertPDFToImageLabel=Конвертиране на PDF в PDF-изображение (използва се за премахване на текста зад полето) redact.convertPDFToImageLabel=Convert PDF to PDF-Image (Used to remove text behind the box)
redact.pageRedactionNumbers.title=Страници redact.pageRedactionNumbers.title=Pages
redact.pageRedactionNumbers.placeholder=(напр. 1,2,8 или 4,7,12-16 или 2n-1) redact.pageRedactionNumbers.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
redact.redactionColor.title=Цвят на редактиране redact.redactionColor.title=Redaction Color
redact.export=Експорт redact.export=Export
redact.upload=Качване redact.upload=Upload
redact.boxRedaction=Редактиране на рисунката в квадратчето redact.boxRedaction=Box draw redaction
redact.zoom=Увеличаване redact.zoom=Zoom
redact.zoomIn=Увеличаване на мащаба redact.zoomIn=Zoom in
redact.zoomOut=Намаляване на мащаба redact.zoomOut=Zoom out
redact.nextPage=Следваща страница redact.nextPage=Next Page
redact.previousPage=Предишна страница redact.previousPage=Previous Page
redact.toggleSidebar=Превключване на страничната лента redact.toggleSidebar=Toggle Sidebar
redact.showThumbnails=Показване на миниатюри redact.showThumbnails=Show Thumbnails
redact.showDocumentOutline=Показване на контура на документа (кликнете два пъти, за да разгънете/свиете всички елементи) redact.showDocumentOutline=Show Document Outline (double-click to expand/collapse all items)
redact.showAttatchments=Показване на прикачени файлове redact.showAttatchments=Show Attachments
redact.showLayers=Показване на слоеве (щракнете два пъти, за да върнете всички слоеве в състояние по подразбиране) redact.showLayers=Show Layers (double-click to reset all layers to the default state)
redact.colourPicker=Избор на цвят redact.colourPicker=Colour Picker
redact.findCurrentOutlineItem=Намиране на текущия елемент от контура redact.findCurrentOutlineItem=Find current outline item
redact.applyChanges=Прилагане на промените redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Покажи Javascript showJS.title=Покажи Javascript
@@ -661,9 +661,9 @@ MarkdownToPDF.credit=Използва WeasyPrint
#pdf-to-markdown #pdf-to-markdown
PDFToMarkdown.title=PDF към Markdown PDFToMarkdown.title=PDF To Markdown
PDFToMarkdown.header=PDF към Markdown PDFToMarkdown.header=PDF To Markdown
PDFToMarkdown.submit=Преобразуване PDFToMarkdown.submit=Convert
#url-to-pdf #url-to-pdf
@@ -809,7 +809,7 @@ certSign.showSig=Показване на подпис
certSign.reason=Причина certSign.reason=Причина
certSign.location=Местоположение certSign.location=Местоположение
certSign.name=Име certSign.name=Име
certSign.showLogo=Покажи лого certSign.showLogo=Show Logo
certSign.submit=Подпишете PDF certSign.submit=Подпишете PDF
@@ -844,9 +844,9 @@ compare.highlightColor.2=Цвят на маркирането 2:
compare.document.1=Документ 1 compare.document.1=Документ 1
compare.document.2=Документ 2 compare.document.2=Документ 2
compare.submit=Сравнявай compare.submit=Сравнявай
compare.complex.message=Един или и двата предоставени документа са големи файлове, точността на сравнението може да бъде намалена. compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced
compare.large.file.message=Един или и двата предоставени документа са твърде големи за обработка compare.large.file.message=One or Both of the provided documents are too large to process
compare.no.text.message=Един или и двата избрани PDF файла нямат текстово съдържание. Моля, изберете PDF файлове с текст за сравнение. compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison.
#BookToPDF #BookToPDF
BookToPDF.title=Книги и комикси в PDF BookToPDF.title=Книги и комикси в PDF
@@ -869,18 +869,18 @@ sign.draw=Начертайте подпис
sign.text=Въвеждане на текст sign.text=Въвеждане на текст
sign.clear=Изчисти sign.clear=Изчисти
sign.add=Добави sign.add=Добави
sign.saved=Съхранени подписи sign.saved=Saved Signatures
sign.save=Запазване на подпис sign.save=Save Signature
sign.personalSigs=Лични подписи sign.personalSigs=Personal Signatures
sign.sharedSigs=Споделени подписи sign.sharedSigs=Shared Signatures
sign.noSavedSigs=Не са намерени запазени подписи sign.noSavedSigs=No saved signatures found
sign.addToAll=Дибави към всички страници sign.addToAll=Add to all pages
sign.delete=Изтрий sign.delete=Delete
sign.first=Първа страница sign.first=First page
sign.last=Последна страница sign.last=Last page
sign.next=Следваща страница sign.next=Next page
sign.previous=Предишна стараница sign.previous=Previous page
sign.maintainRatio=Превключване за поддържане на съотношението на страните sign.maintainRatio=Toggle maintain aspect ratio
#repair #repair
@@ -952,7 +952,7 @@ compress.title=Компресиране
compress.header=Компресиране на PDF compress.header=Компресиране на PDF
compress.credit=Тази услуга използва qpdf за PDF компресиране/оптимизиране. compress.credit=Тази услуга използва qpdf за PDF компресиране/оптимизиране.
compress.selectText.1=Ръчен режим - от 1 до 5 compress.selectText.1=Ръчен режим - от 1 до 5
compress.selectText.1.1=При нива на оптимизация от 6 до 9, в допълнение към общото компресиране на PDF, резолюцията на изображението се намалява, за да се намали допълнително размерът на файла. По-високите нива водят до по-силна компресия на изображенията (до 50% от оригиналния размер), като се постига по-голямо намаляване на размера, но с потенциална загуба на качество на изображенията. 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.2=Ниво на оптимизация: compress.selectText.2=Ниво на оптимизация:
compress.selectText.3=4 (Ужасно за текстови изображения) compress.selectText.3=4 (Ужасно за текстови изображения)
compress.selectText.4=Автоматичен режим - Автоматично настройва качеството, за да получи PDF с точен размер compress.selectText.4=Автоматичен режим - Автоматично настройва качеството, за да получи PDF с точен размер
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Премахни първо
pdfOrganiser.mode.8=Премахване на последния pdfOrganiser.mode.8=Премахване на последния
pdfOrganiser.mode.9=Премахване на първия и последния pdfOrganiser.mode.9=Премахване на първия и последния
pdfOrganiser.mode.10=Обединяване на четно и нечетно pdfOrganiser.mode.10=Обединяване на четно и нечетно
pdfOrganiser.mode.11=Дублиране на всички страници
pdfOrganiser.placeholder=(напр. 1,3,2 или 4-8,2,10-12 или 2n-1) pdfOrganiser.placeholder=(напр. 1,3,2 или 4-8,2,10-12 или 2n-1)
@@ -1000,42 +999,42 @@ pdfOrganiser.placeholder=(напр. 1,3,2 или 4-8,2,10-12 или 2n-1)
multiTool.title=PDF Мулти инструмент multiTool.title=PDF Мулти инструмент
multiTool.header=PDF Мулти инструмент multiTool.header=PDF Мулти инструмент
multiTool.uploadPrompts=Име на файл multiTool.uploadPrompts=Име на файл
multiTool.selectAll=Изберете всички multiTool.selectAll=Select All
multiTool.deselectAll=Отмяна на избора на всички multiTool.deselectAll=Deselect All
multiTool.selectPages=Избор на страница multiTool.selectPages=Page Select
multiTool.selectedPages=Избрани страници multiTool.selectedPages=Selected Pages
multiTool.page=Страница multiTool.page=Page
multiTool.deleteSelected=Изтриване на избраното multiTool.deleteSelected=Delete Selected
multiTool.downloadAll=Експорт multiTool.downloadAll=Export
multiTool.downloadSelected=Избрано за експортиране multiTool.downloadSelected=Export Selected
multiTool.insertPageBreak=Вмъкване на прекъсване на страница multiTool.insertPageBreak=Insert Page Break
multiTool.addFile=Добавяне на файл multiTool.addFile=Add File
multiTool.rotateLeft=Завъртете наляво multiTool.rotateLeft=Rotate Left
multiTool.rotateRight=Завъртете надясно multiTool.rotateRight=Rotate Right
multiTool.split=Разделяне multiTool.split=Split
multiTool.moveLeft=Преместване наляво multiTool.moveLeft=Move Left
multiTool.moveRight=Преместване надясно multiTool.moveRight=Move Right
multiTool.delete=Изтрий multiTool.delete=Delete
multiTool.dragDropMessage=Избран(и) страница(/и) multiTool.dragDropMessage=Page(s) Selected
multiTool.undo=Отмяна на multiTool.undo=Undo
multiTool.redo=Повтори multiTool.redo=Redo
#decrypt #decrypt
decrypt.passwordPrompt=Този файл е защитен с парола. Моля, въведете паролата: decrypt.passwordPrompt=This file is password-protected. Please enter the password:
decrypt.cancelled=Операцията за PDF е отменена: {0} decrypt.cancelled=Operation cancelled for PDF: {0}
decrypt.noPassword=Не е предоставена парола за шифрирания PDF: {0} decrypt.noPassword=No password provided for encrypted PDF: {0}
decrypt.invalidPassword=Моля, опитайте отново с правилната парола. decrypt.invalidPassword=Please try again with the correct password.
decrypt.invalidPasswordHeader=Неправилна парола или неподдържано криптиране за PDF: {0} decrypt.invalidPasswordHeader=Incorrect password or unsupported encryption for PDF: {0}
decrypt.unexpectedError=Възникна грешка при обработката на файла. Моля, опитайте отново. decrypt.unexpectedError=There was an error processing the file. Please try again.
decrypt.serverError=Грешка в работата на сървъра повреме на дешифриране: {0} decrypt.serverError=Server error while decrypting: {0}
decrypt.success=Файлът е успешно дешифриран. decrypt.success=File decrypted successfully.
#multiTool-advert #multiTool-advert
multiTool-advert.message=Тази функция е налична и в нашата <a href="{0}">страница с множество инструменти</a>. Проверете го за подобрен потребителски интерфейс страница по страница и допълнителни функции! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=Преглед/Редактиране на PDF viewPdf.title=Преглед на PDF
viewPdf.header=Преглед на PDF viewPdf.header=Преглед на PDF
#pageRemover #pageRemover
@@ -1336,51 +1335,51 @@ splitByChapters.desc.4=Разрешаване на дубликати: Ако е
splitByChapters.submit=Разделяне на PDF splitByChapters.submit=Разделяне на PDF
#File Chooser #File Chooser
fileChooser.click=Щракнете fileChooser.click=Click
fileChooser.or=или fileChooser.or=or
fileChooser.dragAndDrop=Влачете и пуснете fileChooser.dragAndDrop=Drag & Drop
fileChooser.dragAndDropPDF=Влачете и пуснете PDF файл fileChooser.dragAndDropPDF=Drag & Drop PDF file
fileChooser.dragAndDropImage=Влачете и пуснете изображение fileChooser.dragAndDropImage=Drag & Drop Image file
fileChooser.hoveredDragAndDrop=Влачете и пуснете файл(ове) тук fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
#release notes #release notes
releases.footer=Версии releases.footer=Releases
releases.title=Бележки към версиите releases.title=Release Notes
releases.header=Бележки към версиите releases.header=Release Notes
releases.current.version=Текуща версия releases.current.version=Current Release
releases.note=Бележките към изданието са налични само на английски език releases.note=Release notes are only available in English
#Validate Signature #Validate Signature
validateSignature.title=Удостоверяване на PDF подписи validateSignature.title=Validate PDF Signatures
validateSignature.header=Потвърждаване на цифрови подписи validateSignature.header=Validate Digital Signatures
validateSignature.selectPDF=Изберете подписания PDF файл validateSignature.selectPDF=Select signed PDF file
validateSignature.submit=Потвърждаване на подписите validateSignature.submit=Validate Signatures
validateSignature.results=Резултати от валидирането validateSignature.results=Validation Results
validateSignature.status=Статус validateSignature.status=Status
validateSignature.signer=Подписващ validateSignature.signer=Signer
validateSignature.date=Дата validateSignature.date=Date
validateSignature.reason=Причина validateSignature.reason=Reason
validateSignature.location=Местоположение validateSignature.location=Location
validateSignature.noSignatures=В този документ не са открити цифрови подписи validateSignature.noSignatures=No digital signatures found in this document
validateSignature.status.valid=Валиден validateSignature.status.valid=Valid
validateSignature.status.invalid=Невалиден validateSignature.status.invalid=Invalid
validateSignature.chain.invalid=Удостоверяването на веригата на сертификата е неуспешно - не може да се провери самоличността на подписващия validateSignature.chain.invalid=Certificate chain validation failed - cannot verify signer's identity
validateSignature.trust.invalid=Сертификатът не е в хранилището за доверие - източникът не може да бъде проверен validateSignature.trust.invalid=Certificate not in trust store - source cannot be verified
validateSignature.cert.expired=Сертификатът е изтекъл validateSignature.cert.expired=Certificate has expired
validateSignature.cert.revoked=Сертификатът е отменен validateSignature.cert.revoked=Certificate has been revoked
validateSignature.signature.info=Информация за подписа validateSignature.signature.info=Signature Information
validateSignature.signature=Подпис validateSignature.signature=Signature
validateSignature.signature.mathValid=Подписът е математически валиден, НО: validateSignature.signature.mathValid=Signature is mathematically valid BUT:
validateSignature.selectCustomCert=Файл със сертификат X.509 по поръчка (по избор) validateSignature.selectCustomCert=Custom Certificate File X.509 (Optional)
validateSignature.cert.info=Подробности за сертификата validateSignature.cert.info=Certificate Details
validateSignature.cert.issuer=Издател validateSignature.cert.issuer=Issuer
validateSignature.cert.subject=Тема validateSignature.cert.subject=Subject
validateSignature.cert.serialNumber=Сериен номер validateSignature.cert.serialNumber=Serial Number
validateSignature.cert.validFrom=Валиден от validateSignature.cert.validFrom=Valid From
validateSignature.cert.validUntil=Валиден до validateSignature.cert.validUntil=Valid Until
validateSignature.cert.algorithm=Алгоритъм validateSignature.cert.algorithm=Algorithm
validateSignature.cert.keySize=Размер на ключ validateSignature.cert.keySize=Key Size
validateSignature.cert.version=Версия validateSignature.cert.version=Version
validateSignature.cert.keyUsage=Предназначение на ключа за използване validateSignature.cert.keyUsage=Key Usage
validateSignature.cert.selfSigned=Самостоятелно подписан validateSignature.cert.selfSigned=Self-Signed
validateSignature.cert.bits=битове validateSignature.cert.bits=bits

View File

@@ -262,7 +262,7 @@ home.desc=L'eina allotjada localment per a necessitats de PDF.
home.searchBar=Cerca funcions... home.searchBar=Cerca funcions...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=Visualitza PDF
home.viewPdf.desc=Visualitza, anota, afegeix text o imatges home.viewPdf.desc=Visualitza, anota, afegeix text o imatges
viewPdf.tags=view,read,annotate,text,image viewPdf.tags=view,read,annotate,text,image
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Eliminar Primer
pdfOrganiser.mode.8=Eliminar Últim pdfOrganiser.mode.8=Eliminar Últim
pdfOrganiser.mode.9=Eliminar Primer i Últim pdfOrganiser.mode.9=Eliminar Primer i Últim
pdfOrganiser.mode.10=Fusionar Parells-Senars 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) pdfOrganiser.placeholder=(p. ex. 1,3,2 o 4-8,2,10-12 o 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=Visualitza PDF
viewPdf.header=Visualitza PDF viewPdf.header=Visualitza PDF
#pageRemover #pageRemover

View File

@@ -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.searchBar=Hledat funkce...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=Zobrazit PDF
home.viewPdf.desc=Zobrazit, anotovat, přidat text nebo obrázky home.viewPdf.desc=Zobrazit, anotovat, přidat text nebo obrázky
viewPdf.tags=zobrazit,číst,anotovat,text,obrázek viewPdf.tags=zobrazit,číst,anotovat,text,obrázek
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Odstranit první
pdfOrganiser.mode.8=Odstranit poslední pdfOrganiser.mode.8=Odstranit poslední
pdfOrganiser.mode.9=Odstranit první a poslední pdfOrganiser.mode.9=Odstranit první a poslední
pdfOrganiser.mode.10=Sloučení sudé-liché 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) pdfOrganiser.placeholder=(např. 1,3,2 nebo 4-8,2,10-12 nebo 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=Soubor byl úspěšně dešifrován.
multiTool-advert.message=Tato funkce je také k dispozici na naší <a href="{0}">stránce multi-nástroje</a>. Podívejte se na ni pro vylepšené rozhraní pro práci se stránkami a další funkce! multiTool-advert.message=Tato funkce je také k dispozici na naší <a href="{0}">stránce multi-nástroje</a>. Podívejte se na ni pro vylepšené rozhraní pro práci se stránkami a další funkce!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=Zobrazit PDF
viewPdf.header=Zobrazit PDF viewPdf.header=Zobrazit PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Dit lokalt hostede one-stop-shop for alle dine PDF-behov.
home.searchBar=Søg efter funktioner... home.searchBar=Søg efter funktioner...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=Se PDF
home.viewPdf.desc=Se, annotér, tilføj tekst eller billeder home.viewPdf.desc=Se, annotér, tilføj tekst eller billeder
viewPdf.tags=se,læs,annotér,tekst,billede viewPdf.tags=se,læs,annotér,tekst,billede
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Fjern Første
pdfOrganiser.mode.8=Fjern Sidste pdfOrganiser.mode.8=Fjern Sidste
pdfOrganiser.mode.9=Fjern Første og Sidste pdfOrganiser.mode.9=Fjern Første og Sidste
pdfOrganiser.mode.10=Ulige-Lige Sammenføjning 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) pdfOrganiser.placeholder=(f.eks. 1,3,2 eller 4-8,2,10-12 eller 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=Se PDF
viewPdf.header=Se PDF viewPdf.header=Se PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Ihr lokal gehosteter One-Stop-Shop für alle Ihre PDF-Anforderungen.
home.searchBar=Suche nach Funktionen... home.searchBar=Suche nach Funktionen...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=PDF anzeigen
home.viewPdf.desc=Anzeigen, Kommentieren, Text oder Bilder hinzufügen home.viewPdf.desc=Anzeigen, Kommentieren, Text oder Bilder hinzufügen
viewPdf.tags=anzeigen,lesen,kommentieren,text,bild viewPdf.tags=anzeigen,lesen,kommentieren,text,bild
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Erste entfernen
pdfOrganiser.mode.8=Letzte entfernen pdfOrganiser.mode.8=Letzte entfernen
pdfOrganiser.mode.9=Erste und letzte entfernen pdfOrganiser.mode.9=Erste und letzte entfernen
pdfOrganiser.mode.10=Ungerade-Gerade-Zusammenführung 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) pdfOrganiser.placeholder=(z.B. 1,3,2 oder 4-8,2,10-12 oder 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=Datei erfolgreich entschlüsselt.
multiTool-advert.message=Diese Funktion ist auch auf unserer <a href="{0}">PDF-Multitool-Seite</a> verfügbar. Probieren Sie sie aus, denn sie bietet eine verbesserte Benutzeroberfläche und zusätzliche Funktionen! multiTool-advert.message=Diese Funktion ist auch auf unserer <a href="{0}">PDF-Multitool-Seite</a> verfügbar. Probieren Sie sie aus, denn sie bietet eine verbesserte Benutzeroberfläche und zusätzliche Funktionen!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=PDF anzeigen
viewPdf.header=PDF anzeigen viewPdf.header=PDF anzeigen
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Ο τοπικά φιλοξενούμενος προορισμός σα
home.searchBar=Αναζήτηση λειτουργιών... home.searchBar=Αναζήτηση λειτουργιών...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=Προβολή PDF
home.viewPdf.desc=Προβολή, σχολιασμός, προσθήκη κειμένου ή εικόνων home.viewPdf.desc=Προβολή, σχολιασμός, προσθήκη κειμένου ή εικόνων
viewPdf.tags=προβολή,ανάγνωση,σχολιασμός,κείμενο,εικόνα viewPdf.tags=προβολή,ανάγνωση,σχολιασμός,κείμενο,εικόνα
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Αφαίρεση πρώτης
pdfOrganiser.mode.8=Αφαίρεση τελευταίας pdfOrganiser.mode.8=Αφαίρεση τελευταίας
pdfOrganiser.mode.9=Αφαίρεση πρώτης και τελευταίας pdfOrganiser.mode.9=Αφαίρεση πρώτης και τελευταίας
pdfOrganiser.mode.10=Συγχώνευση μονών-ζυγών pdfOrganiser.mode.10=Συγχώνευση μονών-ζυγών
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(π.χ. 1,3,2 ή 4-8,2,10-12 ή 2n-1) pdfOrganiser.placeholder=(π.χ. 1,3,2 ή 4-8,2,10-12 ή 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=Το αρχείο αποκρυπτογραφήθηκε με επ
multiTool-advert.message=Αυτή η λειτουργία είναι επίσης διαθέσιμη στη <a href="{0}">σελίδα πολυεργαλείου</a> μας. Δείτε την για βελτιωμένο περιβάλλον χρήστη σελίδα-προς-σελίδα και επιπλέον λειτουργίες! multiTool-advert.message=Αυτή η λειτουργία είναι επίσης διαθέσιμη στη <a href="{0}">σελίδα πολυεργαλείου</a> μας. Δείτε την για βελτιωμένο περιβάλλον χρήστη σελίδα-προς-σελίδα και επιπλέον λειτουργίες!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=Προβολή PDF
viewPdf.header=Προβολή PDF viewPdf.header=Προβολή PDF
#pageRemover #pageRemover

View File

@@ -262,9 +262,9 @@ home.desc=Your locally hosted one-stop-shop for all your PDF needs.
home.searchBar=Search for features... home.searchBar=Search for features...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=View PDF
home.viewPdf.desc=View, annotate, draw, add text or images home.viewPdf.desc=View, annotate, add text or images
viewPdf.tags=view,read,annotate,text,image,highlight,edit viewPdf.tags=view,read,annotate,text,image
home.setFavorites=Set Favourites home.setFavorites=Set Favourites
home.hideFavorites=Hide Favourites home.hideFavorites=Hide Favourites
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Remove First
pdfOrganiser.mode.8=Remove Last pdfOrganiser.mode.8=Remove Last
pdfOrganiser.mode.9=Remove First and Last pdfOrganiser.mode.9=Remove First and Last
pdfOrganiser.mode.10=Odd-Even Merge 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) pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=View PDF
viewPdf.header=View PDF viewPdf.header=View PDF
#pageRemover #pageRemover

View File

@@ -262,9 +262,9 @@ home.desc=Your locally hosted one-stop-shop for all your PDF needs.
home.searchBar=Search for features... home.searchBar=Search for features...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=View PDF
home.viewPdf.desc=View, annotate, draw, add text or images home.viewPdf.desc=View, annotate, add text or images
viewPdf.tags=view,read,annotate,text,image,highlight,edit viewPdf.tags=view,read,annotate,text,image
home.setFavorites=Set Favourites home.setFavorites=Set Favourites
home.hideFavorites=Hide Favourites home.hideFavorites=Hide Favourites
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Remove First
pdfOrganiser.mode.8=Remove Last pdfOrganiser.mode.8=Remove Last
pdfOrganiser.mode.9=Remove First and Last pdfOrganiser.mode.9=Remove First and Last
pdfOrganiser.mode.10=Odd-Even Merge 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) pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=View PDF
viewPdf.header=View PDF viewPdf.header=View PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Su ventanilla única autohospedada para todas sus necesidades PDF
home.searchBar=Buscar características... home.searchBar=Buscar características...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=Ver PDF
home.viewPdf.desc=Ver, anotar, añadir texto o imágenes home.viewPdf.desc=Ver, anotar, añadir texto o imágenes
viewPdf.tags=ver,leer,anotar,texto,imagen viewPdf.tags=ver,leer,anotar,texto,imagen
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Quitar primera
pdfOrganiser.mode.8=Quitar última pdfOrganiser.mode.8=Quitar última
pdfOrganiser.mode.9=Quitar primera y última pdfOrganiser.mode.9=Quitar primera y última
pdfOrganiser.mode.10=Unir impar-par pdfOrganiser.mode.10=Unir impar-par
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(por ej., 1,3,2 o 4-8,2,10-12 o 2n-1) pdfOrganiser.placeholder=(por ej., 1,3,2 o 4-8,2,10-12 o 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=Ver PDF
viewPdf.header=Ver PDF viewPdf.header=Ver PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Zure leihatila bakarra autoostatatua zure PDF behar guztietarako
home.searchBar=Search for features... home.searchBar=Search for features...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=View PDF
home.viewPdf.desc=View, annotate, add text or images home.viewPdf.desc=View, annotate, add text or images
viewPdf.tags=view,read,annotate,text,image viewPdf.tags=view,read,annotate,text,image
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Remove First
pdfOrganiser.mode.8=Remove Last pdfOrganiser.mode.8=Remove Last
pdfOrganiser.mode.9=Remove First and Last pdfOrganiser.mode.9=Remove First and Last
pdfOrganiser.mode.10=Odd-Even Merge 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) pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=View PDF
viewPdf.header=View PDF viewPdf.header=View PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=مغازه‌ همه‌کاره میزبانی‌شده به صورت
home.searchBar=جستجو برای ویژگی‌ها... home.searchBar=جستجو برای ویژگی‌ها...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=مشاهده PDF
home.viewPdf.desc=مشاهده، حاشیه‌نویسی، افزودن متن یا تصاویر home.viewPdf.desc=مشاهده، حاشیه‌نویسی، افزودن متن یا تصاویر
viewPdf.tags=مشاهده،خواندن،حاشیه‌نویسی،متن،تصویر viewPdf.tags=مشاهده،خواندن،حاشیه‌نویسی،متن،تصویر
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=حذف اولین
pdfOrganiser.mode.8=حذف آخرین pdfOrganiser.mode.8=حذف آخرین
pdfOrganiser.mode.9=حذف اول و آخر pdfOrganiser.mode.9=حذف اول و آخر
pdfOrganiser.mode.10=ادغام فرد-زوج pdfOrganiser.mode.10=ادغام فرد-زوج
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(مثال: ۱,۳,۲ یا ۴-۸,۲,۱۰-۱۲ یا 2n-1) pdfOrganiser.placeholder=(مثال: ۱,۳,۲ یا ۴-۸,۲,۱۰-۱۲ یا 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=این ویژگی همچنین در <a href="{0}">صفحه ابزار چندگانه ما</a> موجود است. برای رابط کاربری صفحه به صفحه پیشرفته و ویژگی‌های اضافی بررسی کنید! multiTool-advert.message=این ویژگی همچنین در <a href="{0}">صفحه ابزار چندگانه ما</a> موجود است. برای رابط کاربری صفحه به صفحه پیشرفته و ویژگی‌های اضافی بررسی کنید!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=مشاهده PDF
viewPdf.header=مشاهده PDF viewPdf.header=مشاهده PDF
#pageRemover #pageRemover

View File

@@ -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.searchBar=Rechercher des fonctionnalités...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=Visionner le PDF
home.viewPdf.desc=Visionner, annoter, ajouter du texte ou des images. home.viewPdf.desc=Visionner, annoter, ajouter du texte ou des images.
viewPdf.tags=visualiser,lire,annoter,texte,image 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. home.showJS.desc=Recherche et affiche tout JavaScript injecté dans un PDF.
showJS.tags=JS showJS.tags=JS
home.autoRedact.title=Censure automatique home.autoRedact.title=Caviarder automatiquement
home.autoRedact.desc=Censurer automatiquement les informations sensibles d'un PDF. home.autoRedact.desc=Caviardez automatiquement les informations sensibles d'un PDF.
autoRedact.tags=caviarder,rédiger,censurer,redact,auto autoRedact.tags=caviarder,redact,auto
home.redact.title=Censure manuelle home.redact.title=Rédaction manuelle
home.redact.desc=Censurer un PDF en fonction de texte sélectionné, formes dessinées et/ou des pages sélectionnées. 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,caviarder,rédiger,censurer redact.tags=Redact,Hide,black out,black,marker,hidden,manual
home.tableExtraxt.title=PDF en CSV home.tableExtraxt.title=PDF en CSV
home.tableExtraxt.desc=Extrait les tableaux d'un PDF et les transforme en CSV. home.tableExtraxt.desc=Extrait les tableaux d'un PDF et les transforme en CSV.
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Supprimer le premier
pdfOrganiser.mode.8=Supprimer le dernier pdfOrganiser.mode.8=Supprimer le dernier
pdfOrganiser.mode.9=Supprimer le premier et le dernier pdfOrganiser.mode.9=Supprimer le premier et le dernier
pdfOrganiser.mode.10=Méger Impair-Pair 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) pdfOrganiser.placeholder=(par exemple 1,3,2 ou 4-8,2,10-12 ou 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=Fichier déchiffré avec succès.
multiTool-advert.message=Cette fonctionnalité est aussi disponible dans la <a href="{0}">page de l'outil multifonction</a>. Allez-y pour une interface page par page améliorée et des fonctionnalités additionnelles ! multiTool-advert.message=Cette fonctionnalité est aussi disponible dans la <a href="{0}">page de l'outil multifonction</a>. Allez-y pour une interface page par page améliorée et des fonctionnalités additionnelles !
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=Visualiser un PDF
viewPdf.header=Visualiser un PDF viewPdf.header=Visualiser un PDF
#pageRemover #pageRemover

View File

@@ -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.searchBar=Cuardaigh gnéithe...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=Féach PDF
home.viewPdf.desc=Féach ar, nótáil, cuir téacs nó íomhánna leis 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á viewPdf.tags=amharc, léamh, anótáil, téacs, íomhá
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Bain Ar dtús
pdfOrganiser.mode.8=Bain Last pdfOrganiser.mode.8=Bain Last
pdfOrganiser.mode.9=Bain An Chéad agus an Deireadh pdfOrganiser.mode.9=Bain An Chéad agus an Deireadh
pdfOrganiser.mode.10=Corr-Fiú Cumaisc 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) pdfOrganiser.placeholder=(m.sh. 1,3,2 nó 4-8,2,10-12 nó 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=D'éirigh le díchriptiú an chomhaid.
multiTool-advert.message=Tá an ghné seo ar fáil inár <a href="{0}">leathanach il-uirlisí</a> freisin. Seiceáil é le haghaidh Chomhéadain leathanach ar leathanach feabhsaithe agus gnéithe breise! multiTool-advert.message=Tá an ghné seo ar fáil inár <a href="{0}">leathanach il-uirlisí</a> freisin. Seiceáil é le haghaidh Chomhéadain leathanach ar leathanach feabhsaithe agus gnéithe breise!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=Féach PDF
viewPdf.header=Féach PDF viewPdf.header=Féach PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=आपकी सभी PDF आवश्यकताओं के ल
home.searchBar=सुविधाएं खोजें... home.searchBar=सुविधाएं खोजें...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=PDF देखें
home.viewPdf.desc=देखें, टिप्पणी करें, टेक्स्ट या छवियां जोड़ें home.viewPdf.desc=देखें, टिप्पणी करें, टेक्स्ट या छवियां जोड़ें
viewPdf.tags=देखें,पढ़ें,टिप्पणी,टेक्स्ट,छवि viewPdf.tags=देखें,पढ़ें,टिप्पणी,टेक्स्ट,छवि
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=प्रथम हटाएं
pdfOrganiser.mode.8=अंतिम हटाएं pdfOrganiser.mode.8=अंतिम हटाएं
pdfOrganiser.mode.9=प्रथम और अंतिम हटाएं pdfOrganiser.mode.9=प्रथम और अंतिम हटाएं
pdfOrganiser.mode.10=विषम-सम मर्ज pdfOrganiser.mode.10=विषम-सम मर्ज
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(जैसे 1,3,2 या 4-8,2,10-12 या 2n-1) pdfOrganiser.placeholder=(जैसे 1,3,2 या 4-8,2,10-12 या 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=फ़ाइल सफलतापूर्वक डिक्
multiTool-advert.message=यह सुविधा हमारे <a href="{0}">मल्टी-टूल पृष्ठ</a> में भी उपलब्ध है। बेहतर पृष्ठ-दर-पृष्ठ UI और अतिरिक्त सुविधाओं के लिए इसे देखें! multiTool-advert.message=यह सुविधा हमारे <a href="{0}">मल्टी-टूल पृष्ठ</a> में भी उपलब्ध है। बेहतर पृष्ठ-दर-पृष्ठ UI और अतिरिक्त सुविधाओं के लिए इसे देखें!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=PDF देखें
viewPdf.header=PDF देखें viewPdf.header=PDF देखें
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Sve na jednom mjestu za sve vaše PDF potrebe.
home.searchBar=Pretraži funkcije... home.searchBar=Pretraži funkcije...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=Pregledaj PDF
home.viewPdf.desc=Pregledaj, komentiraj, dodaj tekst ili slike home.viewPdf.desc=Pregledaj, komentiraj, dodaj tekst ili slike
viewPdf.tags=pregled,čitanje,komentiranje,tekst,slika viewPdf.tags=pregled,čitanje,komentiranje,tekst,slika
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Ukloni Prvu
pdfOrganiser.mode.8=Ukloni Zadnju pdfOrganiser.mode.8=Ukloni Zadnju
pdfOrganiser.mode.9=Ukloni Prvu i Zadnju pdfOrganiser.mode.9=Ukloni Prvu i Zadnju
pdfOrganiser.mode.10=Neparno-parna kombinacija 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) pdfOrganiser.placeholder=(npr. 1,3,2 ili 4-8,2,10-12 ili 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=Pogledaj
viewPdf.header=Pogledaj PDF viewPdf.header=Pogledaj PDF
#pageRemover #pageRemover

View File

@@ -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.searchBar=Funkciók keresése...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=PDF megtekintése
home.viewPdf.desc=Megtekintés, jegyzetelés, szöveg vagy képek hozzáadása 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 viewPdf.tags=megtekintés,olvasás,jegyzetelés,szöveg,kép
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Első oldal eltávolítása
pdfOrganiser.mode.8=Utolsó 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.9=Első és utolsó oldal eltávolítása
pdfOrganiser.mode.10=Páros-páratlan egyesítés 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) pdfOrganiser.placeholder=(pl. 1,3,2 vagy 4-8,2,10-12 vagy 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=A fájl visszafejtése sikeres.
multiTool-advert.message=Ez a funkció elérhető a <a href="{0}">többfunkciós eszköz oldalon</a> is. Nézze meg a fejlett oldalankénti felületet és további funkciókat! multiTool-advert.message=Ez a funkció elérhető a <a href="{0}">többfunkciós eszköz oldalon</a> is. Nézze meg a fejlett oldalankénti felületet és további funkciókat!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=PDF megtekintése
viewPdf.header=PDF megtekintése viewPdf.header=PDF megtekintése
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Semua kebutuhan PDF Anda, langsung dari komputer lokal Anda.
home.searchBar=Mencari fitur... home.searchBar=Mencari fitur...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=Lihat PDF
home.viewPdf.desc=Melihat, membuat anotasi, menambahkan teks atau gambar home.viewPdf.desc=Melihat, membuat anotasi, menambahkan teks atau gambar
viewPdf.tags=melihat,membaca,membuat anotasi,teks,gambar viewPdf.tags=melihat,membaca,membuat anotasi,teks,gambar
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Hapus Pertama
pdfOrganiser.mode.8=Hapus Terakhir pdfOrganiser.mode.8=Hapus Terakhir
pdfOrganiser.mode.9=Hapus Pertama dan Terakhir pdfOrganiser.mode.9=Hapus Pertama dan Terakhir
pdfOrganiser.mode.10=Penggabungan Genap-Ganjil 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) pdfOrganiser.placeholder=(misalnya 1,3,2 atau 4-8,2,10-12 atau 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=Lihat PDF
viewPdf.header=Lihat PDF viewPdf.header=Lihat PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=La tua pagina auto-gestita per modificare qualsiasi PDF.
home.searchBar=Cerca funzionalità... home.searchBar=Cerca funzionalità...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=Visualizza PDF
home.viewPdf.desc=Visualizza, annota, aggiungi testo o immagini home.viewPdf.desc=Visualizza, annota, aggiungi testo o immagini
viewPdf.tags=visualizzare,leggere,annotare,testo,immagine viewPdf.tags=visualizzare,leggere,annotare,testo,immagine
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Rimuovi prima
pdfOrganiser.mode.8=Rimuovi ultima pdfOrganiser.mode.8=Rimuovi ultima
pdfOrganiser.mode.9=Rimuovi la prima e l'ultima pdfOrganiser.mode.9=Rimuovi la prima e l'ultima
pdfOrganiser.mode.10=Unione pari-dispari 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) pdfOrganiser.placeholder=(ad es. 1,3,2 o 4-8,2,10-12 o 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=File decrittografato con successo.
multiTool-advert.message=Questa funzione è disponibile anche nella nostra <a href="{0}">pagina multi-strumento</a>. Scoprila per un'interfaccia utente pagina per pagina migliorata e funzionalità aggiuntive! multiTool-advert.message=Questa funzione è disponibile anche nella nostra <a href="{0}">pagina multi-strumento</a>. Scoprila per un'interfaccia utente pagina per pagina migliorata e funzionalità aggiuntive!
#view pdf #view pdf
viewPdf.title=Visualizza/Modifica PDF viewPdf.title=Visualizza PDF
viewPdf.header=Visualizza PDF viewPdf.header=Visualizza PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=PDFのあらゆるニーズに対応するローカルホスティン
home.searchBar=機能検索... home.searchBar=機能検索...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=PDFを表示
home.viewPdf.desc=表示、注釈、テキストや画像の追加 home.viewPdf.desc=表示、注釈、テキストや画像の追加
viewPdf.tags=view,read,annotate,text,image viewPdf.tags=view,read,annotate,text,image
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=最初に削除
pdfOrganiser.mode.8=最後を削除 pdfOrganiser.mode.8=最後を削除
pdfOrganiser.mode.9=最初と最後を削除 pdfOrganiser.mode.9=最初と最後を削除
pdfOrganiser.mode.10=奇数-偶数の結合 pdfOrganiser.mode.10=奇数-偶数の結合
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(例:1,3,2または4-8,2,10-12または2n-1) pdfOrganiser.placeholder=(例:1,3,2または4-8,2,10-12または2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=ファイルの暗号化が正常に完了しました。
multiTool-advert.message=この機能は、<a href="{0}">マルチツール</a>でもご利用いただけます。強化されたページごとのUIと追加機能についてはこちらをご覧ください。 multiTool-advert.message=この機能は、<a href="{0}">マルチツール</a>でもご利用いただけます。強化されたページごとのUIと追加機能についてはこちらをご覧ください。
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=PDFを表示
viewPdf.header=PDFを表示 viewPdf.header=PDFを表示
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=PDF 관련 모든 작업을 위한 로컬 호스팅 원스톱 솔루
home.searchBar=기능 검색... home.searchBar=기능 검색...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=PDF 보기
home.viewPdf.desc=보기, 주석 달기, 텍스트 또는 이미지 추가 home.viewPdf.desc=보기, 주석 달기, 텍스트 또는 이미지 추가
viewPdf.tags=보기,읽기,주석,텍스트,이미지 viewPdf.tags=보기,읽기,주석,텍스트,이미지
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=첫 페이지 제거
pdfOrganiser.mode.8=마지막 페이지 제거 pdfOrganiser.mode.8=마지막 페이지 제거
pdfOrganiser.mode.9=첫 페이지와 마지막 페이지 제거 pdfOrganiser.mode.9=첫 페이지와 마지막 페이지 제거
pdfOrganiser.mode.10=홀수-짝수 병합 pdfOrganiser.mode.10=홀수-짝수 병합
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(예: 1,3,2 또는 4-8,2,10-12 또는 2n-1) pdfOrganiser.placeholder=(예: 1,3,2 또는 4-8,2,10-12 또는 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=파일이 성공적으로 복호화되었습니다.
multiTool-advert.message=이 기능은 <a href="{0}">멀티 도구 페이지</a>에서도 사용할 수 있습니다. 향상된 페이지별 UI와 추가 기능을 확인해보세요! multiTool-advert.message=이 기능은 <a href="{0}">멀티 도구 페이지</a>에서도 사용할 수 있습니다. 향상된 페이지별 UI와 추가 기능을 확인해보세요!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=PDF 보기
viewPdf.header=PDF 보기 viewPdf.header=PDF 보기
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Jouw lokaal gehoste one-stop-shop voor al je PDF-behoeften.
home.searchBar=Zoek naar functies... home.searchBar=Zoek naar functies...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=PDF bekijken
home.viewPdf.desc=Bekijk, annoteer, voeg tekst of afbeeldingen toe home.viewPdf.desc=Bekijk, annoteer, voeg tekst of afbeeldingen toe
viewPdf.tags=bekijken,lezen,annoteren,tekst,afbeelding viewPdf.tags=bekijken,lezen,annoteren,tekst,afbeelding
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Eerste verwijderen
pdfOrganiser.mode.8=Laatste verwijderen pdfOrganiser.mode.8=Laatste verwijderen
pdfOrganiser.mode.9=Eerste en laaste verwijderen pdfOrganiser.mode.9=Eerste en laaste verwijderen
pdfOrganiser.mode.10=Oneven-even samenvoeken 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) pdfOrganiser.placeholder=(bijv. 1,3,2 of 4-8,2,10-12 of 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=PDF bekijken
viewPdf.header=PDF bekijken viewPdf.header=PDF bekijken
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Din lokale one-stop-shop for alle dine PDF-behov.
home.searchBar=Søk etter funksjoner... home.searchBar=Søk etter funksjoner...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=Vis PDF
home.viewPdf.desc=Vis, annoter, legg til tekst eller bilder home.viewPdf.desc=Vis, annoter, legg til tekst eller bilder
viewPdf.tags=vis,les,annoter,tekst,bilde viewPdf.tags=vis,les,annoter,tekst,bilde
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Fjern først
pdfOrganiser.mode.8=Fjern sist pdfOrganiser.mode.8=Fjern sist
pdfOrganiser.mode.9=Fjern først og sist pdfOrganiser.mode.9=Fjern først og sist
pdfOrganiser.mode.10=Partall-Oddetall Sammenslåing 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) pdfOrganiser.placeholder=(f.eks. 1,3,2 eller 4-8,2,10-12 eller 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=Vis PDF
viewPdf.header=Vis PDF viewPdf.header=Vis PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Twoja lokalna aplikacja do kompleksowej obsługi Twoich potrzeb związ
home.searchBar=Szukaj opcji ... home.searchBar=Szukaj opcji ...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=Podejrzyj PDF
home.viewPdf.desc=Wyświetl, adnotuj, dodaj tekst lub obrazy home.viewPdf.desc=Wyświetl, adnotuj, dodaj tekst lub obrazy
viewPdf.tags=wyświetl,czytaj,adnotuj,tekst,obraz viewPdf.tags=wyświetl,czytaj,adnotuj,tekst,obraz
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Usuń pierwszą
pdfOrganiser.mode.8=Usuń ostatnią pdfOrganiser.mode.8=Usuń ostatnią
pdfOrganiser.mode.9=Usuń pierwszą i ostatnią pdfOrganiser.mode.9=Usuń pierwszą i ostatnią
pdfOrganiser.mode.10=Połącz parzyste i nieparzyste 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) pdfOrganiser.placeholder=(przykład 1,3,2 lub 4-8,2,10-12 lub 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=Podejrzyj PDF
viewPdf.header=Podejrzyj PDF viewPdf.header=Podejrzyj PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Seu tudo-em-um hospedado localmente para tudo relacionado a PDFs
home.searchBar=Pesquisar funcionalidades... home.searchBar=Pesquisar funcionalidades...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=Visualizar PDF
home.viewPdf.desc=Visualizar, anotar, adicionar texto ou imagens ao PDF. home.viewPdf.desc=Visualizar, anotar, adicionar texto ou imagens ao PDF.
viewPdf.tags=visualizar,ler,anotar,texto,imagem viewPdf.tags=visualizar,ler,anotar,texto,imagem
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Remover primeiro
pdfOrganiser.mode.8=Remover último pdfOrganiser.mode.8=Remover último
pdfOrganiser.mode.9=Remover o primeiro e o último pdfOrganiser.mode.9=Remover o primeiro e o último
pdfOrganiser.mode.10=Mesclagem ímpar-par 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) pdfOrganiser.placeholder=(por exemplo 1,3,2 ou 4-8,2,10-12 ou 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=Esta função também está disponível em <a href="{0}">Multiferramentas de PDF</a>. Com uma interface mais completa e funções adicionais. multiTool-advert.message=Esta função também está disponível em <a href="{0}">Multiferramentas de PDF</a>. Com uma interface mais completa e funções adicionais.
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=Visualizar PDF
viewPdf.header=Visualizar PDF viewPdf.header=Visualizar PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=O seu centro local para todas as suas necessidades de PDF.
home.searchBar=Pesquisar funcionalidades... home.searchBar=Pesquisar funcionalidades...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=Ver PDF
home.viewPdf.desc=Ver, anotar, adicionar texto ou imagens home.viewPdf.desc=Ver, anotar, adicionar texto ou imagens
viewPdf.tags=ver,ler,anotar,texto,imagem viewPdf.tags=ver,ler,anotar,texto,imagem
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Remover Primeira
pdfOrganiser.mode.8=Remover Última pdfOrganiser.mode.8=Remover Última
pdfOrganiser.mode.9=Remover Primeira e Última pdfOrganiser.mode.9=Remover Primeira e Última
pdfOrganiser.mode.10=Junção Par-Ímpar 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) pdfOrganiser.placeholder=(ex. 1,3,2 ou 4-8,2,10-12 ou 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=Ficheiro desencriptado com sucesso.
multiTool-advert.message=Esta funcionalidade também está disponível na nossa <a href="{0}">página multi-ferramenta</a>. Experimente para uma interface melhorada página a página e funcionalidades adicionais! multiTool-advert.message=Esta funcionalidade também está disponível na nossa <a href="{0}">página multi-ferramenta</a>. Experimente para uma interface melhorada página a página e funcionalidades adicionais!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=Ver PDF
viewPdf.header=Ver PDF viewPdf.header=Ver PDF
#pageRemover #pageRemover

View File

@@ -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.searchBar=Caută funcționalități...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=Vizualizează PDF
home.viewPdf.desc=Vizualizează, adnotează, adaugă text sau imagini home.viewPdf.desc=Vizualizează, adnotează, adaugă text sau imagini
viewPdf.tags=vizualizare,citește,adnotează,text,imagine viewPdf.tags=vizualizare,citește,adnotează,text,imagine
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Elimină Prima
pdfOrganiser.mode.8=Elimină Ultima pdfOrganiser.mode.8=Elimină Ultima
pdfOrganiser.mode.9=Elimină Prima și Ultima pdfOrganiser.mode.9=Elimină Prima și Ultima
pdfOrganiser.mode.10=Îmbinare Impar-Par 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) pdfOrganiser.placeholder=(ex. 1,3,2 sau 4-8,2,10-12 sau 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=Vizualizează PDF
viewPdf.header=Vizualizează PDF viewPdf.header=Vizualizează PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Ваше локальное решение для всех потре
home.searchBar=Поиск функций... home.searchBar=Поиск функций...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=Просмотр PDF
home.viewPdf.desc=Просмотр, аннотирование, добавление текста или изображений home.viewPdf.desc=Просмотр, аннотирование, добавление текста или изображений
viewPdf.tags=просмотр,чтение,аннотации,текст,изображение viewPdf.tags=просмотр,чтение,аннотации,текст,изображение
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Удалить первую
pdfOrganiser.mode.8=Удалить последнюю pdfOrganiser.mode.8=Удалить последнюю
pdfOrganiser.mode.9=Удалить первую и последнюю pdfOrganiser.mode.9=Удалить первую и последнюю
pdfOrganiser.mode.10=Объединение четных-нечетных pdfOrganiser.mode.10=Объединение четных-нечетных
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(например, 1,3,2 или 4-8,2,10-12 или 2n-1) pdfOrganiser.placeholder=(например, 1,3,2 или 4-8,2,10-12 или 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=Файл успешно расшифрован.
multiTool-advert.message=Эта функция также доступна на нашей <a href="{0}">странице мультиинструмента</a>. Попробуйте её для улучшенного постраничного интерфейса и дополнительных возможностей! multiTool-advert.message=Эта функция также доступна на нашей <a href="{0}">странице мультиинструмента</a>. Попробуйте её для улучшенного постраничного интерфейса и дополнительных возможностей!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=Просмотр PDF
viewPdf.header=Просмотр PDF viewPdf.header=Просмотр PDF
#pageRemover #pageRemover

View File

@@ -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.searchBar=Vyhľadať funkcie...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=Zobraziť PDF
home.viewPdf.desc=Zobraziť, anotovať, pridať text alebo obrázky home.viewPdf.desc=Zobraziť, anotovať, pridať text alebo obrázky
viewPdf.tags=zobraziť,čítať,anotovať,text,obrázok viewPdf.tags=zobraziť,čítať,anotovať,text,obrázok
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Odstrániť prvú
pdfOrganiser.mode.8=Odstrániť poslednú pdfOrganiser.mode.8=Odstrániť poslednú
pdfOrganiser.mode.9=Odstrániť prvú aj poslednú pdfOrganiser.mode.9=Odstrániť prvú aj poslednú
pdfOrganiser.mode.10=Odd-Even Merge 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) pdfOrganiser.placeholder=(napr. 1,3,2 alebo 4-8,2,10-12 alebo 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=Zobraziť PDF
viewPdf.header=Zobraziť PDF viewPdf.header=Zobraziť PDF
#pageRemover #pageRemover

View File

@@ -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.searchBar=Išči funkcije...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=Ogled PDF-ja
home.viewPdf.desc=Oglejte si, komentirajte, dodajte besedilo ali slike home.viewPdf.desc=Oglejte si, komentirajte, dodajte besedilo ali slike
viewPdf.tags=ogled, branje, opomba, besedilo, slika viewPdf.tags=ogled, branje, opomba, besedilo, slika
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Najprej odstrani
pdfOrganiser.mode.8=Odstrani zadnjega pdfOrganiser.mode.8=Odstrani zadnjega
pdfOrganiser.mode.9=Odstrani prvega in zadnjega pdfOrganiser.mode.9=Odstrani prvega in zadnjega
pdfOrganiser.mode.10=Sodo-liho spajanje 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) pdfOrganiser.placeholder=(npr. 1,3,2 ali 4-8,2,10-12 ali 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=Datoteka uspešno dešifrirana.
multiTool-advert.message=Ta funkcija je na voljo tudi na naši <a href="{0}">strani z več orodji</a>. Oglejte si izboljšan uporabniški vmesnik od strani do strani in dodatne funkcije! multiTool-advert.message=Ta funkcija je na voljo tudi na naši <a href="{0}">strani z več orodji</a>. Oglejte si izboljšan uporabniški vmesnik od strani do strani in dodatne funkcije!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=Oglejte si PDF
viewPdf.header=Ogled PDF-ja viewPdf.header=Ogled PDF-ja
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Vaš lokalno hostovan jedinstveni alat za sve vaše potrebe vezane za
home.searchBar=Pretraži funkcije... home.searchBar=Pretraži funkcije...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=Pregledaj PDF
home.viewPdf.desc=Pregledaj, anotiraj, dodaj tekst ili slike home.viewPdf.desc=Pregledaj, anotiraj, dodaj tekst ili slike
viewPdf.tags=pregled,čitanje,anotiranje,tekst,slika viewPdf.tags=pregled,čitanje,anotiranje,tekst,slika
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Remove First
pdfOrganiser.mode.8=Remove Last pdfOrganiser.mode.8=Remove Last
pdfOrganiser.mode.9=Remove First and Last pdfOrganiser.mode.9=Remove First and Last
pdfOrganiser.mode.10=Odd-Even Merge 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) pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=Prikaz
viewPdf.header=Prikaz PDF-a viewPdf.header=Prikaz PDF-a
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Din lokala one-stop-shop för alla dina PDF-behov.
home.searchBar=Sök efter funktioner... home.searchBar=Sök efter funktioner...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=Visa PDF
home.viewPdf.desc=Visa, kommentera, lägg till text eller bilder home.viewPdf.desc=Visa, kommentera, lägg till text eller bilder
viewPdf.tags=visa,läs,kommentera,text,bild viewPdf.tags=visa,läs,kommentera,text,bild
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Ta bort första
pdfOrganiser.mode.8=Ta bort sista pdfOrganiser.mode.8=Ta bort sista
pdfOrganiser.mode.9=Ta bort första och sista pdfOrganiser.mode.9=Ta bort första och sista
pdfOrganiser.mode.10=Udda-jämn sammanslagning 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) pdfOrganiser.placeholder=(t.ex. 1,3,2 eller 4-8,2,10-12 eller 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=Fil avkrypterad.
multiTool-advert.message=Denna funktion finns också tillgänglig i vår <a href="{0}">multi-tool page</a>. Spana in den för bättre sida-för-sida anpassning och ytterligare funktioner! multiTool-advert.message=Denna funktion finns också tillgänglig i vår <a href="{0}">multi-tool page</a>. Spana in den för bättre sida-för-sida anpassning och ytterligare funktioner!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=Visa PDF
viewPdf.header=Visa PDF viewPdf.header=Visa PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=ศูนย์รวมทุกความต้องการข
home.searchBar=ค้นหาคุณสมบัติ... home.searchBar=ค้นหาคุณสมบัติ...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=ดู PDF
home.viewPdf.desc=ดู เพิ่มคำอธิบาย เพิ่มข้อความหรือรูปภาพ home.viewPdf.desc=ดู เพิ่มคำอธิบาย เพิ่มข้อความหรือรูปภาพ
viewPdf.tags=ดู, อ่าน, เพิ่มคำอธิบาย, ข้อความ, รูปภาพ viewPdf.tags=ดู, อ่าน, เพิ่มคำอธิบาย, ข้อความ, รูปภาพ
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=ลบหน้าหมายเลขแรก
pdfOrganiser.mode.8=ลบหน้าหมายเลขสุดท้าย pdfOrganiser.mode.8=ลบหน้าหมายเลขสุดท้าย
pdfOrganiser.mode.9=ลบหน้าหมายเลขแรกและสุดท้าย pdfOrganiser.mode.9=ลบหน้าหมายเลขแรกและสุดท้าย
pdfOrganiser.mode.10=รวมหน้าแบบคี่-คู่ pdfOrganiser.mode.10=รวมหน้าแบบคี่-คู่
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(เช่น 1,3,2 หรือ 4-8,2,10-12 หรือ 2n-1) pdfOrganiser.placeholder=(เช่น 1,3,2 หรือ 4-8,2,10-12 หรือ 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=ดู PDF
viewPdf.header=ดู PDF viewPdf.header=ดู PDF
#pageRemover #pageRemover

View File

@@ -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.searchBar=Özellikleri arayın...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=PDF Görüntüle
home.viewPdf.desc=Görüntüleyin, açıklama ekleyin, metin veya resim ekleyin 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ü viewPdf.tags=görüntüle,oku,açıklama ekle,metin,görüntü
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=İlk Önce Kaldır
pdfOrganiser.mode.8=Sonuncuyu Kaldır pdfOrganiser.mode.8=Sonuncuyu Kaldır
pdfOrganiser.mode.9=İlk ve Sonu Kaldır pdfOrganiser.mode.9=İlk ve Sonu Kaldır
pdfOrganiser.mode.10=Tek-Çift Birleştirme 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) pdfOrganiser.placeholder=(örn. 1,3,2 veya 4-8,2,10-12 veya 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=PDF Görüntüle
viewPdf.header=PDF Görüntüle viewPdf.header=PDF Görüntüle
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=Ваш локальний універсальний магазин д
home.searchBar=Пошук функцій... home.searchBar=Пошук функцій...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=Перегляд PDF
home.viewPdf.desc=Перегляд, анотація, додавання тексту або зображень home.viewPdf.desc=Перегляд, анотація, додавання тексту або зображень
viewPdf.tags=view,read,annotate,text,image viewPdf.tags=view,read,annotate,text,image
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Видалити першу
pdfOrganiser.mode.8=Видалити останню pdfOrganiser.mode.8=Видалити останню
pdfOrganiser.mode.9=Видалити першу та останню pdfOrganiser.mode.9=Видалити першу та останню
pdfOrganiser.mode.10=Odd-Even Merge pdfOrganiser.mode.10=Odd-Even Merge
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(наприклад, 1,3,2 або 4-8,2,10-12 або 2n-1) pdfOrganiser.placeholder=(наприклад, 1,3,2 або 4-8,2,10-12 або 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=Переглянути PDF
viewPdf.header=Переглянути PDF viewPdf.header=Переглянути PDF
#pageRemover #pageRemover

View File

@@ -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.searchBar=Tìm kiếm tính năng...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=Xem PDF
home.viewPdf.desc=Xem, chú thích, thêm văn bản hoặc hình ảnh 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 viewPdf.tags=xem,đọc,chú thích,văn bản,hình ảnh
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Xóa trang đầu
pdfOrganiser.mode.8=Xóa trang cuối pdfOrganiser.mode.8=Xóa trang cuối
pdfOrganiser.mode.9=Xóa trang đầu và cuối pdfOrganiser.mode.9=Xóa trang đầu và cuối
pdfOrganiser.mode.10=Trộn lẻ-chẵn 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) pdfOrganiser.placeholder=(ví dụ: 1,3,2 hoặc 4-8,2,10-12 hoặc 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=File decrypted successfully.
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=Xem PDF
viewPdf.header=Xem PDF viewPdf.header=Xem PDF
#pageRemover #pageRemover

View File

@@ -262,7 +262,7 @@ home.desc=ཁྱེད་ཀྱི་ PDF དགོས་མཁོ་ཚང་
home.searchBar=ནུས་པ་འཚོལ་བཤེར། home.searchBar=ནུས་པ་འཚོལ་བཤེར།
home.viewPdf.title=View/Edit PDF home.viewPdf.title=PDF ལྟ་བ།
home.viewPdf.desc=ལྟ་བ། མཆན་འགྲེལ། ཡི་གེ་དང་པར་རིས་སྣོན་པ། home.viewPdf.desc=ལྟ་བ། མཆན་འགྲེལ། ཡི་གེ་དང་པར་རིས་སྣོན་པ།
viewPdf.tags=ལྟ་བ།,ཀློག་པ།,མཆན་འགྲེལ།,ཡི་གེ,པར་རིས། viewPdf.tags=ལྟ་བ།,ཀློག་པ།,མཆན་འགྲེལ།,ཡི་གེ,པར་རིས།
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=Remove First
pdfOrganiser.mode.8=Remove Last pdfOrganiser.mode.8=Remove Last
pdfOrganiser.mode.9=དང་པོ་དང་མཐའ་མ་སུབ་པ། pdfOrganiser.mode.9=དང་པོ་དང་མཐའ་མ་སུབ་པ།
pdfOrganiser.mode.10=ཡ་ཟུང་སྡེབ་སྦྱོར། pdfOrganiser.mode.10=ཡ་ཟུང་སྡེབ་སྦྱོར།
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(དཔེར་ན། 1,3,2 ཡང་ན་ 4-8,2,10-12 ཡང་ན་ 2n-1) pdfOrganiser.placeholder=(དཔེར་ན། 1,3,2 ཡང་ན་ 4-8,2,10-12 ཡང་ན་ 2n-1)
@@ -1035,7 +1034,7 @@ decrypt.success=ཡིག་ཆའི་གསང་སྡོམ་གྲོལ
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features! multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=PDF ལྟ་བ།
viewPdf.header=PDF ལྟ་བ། viewPdf.header=PDF ལྟ་བ།
#pageRemover #pageRemover

View File

@@ -76,11 +76,11 @@ donate=捐款
color=颜色 color=颜色
sponsor=赞助 sponsor=赞助
info=信息 info=信息
pro=专业版 pro=Pro
page=页面 page=Page
pages=页码 pages=Pages
loading=加载中... loading=加载中...
addToDoc=添加至文件 addToDoc=Add to Document
reset=重置 reset=重置
apply=应用 apply=应用
@@ -120,19 +120,19 @@ pipelineOptions.validateButton=验证
######################## ########################
enterpriseEdition.button=升级到 Pro 版本 enterpriseEdition.button=升级到 Pro 版本
enterpriseEdition.warning=此功能仅适用于 Pro 版本 enterpriseEdition.warning=此功能仅适用于 Pro 版本
enterpriseEdition.yamlAdvert=Stirling PDF Pro支持YAML配置文件和其他SSO功能。 enterpriseEdition.yamlAdvert=Stirling PDF Pro supports YAML configuration files and other SSO features.
enterpriseEdition.ssoAdvert=寻找更多的用户管理功能?查看Stirling PDF Pro enterpriseEdition.ssoAdvert=Looking for more user management features? Check out Stirling PDF Pro
################# #################
# Analytics # # Analytics #
################# #################
analytics.title=你想协助改善Stirling PDF analytics.title=Do you want make Stirling PDF better?
analytics.paragraph1=Stirling PDF有选择性分析功能,可以帮助我们改进产品。我们不跟踪任何个人信息或文件内容。 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=请考虑启用分析来帮助Stirling-PDF的发展并让我们更好地了解我们的用户。 analytics.paragraph2=Please consider enabling analytics to help Stirling-PDF grow and to allow us to understand our users better.
analytics.enable=启用分析功能 analytics.enable=Enable analytics
analytics.disable=禁用分析功能 analytics.disable=Disable analytics
analytics.settings=您可以在 config/settings.yml 文件中变更分析功能的设定 analytics.settings=You can change the settings for analytics in the config/settings.yml file
############# #############
# NAVBAR # # NAVBAR #
@@ -240,17 +240,17 @@ database.creationDate=创建时间
database.fileSize=文件大小 database.fileSize=文件大小
database.deleteBackupFile=删除备份文件 database.deleteBackupFile=删除备份文件
database.importBackupFile=导入备份文件 database.importBackupFile=导入备份文件
database.createBackupFile=创建备份文件 database.createBackupFile=Create Backup File
database.downloadBackupFile=下载备份文件 database.downloadBackupFile=下载备份文件
database.info_1=导入数据时,确保结构正确至关重要。如果您不确定自己在做什么,请寻求专业人士的建议和支持。结构错误会导致应用程序故障,甚至完全无法运行应用程序。 database.info_1=导入数据时,确保结构正确至关重要。如果您不确定自己在做什么,请寻求专业人士的建议和支持。结构错误会导致应用程序故障,甚至完全无法运行应用程序。
database.info_2=上传文件时,文件名并不重要。上传后,文件名将重命名为 backup_user_yyyyMMddHHmm.sql以确保命名规范的一致性。 database.info_2=上传文件时,文件名并不重要。上传后,文件名将重命名为 backup_user_yyyyMMddHHmm.sql以确保命名规范的一致性。
database.submit=导入备份 database.submit=导入备份
database.importIntoDatabaseSuccessed=导入数据库成功 database.importIntoDatabaseSuccessed=导入数据库成功
database.backupCreated=数据库备份成功 database.backupCreated=Database backup successful
database.fileNotFound=未找到文件 database.fileNotFound=未找到文件
database.fileNullOrEmpty=文件不能为空 database.fileNullOrEmpty=文件不能为空
database.failedImportFile=导入文件失败 database.failedImportFile=导入文件失败
database.notSupported=此功能不适用于您的数据库连接。 database.notSupported=This function is not available for your database connection.
session.expired=您的会话已过期。请刷新页面并重试。 session.expired=您的会话已过期。请刷新页面并重试。
session.refreshPage=刷新页面 session.refreshPage=刷新页面
@@ -262,13 +262,13 @@ home.desc=本地部署的一站式服务,满足您的所有 PDF 需求。
home.searchBar=搜索您需要的功能... home.searchBar=搜索您需要的功能...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=浏览 PDF
home.viewPdf.desc=浏览、注释、添加文本或图像 home.viewPdf.desc=浏览、注释、添加文本或图像
viewPdf.tags=浏览、阅读、注释、文本、图像 viewPdf.tags=浏览、阅读、注释、文本、图像
home.setFavorites=编辑收藏夹 home.setFavorites=编辑收藏夹
home.hideFavorites=隐藏收藏夹 home.hideFavorites=Hide Favourites
home.showFavorites=显示收藏夹 home.showFavorites=Show Favourites
home.legacyHomepage=使用旧版主页 home.legacyHomepage=使用旧版主页
home.newHomePage=试用新版主页! home.newHomePage=试用新版主页!
home.alphabetical=按字母顺序 home.alphabetical=按字母顺序
@@ -462,9 +462,9 @@ home.MarkdownToPDF.title=Markdown 转 PDF
home.MarkdownToPDF.desc=将任何 Markdown 文件转换为 PDF home.MarkdownToPDF.desc=将任何 Markdown 文件转换为 PDF
MarkdownToPDF.tags=标记、网页内容、转换、转换 MarkdownToPDF.tags=标记、网页内容、转换、转换
home.PDFToMarkdown.title=PDF Markdown home.PDFToMarkdown.title=PDF to Markdown
home.PDFToMarkdown.desc=将任何pdf文件转换为Markdown文件 home.PDFToMarkdown.desc=Converts any PDF to Markdown
PDFToMarkdown.tags=标记,网页内容,转换,转档,md PDFToMarkdown.tags=markup,web-content,transformation,convert,md
home.getPdfInfo.title=获取 PDF 的所有信息 home.getPdfInfo.title=获取 PDF 的所有信息
home.getPdfInfo.desc=获取 PDF 的所有可能的信息 home.getPdfInfo.desc=获取 PDF 的所有可能的信息
@@ -489,9 +489,9 @@ home.autoRedact.title=自动删除
home.autoRedact.desc=根据输入文本自动删除覆盖PDF 中的文本 home.autoRedact.desc=根据输入文本自动删除覆盖PDF 中的文本
autoRedact.tags=脱敏、隐藏、涂黑、标记、不可见 autoRedact.tags=脱敏、隐藏、涂黑、标记、不可见
home.redact.title=手动修订 home.redact.title=Manual Redaction
home.redact.desc=根据选定的文本、绘制的形状和/或选定的页面编辑PDF home.redact.desc=Redacts a PDF based on selected text, drawn shapes and/or selected page(s)
redact.tags=涂改,隐藏,涂黑,黑色,标记,遮蔽,手动 redact.tags=Redact,Hide,black out,black,marker,hidden,manual
home.tableExtraxt.title=PDF 转 CSV home.tableExtraxt.title=PDF 转 CSV
home.tableExtraxt.desc=从 PDF 中提取表格并将其转换为 CSV home.tableExtraxt.desc=从 PDF 中提取表格并将其转换为 CSV
@@ -542,19 +542,19 @@ replace-color.title=替换-反转-颜色
replace-color.header=替换-反转 PDF 颜色 replace-color.header=替换-反转 PDF 颜色
home.replaceColorPdf.title=替换和反转颜色 home.replaceColorPdf.title=替换和反转颜色
home.replaceColorPdf.desc=替换 PDF 中文本和背景的颜色并将PDF全色反转以减小文件大小 home.replaceColorPdf.desc=替换 PDF 中文本和背景的颜色并将PDF全色反转以减小文件大小
replaceColorPdf.tags=更换颜色,页面操作,后端,服务器端 replaceColorPdf.tags=Replace Color,Page operations,Back end,server side
replace-color.selectText.1=替换或反转颜色选项 replace-color.selectText.1=替换或反转颜色选项
replace-color.selectText.2=默认(默认高对比度颜色) replace-color.selectText.2=Default(Default high contrast colors)
replace-color.selectText.3=定制(定制的颜色) replace-color.selectText.3=Custom(Customized colors)
replace-color.selectText.4=全反转(反转所有颜色) replace-color.selectText.4=Full-Invert(Invert all colors)
replace-color.selectText.5=高对比度颜色选项 replace-color.selectText.5=High contrast color options
replace-color.selectText.6=黑底白字 replace-color.selectText.6=white text on black background
replace-color.selectText.7=白底黑字 replace-color.selectText.7=Black text on white background
replace-color.selectText.8=黑底黄字 replace-color.selectText.8=Yellow text on black background
replace-color.selectText.9=黑底绿字 replace-color.selectText.9=Green text on black background
replace-color.selectText.10=选择文本颜色 replace-color.selectText.10=Choose text Color
replace-color.selectText.11=选择背景颜色 replace-color.selectText.11=Choose background Color
replace-color.submit=取代 replace-color.submit=Replace
@@ -599,31 +599,31 @@ autoRedact.convertPDFToImageLabel=将PDF转换为PDF-Image用于删除方框
autoRedact.submitButton=提交 autoRedact.submitButton=提交
#redact #redact
redact.title=手动纠正 redact.title=Manual Redaction
redact.header=手动纠正 redact.header=Manual Redaction
redact.submit=纠正 redact.submit=Redact
redact.textBasedRedaction=基于文本的纠正 redact.textBasedRedaction=Text based Redaction
redact.pageBasedRedaction=基于页面的纠正 redact.pageBasedRedaction=Page-based Redaction
redact.convertPDFToImageLabel=将PDF转换为PDF图像用于删除框后的文本 redact.convertPDFToImageLabel=Convert PDF to PDF-Image (Used to remove text behind the box)
redact.pageRedactionNumbers.title=页面 redact.pageRedactionNumbers.title=Pages
redact.pageRedactionNumbers.placeholder=(例如 1,2,8 4,7,12-16 2n-1) redact.pageRedactionNumbers.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1)
redact.redactionColor.title=编辑颜色 redact.redactionColor.title=Redaction Color
redact.export=导出 redact.export=Export
redact.upload=上传 redact.upload=Upload
redact.boxRedaction=框选区域涂黑 redact.boxRedaction=Box draw redaction
redact.zoom=缩放 redact.zoom=Zoom
redact.zoomIn=放大 redact.zoomIn=Zoom in
redact.zoomOut=缩小 redact.zoomOut=Zoom out
redact.nextPage=下一页 redact.nextPage=Next Page
redact.previousPage=上一页 redact.previousPage=Previous Page
redact.toggleSidebar=切换侧边栏 redact.toggleSidebar=Toggle Sidebar
redact.showThumbnails=显示缩略图 redact.showThumbnails=Show Thumbnails
redact.showDocumentOutline=显示文档大纲(双击展开/折叠所有项目) redact.showDocumentOutline=Show Document Outline (double-click to expand/collapse all items)
redact.showAttatchments=显示附件 redact.showAttatchments=Show Attachments
redact.showLayers=显示图层(双击将所有图层重置为默认状态) redact.showLayers=Show Layers (double-click to reset all layers to the default state)
redact.colourPicker=颜色选择器 redact.colourPicker=Colour Picker
redact.findCurrentOutlineItem=查找当前大纲项目 redact.findCurrentOutlineItem=Find current outline item
redact.applyChanges=应用 redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=显示 JavaScript showJS.title=显示 JavaScript
@@ -661,9 +661,9 @@ MarkdownToPDF.credit=此服务使用 WeasyPrint 进行文件转换。
#pdf-to-markdown #pdf-to-markdown
PDFToMarkdown.title=PDFMarkdown PDFToMarkdown.title=PDF To Markdown
PDFToMarkdown.header=PDFMarkdown PDFToMarkdown.header=PDF To Markdown
PDFToMarkdown.submit=转换 PDFToMarkdown.submit=Convert
#url-to-pdf #url-to-pdf
@@ -872,7 +872,7 @@ sign.add=添加
sign.saved=已保存签名 sign.saved=已保存签名
sign.save=保存签名 sign.save=保存签名
sign.personalSigs=个人签名 sign.personalSigs=个人签名
sign.sharedSigs=共享签名 sign.sharedSigs=Shared Signatures
sign.noSavedSigs=未找到已保存的签名 sign.noSavedSigs=未找到已保存的签名
sign.addToAll=添加到所有页面 sign.addToAll=添加到所有页面
sign.delete=删除 sign.delete=删除
@@ -880,7 +880,7 @@ sign.first=首页
sign.last=末页 sign.last=末页
sign.next=下一页 sign.next=下一页
sign.previous=上一页 sign.previous=上一页
sign.maintainRatio=切换保持长宽比 sign.maintainRatio=Toggle maintain aspect ratio
#repair #repair
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=删除第一页
pdfOrganiser.mode.8=删除最后一页 pdfOrganiser.mode.8=删除最后一页
pdfOrganiser.mode.9=删除第一页和最后一页 pdfOrganiser.mode.9=删除第一页和最后一页
pdfOrganiser.mode.10=奇偶合并 pdfOrganiser.mode.10=奇偶合并
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=例如1,3,2 或 4-8,2,10-12 或 2n-1 pdfOrganiser.placeholder=例如1,3,2 或 4-8,2,10-12 或 2n-1
@@ -1035,7 +1034,7 @@ decrypt.success=文件解密成功。
multiTool-advert.message=此功能也适用于我们的“<a href="{0}">多功能工具页面</a>”。查看它以获得增强的逐页 UI 以及其他功能! multiTool-advert.message=此功能也适用于我们的“<a href="{0}">多功能工具页面</a>”。查看它以获得增强的逐页 UI 以及其他功能!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=浏览 PDF
viewPdf.header=浏览 PDF viewPdf.header=浏览 PDF
#pageRemover #pageRemover
@@ -1329,18 +1328,18 @@ splitByChapters.header=按章节拆分 PDF
splitByChapters.bookmarkLevel=书签级别 splitByChapters.bookmarkLevel=书签级别
splitByChapters.includeMetadata=包含元数据 splitByChapters.includeMetadata=包含元数据
splitByChapters.allowDuplicates=允许重复 splitByChapters.allowDuplicates=允许重复
splitByChapters.desc.1=此工具根据章节结构将PDF文件拆分为多个PDF。 splitByChapters.desc.1=This tool splits a PDF file into multiple PDFs based on its chapter structure.
splitByChapters.desc.2=书签级别选择用于拆分的书签级别0表示顶级1表示二级等 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=包含元数据如果选中原始PDF的元数据将包含在每个拆分的PDF中。 splitByChapters.desc.3=Include Metadata: If checked, the original PDF's metadata will be included in each split PDF.
splitByChapters.desc.4=允许重复:如果选中,允许同一页面上的多个书签创建单独的PDF splitByChapters.desc.4=Allow Duplicates: If checked, allows multiple bookmarks on the same page to create separate PDFs.
splitByChapters.submit=拆分 PDF splitByChapters.submit=拆分 PDF
#File Chooser #File Chooser
fileChooser.click=单击 fileChooser.click=单击
fileChooser.or= fileChooser.or=
fileChooser.dragAndDrop=拖放文件 fileChooser.dragAndDrop=拖放文件
fileChooser.dragAndDropPDF=拖放PDF文件 fileChooser.dragAndDropPDF=Drag & Drop PDF file
fileChooser.dragAndDropImage=拖放图片文件 fileChooser.dragAndDropImage=Drag & Drop Image file
fileChooser.hoveredDragAndDrop=拖放文件到此处 fileChooser.hoveredDragAndDrop=拖放文件到此处
#release notes #release notes
@@ -1351,36 +1350,36 @@ releases.current.version=当前版本
releases.note=版本说明仅提供英文版本 releases.note=版本说明仅提供英文版本
#Validate Signature #Validate Signature
validateSignature.title=验证pdf签名 validateSignature.title=Validate PDF Signatures
validateSignature.header=验证数字签名 validateSignature.header=Validate Digital Signatures
validateSignature.selectPDF=选择已签名的pdf文件 validateSignature.selectPDF=Select signed PDF file
validateSignature.submit=验证签名 validateSignature.submit=Validate Signatures
validateSignature.results=验证结果 validateSignature.results=Validation Results
validateSignature.status=状态 validateSignature.status=Status
validateSignature.signer=签署者 validateSignature.signer=Signer
validateSignature.date=日期 validateSignature.date=Date
validateSignature.reason=原因 validateSignature.reason=Reason
validateSignature.location=位置 validateSignature.location=Location
validateSignature.noSignatures=此文件中未找到电子签名 validateSignature.noSignatures=No digital signatures found in this document
validateSignature.status.valid=有效 validateSignature.status.valid=Valid
validateSignature.status.invalid=无效 validateSignature.status.invalid=Invalid
validateSignature.chain.invalid=证书链验证失败 - 无法验证签名者的身份 validateSignature.chain.invalid=Certificate chain validation failed - cannot verify signer's identity
validateSignature.trust.invalid=证书不在信任存储区中 - 无法验证来源 validateSignature.trust.invalid=Certificate not in trust store - source cannot be verified
validateSignature.cert.expired=凭证已过期 validateSignature.cert.expired=Certificate has expired
validateSignature.cert.revoked=凭证已被撤销 validateSignature.cert.revoked=Certificate has been revoked
validateSignature.signature.info=签名信息 validateSignature.signature.info=Signature Information
validateSignature.signature=签名 validateSignature.signature=Signature
validateSignature.signature.mathValid=签名在数学上有效,但: validateSignature.signature.mathValid=Signature is mathematically valid BUT:
validateSignature.selectCustomCert=X.509 自签名证书(可选) validateSignature.selectCustomCert=Custom Certificate File X.509 (Optional)
validateSignature.cert.info=凭证信息 validateSignature.cert.info=Certificate Details
validateSignature.cert.issuer=发行者 validateSignature.cert.issuer=Issuer
validateSignature.cert.subject=主题 validateSignature.cert.subject=Subject
validateSignature.cert.serialNumber=序列号 validateSignature.cert.serialNumber=Serial Number
validateSignature.cert.validFrom=有效期自 validateSignature.cert.validFrom=Valid From
validateSignature.cert.validUntil=有效期至 validateSignature.cert.validUntil=Valid Until
validateSignature.cert.algorithm=算法 validateSignature.cert.algorithm=Algorithm
validateSignature.cert.keySize=密钥长度 validateSignature.cert.keySize=Key Size
validateSignature.cert.version=版本 validateSignature.cert.version=Version
validateSignature.cert.keyUsage=密钥用途 validateSignature.cert.keyUsage=Key Usage
validateSignature.cert.selfSigned=自签名 validateSignature.cert.selfSigned=Self-Signed
validateSignature.cert.bits=比特 validateSignature.cert.bits=bits

View File

@@ -262,7 +262,7 @@ home.desc=您的本機一站式 PDF 解決方案。
home.searchBar=搜尋功能... home.searchBar=搜尋功能...
home.viewPdf.title=View/Edit PDF home.viewPdf.title=檢視 PDF
home.viewPdf.desc=檢視、註釋、新增文字或圖片 home.viewPdf.desc=檢視、註釋、新增文字或圖片
viewPdf.tags=檢視,閱讀,註釋,文字,圖片 viewPdf.tags=檢視,閱讀,註釋,文字,圖片
@@ -992,7 +992,6 @@ pdfOrganiser.mode.7=刪除第一頁
pdfOrganiser.mode.8=刪除最後一頁 pdfOrganiser.mode.8=刪除最後一頁
pdfOrganiser.mode.9=刪除第一頁和最後一頁 pdfOrganiser.mode.9=刪除第一頁和最後一頁
pdfOrganiser.mode.10=奇偶合併 pdfOrganiser.mode.10=奇偶合併
pdfOrganiser.mode.11=Duplicate all pages
pdfOrganiser.placeholder=(例如 1,3,2 或 4-8,2,10-12 或 2n-1 pdfOrganiser.placeholder=(例如 1,3,2 或 4-8,2,10-12 或 2n-1
@@ -1035,7 +1034,7 @@ decrypt.success=檔案已成功解密。
multiTool-advert.message=此功能也可以在我們的<a href="{0}">複合工具頁面</a>中使用。前往查看並體驗更強大的逐頁操作介面及其他進階功能! multiTool-advert.message=此功能也可以在我們的<a href="{0}">複合工具頁面</a>中使用。前往查看並體驗更強大的逐頁操作介面及其他進階功能!
#view pdf #view pdf
viewPdf.title=View/Edit PDF viewPdf.title=檢視 PDF
viewPdf.header=檢視 PDF viewPdf.header=檢視 PDF
#pageRemover #pageRemover

View File

@@ -3,14 +3,14 @@
{ {
"moduleName": "ch.qos.logback:logback-classic", "moduleName": "ch.qos.logback:logback-classic",
"moduleUrl": "http://www.qos.ch", "moduleUrl": "http://www.qos.ch",
"moduleVersion": "1.5.15", "moduleVersion": "1.5.12",
"moduleLicense": "GNU Lesser General Public License", "moduleLicense": "GNU Lesser General Public License",
"moduleLicenseUrl": "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html" "moduleLicenseUrl": "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html"
}, },
{ {
"moduleName": "ch.qos.logback:logback-core", "moduleName": "ch.qos.logback:logback-core",
"moduleUrl": "http://www.qos.ch", "moduleUrl": "http://www.qos.ch",
"moduleVersion": "1.5.15", "moduleVersion": "1.5.12",
"moduleLicense": "GNU Lesser General Public License", "moduleLicense": "GNU Lesser General Public License",
"moduleLicenseUrl": "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html" "moduleLicenseUrl": "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html"
}, },
@@ -560,7 +560,7 @@
{ {
"moduleName": "io.micrometer:micrometer-core", "moduleName": "io.micrometer:micrometer-core",
"moduleUrl": "https://github.com/micrometer-metrics/micrometer", "moduleUrl": "https://github.com/micrometer-metrics/micrometer",
"moduleVersion": "1.14.4", "moduleVersion": "1.14.3",
"moduleLicense": "The Apache Software License, Version 2.0", "moduleLicense": "The Apache Software License, Version 2.0",
"moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt"
}, },
@@ -781,8 +781,8 @@
{ {
"moduleName": "org.apache.commons:commons-compress", "moduleName": "org.apache.commons:commons-compress",
"moduleUrl": "https://commons.apache.org/proper/commons-compress/", "moduleUrl": "https://commons.apache.org/proper/commons-compress/",
"moduleVersion": "1.26.0", "moduleVersion": "1.21",
"moduleLicense": "Apache-2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt"
}, },
{ {
@@ -921,6 +921,20 @@
"moduleLicense": "The Apache Software License, Version 2.0", "moduleLicense": "The Apache Software License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" "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", "moduleName": "org.bouncycastle:bcpkix-jdk18on",
"moduleUrl": "https://www.bouncycastle.org/download/bouncy-castle-java/", "moduleUrl": "https://www.bouncycastle.org/download/bouncy-castle-java/",
@@ -935,6 +949,13 @@
"moduleLicense": "Bouncy Castle Licence", "moduleLicense": "Bouncy Castle Licence",
"moduleLicenseUrl": "https://www.bouncycastle.org/licence.html" "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", "moduleName": "org.bouncycastle:bcutil-jdk18on",
"moduleUrl": "https://www.bouncycastle.org/download/bouncy-castle-java/", "moduleUrl": "https://www.bouncycastle.org/download/bouncy-castle-java/",
@@ -1420,7 +1441,7 @@
{ {
"moduleName": "org.springframework.boot:spring-boot-devtools", "moduleName": "org.springframework.boot:spring-boot-devtools",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.2", "moduleVersion": "3.4.1",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
@@ -1434,14 +1455,14 @@
{ {
"moduleName": "org.springframework.boot:spring-boot-starter-actuator", "moduleName": "org.springframework.boot:spring-boot-starter-actuator",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.2", "moduleVersion": "3.4.1",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.boot:spring-boot-starter-data-jpa", "moduleName": "org.springframework.boot:spring-boot-starter-data-jpa",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.2", "moduleVersion": "3.4.1",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
@@ -1455,7 +1476,7 @@
{ {
"moduleName": "org.springframework.boot:spring-boot-starter-jetty", "moduleName": "org.springframework.boot:spring-boot-starter-jetty",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.2", "moduleVersion": "3.4.1",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
@@ -1476,28 +1497,28 @@
{ {
"moduleName": "org.springframework.boot:spring-boot-starter-oauth2-client", "moduleName": "org.springframework.boot:spring-boot-starter-oauth2-client",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.2", "moduleVersion": "3.4.1",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.boot:spring-boot-starter-security", "moduleName": "org.springframework.boot:spring-boot-starter-security",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.2", "moduleVersion": "3.4.1",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.boot:spring-boot-starter-thymeleaf", "moduleName": "org.springframework.boot:spring-boot-starter-thymeleaf",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.2", "moduleVersion": "3.4.1",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
{ {
"moduleName": "org.springframework.boot:spring-boot-starter-web", "moduleName": "org.springframework.boot:spring-boot-starter-web",
"moduleUrl": "https://spring.io/projects/spring-boot", "moduleUrl": "https://spring.io/projects/spring-boot",
"moduleVersion": "3.4.2", "moduleVersion": "3.4.1",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
@@ -1630,7 +1651,7 @@
{ {
"moduleName": "org.springframework:spring-jdbc", "moduleName": "org.springframework:spring-jdbc",
"moduleUrl": "https://github.com/spring-projects/spring-framework", "moduleUrl": "https://github.com/spring-projects/spring-framework",
"moduleVersion": "6.2.3", "moduleVersion": "6.2.2",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },
@@ -1658,7 +1679,7 @@
{ {
"moduleName": "org.springframework:spring-webmvc", "moduleName": "org.springframework:spring-webmvc",
"moduleUrl": "https://github.com/spring-projects/spring-framework", "moduleUrl": "https://github.com/spring-projects/spring-framework",
"moduleVersion": "6.2.3", "moduleVersion": "6.2.2",
"moduleLicense": "Apache License, Version 2.0", "moduleLicense": "Apache License, Version 2.0",
"moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0"
}, },

View File

@@ -17,7 +17,7 @@ let fileInput = document.getElementById('fileInput-input');
let file; let file;
let pdfDoc = null; let pdfDoc = null;
let pageNumbers = document.getElementById('pageNumbers'); let pageId = document.getElementById('pageId');
let currentPage = 1; let currentPage = 1;
let totalPages = 0; let totalPages = 0;
@@ -31,7 +31,7 @@ let timeId = null; // timeout id for resizing canvases event
btn1Object.addEventListener('click', function (e) { btn1Object.addEventListener('click', function (e) {
if (currentPage !== 1) { if (currentPage !== 1) {
currentPage = currentPage - 1; currentPage = currentPage - 1;
pageNumbers.value = currentPage; pageId.value = currentPage;
if (file.type === 'application/pdf') { if (file.type === 'application/pdf') {
let reader = new FileReader(); let reader = new FileReader();
@@ -52,7 +52,7 @@ btn1Object.addEventListener('click', function (e) {
btn2Object.addEventListener('click', function (e) { btn2Object.addEventListener('click', function (e) {
if (currentPage !== totalPages) { if (currentPage !== totalPages) {
currentPage = currentPage + 1; currentPage = currentPage + 1;
pageNumbers.value = currentPage; pageId.value = currentPage;
if (file.type === 'application/pdf') { if (file.type === 'application/pdf') {
let reader = new FileReader(); let reader = new FileReader();
@@ -81,7 +81,7 @@ function renderPageFromFile(file) {
totalPages = pdf.numPages; totalPages = pdf.numPages;
renderPage(currentPage); renderPage(currentPage);
}); });
pageNumbers.value = currentPage; pageId.value = currentPage;
}; };
reader.readAsArrayBuffer(file); reader.readAsArrayBuffer(file);
document.getElementById('pagination-button-container').style.display = 'flex'; document.getElementById('pagination-button-container').style.display = 'flex';

View File

@@ -17,7 +17,7 @@
<span class="tool-header-text" th:text="#{PDFToCSV.header}"></span> <span class="tool-header-text" th:text="#{PDFToCSV.header}"></span>
</div> </div>
<form id="PDFToCSVForm" th:action="@{'/api/v1/convert/pdf/csv'}" method="post" enctype="multipart/form-data"> <form id="PDFToCSVForm" th:action="@{'/api/v1/convert/pdf/csv'}" method="post" enctype="multipart/form-data">
<input id="pageNumbers" type="hidden" name="pageNumbers"> <input id="pageId" type="hidden" name="pageId">
<div th:replace="~{fragments/common :: fileSelector(name='fileInput', multipleInputsForSingleRequest=false, accept='application/pdf')}"></div> <div th:replace="~{fragments/common :: fileSelector(name='fileInput', multipleInputsForSingleRequest=false, accept='application/pdf')}"></div>
<button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{PDFToCSV.submit}"></button> <button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{PDFToCSV.submit}"></button>
</form> </form>

View File

@@ -36,7 +36,6 @@
</option> </option>
<option value="ODD_EVEN_SPLIT" th:text="#{pdfOrganiser.mode.6}">Odd-Even Split</option> <option value="ODD_EVEN_SPLIT" th:text="#{pdfOrganiser.mode.6}">Odd-Even Split</option>
<option value="ODD_EVEN_MERGE" th:text="#{pdfOrganiser.mode.10}">Odd-Even Merge</option> <option value="ODD_EVEN_MERGE" th:text="#{pdfOrganiser.mode.10}">Odd-Even Merge</option>
<option value="DUPLICATE" th:text="#{pdfOrganiser.mode.11}">Duplicate all pages</option>
<option value="REMOVE_FIRST" th:text="#{pdfOrganiser.mode.7}">Remove First</option> <option value="REMOVE_FIRST" th:text="#{pdfOrganiser.mode.7}">Remove First</option>
<option value="REMOVE_LAST" th:text="#{pdfOrganiser.mode.8}">Remove Last</option> <option value="REMOVE_LAST" th:text="#{pdfOrganiser.mode.8}">Remove Last</option>
<option value="REMOVE_FIRST_AND_LAST" th:text="#{pdfOrganiser.mode.9}">Remove First and Last</option> <option value="REMOVE_FIRST_AND_LAST" th:text="#{pdfOrganiser.mode.9}">Remove First and Last</option>
@@ -52,7 +51,7 @@
<script> <script>
document.getElementById('customMode').addEventListener('change', function () { document.getElementById('customMode').addEventListener('change', function () {
var pageOrderInput = document.getElementById('pageOrder'); var pageOrderInput = document.getElementById('pageOrder');
if (this.value === "" || this.value === "DUPLICATE") { if (this.value === "") {
pageOrderInput.disabled = false; pageOrderInput.disabled = false;
} else { } else {
pageOrderInput.disabled = true; pageOrderInput.disabled = true;

View File

@@ -205,7 +205,6 @@ Feature: API Validation
And the response file should have size greater than 100 And the response file should have size greater than 100
And the response file should have extension ".pdf" And the response file should have extension ".pdf"
@markdown @positive
Scenario: Convert PDF to Markdown format Scenario: Convert PDF to Markdown format
Given I generate a PDF file as "fileInput" Given I generate a PDF file as "fileInput"
And the pdf contains 3 pages with random text And the pdf contains 3 pages with random text
@@ -213,18 +212,4 @@ Feature: API Validation
Then the response status code should be 200 Then the response status code should be 200
And the response file should have size greater than 100 And the response file should have size greater than 100
And the response file should have extension ".md" And the response file should have extension ".md"
@positive @pdftocsv
Scenario: Convert PDF with tables to CSV format
Given I use an example file at "exampleFiles/tables.pdf" as parameter "fileInput"
And the request data includes
| parameter | value |
| outputFormat | csv |
| pageNumbers | all |
When I send the API request to the endpoint "/api/v1/convert/pdf/csv"
Then the response status code should be 200
And the response file should have size greater than 200
And the response file should have extension ".zip"
And the response ZIP should contain 3 files

View File

@@ -189,4 +189,4 @@ main() {
fi fi
} }
main main