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