Compare commits
40 Commits
sonarqube
...
2934-bug-d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1ad348b9a7 | ||
|
|
84e0b4caa7 | ||
|
|
27ec4d5a8f | ||
|
|
779191c02b | ||
|
|
2742e0b051 | ||
|
|
ea46204c6e | ||
|
|
41b41996c5 | ||
|
|
2abf48a57b | ||
|
|
5f81ff88e8 | ||
|
|
bc3340f3ba | ||
|
|
f9963a2316 | ||
|
|
0aeb22e7c8 | ||
|
|
dbb9009cf6 | ||
|
|
21839d07e8 | ||
|
|
8004251460 | ||
|
|
1ced941bee | ||
|
|
cb4a5778ec | ||
|
|
46c6a2b599 | ||
|
|
e5627af63d | ||
|
|
6a3064f7f2 | ||
|
|
158708b696 | ||
|
|
0233086487 | ||
|
|
242aa5eae1 | ||
|
|
bf65c456d1 | ||
|
|
26720c5018 | ||
|
|
2ed07e3fcb | ||
|
|
e382d254ee | ||
|
|
507d21772d | ||
|
|
5bf050d77f | ||
|
|
976caeb79d | ||
|
|
2d3611fd00 | ||
|
|
118de1789a | ||
|
|
b56d54a35a | ||
|
|
b9bfcd59cd | ||
|
|
f8adc0f101 | ||
|
|
69d4b52b06 | ||
|
|
5e3612a9b0 | ||
|
|
b3a4597ad1 | ||
|
|
dc46172deb | ||
|
|
04696dc2aa |
2
.github/workflows/PR-Demo-Comment.yml
vendored
@@ -105,7 +105,7 @@ jobs:
|
||||
DOCKER_ENABLE_SECURITY: false
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0
|
||||
uses: docker/setup-buildx-action@f7ce87c1d6bead3e36075b2ce75da1f6cc28aaca # v3.9.0
|
||||
|
||||
- name: Get version number
|
||||
id: versionNumber
|
||||
|
||||
10
.github/workflows/build.yml
vendored
@@ -37,12 +37,6 @@ jobs:
|
||||
java-version: ${{ matrix.jdk-version }}
|
||||
distribution: "temurin"
|
||||
|
||||
- name: PR | Generate verification metadata with signatures and checksums for dependabot[bot]
|
||||
if: github.event.pull_request.user.login == 'dependabot[bot]'
|
||||
run: |
|
||||
./gradlew clean dependencies buildEnvironment spotlessApply --write-verification-metadata sha256 --refresh-dependencies help
|
||||
./gradlew clean dependencies buildEnvironment spotlessApply --write-verification-metadata sha256,pgp --refresh-keys --export-keys --refresh-dependencies help
|
||||
|
||||
- name: Build with Gradle and no spring security
|
||||
run: ./gradlew clean build
|
||||
env:
|
||||
@@ -126,7 +120,7 @@ jobs:
|
||||
distribution: "adopt"
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0
|
||||
uses: docker/setup-buildx-action@f7ce87c1d6bead3e36075b2ce75da1f6cc28aaca # v3.9.0
|
||||
|
||||
- name: Install Docker Compose
|
||||
run: |
|
||||
@@ -147,4 +141,4 @@ jobs:
|
||||
run: |
|
||||
chmod +x ./testing/test_webpages.sh
|
||||
chmod +x ./testing/test.sh
|
||||
./testing/test.sh "${{ github.event.pull_request.user.login == 'dependabot[bot]' }}"
|
||||
./testing/test.sh
|
||||
|
||||
2
.github/workflows/licenses-update.yml
vendored
@@ -38,7 +38,7 @@ jobs:
|
||||
java-version: "17"
|
||||
distribution: "adopt"
|
||||
|
||||
- uses: gradle/actions/setup-gradle@0bdd871935719febd78681f197cd39af5b6e16a6 # v4.2.2
|
||||
- uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0
|
||||
|
||||
- name: check the licenses for compatibility
|
||||
run: ./gradlew clean checkLicense
|
||||
|
||||
4
.github/workflows/multiOSReleases.yml
vendored
@@ -63,7 +63,7 @@ jobs:
|
||||
java-version: "21"
|
||||
distribution: "temurin"
|
||||
|
||||
- uses: gradle/actions/setup-gradle@0bdd871935719febd78681f197cd39af5b6e16a6 # v4.2.2
|
||||
- uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0
|
||||
with:
|
||||
gradle-version: 8.12
|
||||
|
||||
@@ -151,7 +151,7 @@ jobs:
|
||||
java-version: "21"
|
||||
distribution: "temurin"
|
||||
|
||||
- uses: gradle/actions/setup-gradle@0bdd871935719febd78681f197cd39af5b6e16a6 # v4.2.2
|
||||
- uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0
|
||||
with:
|
||||
gradle-version: 8.12
|
||||
|
||||
|
||||
6
.github/workflows/push-docker.yml
vendored
@@ -30,7 +30,7 @@ jobs:
|
||||
java-version: "17"
|
||||
distribution: "temurin"
|
||||
|
||||
- uses: gradle/actions/setup-gradle@0bdd871935719febd78681f197cd39af5b6e16a6 # v4.2.2
|
||||
- uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0
|
||||
with:
|
||||
gradle-version: 8.12
|
||||
|
||||
@@ -47,7 +47,7 @@ jobs:
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
id: buildx
|
||||
uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0
|
||||
uses: docker/setup-buildx-action@f7ce87c1d6bead3e36075b2ce75da1f6cc28aaca # v3.9.0
|
||||
|
||||
- name: Get version number
|
||||
id: versionNumber
|
||||
@@ -67,7 +67,7 @@ jobs:
|
||||
password: ${{ github.token }}
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@53851d14592bedcffcf25ea515637cff71ef929a # v3.3.0
|
||||
uses: docker/setup-qemu-action@4574d27a4764455b42196d70a065bc6853246a25 # v3.4.0
|
||||
|
||||
- name: Convert repository owner to lowercase
|
||||
id: repoowner
|
||||
|
||||
2
.github/workflows/releaseArtifacts.yml
vendored
@@ -35,7 +35,7 @@ jobs:
|
||||
java-version: "17"
|
||||
distribution: "temurin"
|
||||
|
||||
- uses: gradle/actions/setup-gradle@0bdd871935719febd78681f197cd39af5b6e16a6 # v4.2.2
|
||||
- uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0
|
||||
with:
|
||||
gradle-version: 8.12
|
||||
|
||||
|
||||
2
.github/workflows/scorecards.yml
vendored
@@ -74,6 +74,6 @@ jobs:
|
||||
|
||||
# Upload the results to GitHub's code scanning dashboard.
|
||||
- name: "Upload to code-scanning"
|
||||
uses: github/codeql-action/upload-sarif@dd746615b3b9d728a6a37ca2045b68ca76d4841a # v3.28.8
|
||||
uses: github/codeql-action/upload-sarif@9e8d0789d4a0fa9ceb6b1738f7e269594bdd67f0 # v3.28.9
|
||||
with:
|
||||
sarif_file: results.sarif
|
||||
|
||||
62
.github/workflows/sonarqube.yml
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
pull_request:
|
||||
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
|
||||
with:
|
||||
egress-policy: audit
|
||||
|
||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Setup Gradle
|
||||
uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0
|
||||
|
||||
- name: Build and analyze with Gradle
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
||||
DOCKER_ENABLE_SECURITY: true
|
||||
STIRLING_PDF_DESKTOP_UI: true
|
||||
run: |
|
||||
./gradlew clean build sonar \
|
||||
-Dsonar.projectKey=Stirling-Tools_Stirling-PDF \
|
||||
-Dsonar.organization=stirling-tools \
|
||||
-Dsonar.host.url=https://sonarcloud.io \
|
||||
-Dsonar.login=${SONAR_TOKEN} \
|
||||
-Dsonar.log.level=DEBUG \
|
||||
--info
|
||||
|
||||
- name: Upload Problems Report on Failure
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0
|
||||
with:
|
||||
name: gradle-problems-report
|
||||
path: build/reports/problems/problems-report.html
|
||||
retention-days: 7
|
||||
|
||||
- name: Upload Sonar Logs on Failure
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0
|
||||
with:
|
||||
name: sonar-logs
|
||||
path: |
|
||||
.scannerwork/report-task.txt
|
||||
build/sonar/
|
||||
retention-days: 7
|
||||
2
.github/workflows/swagger.yml
vendored
@@ -26,7 +26,7 @@ jobs:
|
||||
java-version: "17"
|
||||
distribution: "temurin"
|
||||
|
||||
- uses: gradle/actions/setup-gradle@0bdd871935719febd78681f197cd39af5b6e16a6 # v4.2.2
|
||||
- uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0
|
||||
|
||||
- name: Generate Swagger documentation
|
||||
run: ./gradlew generateOpenApiDocs
|
||||
|
||||
29
.github/workflows/sync_files.yml
vendored
@@ -8,8 +8,6 @@ on:
|
||||
paths:
|
||||
- "build.gradle"
|
||||
- "README.md"
|
||||
- "gradle/verification-keyring.keys"
|
||||
- "gradle/verification-metadata.xml"
|
||||
- "src/main/resources/messages_*.properties"
|
||||
- "src/main/resources/static/3rdPartyLicenses.json"
|
||||
- "scripts/ignore_translation.toml"
|
||||
@@ -104,22 +102,6 @@ jobs:
|
||||
git add README.md
|
||||
git diff --staged --quiet || git commit -m ":memo: Sync README.md" || echo "no changes"
|
||||
|
||||
- name: Generate verification metadata with signatures and checksums
|
||||
run: |
|
||||
set -e
|
||||
if [ -f ./gradle/verification-metadata.xml ]; then
|
||||
rm ./gradle/verification-metadata.xml
|
||||
fi
|
||||
./gradlew clean dependencies buildEnvironment spotlessApply --write-verification-metadata sha256 help
|
||||
./gradlew clean dependencies buildEnvironment spotlessApply --write-verification-metadata sha256,pgp --refresh-keys --export-keys --refresh-dependencies help
|
||||
./gradlew clean build
|
||||
|
||||
- name: Run git add
|
||||
run: |
|
||||
git add gradle/verification-keyring.keys
|
||||
git add gradle/verification-metadata.xml
|
||||
git diff --staged --quiet || git commit -m ":memo: Generate verification metadata with signatures and checksums" || echo "no changes"
|
||||
|
||||
- name: Create Pull Request
|
||||
uses: peter-evans/create-pull-request@67ccf781d68cd99b580ae25a5c18a1cc84ffff1f # v7.0.6
|
||||
with:
|
||||
@@ -129,11 +111,11 @@ jobs:
|
||||
author: ${{ needs.read_bot_entries.outputs.committer }}
|
||||
signoff: true
|
||||
branch: sync_readme
|
||||
title: ":globe_with_meridians: Sync Translations + Update README Progress Table + Update Verification Metadata"
|
||||
title: ":globe_with_meridians: Sync Translations + Update README Progress Table"
|
||||
body: |
|
||||
### Description of Changes
|
||||
|
||||
This Pull Request was automatically generated to synchronize updates to translation files, verification metadata, and documentation. Below are the details of the changes made:
|
||||
This Pull Request was automatically generated to synchronize updates to translation files and documentation. Below are the details of the changes made:
|
||||
|
||||
#### **1. Synchronization of Translation Files**
|
||||
- Updated translation files (`messages_*.properties`) to reflect changes in the reference file `messages_en_GB.properties`.
|
||||
@@ -145,14 +127,9 @@ jobs:
|
||||
- Added a summary of the current translation status for all supported languages.
|
||||
- Included up-to-date statistics on translation coverage.
|
||||
|
||||
#### **3. Verification Metadata Updates**
|
||||
- Generated or refreshed the `verification-keyring.keys` and `verification-metadata.xml` files.
|
||||
- Included the latest dependency signatures and checksums to enhance the build's integrity.
|
||||
|
||||
#### **Why these changes are necessary**
|
||||
- Keeps translation files aligned with the latest reference updates.
|
||||
- Ensures the documentation reflects the current translation progress.
|
||||
- Strengthens dependency verification for a more secure build process.
|
||||
|
||||
---
|
||||
|
||||
@@ -166,5 +143,3 @@ jobs:
|
||||
add-paths: |
|
||||
README.md
|
||||
src/main/resources/messages_*.properties
|
||||
gradle/verification-keyring.keys
|
||||
gradle/verification-metadata.xml
|
||||
|
||||
2
.github/workflows/testdriver.yml
vendored
@@ -31,7 +31,7 @@ jobs:
|
||||
DOCKER_ENABLE_SECURITY: false
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0
|
||||
uses: docker/setup-buildx-action@f7ce87c1d6bead3e36075b2ce75da1f6cc28aaca # v3.9.0
|
||||
|
||||
- name: Get version number
|
||||
id: versionNumber
|
||||
|
||||
@@ -585,41 +585,3 @@ In your Thymeleaf templates, use the `#{key}` syntax to reference the new transl
|
||||
```
|
||||
|
||||
Remember, never hard-code text in your templates or Java code. Always use translation keys to ensure proper localization.
|
||||
|
||||
|
||||
## Managing Dependencies
|
||||
|
||||
When adding new dependencies or updating existing ones in Stirling-PDF, follow these steps to ensure proper verification and security:
|
||||
|
||||
1. Update the dependency in `build.gradle`:
|
||||
```groovy
|
||||
dependencies {
|
||||
// Add or update your dependency
|
||||
implementation "com.example:new-library:1.2.3"
|
||||
}
|
||||
```
|
||||
|
||||
2. Generate new verification metadata and keys:
|
||||
```bash
|
||||
# Generate verification metadata with signatures and checksums
|
||||
./gradlew clean dependencies buildEnvironment spotlessApply --write-verification-metadata sha256,pgp
|
||||
|
||||
# Export the .keys file
|
||||
./gradlew --export-keys
|
||||
```
|
||||
|
||||
3. Files to commit:
|
||||
- `build.gradle` - Your dependency changes
|
||||
- `gradle/verification-metadata.xml` - Contains verification rules and checksums
|
||||
- `gradle/verification-keyring.keys` - Contains PGP keys in text format
|
||||
|
||||
4. Verify the build works with the new verification:
|
||||
```bash
|
||||
./gradlew build
|
||||
```
|
||||
|
||||
5. Before committing, check:
|
||||
- Verify any new BOM files are properly handled in verification metadata
|
||||
- Review the changes in `verification-metadata.xml` to ensure they match your dependency updates
|
||||
|
||||
This ensures dependencies are properly verified and secure while maintaining transparency in the repository.
|
||||
|
||||
56
Dockerfile
@@ -39,41 +39,43 @@ ENV DOCKER_ENABLE_SECURITY=false \
|
||||
|
||||
|
||||
# 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
|
||||
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-unoconv@testing \
|
||||
py3-pillow@testing \
|
||||
py3-pdf2image@testing \
|
||||
weasyprint@community && \
|
||||
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
|
||||
|
||||
@@ -9,7 +9,7 @@ COPY . .
|
||||
|
||||
# Build the application with DOCKER_ENABLE_SECURITY=false
|
||||
RUN DOCKER_ENABLE_SECURITY=true \
|
||||
./gradlew clean build
|
||||
./gradlew clean build
|
||||
|
||||
# Main stage
|
||||
FROM alpine:3.21.2@sha256:56fa17d2a7e7f168a043a2712e63aed1f8543aeafdcee47c58dcffe38ed51099
|
||||
@@ -41,42 +41,46 @@ ENV DOCKER_ENABLE_SECURITY=false \
|
||||
|
||||
|
||||
# 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 \
|
||||
shadow \
|
||||
su-exec \
|
||||
openssl \
|
||||
openssl-dev \
|
||||
openjdk21-jre \
|
||||
# Doc conversion
|
||||
libreoffice \
|
||||
# pdftohtml
|
||||
poppler-utils \
|
||||
# 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 && \
|
||||
ca-certificates \
|
||||
tzdata \
|
||||
tini \
|
||||
bash \
|
||||
curl \
|
||||
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 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-unoconv@testing \
|
||||
py3-pillow@testing \
|
||||
py3-pdf2image@testing \
|
||||
weasyprint@community && \
|
||||
# uno unoconv and HTML
|
||||
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
|
||||
|
||||
14
README.md
@@ -130,27 +130,27 @@ Stirling-PDF currently supports 39 languages!
|
||||
| English (US) (en_US) |  |
|
||||
| French (Français) (fr_FR) |  |
|
||||
| German (Deutsch) (de_DE) |  |
|
||||
| Greek (Ελληνικά) (el_GR) |  |
|
||||
| Greek (Ελληνικά) (el_GR) |  |
|
||||
| Hindi (हिंदी) (hi_IN) |  |
|
||||
| Hungarian (Magyar) (hu_HU) |  |
|
||||
| Indonesian (Bahasa Indonesia) (id_ID) |  |
|
||||
| Irish (Gaeilge) (ga_IE) |  |
|
||||
| Italian (Italiano) (it_IT) |  |
|
||||
| Japanese (日本語) (ja_JP) |  |
|
||||
| Korean (한국어) (ko_KR) |  |
|
||||
| Norwegian (Norsk) (no_NB) |  |
|
||||
| Korean (한국어) (ko_KR) |  |
|
||||
| Norwegian (Norsk) (no_NB) |  |
|
||||
| Persian (فارسی) (fa_IR) |  |
|
||||
| Polish (Polski) (pl_PL) |  |
|
||||
| Portuguese (Português) (pt_PT) |  |
|
||||
| Portuguese Brazilian (Português) (pt_BR) |  |
|
||||
| Portuguese Brazilian (Português) (pt_BR) |  |
|
||||
| Romanian (Română) (ro_RO) |  |
|
||||
| Russian (Русский) (ru_RU) |  |
|
||||
| Serbian Latin alphabet (Srpski) (sr_LATN_RS) |  |
|
||||
| Simplified Chinese (简体中文) (zh_CN) |  |
|
||||
| Serbian Latin alphabet (Srpski) (sr_LATN_RS) |  |
|
||||
| Simplified Chinese (简体中文) (zh_CN) |  |
|
||||
| Slovakian (Slovensky) (sk_SK) |  |
|
||||
| Slovenian (Slovenščina) (sl_SI) |  |
|
||||
| Spanish (Español) (es_ES) |  |
|
||||
| Swedish (Svenska) (sv_SE) |  |
|
||||
| Swedish (Svenska) (sv_SE) |  |
|
||||
| Thai (ไทย) (th_TH) |  |
|
||||
| Tibetan (བོད་ཡིག་) (zh_BO) |  |
|
||||
| Traditional Chinese (繁體中文) (zh_TW) |  |
|
||||
|
||||
17
build.gradle
@@ -8,7 +8,8 @@ plugins {
|
||||
id "com.diffplug.spotless" version "7.0.2"
|
||||
id "com.github.jk1.dependency-license-report" version "2.9"
|
||||
//id "nebula.lint" version "19.0.3"
|
||||
id("org.panteleyev.jpackageplugin") version "1.6.0"
|
||||
id("org.panteleyev.jpackageplugin") version "1.6.1"
|
||||
id "org.sonarqube" version "6.0.1.5171"
|
||||
}
|
||||
|
||||
import com.github.jk1.license.render.*
|
||||
@@ -25,7 +26,7 @@ ext {
|
||||
}
|
||||
|
||||
group = "stirling.software"
|
||||
version = "0.40.1"
|
||||
version = "0.41.0"
|
||||
|
||||
java {
|
||||
// 17 is lowest but we support and recommend 21
|
||||
@@ -34,7 +35,6 @@ java {
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
maven { url = "https://jitpack.io" }
|
||||
maven { url = "https://build.shibboleth.net/maven/releases" }
|
||||
maven { url = "https://maven.pkg.github.com/jcefmaven/jcefmaven" }
|
||||
}
|
||||
@@ -269,6 +269,17 @@ spotless {
|
||||
}
|
||||
}
|
||||
|
||||
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/**"
|
||||
}
|
||||
}
|
||||
|
||||
//gradleLint {
|
||||
// rules=['unused-dependency']
|
||||
// }
|
||||
|
||||
|
Before Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 9.4 KiB |
|
Before Width: | Height: | Size: 242 KiB After Width: | Height: | Size: 169 KiB |
|
Before Width: | Height: | Size: 145 KiB After Width: | Height: | Size: 118 KiB |
@@ -265,9 +265,6 @@ public class EndpointConfiguration {
|
||||
// Pdftohtml dependent endpoints
|
||||
addEndpointToGroup("Pdftohtml", "pdf-to-html");
|
||||
addEndpointToGroup("Pdftohtml", "pdf-to-markdown");
|
||||
|
||||
// disabled for now while we resolve issues
|
||||
disableEndpoint("pdf-to-pdfa");
|
||||
}
|
||||
|
||||
private void processEnvironmentConfigs() {
|
||||
|
||||
@@ -32,7 +32,10 @@ public class AdditionalLanguageJsController {
|
||||
response.setContentType("application/javascript");
|
||||
PrintWriter writer = response.getWriter();
|
||||
// Erstelle das JavaScript dynamisch
|
||||
writer.println("const supportedLanguages = " + toJsonArray(new ArrayList<>(supportedLanguages)) + ";");
|
||||
writer.println(
|
||||
"const supportedLanguages = "
|
||||
+ toJsonArray(new ArrayList<>(supportedLanguages))
|
||||
+ ";");
|
||||
// Generiere die `getDetailedLanguageCode`-Funktion
|
||||
writer.println(
|
||||
"""
|
||||
|
||||
@@ -100,6 +100,8 @@ public class SplitPdfBySectionsController {
|
||||
|
||||
if (sectionNum == horiz * verti) pageNum++;
|
||||
}
|
||||
|
||||
zipOut.finish();
|
||||
data = Files.readAllBytes(zipFile);
|
||||
return WebResponseUtils.bytesToWebResponse(
|
||||
data, filename + "_split.zip", MediaType.APPLICATION_OCTET_STREAM);
|
||||
|
||||
@@ -13,8 +13,8 @@ import io.github.pixee.security.Filenames;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
|
||||
import stirling.software.SPDF.model.api.converters.HTMLToPdfRequest;
|
||||
import stirling.software.SPDF.model.ApplicationProperties;
|
||||
import stirling.software.SPDF.model.api.converters.HTMLToPdfRequest;
|
||||
import stirling.software.SPDF.service.CustomPDDocumentFactory;
|
||||
import stirling.software.SPDF.utils.FileToPdf;
|
||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||
@@ -28,23 +28,23 @@ public class ConvertHtmlToPDF {
|
||||
|
||||
private final CustomPDDocumentFactory pdfDocumentFactory;
|
||||
|
||||
private final ApplicationProperties applicationProperties;
|
||||
private final ApplicationProperties applicationProperties;
|
||||
|
||||
@Autowired
|
||||
public ConvertHtmlToPDF(
|
||||
CustomPDDocumentFactory pdfDocumentFactory,
|
||||
@Qualifier("bookAndHtmlFormatsInstalled") boolean bookAndHtmlFormatsInstalled,
|
||||
ApplicationProperties applicationProperties) {
|
||||
ApplicationProperties applicationProperties) {
|
||||
this.pdfDocumentFactory = pdfDocumentFactory;
|
||||
this.bookAndHtmlFormatsInstalled = bookAndHtmlFormatsInstalled;
|
||||
this.applicationProperties = applicationProperties;
|
||||
this.applicationProperties = applicationProperties;
|
||||
}
|
||||
|
||||
@PostMapping(consumes = "multipart/form-data", value = "/html/pdf")
|
||||
@Operation(
|
||||
summary = "Convert an HTML or ZIP (containing HTML and CSS) to PDF",
|
||||
description =
|
||||
"This endpoint takes an HTML or ZIP file input and converts it to a PDF format.")
|
||||
"This endpoint takes an HTML or ZIP file input and converts it to a PDF format. Input:HTML Output:PDF Type:SISO")
|
||||
public ResponseEntity<byte[]> HtmlToPdf(@ModelAttribute HTMLToPdfRequest request)
|
||||
throws Exception {
|
||||
MultipartFile fileInput = request.getFileInput();
|
||||
@@ -60,7 +60,8 @@ public class ConvertHtmlToPDF {
|
||||
throw new IllegalArgumentException("File must be either .html or .zip format.");
|
||||
}
|
||||
|
||||
boolean disableSanitize = Boolean.TRUE.equals(applicationProperties.getSystem().getDisableSanitize());
|
||||
boolean disableSanitize =
|
||||
Boolean.TRUE.equals(applicationProperties.getSystem().getDisableSanitize());
|
||||
|
||||
byte[] pdfBytes =
|
||||
FileToPdf.convertHtmlToPdf(
|
||||
@@ -68,7 +69,7 @@ public class ConvertHtmlToPDF {
|
||||
fileInput.getBytes(),
|
||||
originalFilename,
|
||||
bookAndHtmlFormatsInstalled,
|
||||
disableSanitize);
|
||||
disableSanitize);
|
||||
|
||||
pdfBytes = pdfDocumentFactory.createNewBytesBasedOnOldDocument(pdfBytes);
|
||||
|
||||
|
||||
@@ -23,8 +23,8 @@ import io.github.pixee.security.Filenames;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
|
||||
import stirling.software.SPDF.model.api.GeneralFile;
|
||||
import stirling.software.SPDF.model.ApplicationProperties;
|
||||
import stirling.software.SPDF.model.api.GeneralFile;
|
||||
import stirling.software.SPDF.service.CustomPDDocumentFactory;
|
||||
import stirling.software.SPDF.utils.FileToPdf;
|
||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||
@@ -38,16 +38,16 @@ public class ConvertMarkdownToPdf {
|
||||
|
||||
private final CustomPDDocumentFactory pdfDocumentFactory;
|
||||
|
||||
private final ApplicationProperties applicationProperties;
|
||||
private final ApplicationProperties applicationProperties;
|
||||
|
||||
@Autowired
|
||||
public ConvertMarkdownToPdf(
|
||||
CustomPDDocumentFactory pdfDocumentFactory,
|
||||
@Qualifier("bookAndHtmlFormatsInstalled") boolean bookAndHtmlFormatsInstalled,
|
||||
ApplicationProperties applicationProperties) {
|
||||
ApplicationProperties applicationProperties) {
|
||||
this.pdfDocumentFactory = pdfDocumentFactory;
|
||||
this.bookAndHtmlFormatsInstalled = bookAndHtmlFormatsInstalled;
|
||||
this.applicationProperties = applicationProperties;
|
||||
this.applicationProperties = applicationProperties;
|
||||
}
|
||||
|
||||
@PostMapping(consumes = "multipart/form-data", value = "/markdown/pdf")
|
||||
@@ -81,7 +81,8 @@ public class ConvertMarkdownToPdf {
|
||||
|
||||
String htmlContent = renderer.render(document);
|
||||
|
||||
boolean disableSanitize = Boolean.TRUE.equals(applicationProperties.getSystem().getDisableSanitize());
|
||||
boolean disableSanitize =
|
||||
Boolean.TRUE.equals(applicationProperties.getSystem().getDisableSanitize());
|
||||
|
||||
byte[] pdfBytes =
|
||||
FileToPdf.convertHtmlToPdf(
|
||||
@@ -89,7 +90,7 @@ public class ConvertMarkdownToPdf {
|
||||
htmlContent.getBytes(),
|
||||
"converted.html",
|
||||
bookAndHtmlFormatsInstalled,
|
||||
disableSanitize);
|
||||
disableSanitize);
|
||||
pdfBytes = pdfDocumentFactory.createNewBytesBasedOnOldDocument(pdfBytes);
|
||||
String outputFilename =
|
||||
originalFilename.replaceFirst("[.][^.]+$", "")
|
||||
|
||||
@@ -73,8 +73,8 @@ public class ConvertPDFToPDFA {
|
||||
// Determine PDF/A filter based on requested format
|
||||
String pdfFilter =
|
||||
"pdfa".equals(outputFormat)
|
||||
? "writer_pdf_Export:{'SelectPdfVersion':{'Value':'2'}}:writer_pdf_Export"
|
||||
: "writer_pdf_Export:{'SelectPdfVersion':{'Value':'1'}}:writer_pdf_Export";
|
||||
? "pdf:writer_pdf_Export:{\"SelectPdfVersion\":{\"type\":\"long\",\"value\":\"2\"}}"
|
||||
: "pdf:writer_pdf_Export:{\"SelectPdfVersion\":{\"type\":\"long\",\"value\":\"1\"}}";
|
||||
|
||||
// Prepare LibreOffice command
|
||||
List<String> command =
|
||||
@@ -84,7 +84,7 @@ public class ConvertPDFToPDFA {
|
||||
"--headless",
|
||||
"--nologo",
|
||||
"--convert-to",
|
||||
"pdf:" + pdfFilter,
|
||||
pdfFilter,
|
||||
"--outdir",
|
||||
tempOutputDir.toString(),
|
||||
tempInputFile.toString()));
|
||||
|
||||
@@ -8,7 +8,9 @@ import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
|
||||
@@ -41,8 +43,12 @@ import stirling.software.SPDF.utils.WebResponseUtils;
|
||||
@Tag(name = "Misc", description = "Miscellaneous APIs")
|
||||
public class AutoSplitPdfController {
|
||||
|
||||
private static final String QR_CONTENT = "https://github.com/Stirling-Tools/Stirling-PDF";
|
||||
private static final String QR_CONTENT_OLD = "https://github.com/Frooodle/Stirling-PDF";
|
||||
private static final Set<String> VALID_QR_CONTENTS =
|
||||
new HashSet<>(
|
||||
Set.of(
|
||||
"https://github.com/Stirling-Tools/Stirling-PDF",
|
||||
"https://github.com/Frooodle/Stirling-PDF",
|
||||
"https://stirlingpdf.com"));
|
||||
|
||||
private final CustomPDDocumentFactory pdfDocumentFactory;
|
||||
|
||||
@@ -120,13 +126,14 @@ public class AutoSplitPdfController {
|
||||
for (int page = 0; page < document.getNumberOfPages(); ++page) {
|
||||
BufferedImage bim = pdfRenderer.renderImageWithDPI(page, 150);
|
||||
String result = decodeQRCode(bim);
|
||||
if ((QR_CONTENT.equals(result) || QR_CONTENT_OLD.equals(result)) && page != 0) {
|
||||
|
||||
boolean isValidQrCode = VALID_QR_CONTENTS.contains(result);
|
||||
log.debug("detected qr code {}, code is vale={}", result, isValidQrCode);
|
||||
if (isValidQrCode && page != 0) {
|
||||
splitDocuments.add(new PDDocument());
|
||||
}
|
||||
|
||||
if (!splitDocuments.isEmpty()
|
||||
&& !QR_CONTENT.equals(result)
|
||||
&& !QR_CONTENT_OLD.equals(result)) {
|
||||
if (!splitDocuments.isEmpty() && !isValidQrCode) {
|
||||
splitDocuments.get(splitDocuments.size() - 1).addPage(document.getPage(page));
|
||||
} else if (page == 0) {
|
||||
PDDocument firstDocument = new PDDocument();
|
||||
@@ -135,7 +142,7 @@ public class AutoSplitPdfController {
|
||||
}
|
||||
|
||||
// If duplexMode is true and current page is a divider, then skip next page
|
||||
if (duplexMode && (QR_CONTENT.equals(result) || QR_CONTENT_OLD.equals(result))) {
|
||||
if (duplexMode && isValidQrCode) {
|
||||
page++;
|
||||
}
|
||||
}
|
||||
@@ -168,6 +175,9 @@ public class AutoSplitPdfController {
|
||||
|
||||
return WebResponseUtils.bytesToWebResponse(
|
||||
data, filename + ".zip", MediaType.APPLICATION_OCTET_STREAM);
|
||||
} catch (Exception e) {
|
||||
log.error("Error in auto split", e);
|
||||
throw e;
|
||||
} finally {
|
||||
// Clean up resources
|
||||
if (document != null) {
|
||||
|
||||
@@ -5,6 +5,7 @@ import java.awt.image.BufferedImage;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.nio.file.StandardCopyOption;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@@ -94,7 +95,9 @@ public class CompressController {
|
||||
}
|
||||
}
|
||||
}
|
||||
doc.save(pdfFile.toString());
|
||||
Path tempOutput = Files.createTempFile("output_", ".pdf");
|
||||
doc.save(tempOutput.toString());
|
||||
Files.move(tempOutput, pdfFile, StandardCopyOption.REPLACE_EXISTING);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -188,7 +191,7 @@ public class CompressController {
|
||||
optimizeLevel =
|
||||
incrementOptimizeLevel(
|
||||
optimizeLevel, outputFileSize, expectedOutputSize);
|
||||
if (autoMode && optimizeLevel > 9) {
|
||||
if (autoMode && optimizeLevel >= 9) {
|
||||
log.info("Maximum compression level reached in auto mode");
|
||||
sizeMet = true;
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ public class ExtractImagesController {
|
||||
@Operation(
|
||||
summary = "Extract images from a PDF file",
|
||||
description =
|
||||
"This endpoint extracts images from a given PDF file and returns them in a zip file. Users can specify the output image format. Input: PDF Output: IMAGE/ZIP Type: SIMO")
|
||||
"This endpoint extracts images from a given PDF file and returns them in a zip file. Users can specify the output image format. Input:PDF Output:IMAGE/ZIP Type:SIMO")
|
||||
public ResponseEntity<byte[]> extractImages(@ModelAttribute PDFExtractImagesRequest request)
|
||||
throws IOException, InterruptedException, ExecutionException {
|
||||
MultipartFile file = request.getFileInput();
|
||||
|
||||
@@ -46,7 +46,7 @@ public class FlattenController {
|
||||
@Operation(
|
||||
summary = "Flatten PDF form fields or full page",
|
||||
description =
|
||||
"Flattening just PDF form fields or converting each page to images to make text unselectable. Input: PDF, Output: PDF. Type: SISO")
|
||||
"Flattening just PDF form fields or converting each page to images to make text unselectable. Input:PDF, Output:PDF. Type:SISO")
|
||||
public ResponseEntity<byte[]> flatten(@ModelAttribute FlattenRequest request) throws Exception {
|
||||
MultipartFile file = request.getFileInput();
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@ import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
import io.github.pixee.security.BoundedLineReader;
|
||||
import io.github.pixee.security.Filenames;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
@@ -65,6 +66,10 @@ public class OCRController {
|
||||
}
|
||||
|
||||
@PostMapping(consumes = "multipart/form-data", value = "/ocr-pdf")
|
||||
@Operation(
|
||||
summary = "Process PDF files with OCR using Tesseract",
|
||||
description =
|
||||
"Takes a PDF file as input, performs OCR using specified languages and OCR type (skip-text/force-ocr), and returns the processed PDF. Input:PDF Output:PDF Type:SISO")
|
||||
public ResponseEntity<byte[]> processPdfWithOCR(
|
||||
@ModelAttribute ProcessPdfWithOcrRequest request)
|
||||
throws IOException, InterruptedException {
|
||||
|
||||
@@ -25,6 +25,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import stirling.software.SPDF.model.PipelineConfig;
|
||||
import stirling.software.SPDF.model.PipelineResult;
|
||||
import stirling.software.SPDF.model.api.HandleDataRequest;
|
||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||
|
||||
@@ -58,7 +59,8 @@ public class PipelineController {
|
||||
if (inputFiles == null || inputFiles.size() == 0) {
|
||||
return null;
|
||||
}
|
||||
List<Resource> outputFiles = processor.runPipelineAgainstFiles(inputFiles, config);
|
||||
PipelineResult result = processor.runPipelineAgainstFiles(inputFiles, config);
|
||||
List<Resource> outputFiles = result.getOutputFiles();
|
||||
if (outputFiles != null && outputFiles.size() == 1) {
|
||||
// If there is only one file, return it directly
|
||||
Resource singleFile = outputFiles.get(0);
|
||||
|
||||
@@ -27,6 +27,7 @@ import lombok.extern.slf4j.Slf4j;
|
||||
import stirling.software.SPDF.config.InstallationPathConfig;
|
||||
import stirling.software.SPDF.model.PipelineConfig;
|
||||
import stirling.software.SPDF.model.PipelineOperation;
|
||||
import stirling.software.SPDF.model.PipelineResult;
|
||||
import stirling.software.SPDF.utils.FileMonitor;
|
||||
|
||||
@Service
|
||||
@@ -143,19 +144,64 @@ public class PipelineDirectoryProcessor {
|
||||
|
||||
private File[] collectFilesForProcessing(Path dir, Path jsonFile, PipelineOperation operation)
|
||||
throws IOException {
|
||||
|
||||
List<String> inputExtensions =
|
||||
apiDocService.getExtensionTypes(false, operation.getOperation());
|
||||
log.info(
|
||||
"Allowed extensions for operation {}: {}",
|
||||
operation.getOperation(),
|
||||
inputExtensions);
|
||||
|
||||
boolean allowAllFiles = inputExtensions.contains("ALL");
|
||||
|
||||
try (Stream<Path> paths = Files.list(dir)) {
|
||||
if ("automated".equals(operation.getParameters().get("fileInput"))) {
|
||||
return paths.filter(
|
||||
path ->
|
||||
!Files.isDirectory(path)
|
||||
&& !path.equals(jsonFile)
|
||||
&& fileMonitor.isFileReadyForProcessing(path))
|
||||
.map(Path::toFile)
|
||||
.toArray(File[]::new);
|
||||
} else {
|
||||
String fileInput = (String) operation.getParameters().get("fileInput");
|
||||
return new File[] {new File(fileInput)};
|
||||
}
|
||||
File[] files =
|
||||
paths.filter(
|
||||
path -> {
|
||||
if (Files.isDirectory(path)) {
|
||||
return false;
|
||||
}
|
||||
if (path.equals(jsonFile)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Get file extension
|
||||
String filename = path.getFileName().toString();
|
||||
String extension =
|
||||
filename.contains(".")
|
||||
? filename.substring(
|
||||
filename.lastIndexOf(".")
|
||||
+ 1)
|
||||
.toLowerCase()
|
||||
: "";
|
||||
|
||||
// Check against allowed extensions
|
||||
boolean isAllowed =
|
||||
allowAllFiles
|
||||
|| inputExtensions.contains(extension);
|
||||
if (!isAllowed) {
|
||||
log.info(
|
||||
"Skipping file with unsupported extension: {} ({})",
|
||||
filename,
|
||||
extension);
|
||||
}
|
||||
return isAllowed;
|
||||
})
|
||||
.filter(
|
||||
path -> {
|
||||
boolean isReady =
|
||||
fileMonitor.isFileReadyForProcessing(path);
|
||||
if (!isReady) {
|
||||
log.info(
|
||||
"File not ready for processing (locked/created last 5s): {}",
|
||||
path);
|
||||
}
|
||||
return isReady;
|
||||
})
|
||||
.map(Path::toFile)
|
||||
.toArray(File[]::new);
|
||||
log.info("Collected {} files for processing", files.length);
|
||||
return files;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -198,19 +244,37 @@ public class PipelineDirectoryProcessor {
|
||||
try {
|
||||
List<Resource> inputFiles =
|
||||
processor.generateInputFiles(filesToProcess.toArray(new File[0]));
|
||||
if (inputFiles == null || inputFiles.size() == 0) {
|
||||
if (inputFiles == null || inputFiles.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
List<Resource> outputFiles = processor.runPipelineAgainstFiles(inputFiles, config);
|
||||
if (outputFiles == null) return;
|
||||
moveAndRenameFiles(outputFiles, config, dir);
|
||||
deleteOriginalFiles(filesToProcess, processingDir);
|
||||
PipelineResult result = processor.runPipelineAgainstFiles(inputFiles, config);
|
||||
|
||||
if (result.isHasErrors()) {
|
||||
log.error("Errors occurred during processing, retaining original files");
|
||||
moveToErrorDirectory(filesToProcess, dir);
|
||||
} else {
|
||||
moveAndRenameFiles(result.getOutputFiles(), config, dir);
|
||||
deleteOriginalFiles(filesToProcess, processingDir);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
log.error("error during processing", e);
|
||||
log.error("Error during processing", e);
|
||||
moveFilesBack(filesToProcess, processingDir);
|
||||
}
|
||||
}
|
||||
|
||||
private void moveToErrorDirectory(List<File> files, Path originalDir) throws IOException {
|
||||
Path errorDir = originalDir.resolve("error");
|
||||
if (!Files.exists(errorDir)) {
|
||||
Files.createDirectories(errorDir);
|
||||
}
|
||||
|
||||
for (File file : files) {
|
||||
Path target = errorDir.resolve(file.getName());
|
||||
Files.move(file.toPath(), target);
|
||||
log.info("Moved failed file to error directory for investigation: {}", target);
|
||||
}
|
||||
}
|
||||
|
||||
private void moveAndRenameFiles(List<Resource> resources, PipelineConfig config, Path dir)
|
||||
throws IOException {
|
||||
for (Resource resource : resources) {
|
||||
|
||||
@@ -33,6 +33,7 @@ import lombok.extern.slf4j.Slf4j;
|
||||
import stirling.software.SPDF.SPDFApplication;
|
||||
import stirling.software.SPDF.model.PipelineConfig;
|
||||
import stirling.software.SPDF.model.PipelineOperation;
|
||||
import stirling.software.SPDF.model.PipelineResult;
|
||||
import stirling.software.SPDF.model.Role;
|
||||
|
||||
@Service
|
||||
@@ -84,8 +85,10 @@ public class PipelineProcessor {
|
||||
return "http://localhost:" + port + contextPath + "/";
|
||||
}
|
||||
|
||||
List<Resource> runPipelineAgainstFiles(List<Resource> outputFiles, PipelineConfig config)
|
||||
PipelineResult runPipelineAgainstFiles(List<Resource> outputFiles, PipelineConfig config)
|
||||
throws Exception {
|
||||
PipelineResult result = new PipelineResult();
|
||||
|
||||
ByteArrayOutputStream logStream = new ByteArrayOutputStream();
|
||||
PrintStream logPrintStream = new PrintStream(logStream);
|
||||
boolean hasErrors = false;
|
||||
@@ -130,7 +133,8 @@ public class PipelineProcessor {
|
||||
if (operation.startsWith("filter-")
|
||||
&& (response.getBody() == null
|
||||
|| response.getBody().length == 0)) {
|
||||
log.info("Skipping file due to failing {}", operation);
|
||||
result.setFiltersApplied(true);
|
||||
log.info("Skipping file due to filtering {}", operation);
|
||||
continue;
|
||||
}
|
||||
if (!response.getStatusCode().equals(HttpStatus.OK)) {
|
||||
@@ -208,7 +212,10 @@ public class PipelineProcessor {
|
||||
if (hasErrors) {
|
||||
log.error("Errors occurred during processing. Log: {}", logStream.toString());
|
||||
}
|
||||
return outputFiles;
|
||||
result.setHasErrors(hasErrors);
|
||||
result.setFiltersApplied(hasErrors);
|
||||
result.setOutputFiles(outputFiles);
|
||||
return result;
|
||||
}
|
||||
|
||||
private ResponseEntity<byte[]> sendWebRequest(String url, MultiValueMap<String, Object> body) {
|
||||
|
||||
@@ -40,8 +40,7 @@ public class RemoveCertSignController {
|
||||
@Operation(
|
||||
summary = "Remove digital signature from PDF",
|
||||
description =
|
||||
"This endpoint accepts a PDF file and returns the PDF file without the digital signature."
|
||||
+ " Input: PDF, Output: PDF")
|
||||
"This endpoint accepts a PDF file and returns the PDF file without the digital signature. Input:PDF, Output:PDF Type:SISO")
|
||||
public ResponseEntity<byte[]> removeCertSignPDF(@ModelAttribute PDFFile request)
|
||||
throws Exception {
|
||||
MultipartFile pdf = request.getFileInput();
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
package stirling.software.SPDF.model;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.core.io.Resource;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class PipelineResult {
|
||||
private List<Resource> outputFiles;
|
||||
private boolean hasErrors;
|
||||
private boolean filtersApplied;
|
||||
}
|
||||
@@ -1,10 +1,10 @@
|
||||
package stirling.software.SPDF.service;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Arrays;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.Arrays;
|
||||
|
||||
import org.springframework.core.io.Resource;
|
||||
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
|
||||
@@ -21,8 +21,7 @@ public class LanguageService {
|
||||
private final PathMatchingResourcePatternResolver resourcePatternResolver =
|
||||
new PathMatchingResourcePatternResolver();
|
||||
|
||||
public LanguageService(
|
||||
ApplicationProperties applicationProperties) {
|
||||
public LanguageService(ApplicationProperties applicationProperties) {
|
||||
this.applicationProperties = applicationProperties;
|
||||
}
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ public class FileToPdf {
|
||||
byte[] fileBytes,
|
||||
String fileName,
|
||||
boolean htmlFormatsInstalled,
|
||||
boolean disableSanitize)
|
||||
boolean disableSanitize)
|
||||
throws IOException, InterruptedException {
|
||||
|
||||
Path tempOutputFile = Files.createTempFile("output_", ".pdf");
|
||||
@@ -36,7 +36,9 @@ public class FileToPdf {
|
||||
try {
|
||||
if (fileName.endsWith(".html")) {
|
||||
tempInputFile = Files.createTempFile("input_", ".html");
|
||||
String sanitizedHtml = sanitizeHtmlContent(new String(fileBytes, StandardCharsets.UTF_8), disableSanitize);
|
||||
String sanitizedHtml =
|
||||
sanitizeHtmlContent(
|
||||
new String(fileBytes, StandardCharsets.UTF_8), disableSanitize);
|
||||
Files.write(tempInputFile, sanitizedHtml.getBytes(StandardCharsets.UTF_8));
|
||||
} else if (fileName.endsWith(".zip")) {
|
||||
tempInputFile = Files.createTempFile("input_", ".zip");
|
||||
@@ -93,7 +95,8 @@ public class FileToPdf {
|
||||
return (!disableSanitize) ? CustomHtmlSanitizer.sanitize(htmlContent) : htmlContent;
|
||||
}
|
||||
|
||||
private static void sanitizeHtmlFilesInZip(Path zipFilePath, boolean disableSanitize) throws IOException {
|
||||
private static void sanitizeHtmlFilesInZip(Path zipFilePath, boolean disableSanitize)
|
||||
throws IOException {
|
||||
Path tempUnzippedDir = Files.createTempDirectory("unzipped_");
|
||||
try (ZipInputStream zipIn =
|
||||
ZipSecurity.createHardenedInputStream(
|
||||
|
||||
@@ -587,9 +587,7 @@ public class GeneralUtils {
|
||||
for (byte b : hash) {
|
||||
fingerprint.append(String.format("%02x", b));
|
||||
}
|
||||
|
||||
return fingerprint.toString();
|
||||
|
||||
} catch (Exception e) {
|
||||
return "GenericID";
|
||||
}
|
||||
|
||||
@@ -218,6 +218,9 @@ public class ProcessExecutor {
|
||||
errorReaderThread.join();
|
||||
outputReaderThread.join();
|
||||
|
||||
boolean isQpdf =
|
||||
command != null && !command.isEmpty() && command.get(0).contains("qpdf");
|
||||
|
||||
if (outputLines.size() > 0) {
|
||||
String outputMessage = String.join("\n", outputLines);
|
||||
messages += outputMessage;
|
||||
@@ -233,20 +236,28 @@ public class ProcessExecutor {
|
||||
log.warn("Command error output:\n" + errorMessage);
|
||||
}
|
||||
if (exitCode != 0) {
|
||||
throw new IOException(
|
||||
"Command process failed with exit code "
|
||||
+ exitCode
|
||||
+ ". Error message: "
|
||||
+ errorMessage);
|
||||
if (isQpdf && exitCode == 3) {
|
||||
log.warn("qpdf succeeded with warnings: {}", messages);
|
||||
} else {
|
||||
throw new IOException(
|
||||
"Command process failed with exit code "
|
||||
+ exitCode
|
||||
+ ". Error message: "
|
||||
+ errorMessage);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (exitCode != 0) {
|
||||
throw new IOException(
|
||||
"Command process failed with exit code "
|
||||
+ exitCode
|
||||
+ "\nLogs: "
|
||||
+ messages);
|
||||
if (isQpdf && exitCode == 3) {
|
||||
log.warn("qpdf succeeded with warnings: {}", messages);
|
||||
} else {
|
||||
throw new IOException(
|
||||
"Command process failed with exit code "
|
||||
+ exitCode
|
||||
+ "\nLogs: "
|
||||
+ messages);
|
||||
}
|
||||
}
|
||||
} finally {
|
||||
semaphore.release();
|
||||
|
||||
@@ -623,6 +623,7 @@ 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
|
||||
|
||||
#showJS
|
||||
showJS.title=إظهار جافا سكريبت
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=ارفع ملف PDF الممسوح ضوئيًا الك
|
||||
autoSplitPDF.selectText.4=يتم اكتشاف صفحات الفاصل تلقائيًا وإزالتها، مما يضمن مستندًا نهائيًا نظيفًا.
|
||||
autoSplitPDF.formPrompt=أرسل ملف PDF يحتوي على فواصل صفحات Stirling-PDF:
|
||||
autoSplitPDF.duplexMode=وضع الطباعة على الوجهين (المسح الضوئي للوجه الأمامي والخلفي)
|
||||
autoSplitPDF.dividerDownload1=تنزيل 'فاصل التقسيم التلقائي (الحد الأدنى).pdf'
|
||||
autoSplitPDF.dividerDownload2=تنزيل 'فاصل التقسيم التلقائي (مع التعليمات).pdf'
|
||||
autoSplitPDF.submit=إرسال
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=تغيير
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF إلى PDF/A
|
||||
pdfToPDFA.header=PDF إلى PDF/A
|
||||
pdfToPDFA.credit=تستخدم هذه الخدمة qpdf لتحويل PDF/A.
|
||||
pdfToPDFA.credit=تستخدم هذه الخدمة libreoffice لتحويل PDF/A.
|
||||
pdfToPDFA.submit=تحويل
|
||||
pdfToPDFA.tip=لا يعمل حاليًا لمدخلات متعددة في وقت واحد
|
||||
pdfToPDFA.outputFormat=تنسيق الإخراج
|
||||
|
||||
@@ -623,6 +623,7 @@ 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
|
||||
|
||||
#showJS
|
||||
showJS.title=Javascripti Göstər
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Tək böyük skan edilmiş PDF faylını yükləyin v
|
||||
autoSplitPDF.selectText.4=Ayırıcı səhifələr avtomatik aşkarlanır və silinir, səliqəli yekun sənədə zəmanət verir.
|
||||
autoSplitPDF.formPrompt=Stirling-PDF ə Səhifə bölücüləri olan PDF-i təqdim edin:
|
||||
autoSplitPDF.duplexMode=Dupleks rejimi (Ön və arxa skanlama)
|
||||
autoSplitPDF.dividerDownload1='Auto Splitter Divider (minimal).pdf'-ı yükləyin
|
||||
autoSplitPDF.dividerDownload2='Auto Splitter Divider (with instructions).pdf'-ı yükləyin
|
||||
autoSplitPDF.submit=Təsdiq edin
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Dəyiş
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF-i PDF/A-ya
|
||||
pdfToPDFA.header=PDF-i PDF/A-ya
|
||||
pdfToPDFA.credit=Bu Servis PDF/A Çevirmək Üçün ghostscript İşlədir
|
||||
pdfToPDFA.credit=Bu Servis PDF/A Çevirmək Üçün libreoffice İşlədir
|
||||
pdfToPDFA.submit=Çevir
|
||||
pdfToPDFA.tip=Hazırda Birdən Çox Giriş Üçün İşləmir
|
||||
pdfToPDFA.outputFormat=Çıxış Formatı
|
||||
|
||||
@@ -623,6 +623,7 @@ 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
|
||||
|
||||
#showJS
|
||||
showJS.title=Покажи Javascript
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Качете единствения голям ска
|
||||
autoSplitPDF.selectText.4=Разделителните страници се откриват и премахват автоматично, което гарантира чист краен документ.
|
||||
autoSplitPDF.formPrompt=Изпратете PDF, съдържащ разделители на страници на Stirling-PDF:
|
||||
autoSplitPDF.duplexMode=Дуплексен режим (сканиране отпред и отзад)
|
||||
autoSplitPDF.dividerDownload1=Изтеглете 'Автоматичен сплитер разделител (минимален).pdf'
|
||||
autoSplitPDF.dividerDownload2=Изтеглете 'Автоматичен сплитер разделител (с инструкции).pdf'
|
||||
autoSplitPDF.submit=Подайте
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Промени
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF към PDF/A
|
||||
pdfToPDFA.header=PDF към PDF/A
|
||||
pdfToPDFA.credit=Тази услуга използва qpdf за PDF/A преобразуване.
|
||||
pdfToPDFA.credit=Тази услуга използва libreoffice за PDF/A преобразуване.
|
||||
pdfToPDFA.submit=Преобразуване
|
||||
pdfToPDFA.tip=В момента не работи за няколко входа наведнъж
|
||||
pdfToPDFA.outputFormat=Изходен формат
|
||||
|
||||
@@ -623,6 +623,7 @@ 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
|
||||
|
||||
#showJS
|
||||
showJS.title=Mostra Javascript
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Puja el fitxer PDF escanejat gran i deixa que Stirling
|
||||
autoSplitPDF.selectText.4=Les pàgines divisòries es detecten i eliminen automàticament, garantint un document final ordenat.
|
||||
autoSplitPDF.formPrompt=Envia un PDF que contingui les pàgines divisòries de Stirling-PDF:
|
||||
autoSplitPDF.duplexMode=Mode Dúplex (Escaneig de davant i darrere)
|
||||
autoSplitPDF.dividerDownload1=Descarrega 'Divisor Automàtic (mínim).pdf'
|
||||
autoSplitPDF.dividerDownload2=Descarrega 'Divisor Automàtic (amb instruccions).pdf'
|
||||
autoSplitPDF.submit=Envia
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Canvia
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF a PDF/A
|
||||
pdfToPDFA.header=PDF a PDF/A
|
||||
pdfToPDFA.credit=Utilitza qpdf per a la conversió a PDF/A
|
||||
pdfToPDFA.credit=Utilitza libreoffice per a la conversió a PDF/A
|
||||
pdfToPDFA.submit=Converteix
|
||||
pdfToPDFA.tip=Actualment no funciona per a múltiples entrades al mateix temps
|
||||
pdfToPDFA.outputFormat=Format de sortida
|
||||
|
||||
@@ -623,6 +623,7 @@ redact.showAttatchments=Zobrazit přílohy
|
||||
redact.showLayers=Zobrazit vrstvy (dvojklik pro obnovení všech vrstev do výchozího stavu)
|
||||
redact.colourPicker=Výběr barvy
|
||||
redact.findCurrentOutlineItem=Najít aktuální položku osnovy
|
||||
redact.applyChanges=Apply Changes
|
||||
|
||||
#showJS
|
||||
showJS.title=Zobrazit Javascript
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Nahrajte jediný velký naskenovaný PDF soubor a nech
|
||||
autoSplitPDF.selectText.4=Oddělovací stránky jsou automaticky detekovány a odstraněny, což zaručuje čistý finální dokument.
|
||||
autoSplitPDF.formPrompt=Odeslat PDF obsahující Stirling-PDF oddělovače stránek:
|
||||
autoSplitPDF.duplexMode=Duplexní režim (skenování přední a zadní strany)
|
||||
autoSplitPDF.dividerDownload1=Stáhnout 'Automatický oddělovač (minimální).pdf'
|
||||
autoSplitPDF.dividerDownload2=Stáhnout 'Automatický oddělovač (s instrukcemi).pdf'
|
||||
autoSplitPDF.submit=Odeslat
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Změnit
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF na PDF/A
|
||||
pdfToPDFA.header=PDF na PDF/A
|
||||
pdfToPDFA.credit=Tato služba používá qpdf pro konverzi do PDF/A
|
||||
pdfToPDFA.credit=Tato služba používá libreoffice pro konverzi do PDF/A
|
||||
pdfToPDFA.submit=Převést
|
||||
pdfToPDFA.tip=Momentálně nefunguje pro více vstupů najednou
|
||||
pdfToPDFA.outputFormat=Výstupní formát
|
||||
|
||||
@@ -623,6 +623,7 @@ 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
|
||||
|
||||
#showJS
|
||||
showJS.title=Vis Javascript
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Upload den enkelte store scannede PDF-fil og lad Stirl
|
||||
autoSplitPDF.selectText.4=Skillesider detekteres automatisk og fjernes, hvilket garanterer et pænt endeligt dokument.
|
||||
autoSplitPDF.formPrompt=Indsend PDF indeholdende Stirling-PDF Sideopdelere:
|
||||
autoSplitPDF.duplexMode=Duplex-tilstand (For- og bagside scanning)
|
||||
autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf'
|
||||
autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (med instruktioner).pdf'
|
||||
autoSplitPDF.submit=Indsend
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Ændre
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF Til PDF/A
|
||||
pdfToPDFA.header=PDF Til PDF/A
|
||||
pdfToPDFA.credit=Denne tjeneste bruger qpdf til PDF/A-konvertering
|
||||
pdfToPDFA.credit=Denne tjeneste bruger libreoffice til PDF/A-konvertering
|
||||
pdfToPDFA.submit=Konvertér
|
||||
pdfToPDFA.tip=Fungerer i øjeblikket ikke for flere input på én gang
|
||||
pdfToPDFA.outputFormat=Outputformat
|
||||
|
||||
@@ -623,6 +623,7 @@ redact.showAttatchments=Zeige Anhänge
|
||||
redact.showLayers=Ebenen anzeigen (Doppelklick, um alle Ebenen auf den Standardzustand zurückzusetzen)
|
||||
redact.colourPicker=Farbauswahl
|
||||
redact.findCurrentOutlineItem=Aktuell gewähltes Element finden
|
||||
redact.applyChanges=Apply Changes
|
||||
|
||||
#showJS
|
||||
showJS.title=Javascript anzeigen
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Laden Sie die einzelne große gescannte PDF-Datei hoch
|
||||
autoSplitPDF.selectText.4=Trennseiten werden automatisch erkannt und entfernt, so dass ein sauberes Enddokument garantiert ist.
|
||||
autoSplitPDF.formPrompt=PDF mit Stirling-PDF Seitentrennern hochladen:
|
||||
autoSplitPDF.duplexMode=Duplex-Modus (Scannen von Vorder- und Rückseite)
|
||||
autoSplitPDF.dividerDownload1=Herunterladen 'Auto Splitter Divider (minimal).pdf'
|
||||
autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (mit Anleitung).pdf'
|
||||
autoSplitPDF.submit=Aufteilen
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Ändern
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF zu PDF/A
|
||||
pdfToPDFA.header=PDF zu PDF/A
|
||||
pdfToPDFA.credit=Dieser Dienst verwendet qpdf für die PDF/A-Konvertierung
|
||||
pdfToPDFA.credit=Dieser Dienst verwendet libreoffice für die PDF/A-Konvertierung
|
||||
pdfToPDFA.submit=Konvertieren
|
||||
pdfToPDFA.tip=Dieser Dienst kann nur einzelne Eingangsdateien verarbeiten.
|
||||
pdfToPDFA.outputFormat=Ausgabeformat
|
||||
|
||||
@@ -623,6 +623,7 @@ redact.showAttatchments=Εμφάνιση συνημμένων
|
||||
redact.showLayers=Εμφάνιση επιπέδων (διπλό κλικ για επαναφορά όλων των επιπέδων στην προεπιλεγμένη κατάσταση)
|
||||
redact.colourPicker=Επιλογέας χρώματος
|
||||
redact.findCurrentOutlineItem=Εύρεση τρέχοντος στοιχείου περιγράμματος
|
||||
redact.applyChanges=Apply Changes
|
||||
|
||||
#showJS
|
||||
showJS.title=Εμφάνιση Javascript
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Μεταφορτώστε το ενιαίο μεγάλ
|
||||
autoSplitPDF.selectText.4=Οι σελίδες διαχωρισμού ανιχνεύονται και αφαιρούνται αυτόματα, εξασφαλίζοντας ένα καθαρό τελικό έγγραφο.
|
||||
autoSplitPDF.formPrompt=Υποβολή PDF που περιέχει διαχωριστές σελίδων Stirling-PDF:
|
||||
autoSplitPDF.duplexMode=Λειτουργία διπλής όψης (Σάρωση μπρος και πίσω)
|
||||
autoSplitPDF.dividerDownload1=Λήψη 'Αυτόματος διαχωριστής (ελάχιστος).pdf'
|
||||
autoSplitPDF.dividerDownload2=Λήψη 'Αυτόματος διαχωριστής (με οδηγίες).pdf'
|
||||
autoSplitPDF.submit=Υποβολή
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Αλλαγή
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF σε PDF/A
|
||||
pdfToPDFA.header=PDF σε PDF/A
|
||||
pdfToPDFA.credit=Αυτή η υπηρεσία χρησιμοποιεί qpdf για μετατροπή PDF/A
|
||||
pdfToPDFA.credit=Αυτή η υπηρεσία χρησιμοποιεί libreoffice για μετατροπή PDF/A
|
||||
pdfToPDFA.submit=Μετατροπή
|
||||
pdfToPDFA.tip=Προς το παρόν δεν λειτουργεί για πολλαπλές εισόδους ταυτόχρονα
|
||||
pdfToPDFA.outputFormat=Μορφή εξόδου
|
||||
|
||||
@@ -623,6 +623,7 @@ 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
|
||||
|
||||
#showJS
|
||||
showJS.title=Show Javascript
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirl
|
||||
autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document.
|
||||
autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers:
|
||||
autoSplitPDF.duplexMode=Duplex Mode (Front and back scanning)
|
||||
autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf'
|
||||
autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf'
|
||||
autoSplitPDF.submit=Submit
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Change
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF To PDF/A
|
||||
pdfToPDFA.header=PDF To PDF/A
|
||||
pdfToPDFA.credit=This service uses qpdf for PDF/A conversion
|
||||
pdfToPDFA.credit=This service uses libreoffice for PDF/A conversion
|
||||
pdfToPDFA.submit=Convert
|
||||
pdfToPDFA.tip=Currently does not work for multiple inputs at once
|
||||
pdfToPDFA.outputFormat=Output format
|
||||
|
||||
@@ -623,6 +623,7 @@ 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
|
||||
|
||||
#showJS
|
||||
showJS.title=Show Javascript
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Upload the single large scanned PDF file and let Stirl
|
||||
autoSplitPDF.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document.
|
||||
autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers:
|
||||
autoSplitPDF.duplexMode=Duplex Mode (Front and back scanning)
|
||||
autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf'
|
||||
autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf'
|
||||
autoSplitPDF.submit=Submit
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Change
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF To PDF/A
|
||||
pdfToPDFA.header=PDF To PDF/A
|
||||
pdfToPDFA.credit=This service uses qpdf for PDF/A conversion
|
||||
pdfToPDFA.credit=This service uses libreoffice for PDF/A conversion
|
||||
pdfToPDFA.submit=Convert
|
||||
pdfToPDFA.tip=Currently does not work for multiple inputs at once
|
||||
pdfToPDFA.outputFormat=Output format
|
||||
|
||||
@@ -623,6 +623,7 @@ 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
|
||||
|
||||
#showJS
|
||||
showJS.title=Mostrar Javascript
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Cargue un único archivo PDF escaneado de gran tamaño
|
||||
autoSplitPDF.selectText.4=Las páginas divisorias son automáticamente detectadas y eliminadas, garantizando un buen documento final.
|
||||
autoSplitPDF.formPrompt=Entregar PDF conteniendo divisores de página de Stirling-PDF:
|
||||
autoSplitPDF.duplexMode=Modo Dúplex (Escaneado de ambas caras)
|
||||
autoSplitPDF.dividerDownload1=Descargar 'Divisor automático (mínima).pdf'
|
||||
autoSplitPDF.dividerDownload2=Descargar 'Divisor automático (con instrucciones).pdf'
|
||||
autoSplitPDF.submit=Entregar
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Cambiar
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF a PDF/A
|
||||
pdfToPDFA.header=PDF a PDF/A
|
||||
pdfToPDFA.credit=Este servicio usa qpdf para la conversión a PDF/A
|
||||
pdfToPDFA.credit=Este servicio usa libreoffice para la conversión a PDF/A
|
||||
pdfToPDFA.submit=Convertir
|
||||
pdfToPDFA.tip=Actualmente no funciona para múltiples entrada a la vez
|
||||
pdfToPDFA.outputFormat=Formato de salida
|
||||
|
||||
@@ -623,6 +623,7 @@ 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
|
||||
|
||||
#showJS
|
||||
showJS.title=Javascript erakutsi
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Igo eskaneatutako PDF artxibo handia, eta utzi Stirlin
|
||||
autoSplitPDF.selectText.4=Orrialde zatitzaileak automatikoki detektatu eta kentzen dira, eta azken dokumentu ordenatua bermatzen da.
|
||||
autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers:
|
||||
autoSplitPDF.duplexMode=Duplex Mode (Front and back scanning)Duplex modua (aurreko eta atzeko azterketa)
|
||||
autoSplitPDF.dividerDownload1=Deskargatu 'Auto Splitter Divider (minimal).pdf'
|
||||
autoSplitPDF.dividerDownload2=Deskargatu 'Auto Splitter Divider (with instructions).pdf'
|
||||
autoSplitPDF.submit=Bidali
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Aldatu
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDFa PDF/A bihurtu
|
||||
pdfToPDFA.header=PDFa PDF/A bihurtu
|
||||
pdfToPDFA.credit=Zerbitzu honek qpdf erabiltzen du PDFak PDF/A bihurtzeko
|
||||
pdfToPDFA.credit=Zerbitzu honek libreoffice erabiltzen du PDFak PDF/A bihurtzeko
|
||||
pdfToPDFA.submit=Bihurtu
|
||||
pdfToPDFA.tip=Currently does not work for multiple inputs at once
|
||||
pdfToPDFA.outputFormat=Output format
|
||||
|
||||
@@ -623,6 +623,7 @@ 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
|
||||
|
||||
#showJS
|
||||
showJS.title=نمایش جاوااسکریپت
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=فایل PDF بزرگ اسکن شده را بارگذ
|
||||
autoSplitPDF.selectText.4=صفحات جداکننده به طور خودکار تشخیص داده و حذف میشوند، تضمینکننده یک سند نهایی منظم.
|
||||
autoSplitPDF.formPrompt=PDF حاوی جداکنندههای Stirling-PDF را ارسال کنید:
|
||||
autoSplitPDF.duplexMode=حالت دوبلکس (اسکن جلو و عقب)
|
||||
autoSplitPDF.dividerDownload1=دانلود 'Auto Splitter Divider (minimal).pdf'
|
||||
autoSplitPDF.dividerDownload2=دانلود 'Auto Splitter Divider (with instructions).pdf'
|
||||
autoSplitPDF.submit=ارسال
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=تغییر
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF به PDF/A
|
||||
pdfToPDFA.header=PDF به PDF/A
|
||||
pdfToPDFA.credit=این سرویس از qpdf برای تبدیل PDF/A استفاده میکند
|
||||
pdfToPDFA.credit=این سرویس از libreoffice برای تبدیل PDF/A استفاده میکند
|
||||
pdfToPDFA.submit=تبدیل
|
||||
pdfToPDFA.tip=در حال حاضر برای چندین ورودی به طور همزمان کار نمیکند
|
||||
pdfToPDFA.outputFormat=فرمت خروجی
|
||||
|
||||
@@ -138,7 +138,7 @@ analytics.settings=Vous pouvez modifier les paramètres des analyses dans le fic
|
||||
# NAVBAR #
|
||||
#############
|
||||
navbar.favorite=Favoris
|
||||
navbar.recent=New and recently updated
|
||||
navbar.recent=Nouveau et mise à jour
|
||||
navbar.darkmode=Mode sombre
|
||||
navbar.language=Langues
|
||||
navbar.settings=Paramètres
|
||||
@@ -266,14 +266,14 @@ home.viewPdf.title=Visionner le PDF
|
||||
home.viewPdf.desc=Visionner, annoter, ajouter du texte ou des images.
|
||||
viewPdf.tags=visualiser,lire,annoter,texte,image
|
||||
|
||||
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=Ajouter des favoris
|
||||
home.hideFavorites=Cacher les favoris
|
||||
home.showFavorites=Montrer les favoris
|
||||
home.legacyHomepage=Ancienne Homepage
|
||||
home.newHomePage=Essayez notre nouvelle Homepage !
|
||||
home.alphabetical=Alphabétique
|
||||
home.globalPopularity=Popularité globale
|
||||
home.sortBy=Trier par :
|
||||
|
||||
home.multiTool.title=Outil multifonction PDF
|
||||
home.multiTool.desc=Fusionnez, faites pivoter, réorganisez et supprimez des pages.
|
||||
@@ -623,6 +623,7 @@ redact.showAttatchments=Montrer les éléments attachés
|
||||
redact.showLayers=Montrer les calques (double-click pour réinitialiser tous les calques à l'état par défaut)
|
||||
redact.colourPicker=Sélection de couleur
|
||||
redact.findCurrentOutlineItem=Trouver l'élément de contour courrant
|
||||
redact.applyChanges=Apply Changes
|
||||
|
||||
#showJS
|
||||
showJS.title=Afficher le JavaScript
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Téléchargez le fichier PDF numérisé et laissez Sti
|
||||
autoSplitPDF.selectText.4=Les feuilles de séparation sont automatiquement détectées et supprimées, garantissant un document final soigné.
|
||||
autoSplitPDF.formPrompt=PDF contenant des feuilles de séparation de Stirling PDF :
|
||||
autoSplitPDF.duplexMode=Mode recto-verso
|
||||
autoSplitPDF.dividerDownload1=Auto Splitter Divider (minimal).pdf
|
||||
autoSplitPDF.dividerDownload2=Auto Splitter Divider (with instructions).pdf
|
||||
autoSplitPDF.submit=Séparer
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Modifier
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF en PDF/A
|
||||
pdfToPDFA.header=PDF en PDF/A
|
||||
pdfToPDFA.credit=Ce service utilise qpdf pour la conversion en PDF/A.
|
||||
pdfToPDFA.credit=Ce service utilise libreoffice pour la conversion en PDF/A.
|
||||
pdfToPDFA.submit=Convertir
|
||||
pdfToPDFA.tip=Ne fonctionne actuellement pas pour plusieurs entrées à la fois
|
||||
pdfToPDFA.outputFormat=Format de sortie
|
||||
|
||||
@@ -623,6 +623,7 @@ redact.showAttatchments=Taispeáin Ceangaltáin
|
||||
redact.showLayers=Taispeáin Sraitheanna (cliceáil faoi dhó chun gach sraith a athshocrú go dtí an staid réamhshocraithe)
|
||||
redact.colourPicker=Roghnóir Dathanna
|
||||
redact.findCurrentOutlineItem=Faigh imlíne reatha
|
||||
redact.applyChanges=Apply Changes
|
||||
|
||||
#showJS
|
||||
showJS.title=Taispeáin Javascript
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Uaslódáil an comhad PDF mór scanta amháin agus lig
|
||||
autoSplitPDF.selectText.4=Déantar leathanaigh roinnteoirí a bhrath agus a bhaint go huathoibríoch, rud a ráthaíonn doiciméad deiridh néata.
|
||||
autoSplitPDF.formPrompt=Cuir PDF isteach ina bhfuil roinnteoirí Leathanaigh Stirling-PDF:
|
||||
autoSplitPDF.duplexMode=Mód Duplex (scanadh tosaigh agus cúil)
|
||||
autoSplitPDF.dividerDownload1=Íoslódáil 'Auto Scoilteoir Roinnteoir (íosmhéid).pdf'
|
||||
autoSplitPDF.dividerDownload2=Íoslódáil 'Auto Splitter Divider (le treoracha).pdf'
|
||||
autoSplitPDF.submit=Cuir isteach
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Athrú
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF Go PDF/A
|
||||
pdfToPDFA.header=PDF Go PDF/A
|
||||
pdfToPDFA.credit=Úsáideann an tseirbhís seo qpdf chun PDF/A a thiontú
|
||||
pdfToPDFA.credit=Úsáideann an tseirbhís seo libreoffice chun PDF/A a thiontú
|
||||
pdfToPDFA.submit=Tiontaigh
|
||||
pdfToPDFA.tip=Faoi láthair ní oibríonn sé le haghaidh ionchuir iolracha ag an am céanna
|
||||
pdfToPDFA.outputFormat=Formáid aschuir
|
||||
|
||||
@@ -623,6 +623,7 @@ redact.showAttatchments=अटैचमेंट दिखाएं
|
||||
redact.showLayers=लेयर्स दिखाएं (सभी लेयर्स को डिफ़ॉल्ट स्थिति में रीसेट करने के लिए डबल-क्लिक करें)
|
||||
redact.colourPicker=रंग चयनकर्ता
|
||||
redact.findCurrentOutlineItem=वर्तमान आउटलाइन आइटम खोजें
|
||||
redact.applyChanges=Apply Changes
|
||||
|
||||
#showJS
|
||||
showJS.title=जावास्क्रिप्ट दिखाएं
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=एक बड़ी स्कैन की गई PDF
|
||||
autoSplitPDF.selectText.4=विभाजक पृष्ठ स्वचालित रूप से पहचाने जाते हैं और हटा दिए जाते हैं, एक साफ अंतिम दस्तावेज़ सुनिश्चित करते हैं।
|
||||
autoSplitPDF.formPrompt=Stirling-PDF पृष्ठ विभाजक वाली PDF जमा करें:
|
||||
autoSplitPDF.duplexMode=डुप्लेक्स मोड (सामने और पीछे स्कैनिंग)
|
||||
autoSplitPDF.dividerDownload1='स्वतः विभाजक (न्यूनतम).pdf' डाउनलोड करें
|
||||
autoSplitPDF.dividerDownload2='स्वतः विभाजक (निर्देशों के साथ).pdf' डाउनलोड करें
|
||||
autoSplitPDF.submit=जमा करें
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=बदलें
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF से PDF/A
|
||||
pdfToPDFA.header=PDF से PDF/A
|
||||
pdfToPDFA.credit=यह सेवा PDF/A रूपांतरण के लिए qpdf का उपयोग करती है
|
||||
pdfToPDFA.credit=यह सेवा PDF/A रूपांतरण के लिए libreoffice का उपयोग करती है
|
||||
pdfToPDFA.submit=बदलें
|
||||
pdfToPDFA.tip=वर्तमान में एक बार में कई इनपुट के लिए काम नहीं करता
|
||||
pdfToPDFA.outputFormat=आउटपुट प्रारूप
|
||||
|
||||
@@ -623,6 +623,7 @@ 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
|
||||
|
||||
#showJS
|
||||
showJS.title=Prikaži Javascript
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Prenesite jednu veliku skeniranu PDF datoteku i pustit
|
||||
autoSplitPDF.selectText.4=Razdjelne stranice automatski se otkrivaju i uklanjaju, jamčeći uredan konačni dokument.
|
||||
autoSplitPDF.formPrompt=Pošaljite PDF koji sadrži naše razdjelnike stranica:
|
||||
autoSplitPDF.duplexMode=Obostrani način rada (skeniranje s prednje i stražnje strane)
|
||||
autoSplitPDF.dividerDownload1=Preuzmite 'Auto Splitter Divider (minimalan).pdf'
|
||||
autoSplitPDF.dividerDownload2=Preuzmite 'Auto Splitter Divider (s uputama).pdf'
|
||||
autoSplitPDF.submit=Potvrdi
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Promijeniti
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF u PDF/A
|
||||
pdfToPDFA.header=PDF u PDF/A
|
||||
pdfToPDFA.credit=Ova usluga koristi qpdf za PDF/A pretvorbu
|
||||
pdfToPDFA.credit=Ova usluga koristi libreoffice za PDF/A pretvorbu
|
||||
pdfToPDFA.submit=Pretvoriti
|
||||
pdfToPDFA.tip=Trenutno ne radi za više unosa odjednom
|
||||
pdfToPDFA.outputFormat=Izlazni format
|
||||
|
||||
@@ -623,6 +623,7 @@ 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
|
||||
|
||||
#showJS
|
||||
showJS.title=JavaScript megjelenítése
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Töltse fel az egyetlen nagy szkennelt PDF fájlt, és
|
||||
autoSplitPDF.selectText.4=Az elválasztólapokat automatikusan felismeri és eltávolítja, garantálva a rendezett végeredményt.
|
||||
autoSplitPDF.formPrompt=Töltse fel a Stirling-PDF oldalelválasztókat tartalmazó PDF-et:
|
||||
autoSplitPDF.duplexMode=Duplex mód (Elő- és hátoldali szkennelés)
|
||||
autoSplitPDF.dividerDownload1='Automatikus elválasztó (minimális).pdf' letöltése
|
||||
autoSplitPDF.dividerDownload2='Automatikus elválasztó (utasításokkal).pdf' letöltése
|
||||
autoSplitPDF.submit=Küldés
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Módosítás
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF konvertálása PDF/A formátumba
|
||||
pdfToPDFA.header=PDF konvertálása PDF/A formátumba
|
||||
pdfToPDFA.credit=Ez a szolgáltatás a qpdf használatával végzi a PDF/A konverziót
|
||||
pdfToPDFA.credit=Ez a szolgáltatás a libreoffice használatával végzi a PDF/A konverziót
|
||||
pdfToPDFA.submit=Konvertálás
|
||||
pdfToPDFA.tip=Jelenleg nem támogatja a több fájl egyidejű feldolgozását
|
||||
pdfToPDFA.outputFormat=Kimeneti formátum
|
||||
|
||||
@@ -623,6 +623,7 @@ 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
|
||||
|
||||
#showJS
|
||||
showJS.title=Tampilkan Javascript
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Unggah satu berkas PDF besar yang dipindai dan biarkan
|
||||
autoSplitPDF.selectText.4=Halaman pembatas secara otomatis terdeteksi dan dihapus, menjamin dokumen akhir yang rapi.
|
||||
autoSplitPDF.formPrompt=Kirimkan PDF yang berisi pembagi Halaman Stirling-PDF:
|
||||
autoSplitPDF.duplexMode=Mode Dupleks (Pemindaian depan dan belakang)
|
||||
autoSplitPDF.dividerDownload1=Unduh 'Pembagi Pembagi Otomatis (minimal).pdf'
|
||||
autoSplitPDF.dividerDownload2=Unduh 'Pembagi Pembagi Otomatis (dengan instruksi).pdf'
|
||||
autoSplitPDF.submit=Kirim
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Ganti
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF Ke PDF/A
|
||||
pdfToPDFA.header=PDF ke PDF/A
|
||||
pdfToPDFA.credit=Layanan ini menggunakan qpdf untuk konversi PDF/A.
|
||||
pdfToPDFA.credit=Layanan ini menggunakan libreoffice untuk konversi PDF/A.
|
||||
pdfToPDFA.submit=Konversi
|
||||
pdfToPDFA.tip=Saat ini tidak dapat digunakan untuk beberapa input sekaligus
|
||||
pdfToPDFA.outputFormat=Format keluaran
|
||||
|
||||
@@ -27,7 +27,7 @@ bored=Stanco di aspettare?
|
||||
alphabet=Alfabeto
|
||||
downloadPdf=Scarica PDF
|
||||
text=Testo
|
||||
font=Fonte
|
||||
font=Font
|
||||
selectFillter=-- Seleziona --
|
||||
pageNum=Numero pagina
|
||||
sizes.small=Piccolo
|
||||
@@ -272,8 +272,8 @@ home.showFavorites=Mostra preferiti
|
||||
home.legacyHomepage=Vecchia homepage
|
||||
home.newHomePage=Prova la nostra nuova homepage!
|
||||
home.alphabetical=Alfabetico
|
||||
home.globalPopularity=Popolarità globale
|
||||
home.sortBy=Sort by:
|
||||
home.globalPopularity=Popolarità
|
||||
home.sortBy=Ordinamento:
|
||||
|
||||
home.multiTool.title=Multifunzione PDF
|
||||
home.multiTool.desc=Unisci, Ruota, Riordina, e Rimuovi pagine
|
||||
@@ -623,6 +623,7 @@ redact.showAttatchments=Mostra allegati
|
||||
redact.showLayers=Mostra livelli (fare doppio clic per ripristinare tutti i livelli allo stato predefinito)
|
||||
redact.colourPicker=Selettore colore
|
||||
redact.findCurrentOutlineItem=Trova l'elemento di contorno corrente
|
||||
redact.applyChanges=Applica modifiche
|
||||
|
||||
#showJS
|
||||
showJS.title=Mostra Javascript
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Carica il singolo file PDF scansionato di grandi dimen
|
||||
autoSplitPDF.selectText.4=Le pagine divisorie vengono rilevate e rimosse automaticamente, garantendo un documento finale ordinato.
|
||||
autoSplitPDF.formPrompt=Invia PDF contenente divisori di pagina Stirling-PDF:
|
||||
autoSplitPDF.duplexMode=Modalità duplex (scansione fronte e retro)
|
||||
autoSplitPDF.dividerDownload1=Scarica 'Divisore automatico (minimo).pdf'
|
||||
autoSplitPDF.dividerDownload2=Scarica 'Divisore automatico (con istruzioni).pdf'
|
||||
autoSplitPDF.submit=Invia
|
||||
|
||||
@@ -926,7 +926,7 @@ ocr.selectText.10=Modalità OCR
|
||||
ocr.selectText.11=Rimuovi immagini dopo la scansione (Rimuove TUTTE le immagini, utile solo come parte del processo di conversione)
|
||||
ocr.selectText.12=Modalità di rendering (avanzato)
|
||||
ocr.help=Per favore leggi la documentazione su come usare il programma per altri linguaggi e/o uso non in Docker
|
||||
ocr.credit=Questo servizio utilizza qpdf e Tesseract per l'OCR.
|
||||
ocr.credit=Questo servizio utilizza Qpdf e Tesseract per l'OCR.
|
||||
ocr.submit=Scansiona testo nel PDF con OCR
|
||||
|
||||
|
||||
@@ -952,7 +952,7 @@ compress.title=Comprimi
|
||||
compress.header=Comprimi PDF
|
||||
compress.credit=Questo servizio utilizza qpdf per la compressione/ottimizzazione dei PDF.
|
||||
compress.selectText.1=Modalità manuale - Da 1 a 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=Nei livelli di ottimizzazione da 6 a 9, oltre alla compressione PDF generale, la risoluzione dell'immagine viene ridotta per ridurre ulteriormente le dimensioni del file. Livelli più alti comportano una compressione dell'immagine più forte (fino al 50% delle dimensioni originali), ottenendo una maggiore riduzione delle dimensioni ma con una potenziale perdita di qualità nelle immagini.
|
||||
compress.selectText.2=Livello di ottimizzazione:
|
||||
compress.selectText.3=4 (Terribile per le immagini di testo)
|
||||
compress.selectText.4=Modalità automatica - Regola automaticamente la qualità per ottenere le dimensioni esatte del PDF
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Cambia proprietà
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=Da PDF a PDF/A
|
||||
pdfToPDFA.header=Da PDF a PDF/A
|
||||
pdfToPDFA.credit=Questo servizio utilizza qpdf per la conversione in PDF/A.
|
||||
pdfToPDFA.credit=Questo servizio utilizza libreoffice per la conversione in PDF/A.
|
||||
pdfToPDFA.submit=Converti
|
||||
pdfToPDFA.tip=Attualmente non funziona per più input contemporaneamente
|
||||
pdfToPDFA.outputFormat=Formato di output
|
||||
|
||||
@@ -623,6 +623,7 @@ redact.showAttatchments=添付ファイルを表示
|
||||
redact.showLayers=レイヤーを表示(ダブルクリックするとすべてのレイヤーがデフォルトの状態にリセットされます)
|
||||
redact.colourPicker=カラー選択
|
||||
redact.findCurrentOutlineItem=現在のアウトライン項目を検索
|
||||
redact.applyChanges=Apply Changes
|
||||
|
||||
#showJS
|
||||
showJS.title=Javascriptを表示
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=スキャンしたPDFファイルをアップロード
|
||||
autoSplitPDF.selectText.4=仕切りページは自動的に検出、削除されるので、最終的な文書はきれいに仕上がります。
|
||||
autoSplitPDF.formPrompt=Stirling-PDF仕切り用紙を含むPDFを送信:
|
||||
autoSplitPDF.duplexMode=両面モード (表裏スキャン)
|
||||
autoSplitPDF.dividerDownload1=ダウンロード '自動仕切り用紙 (最小).pdf'
|
||||
autoSplitPDF.dividerDownload2=ダウンロード '自動仕切り用紙 (手順書付き).pdf'
|
||||
autoSplitPDF.submit=送信
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=変更
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDFをPDF/Aに変換
|
||||
pdfToPDFA.header=PDFをPDF/Aに変換
|
||||
pdfToPDFA.credit=本サービスはPDF/Aの変換にqpdfを使用しています。
|
||||
pdfToPDFA.credit=本サービスはPDF/Aの変換にlibreofficeを使用しています。
|
||||
pdfToPDFA.submit=変換
|
||||
pdfToPDFA.tip=現在、一度に複数の入力に対して機能しません
|
||||
pdfToPDFA.outputFormat=出力形式
|
||||
|
||||
@@ -623,6 +623,7 @@ redact.showAttatchments=첨부 파일 보기
|
||||
redact.showLayers=레이어 보기 (더블클릭하여 모든 레이어를 기본 상태로 재설정)
|
||||
redact.colourPicker=색상 선택기
|
||||
redact.findCurrentOutlineItem=현재 개요 항목 찾기
|
||||
redact.applyChanges=Apply Changes
|
||||
|
||||
#showJS
|
||||
showJS.title=JavaScript 보기
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=스캔한 단일 PDF 파일을 업로드하고 나머
|
||||
autoSplitPDF.selectText.4=구분자 페이지는 자동으로 감지되고 제거되어 깔끔한 최종 문서를 보장합니다.
|
||||
autoSplitPDF.formPrompt=Stirling-PDF 페이지 구분자가 포함된 PDF 제출:
|
||||
autoSplitPDF.duplexMode=양면 모드 (앞뒷면 스캔)
|
||||
autoSplitPDF.dividerDownload1='자동 분할 구분자 (최소)' PDF 다운로드
|
||||
autoSplitPDF.dividerDownload2='자동 분할 구분자 (설명 포함)' PDF 다운로드
|
||||
autoSplitPDF.submit=제출
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=변경
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF를 PDF/A로
|
||||
pdfToPDFA.header=PDF를 PDF/A로
|
||||
pdfToPDFA.credit=이 서비스는 PDF/A 변환을 위해 qpdf를 사용합니다
|
||||
pdfToPDFA.credit=이 서비스는 PDF/A 변환을 위해 libreoffice를 사용합니다
|
||||
pdfToPDFA.submit=변환
|
||||
pdfToPDFA.tip=현재 여러 입력을 한 번에 처리할 수 없습니다
|
||||
pdfToPDFA.outputFormat=출력 형식
|
||||
|
||||
@@ -623,6 +623,7 @@ 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
|
||||
|
||||
#showJS
|
||||
showJS.title=Toon Javascript
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Upload het enkele grote gescande PDF-bestand en laat S
|
||||
autoSplitPDF.selectText.4=Scheidingspagina's worden automatisch gedetecteerd en verwijderd, wat een net einddocument garandeert.
|
||||
autoSplitPDF.formPrompt=Dien PDF in met Stirling-PDF Pagina-scheiders:
|
||||
autoSplitPDF.duplexMode=Duplex Modus (voor- en achterkant scannen)
|
||||
autoSplitPDF.dividerDownload1=Download 'Auto Splitter Divider (minimal).pdf'
|
||||
autoSplitPDF.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf'
|
||||
autoSplitPDF.submit=Indienen
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Wijzigen
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF naar PDF/A
|
||||
pdfToPDFA.header=PDF naar PDF/A
|
||||
pdfToPDFA.credit=Deze service gebruikt qpdf voor PDF/A-conversie
|
||||
pdfToPDFA.credit=Deze service gebruikt libreoffice voor PDF/A-conversie
|
||||
pdfToPDFA.submit=Converteren
|
||||
pdfToPDFA.tip=Werkt momenteel niet voor meerdere inputs tegelijkertijd.
|
||||
pdfToPDFA.outputFormat=Uitvoerindeling
|
||||
|
||||
@@ -623,6 +623,7 @@ 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
|
||||
|
||||
#showJS
|
||||
showJS.title=Vis Javascript
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Last opp den enkelte store skannede PDF-filen og la St
|
||||
autoSplitPDF.selectText.4=Delingssidene blir automatisk oppdaget og fjernet, og garanterer et pent endelig dokument.
|
||||
autoSplitPDF.formPrompt=Send inn PDF som inneholder Stirling-PDF-sideskillere:
|
||||
autoSplitPDF.duplexMode=Dupleksmodus (Front- og bakskanning)
|
||||
autoSplitPDF.dividerDownload1=Last ned 'Auto Splitter Divider (minimal).pdf'
|
||||
autoSplitPDF.dividerDownload2=Last ned 'Auto Splitter Divider (med instruksjoner).pdf'
|
||||
autoSplitPDF.submit=Send inn
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Endre
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF til PDF/A
|
||||
pdfToPDFA.header=PDF til PDF/A
|
||||
pdfToPDFA.credit=Denne tjenesten bruker qpdf for PDF/A-konvertering
|
||||
pdfToPDFA.credit=Denne tjenesten bruker libreoffice for PDF/A-konvertering
|
||||
pdfToPDFA.submit=Konverter
|
||||
pdfToPDFA.tip=Fungere for øyeblikket ikke for flere innganger samtidig
|
||||
pdfToPDFA.outputFormat=Utdataformat
|
||||
|
||||
@@ -623,6 +623,7 @@ 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
|
||||
|
||||
#showJS
|
||||
showJS.title=Pokaż Javascript
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Wyślij pojedynczy duży plik PDF zawierający skan i
|
||||
autoSplitPDF.selectText.4=Strony separacji są automatycznie wykrywane i usuwane, gwarantując ładny finalny dokument.
|
||||
autoSplitPDF.formPrompt=Wyślij dokument PDF zawierający strony podziału z Stirling PDF.
|
||||
autoSplitPDF.duplexMode=Skanowanie dwustronne
|
||||
autoSplitPDF.dividerDownload1=Pobierz 'Auto Splitter Divider (minimal).pdf'
|
||||
autoSplitPDF.dividerDownload2=Pobierz 'Auto Splitter Divider (with instructions).pdf'
|
||||
autoSplitPDF.submit=Wyślij
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Zmień
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF na PDF/A
|
||||
pdfToPDFA.header=PDF na PDF/A
|
||||
pdfToPDFA.credit=Ta usługa używa qpdf do konwersji PDF/A
|
||||
pdfToPDFA.credit=Ta usługa używa libreoffice do konwersji PDF/A
|
||||
pdfToPDFA.submit=Konwertuj
|
||||
pdfToPDFA.tip=Tylko jeden plik na raz
|
||||
pdfToPDFA.outputFormat=Format wyjściowy:
|
||||
|
||||
@@ -138,7 +138,7 @@ analytics.settings=Você pode alterar as configurações de coleta de dados no a
|
||||
# NAVBAR #
|
||||
#############
|
||||
navbar.favorite=Favoritos
|
||||
navbar.recent=New and recently updated
|
||||
navbar.recent=Novos e Recentemente Atualizados
|
||||
navbar.darkmode=Modo Escuro
|
||||
navbar.language=Idiomas
|
||||
navbar.settings=Configurações
|
||||
@@ -266,14 +266,14 @@ home.viewPdf.title=Visualizar PDF
|
||||
home.viewPdf.desc=Visualizar, anotar, adicionar texto ou imagens ao PDF.
|
||||
viewPdf.tags=visualizar,ler,anotar,texto,imagem
|
||||
|
||||
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=Adicionar Favoritos
|
||||
home.hideFavorites=Ocultar Favoritos
|
||||
home.showFavorites=Mostrar Favoritos
|
||||
home.legacyHomepage=Homepage Antiga
|
||||
home.newHomePage=Experimente nossa nova Homepage!
|
||||
home.alphabetical=Alfabética
|
||||
home.globalPopularity=Popularidade Global
|
||||
home.sortBy=Ordenar por:
|
||||
|
||||
home.multiTool.title=Multiferramentas de PDF
|
||||
home.multiTool.desc=Mesclar, girar, reorganizar, dividir, inserir e remover páginas.
|
||||
@@ -417,7 +417,7 @@ home.pageLayout.title=Layout de Múltiplas Páginas
|
||||
home.pageLayout.desc=Mesclar várias páginas de um documento PDF em uma única página.
|
||||
pageLayout.tags=mesclar,composto,vista-única,organizar
|
||||
|
||||
home.scalePages.title=Ajustar Tamanho/Escala da Página
|
||||
home.scalePages.title=Ajustar Dimensões da Página
|
||||
home.scalePages.desc=Alterar o tamanho/escala da página e/ou seu conteúdo.
|
||||
scalePages.tags=redimensionar,modificar,dimensão,adaptar
|
||||
|
||||
@@ -429,7 +429,7 @@ home.add-page-numbers.title=Adicionar Números de Página
|
||||
home.add-page-numbers.desc=Adicionar números de página no documento, em um local definido.
|
||||
add-page-numbers.tags=paginar,rotular,organizar,índice
|
||||
|
||||
home.auto-rename.title=Renomear Automaticamente o PDF
|
||||
home.auto-rename.title=Renomeação Automática do PDF
|
||||
home.auto-rename.desc=Renomeia automaticamente o PDF com base no cabeçalho detectado.
|
||||
auto-rename.tags=detecção-automática,baseado-em-cabeçalho,organizar,relabel
|
||||
|
||||
@@ -623,6 +623,7 @@ redact.showAttatchments=Mostrar Anexos
|
||||
redact.showLayers=Mostrar Camadas (duplo clique para restabelecer as camadas para o estado padrão)
|
||||
redact.colourPicker=Seletor de Cores
|
||||
redact.findCurrentOutlineItem=Encontrar item atual
|
||||
redact.applyChanges=Apply Changes
|
||||
|
||||
#showJS
|
||||
showJS.title=Mostrar JavaScript
|
||||
@@ -738,8 +739,8 @@ addPageNumbers.submit=Adicionar Números de Página
|
||||
|
||||
|
||||
#auto-rename
|
||||
auto-rename.title=Renomear Automaticamente o PDF
|
||||
auto-rename.header=Renomear Automaticamente o PDF
|
||||
auto-rename.title=Renomeação Automática do PDF
|
||||
auto-rename.header=Renomeação Automática do PDF
|
||||
auto-rename.submit=Renomeação Automática
|
||||
|
||||
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Faça o upload do arquivo único PDF digitalizado e de
|
||||
autoSplitPDF.selectText.4=As páginas divisórias são detectadas e removidas automaticamente, garantindo um documento final organizado.
|
||||
autoSplitPDF.formPrompt=Enviar PDF contendo folhas divisórias Stirling-PDF:
|
||||
autoSplitPDF.duplexMode=Modo Duplex (Digitalização frente e verso).
|
||||
autoSplitPDF.dividerDownload1=Baixar 'Folha Divisória Automática (mínimo).pdf'
|
||||
autoSplitPDF.dividerDownload2=Baixar 'Folha Divisória Automática (com instruções).pdf'
|
||||
autoSplitPDF.submit=Enviar
|
||||
|
||||
@@ -786,8 +786,8 @@ pageLayout.submit=Enviar
|
||||
|
||||
|
||||
#scalePages
|
||||
scalePages.title=Ajustar Tamanho/Escala da Página
|
||||
scalePages.header=Ajustar Tamanho/Escala da Página
|
||||
scalePages.title=Ajustar Dimensões da Página
|
||||
scalePages.header=Ajustar Dimensões da Página
|
||||
scalePages.pageSize=Tamanho desejado do documento:
|
||||
scalePages.keepPageSize=Tamanho Original
|
||||
scalePages.scaleFactor=Fator de zoom (corte) de uma página:
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Alterar
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF para PDF/A
|
||||
pdfToPDFA.header=PDF para PDF/A
|
||||
pdfToPDFA.credit=Este serviço usa Qpdf para conversão para PDF/A.
|
||||
pdfToPDFA.credit=Este serviço usa o LibreOffice para conversão para PDF/A.
|
||||
pdfToPDFA.submit=Converter
|
||||
pdfToPDFA.tip=Atenção, atualmente não funciona para múltiplas entradas ao mesmo tempo.
|
||||
pdfToPDFA.outputFormat=Formato de saída:
|
||||
|
||||
@@ -623,6 +623,7 @@ redact.showAttatchments=Mostrar Anexos
|
||||
redact.showLayers=Mostrar Camadas (duplo clique para repor todas as camadas para o estado predefinido)
|
||||
redact.colourPicker=Seletor de Cor
|
||||
redact.findCurrentOutlineItem=Encontrar item atual do esquema
|
||||
redact.applyChanges=Apply Changes
|
||||
|
||||
#showJS
|
||||
showJS.title=Mostrar Javascript
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Carregue o único ficheiro PDF digitalizado grande e d
|
||||
autoSplitPDF.selectText.4=As páginas separadoras são automaticamente detetadas e removidas, garantindo um documento final organizado.
|
||||
autoSplitPDF.formPrompt=Submeter PDF contendo separadores de página Stirling-PDF:
|
||||
autoSplitPDF.duplexMode=Modo Duplex (Digitalização frente e verso)
|
||||
autoSplitPDF.dividerDownload1=Transferir 'Separador de Divisão Automática (minimal).pdf'
|
||||
autoSplitPDF.dividerDownload2=Transferir 'Separador de Divisão Automática (com instruções).pdf'
|
||||
autoSplitPDF.submit=Submeter
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Alterar
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF Para PDF/A
|
||||
pdfToPDFA.header=PDF Para PDF/A
|
||||
pdfToPDFA.credit=Este serviço usa qpdf para conversão PDF/A
|
||||
pdfToPDFA.credit=Este serviço usa libreoffice para conversão PDF/A
|
||||
pdfToPDFA.submit=Converter
|
||||
pdfToPDFA.tip=Atualmente não funciona para múltiplas entradas de uma só vez
|
||||
pdfToPDFA.outputFormat=Formato de saída
|
||||
|
||||
@@ -623,6 +623,7 @@ 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
|
||||
|
||||
#showJS
|
||||
showJS.title=Arată Javascript
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Încarcă fișierul PDF scanat mare și lasă Stirling
|
||||
autoSplitPDF.selectText.4=Paginile separatoare sunt detectate automat și eliminate, garantând un document final ordonat.
|
||||
autoSplitPDF.formPrompt=Trimite PDF-ul conținând separatoarele de pagini Stirling-PDF:
|
||||
autoSplitPDF.duplexMode=Mod Duplex (Scanare față-verso)
|
||||
autoSplitPDF.dividerDownload1=Descarcă 'Separator Auto Splitter (minimal).pdf'
|
||||
autoSplitPDF.dividerDownload2=Descarcă 'Separator Auto Splitter (cu instrucțiuni).pdf'
|
||||
autoSplitPDF.submit=Trimite
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Schimbă
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF către PDF/A
|
||||
pdfToPDFA.header=PDF către PDF/A
|
||||
pdfToPDFA.credit=Acest serviciu utilizează qpdf pentru conversia în PDF/A
|
||||
pdfToPDFA.credit=Acest serviciu utilizează libreoffice pentru conversia în PDF/A
|
||||
pdfToPDFA.submit=Convertește
|
||||
pdfToPDFA.tip=În prezent nu funcționează pentru mai multe intrări simultan
|
||||
pdfToPDFA.outputFormat=Format de ieșire
|
||||
|
||||
@@ -623,6 +623,7 @@ redact.showAttatchments=Показать вложения
|
||||
redact.showLayers=Показать слои (двойной щелчок для сброса всех слоев к состоянию по умолчанию)
|
||||
redact.colourPicker=Выбор цвета
|
||||
redact.findCurrentOutlineItem=Найти текущий элемент структуры
|
||||
redact.applyChanges=Apply Changes
|
||||
|
||||
#showJS
|
||||
showJS.title=Показать Javascript
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Загрузите один большой отска
|
||||
autoSplitPDF.selectText.4=Разделительные страницы автоматически обнаруживаются и удаляются, гарантируя аккуратный конечный документ.
|
||||
autoSplitPDF.formPrompt=Отправить PDF, содержащий разделители страниц Stirling-PDF:
|
||||
autoSplitPDF.duplexMode=Двусторонний режим (сканирование с двух сторон)
|
||||
autoSplitPDF.dividerDownload1=Скачать 'Автоматический разделитель (минимальный).pdf'
|
||||
autoSplitPDF.dividerDownload2=Скачать 'Автоматический разделитель (с инструкциями).pdf'
|
||||
autoSplitPDF.submit=Отправить
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Изменить
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF в PDF/A
|
||||
pdfToPDFA.header=PDF в PDF/A
|
||||
pdfToPDFA.credit=Этот сервис использует qpdf для преобразования в PDF/A
|
||||
pdfToPDFA.credit=Этот сервис использует libreoffice для преобразования в PDF/A
|
||||
pdfToPDFA.submit=Преобразовать
|
||||
pdfToPDFA.tip=В настоящее время не работает с несколькими входными файлами одновременно
|
||||
pdfToPDFA.outputFormat=Формат вывода
|
||||
|
||||
@@ -623,6 +623,7 @@ 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
|
||||
|
||||
#showJS
|
||||
showJS.title=Zobraziť JavaScript
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Nahrajte jeden veľký naskenovaný PDF súbor a necha
|
||||
autoSplitPDF.selectText.4=Rozdeľovacie stránky sú automaticky detekované a odstránené, čo zaručuje čistý konečný dokument.
|
||||
autoSplitPDF.formPrompt=Odoslať PDF obsahujúce Stirling-PDF rozdeľovače stránok:
|
||||
autoSplitPDF.duplexMode=Duplex režim (skanovanie prednej a zadnej strany)
|
||||
autoSplitPDF.dividerDownload1=Stiahnuť 'Auto Splitter Divider (minimálny).pdf'
|
||||
autoSplitPDF.dividerDownload2=Stiahnuť 'Auto Splitter Divider (s inštrukciami).pdf'
|
||||
autoSplitPDF.submit=Odoslať
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Zmeniť
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF na PDF/A
|
||||
pdfToPDFA.header=PDF na PDF/A
|
||||
pdfToPDFA.credit=Táto služba používa qpdf na konverziu PDF/A
|
||||
pdfToPDFA.credit=Táto služba používa libreoffice na konverziu PDF/A
|
||||
pdfToPDFA.submit=Konvertovať
|
||||
pdfToPDFA.tip=Momentálne nefunguje pre viacero vstupov naraz
|
||||
pdfToPDFA.outputFormat=Výstupný formát
|
||||
|
||||
@@ -623,6 +623,7 @@ redact.showAttatchments=Prikaži priloge
|
||||
redact.showLayers=Prikaži plasti (dvokliknite za ponastavitev vseh plasti na privzeto stanje)
|
||||
redact.colourPicker=Izbirnik barv
|
||||
redact.findCurrentOutlineItem=Poišči trenutno postavko orisa
|
||||
redact.applyChanges=Uporabi spremembe
|
||||
|
||||
#showJS
|
||||
showJS.title=Prikaži Javascript
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Naložite eno veliko optično prebrano datoteko PDF in
|
||||
autoSplitPDF.selectText.4=Ločilne strani so samodejno zaznane in odstranjene, kar zagotavlja čist končni dokument.
|
||||
autoSplitPDF.formPrompt=Pošljite PDF, ki vsebuje razdelilnike strani Stirling-PDF:
|
||||
autoSplitPDF.duplexMode=Dupleksni način (skeniranje spredaj in zadaj)
|
||||
autoSplitPDF.dividerDownload1=Prenesi 'Auto Splitter Divider (minimal).pdf'
|
||||
autoSplitPDF.dividerDownload2=Prenesi 'Auto Splitter Divider (z navodili).pdf'
|
||||
autoSplitPDF.submit=Pošlji
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Spremeni
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF v PDF/A
|
||||
pdfToPDFA.header=PDF v PDF/A
|
||||
pdfToPDFA.credit=Ta storitev uporablja qpdf za pretvorbo PDF/A
|
||||
pdfToPDFA.credit=Ta storitev uporablja libreoffice za pretvorbo PDF/A
|
||||
pdfToPDFA.submit=Pretvori
|
||||
pdfToPDFA.tip=Trenutno ne deluje za več vnosov hkrati
|
||||
pdfToPDFA.outputFormat=Izhodna oblika
|
||||
|
||||
@@ -623,6 +623,7 @@ 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
|
||||
|
||||
#showJS
|
||||
showJS.title=Prikaži Javascript
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Učitajte jedan veliki skenirani PDF fajl i dozvolite
|
||||
autoSplitPDF.selectText.4=Listovi razdeljivača se automatski detektuju i uklanjaju, obezbeđujući uredan konačni dokument.
|
||||
autoSplitPDF.formPrompt=Potvrdite PDF koji sadrži Stirling-PDF listove razdeljivača:
|
||||
autoSplitPDF.duplexMode=Dupleks režim (skeniranje prednje i zadnje strane)
|
||||
autoSplitPDF.dividerDownload1=Preuzmi 'Auto Splitter Divider (minimal).pdf'
|
||||
autoSplitPDF.dividerDownload2=Preuzmi 'Auto Splitter Divider (sa uputstvima).pdf'
|
||||
autoSplitPDF.submit=Potvrdi
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Promeni
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF u PDF/A
|
||||
pdfToPDFA.header=PDF u PDF/A
|
||||
pdfToPDFA.credit=Ova usluga koristi qpdf za konverziju u PDF/A format
|
||||
pdfToPDFA.credit=Ova usluga koristi libreoffice za konverziju u PDF/A format
|
||||
pdfToPDFA.submit=Konvertuj
|
||||
pdfToPDFA.tip=Currently does not work for multiple inputs at once
|
||||
pdfToPDFA.outputFormat=Output format
|
||||
|
||||
@@ -23,7 +23,7 @@ close=Stäng
|
||||
filesSelected=filer valda
|
||||
noFavourites=Inga favoriter har lagts till
|
||||
downloadComplete=Nedladdning klar
|
||||
bored=Utråkad att vänta?
|
||||
bored=Trött på att vänta?
|
||||
alphabet=Alfabet
|
||||
downloadPdf=Ladda ner PDF
|
||||
text=Text
|
||||
@@ -31,7 +31,7 @@ font=Teckensnitt
|
||||
selectFillter=-- Välj --
|
||||
pageNum=Sidnummer
|
||||
sizes.small=Liten
|
||||
sizes.medium=Mellanvärd
|
||||
sizes.medium=Mellan
|
||||
sizes.large=Stor
|
||||
sizes.x-large=Extra stor
|
||||
error.pdfPassword=PDF-dokumentet är lösenordsskyddat och antingen har lösenordet inte angetts eller är felaktigt
|
||||
@@ -46,7 +46,7 @@ red=Röd
|
||||
green=Grön
|
||||
blue=Blå
|
||||
custom=Anpassad...
|
||||
WorkInProgess=Pågående arbete, kan inte fungera eller vara buggigt. Rapportera eventuella problem!
|
||||
WorkInProgess=Pågående arbete, kan vara icke fungerande eller buggigt. Rapportera eventuella problem!
|
||||
poweredBy=Drivs av
|
||||
yes=Ja
|
||||
no=Nej
|
||||
@@ -240,17 +240,17 @@ database.creationDate=Skapelsedatum
|
||||
database.fileSize=Filstorlek
|
||||
database.deleteBackupFile=Ta bort säkerhetskopieringsfil
|
||||
database.importBackupFile=Importera säkerhetskopieringsfil
|
||||
database.createBackupFile=Create Backup File
|
||||
database.createBackupFile=Skapa säkerhetskopieringsfil
|
||||
database.downloadBackupFile=Ladda ner säkerhetskopieringsfil
|
||||
database.info_1=Vid import av data är det avgörande att säkerställa korrekt struktur. Om du är osäker på vad du gör, sök råd och stöd från en professionell. Ett fel i strukturen kan orsaka funktionsfel i applikationen, upp till och inklusive fullständig oförmåga att köra applikationen.
|
||||
database.info_2=Filnamnet spelar ingen roll vid uppladdning. Det kommer att döpas om efteråt för att följa formatet backup_user_yyyyMMddHHmm.sql, vilket säkerställer en konsekvent namngivningskonvention.
|
||||
database.submit=Importera säkerhetskopia
|
||||
database.importIntoDatabaseSuccessed=Import till databas lyckades
|
||||
database.backupCreated=Database backup successful
|
||||
database.backupCreated=Backup av databas lyckades
|
||||
database.fileNotFound=Filen hittades inte
|
||||
database.fileNullOrEmpty=Filen får inte vara null eller tom
|
||||
database.failedImportFile=Misslyckades med att importera fil
|
||||
database.notSupported=This function is not available for your database connection.
|
||||
database.notSupported=Denna funktion är inte tillgänglig för din databasanslutning.
|
||||
|
||||
session.expired=Din session har löpt ut. Uppdatera sidan och försök igen.
|
||||
session.refreshPage=Uppdatera sida
|
||||
@@ -266,14 +266,14 @@ home.viewPdf.title=Visa PDF
|
||||
home.viewPdf.desc=Visa, kommentera, lägg till text eller bilder
|
||||
viewPdf.tags=visa,läs,kommentera,text,bild
|
||||
|
||||
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.setFavorites=Välj Favoriter
|
||||
home.hideFavorites=Dölj Favoriter
|
||||
home.showFavorites=Visa Favoriter
|
||||
home.legacyHomepage=Gammal Hem-vy.
|
||||
home.newHomePage=Testa vår nya Hem-vy!
|
||||
home.alphabetical=Alfabetisk
|
||||
home.globalPopularity=Global Popularity
|
||||
home.sortBy=Sort by:
|
||||
home.sortBy=Sortera efter:
|
||||
|
||||
home.multiTool.title=PDF Multi-verktyg
|
||||
home.multiTool.desc=Sammanfoga, rotera, ordna om och ta bort sidor
|
||||
@@ -462,8 +462,8 @@ home.MarkdownToPDF.title=Markdown till PDF
|
||||
home.MarkdownToPDF.desc=Konverterar valfri Markdown-fil till PDF
|
||||
MarkdownToPDF.tags=markup,webbinnehåll,transformation,konvertera
|
||||
|
||||
home.PDFToMarkdown.title=PDF to Markdown
|
||||
home.PDFToMarkdown.desc=Converts any PDF to Markdown
|
||||
home.PDFToMarkdown.title=PDF till Markdown
|
||||
home.PDFToMarkdown.desc=Konvertera PDF till Markdown
|
||||
PDFToMarkdown.tags=markup,web-content,transformation,convert,md
|
||||
|
||||
home.getPdfInfo.title=Hämta ALL information om PDF
|
||||
@@ -533,9 +533,9 @@ home.splitPdfByChapters.title=Dela upp PDF efter kapitel
|
||||
home.splitPdfByChapters.desc=Dela upp en PDF till flera filer baserat på dess kapitelstruktur.
|
||||
splitPdfByChapters.tags=dela,kapitel,bokmärken,organisera
|
||||
|
||||
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=Validera PDF signature
|
||||
home.validateSignature.desc=Verifiera digitala signaturer och certifiakt i PDF dokument
|
||||
validateSignature.tags=signatur,verifiera,validera,pdf,certifikat,digital signatur,Validera Signatur,Validera certifikat
|
||||
|
||||
#replace-invert-color
|
||||
replace-color.title=Ersätt-Invertera-Färg
|
||||
@@ -623,6 +623,7 @@ 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
|
||||
|
||||
#showJS
|
||||
showJS.title=Visa Javascript
|
||||
@@ -660,9 +661,9 @@ MarkdownToPDF.credit=Använder WeasyPrint
|
||||
|
||||
|
||||
#pdf-to-markdown
|
||||
PDFToMarkdown.title=PDF To Markdown
|
||||
PDFToMarkdown.header=PDF To Markdown
|
||||
PDFToMarkdown.submit=Convert
|
||||
PDFToMarkdown.title=PDF Till Markdown
|
||||
PDFToMarkdown.header=PDF Till Markdown
|
||||
PDFToMarkdown.submit=Konvertera
|
||||
|
||||
|
||||
#url-to-pdf
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Ladda upp den enda stora skannade PDF-filen och låt S
|
||||
autoSplitPDF.selectText.4=Avdelarsidor detekteras automatiskt och tas bort, vilket garanterar ett prydligt slutdokument.
|
||||
autoSplitPDF.formPrompt=Skicka PDF som innehåller Stirling-PDF-sidavdelare:
|
||||
autoSplitPDF.duplexMode=Duplexläge (Fram- och baksideskanning)
|
||||
autoSplitPDF.dividerDownload1=Ladda ner 'Auto-delningsavdelare (minimal).pdf'
|
||||
autoSplitPDF.dividerDownload2=Ladda ner 'Auto-delningsavdelare (med instruktioner).pdf'
|
||||
autoSplitPDF.submit=Skicka
|
||||
|
||||
@@ -874,12 +874,12 @@ sign.save=Spara signatur
|
||||
sign.personalSigs=Personliga signaturer
|
||||
sign.sharedSigs=Delade signaturer
|
||||
sign.noSavedSigs=Inga sparade signaturer hittades
|
||||
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.addToAll=Lägg till på alla sidor
|
||||
sign.delete=Ta bort
|
||||
sign.first=Första sidan
|
||||
sign.last=Sista sidan
|
||||
sign.next=Nästa sida
|
||||
sign.previous=Föregående sida
|
||||
sign.maintainRatio=Toggle maintain aspect ratio
|
||||
|
||||
|
||||
@@ -999,24 +999,24 @@ pdfOrganiser.placeholder=(t.ex. 1,3,2 eller 4-8,2,10-12 eller 2n-1)
|
||||
multiTool.title=PDF-multiverktyg
|
||||
multiTool.header=PDF Multi-verktyg
|
||||
multiTool.uploadPrompts=Filnamn
|
||||
multiTool.selectAll=Select All
|
||||
multiTool.selectAll=Välj allt
|
||||
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.selectPages=Välj sidor
|
||||
multiTool.selectedPages=Valda sidor
|
||||
multiTool.page=Sida
|
||||
multiTool.deleteSelected=Ta bort valda
|
||||
multiTool.downloadAll=Exportera
|
||||
multiTool.downloadSelected=Exportersa valda
|
||||
|
||||
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.addFile=Lägg till fil
|
||||
multiTool.rotateLeft=Rotera Vänster
|
||||
multiTool.rotateRight=Rotera Höger
|
||||
multiTool.split=Dela upp
|
||||
multiTool.moveLeft=Flytta Vänster
|
||||
multiTool.moveRight=Flytta Höger
|
||||
multiTool.delete=Ta bort
|
||||
multiTool.dragDropMessage=Valda sid(or)
|
||||
multiTool.undo=Undo
|
||||
multiTool.redo=Redo
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Ändra
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF till PDF/A
|
||||
pdfToPDFA.header=PDF till PDF/A
|
||||
pdfToPDFA.credit=Denna tjänst använder qpdf för PDF/A-konvertering
|
||||
pdfToPDFA.credit=Denna tjänst använder libreoffice för PDF/A-konvertering
|
||||
pdfToPDFA.submit=Konvertera
|
||||
pdfToPDFA.tip=Fungerar för närvarande inte för flera inmatningar samtidigt
|
||||
pdfToPDFA.outputFormat=Utdataformat
|
||||
@@ -1335,34 +1335,34 @@ splitByChapters.desc.4=Tillåt duplicieringar: Om kryssrutan är markerad tillå
|
||||
splitByChapters.submit=Dela upp 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=Klicka
|
||||
fileChooser.or=eller
|
||||
fileChooser.dragAndDrop=Dra & Släpp
|
||||
fileChooser.dragAndDropPDF=Dra & Släpp PDF fil
|
||||
fileChooser.dragAndDropImage=Dra & Släpp bildfil
|
||||
fileChooser.hoveredDragAndDrop=Dra & Släpp fil(er) här
|
||||
|
||||
#release notes
|
||||
releases.footer=Releases
|
||||
releases.footer=Utgåvor
|
||||
releases.title=Release Notes
|
||||
releases.header=Release Notes
|
||||
releases.current.version=Current Release
|
||||
releases.current.version=Nuvarande Utgåva
|
||||
releases.note=Release notes are only available in English
|
||||
|
||||
#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.title=Validera PDF Signaturer
|
||||
validateSignature.header=Validera Digitala Signaturer
|
||||
validateSignature.selectPDF=Välj signerad PDF fil
|
||||
validateSignature.submit=Validera Signaturer
|
||||
validateSignature.results=Valideringsresultat
|
||||
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.date=Datum
|
||||
validateSignature.reason=Anledning
|
||||
validateSignature.location=Plats
|
||||
validateSignature.noSignatures=Inga digitala signaturer hittade i detta dokument
|
||||
validateSignature.status.valid=Giltig
|
||||
validateSignature.status.invalid=Ogiltig
|
||||
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
|
||||
|
||||
@@ -623,6 +623,7 @@ 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
|
||||
|
||||
#showJS
|
||||
showJS.title=แสดง Javascript
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=อัปโหลดไฟล์ PDF ที่สแ
|
||||
autoSplitPDF.selectText.4=หน้ากั้นจะถูกตรวจจับและลบโดยอัตโนมัติ รับประกันเอกสารสุดท้ายที่เรียบร้อย
|
||||
autoSplitPDF.formPrompt=ส่ง PDF ที่มีแผ่นแยก Stirling-PDF:
|
||||
autoSplitPDF.duplexMode=โหมด Duplex (การสแกนหน้าและหลัง)
|
||||
autoSplitPDF.dividerDownload1=ดาวน์โหลด 'Auto Splitter Divider (minimal).pdf'
|
||||
autoSplitPDF.dividerDownload2=ดาวน์โหลด 'Auto Splitter Divider (with instructions).pdf'
|
||||
autoSplitPDF.submit=ส่ง
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=เปลี่ยน
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF เป็น PDF/A
|
||||
pdfToPDFA.header=PDF เป็น PDF/A
|
||||
pdfToPDFA.credit=บริการนี้ใช้ qpdf สำหรับการแปลง PDF/A
|
||||
pdfToPDFA.credit=บริการนี้ใช้ libreoffice สำหรับการแปลง PDF/A
|
||||
pdfToPDFA.submit=แปลง
|
||||
pdfToPDFA.tip=ปัจจุบันไม่ทำงานสำหรับการป้อนข้อมูลหลายรายการพร้อมกัน
|
||||
pdfToPDFA.outputFormat=รูปแบบผลลัพธ์
|
||||
|
||||
@@ -623,6 +623,7 @@ 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
|
||||
|
||||
#showJS
|
||||
showJS.title=Javascript'i Göster
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Tek büyük taranmış PDF dosyasını yükleyin ve ge
|
||||
autoSplitPDF.selectText.4=Ayırıcı sayfalar otomatik olarak tespit edilir ve kaldırılır, düzgün bir final belgesi garantilidir.
|
||||
autoSplitPDF.formPrompt=Stirling-PDF Sayfa ayırıcıları içeren PDF'i gönderin:
|
||||
autoSplitPDF.duplexMode=Çift Taraflı Mod (Ön ve arka tarama)
|
||||
autoSplitPDF.dividerDownload1='Otomatik Ayırıcı Ayırıcı (minimal).pdf' indir
|
||||
autoSplitPDF.dividerDownload2='Otomatik Ayırıcı Ayırıcı (talimatlarla).pdf' indir
|
||||
autoSplitPDF.submit=Gönder
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Değiştir
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF'den PDF/A'ya
|
||||
pdfToPDFA.header=PDF'den PDF/A'ya
|
||||
pdfToPDFA.credit=Bu hizmet PDF/A dönüşümü için qpdf kullanır
|
||||
pdfToPDFA.credit=Bu hizmet PDF/A dönüşümü için libreoffice kullanır
|
||||
pdfToPDFA.submit=Dönüştür
|
||||
pdfToPDFA.tip=Şu anda aynı anda birden fazla giriş için çalışmıyor
|
||||
pdfToPDFA.outputFormat=Çıkış formatı
|
||||
|
||||
@@ -623,6 +623,7 @@ 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
|
||||
|
||||
#showJS
|
||||
showJS.title=Показати JavaScript
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Завантажте один великий відс
|
||||
autoSplitPDF.selectText.4=Роздільні сторінки автоматично виявляються і видаляються, забезпечуючи акуратний кінцевий документ.
|
||||
autoSplitPDF.formPrompt=Надіслати PDF-файл, що містить роздільні сторінки Stirling-PDF:
|
||||
autoSplitPDF.duplexMode=Дуплексний режим (сканування спереду і ззаду)
|
||||
autoSplitPDF.dividerDownload1=Завантажити 'Auto Splitter Divider (minimal).pdf'
|
||||
autoSplitPDF.dividerDownload2=Завантажити 'Auto Splitter Divider (with instructions).pdf'
|
||||
autoSplitPDF.submit=Надіслати
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Змінити
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF в PDF/A
|
||||
pdfToPDFA.header=PDF в PDF/A
|
||||
pdfToPDFA.credit=Цей сервіс використовує qpdf для перетворення у формат PDF/A
|
||||
pdfToPDFA.credit=Цей сервіс використовує libreoffice для перетворення у формат PDF/A
|
||||
pdfToPDFA.submit=Конвертувати
|
||||
pdfToPDFA.tip=Наразі не працює для кількох вхідних файлів одночасно
|
||||
pdfToPDFA.outputFormat=Вихідний формат
|
||||
|
||||
@@ -623,6 +623,7 @@ 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
|
||||
|
||||
#showJS
|
||||
showJS.title=Hiển thị Javascript
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=Tải lên tệp PDF quét lớn duy nhất và để
|
||||
autoSplitPDF.selectText.4=Các trang phân cách được tự động phát hiện và xóa, đảm bảo tài liệu cuối cùng gọn gàng.
|
||||
autoSplitPDF.formPrompt=Gửi PDF chứa trang phân cách Stirling-PDF:
|
||||
autoSplitPDF.duplexMode=Chế độ hai mặt (Quét mặt trước và sau)
|
||||
autoSplitPDF.dividerDownload1=Tải xuống 'Trang phân cách tự động (tối giản).pdf'
|
||||
autoSplitPDF.dividerDownload2=Tải xuống 'Trang phân cách tự động (có hướng dẫn).pdf'
|
||||
autoSplitPDF.submit=Gửi
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Thay đổi
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF sang PDF/A
|
||||
pdfToPDFA.header=PDF sang PDF/A
|
||||
pdfToPDFA.credit=Dịch vụ này sử dụng qpdf để chuyển đổi PDF/A
|
||||
pdfToPDFA.credit=Dịch vụ này sử dụng libreoffice để chuyển đổi PDF/A
|
||||
pdfToPDFA.submit=Chuyển đổi
|
||||
pdfToPDFA.tip=Hiện tại không hoạt động với nhiều đầu vào cùng lúc
|
||||
pdfToPDFA.outputFormat=Định dạng đầu ra
|
||||
|
||||
@@ -623,6 +623,7 @@ redact.showAttatchments=ཟུར་སྦྱར་སྟོན།
|
||||
redact.showLayers=རིམ་པ་སྟོན། (རིམ་པ་ཚང་མ་སྔོན་སྒྲིག་གནས་བབ་ལ་བསྐྱར་སྒྲིག་བྱེད་པར་ཉིས་རྡེབ།)
|
||||
redact.colourPicker=ཚོས་གཞི་འདེམས་བྱེད<EFBFBD><EFBFBD><EFBFBD>
|
||||
redact.findCurrentOutlineItem=ད་ལྟའི་སྒྲོམ་གཞིའི་ནང་དོན་འཚོལ་བ།
|
||||
redact.applyChanges=Apply Changes
|
||||
|
||||
#showJS
|
||||
showJS.title=Javascript ས<>ོན་པ།
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=བཤེར་འབེབས་བྱས་པའི
|
||||
autoSplitPDF.selectText.4=བར་མཚམས་ཤོག་ངོས་རྣམས་རང་འགུལ་གྱིས་ངོས་འཛིན་དང་སུབ་པ་བྱས་ནས་མཐའ་མའི་ཡིག་ཆ་གཙང་མ་ཞིག་ངེས་པར་དུ་ཐོབ་ཐུབ།
|
||||
autoSplitPDF.formPrompt=Stirling-PDF ཤོག་ངོས་བར་མཚམས་ཡོད་པའི་ PDF ཕུལ་བ།
|
||||
autoSplitPDF.duplexMode=ཕྱོགས་གཉིས་ཀྱི་རྣམ་པ། (མདུན་རྒྱབ་བཤེར་འབེབས།)
|
||||
autoSplitPDF.dividerDownload1='རང་འགུལ་ཁ་གྱེས་བར་མཚམས། (ཉུང་ཤོས།).pdf' ཕབ་ལེན།
|
||||
autoSplitPDF.dividerDownload2='རང་འགུལ་ཁ་གྱེས་བར་མཚམས། (བཀོལ་སྤྱོད་ལམ་སྟོན་དང་བཅས་པ།).pdf' ཕབ་ལེན།
|
||||
autoSplitPDF.submit=ཕུལ་བ།
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=བསྒྱུར་བ།
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF ནས་ PDF/A ལ།
|
||||
pdfToPDFA.header=PDF ནས་ PDF/A ལ།
|
||||
pdfToPDFA.credit=ཞབས་ཞུ་འདིས་ PDF/A བསྒྱུར་བའི་ཆེད་དུ་ qpdf བེད་སྤྱོད་བྱེད་པ།
|
||||
pdfToPDFA.credit=ཞབས་ཞུ་འདིས་ PDF/A བསྒྱུར་བའི་ཆེད་དུ་ libreoffice བེད་སྤྱོད་བྱེད་པ།
|
||||
pdfToPDFA.submit=བསྒྱུར་བ།
|
||||
pdfToPDFA.tip=ད་ལྟ་ཡིག་ཆ་མང་པོ་དུས་གཅིག་ལ་བསྒྱུར་མི་ཐུབ།
|
||||
pdfToPDFA.outputFormat=ཕྱིར་འདོན་རྣམ་གཞག
|
||||
|
||||
@@ -82,7 +82,7 @@ pages=Pages
|
||||
loading=加载中...
|
||||
addToDoc=Add to Document
|
||||
reset=重置
|
||||
apply=Apply
|
||||
apply=应用
|
||||
|
||||
legal.privacy=隐私政策
|
||||
legal.terms=服务条款
|
||||
@@ -138,20 +138,20 @@ analytics.settings=You can change the settings for analytics in the config/setti
|
||||
# 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转换
|
||||
navbar.sections.security=签名和安全
|
||||
navbar.sections.advance=高级功能
|
||||
navbar.sections.edit=查看和编辑
|
||||
navbar.sections.popular=Popular
|
||||
navbar.sections.popular=热门
|
||||
|
||||
#############
|
||||
# SETTINGS #
|
||||
@@ -266,14 +266,14 @@ home.viewPdf.title=浏览 PDF
|
||||
home.viewPdf.desc=浏览、注释、添加文本或图像
|
||||
viewPdf.tags=浏览、阅读、注释、文本、图像
|
||||
|
||||
home.setFavorites=Set Favourites
|
||||
home.setFavorites=编辑收藏夹
|
||||
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.legacyHomepage=使用旧版主页
|
||||
home.newHomePage=试用新版主页!
|
||||
home.alphabetical=按字母顺序
|
||||
home.globalPopularity=按全球热度
|
||||
home.sortBy=排序:
|
||||
|
||||
home.multiTool.title=PDF 多功能工具
|
||||
home.multiTool.desc=合并、旋转、重新排列和删除 PDF 页面
|
||||
@@ -623,6 +623,7 @@ 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
|
||||
|
||||
#showJS
|
||||
showJS.title=显示 JavaScript
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=上传单个大型扫描的 PDF 文件,让 Stirling
|
||||
autoSplitPDF.selectText.4=分隔页会自动检测和删除,确保最终文档整洁。
|
||||
autoSplitPDF.formPrompt=提交包含 Stirling-PDF 分隔页的 PDF:
|
||||
autoSplitPDF.duplexMode=双面模式(正反面扫描)
|
||||
autoSplitPDF.dividerDownload1=下载“自动拆分分隔页(最小化).pdf”
|
||||
autoSplitPDF.dividerDownload2=下载“自动拆分分隔页(带指导说明).pdf”
|
||||
autoSplitPDF.submit=提交
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=更改
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF 转 PDF/A
|
||||
pdfToPDFA.header=将 PDF 转换为 PDF/A
|
||||
pdfToPDFA.credit=此服务使用 qpdf 进行 PDF/A 转换
|
||||
pdfToPDFA.credit=此服务使用 libreoffice 进行 PDF/A 转换
|
||||
pdfToPDFA.submit=转换
|
||||
pdfToPDFA.tip=目前不支持上传多个
|
||||
pdfToPDFA.outputFormat=输出格式
|
||||
|
||||
@@ -623,6 +623,7 @@ redact.showAttatchments=顯示附件
|
||||
redact.showLayers=顯示圖層(按兩下可將所有圖層重設為預設狀態)
|
||||
redact.colourPicker=顏色選擇器
|
||||
redact.findCurrentOutlineItem=尋找目前的大綱項目
|
||||
redact.applyChanges=Apply Changes
|
||||
|
||||
#showJS
|
||||
showJS.title=顯示 JavaScript
|
||||
@@ -768,7 +769,6 @@ autoSplitPDF.selectText.3=上傳單一大的掃描 PDF 檔案,讓 Stirling PDF
|
||||
autoSplitPDF.selectText.4=自動偵測並移除分隔頁面,確保最終文件整潔。
|
||||
autoSplitPDF.formPrompt=送出包含 Stirling-PDF 頁面分隔器的 PDF:
|
||||
autoSplitPDF.duplexMode=雙面模式(正反面掃描)
|
||||
autoSplitPDF.dividerDownload1=下載 '自動分割器分隔器(最小化).pdf'
|
||||
autoSplitPDF.dividerDownload2=下載 '自動分割器分隔器(帶說明).pdf'
|
||||
autoSplitPDF.submit=送出
|
||||
|
||||
@@ -1185,7 +1185,7 @@ changeMetadata.submit=變更
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF 轉 PDF/A
|
||||
pdfToPDFA.header=PDF 轉 PDF/A
|
||||
pdfToPDFA.credit=此服務使用 qpdf 進行 PDF/A 轉換
|
||||
pdfToPDFA.credit=此服務使用 libreoffice 進行 PDF/A 轉換
|
||||
pdfToPDFA.submit=轉換
|
||||
pdfToPDFA.tip=目前不支援上傳多個
|
||||
pdfToPDFA.outputFormat=輸出格式
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24">
|
||||
<symbol id="icon-redact-auto" viewBox="0 0 24 24"> <g id="Layer_2" data-name="Layer 2">
|
||||
<g id="Layer_1-2" data-name="Layer 1">
|
||||
<rect width="24" height="24" style="fill: none"/>
|
||||
@@ -14,4 +14,5 @@
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</symbol>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.5 KiB |
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24">
|
||||
<symbol id="icon-redact-manual" viewBox="-2 0 24 24">
|
||||
<g id="Layer_2" data-name="Layer 2">
|
||||
<g id="Layer_1-2" data-name="Layer 1">
|
||||
|
||||
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.5 KiB |
@@ -1,6 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||
<symbol id="icon-split-auto" viewBox="0 0 24 24"> <g id="Layer_2" data-name="Layer 2"> <g id="Layer_2" data-name="Layer 2">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24">
|
||||
<symbol id="icon-split-auto" viewBox="0 0 24 24">
|
||||
<g id="Layer_2" data-name="Layer 2">
|
||||
<g id="Layer_1-2" data-name="Layer 1">
|
||||
<g>
|
||||
<path d="M18.42466,20.16555,12,13.74089,9.84315,15.89774a2.45776,2.45776,0,0,1,.2524.73425,4.481,4.481,0,0,1,.06883.78013A3.53515,3.53515,0,0,1,9.086,20.00493a3.53516,3.53516,0,0,1-2.59281,1.07843,3.53516,3.53516,0,0,1-2.59281-1.07843,3.6561,3.6561,0,0,1,0-5.18561,3.53516,3.53516,0,0,1,2.59281-1.07843,4.48117,4.48117,0,0,1,.78014.06884,2.45778,2.45778,0,0,1,.73424.25239l2.15685-2.15685L8.00753,9.74842a2.45752,2.45752,0,0,1-.73424.2524,4.48117,4.48117,0,0,1-.78014.06884A3.53516,3.53516,0,0,1,3.90034,8.99123,3.53515,3.53515,0,0,1,2.82192,6.39842,3.53515,3.53515,0,0,1,3.90034,3.80561,3.53515,3.53515,0,0,1,6.49315,2.72719,3.53515,3.53515,0,0,1,9.086,3.80561a3.53515,3.53515,0,0,1,1.07842,2.59281,4.48107,4.48107,0,0,1-.06883.78014,2.45786,2.45786,0,0,1-.2524.73425L21.17808,19.24774v.91781Zm-3.67123-9.17809L12.91781,9.15185,18.42466,3.645h2.75342v.91781ZM6.49315,8.234A1.841,1.841,0,0,0,8.32877,6.39842,1.841,1.841,0,0,0,6.49315,4.56281,1.841,1.841,0,0,0,4.65753,6.39842,1.841,1.841,0,0,0,6.49315,8.234ZM12,12.36418a.47051.47051,0,1,0-.32123-.13767A.44026.44026,0,0,0,12,12.36418ZM6.49315,19.24774a1.83562,1.83562,0,1,0-1.29641-3.132,1.83562,1.83562,0,0,0,1.29641,3.132Z" style="fill: currentColor"/>
|
||||
@@ -9,4 +10,5 @@
|
||||
<rect width="24" height="24" style="fill: none"/>
|
||||
</g>
|
||||
</g>
|
||||
</symbol>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
@@ -1,6 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
|
||||
<symbol id="icon-split-chapters" viewBox="0 0 24 24"> <g id="Layer_2" data-name="Layer 2"> <g id="Layer_2" data-name="Layer 2">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24">
|
||||
<symbol id="icon-split-chapters" viewBox="0 0 24 24">
|
||||
<g id="Layer_2" data-name="Layer 2">
|
||||
<g id="Layer_1-2" data-name="Layer 1">
|
||||
<g>
|
||||
<path d="M17.632,9.18527v5.44l1.94-1.16,1.94,1.16v-5.44Z" style="fill: currentColor"/>
|
||||
@@ -9,4 +10,5 @@
|
||||
<rect width="24" height="24" style="fill: none"/>
|
||||
</g>
|
||||
</g>
|
||||
</symbol>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
@@ -1,6 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="padding-left: 20px; margin-right: -20px;">
|
||||
<symbol id="icon-split-size" viewBox="0 0 24 24"> <g id="Layer_2" data-name="Layer 2"> <g id="Layer_2" data-name="Layer 2">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24">
|
||||
<symbol id="icon-split-size" viewBox="0 0 24 24">
|
||||
<g id="Layer_2" data-name="Layer 2">
|
||||
<g id="Layer_1-2" data-name="Layer 1">
|
||||
<g>
|
||||
<path d="M17.90313,20.16555l-6.42466-6.42466L9.32162,15.89774a2.45776,2.45776,0,0,1,.2524.73425,4.481,4.481,0,0,1,.06883.78013,3.53515,3.53515,0,0,1-1.07842,2.59281,3.53516,3.53516,0,0,1-2.59281,1.07843,3.53516,3.53516,0,0,1-2.59281-1.07843,3.6561,3.6561,0,0,1,0-5.18561,3.53516,3.53516,0,0,1,2.59281-1.07843,4.48117,4.48117,0,0,1,.78014.06884,2.45778,2.45778,0,0,1,.73424.25239l2.15685-2.15685L7.486,9.74842a2.45752,2.45752,0,0,1-.73424.2524,4.48117,4.48117,0,0,1-.78014.06884A3.53516,3.53516,0,0,1,3.37881,8.99123,3.53515,3.53515,0,0,1,2.30039,6.39842,3.53515,3.53515,0,0,1,3.37881,3.80561,3.53515,3.53515,0,0,1,5.97162,2.72719,3.53515,3.53515,0,0,1,8.56443,3.80561,3.53515,3.53515,0,0,1,9.64285,6.39842a4.48107,4.48107,0,0,1-.06883.78014,2.45786,2.45786,0,0,1-.2524.73425L20.65655,19.24774v.91781Zm-3.67124-9.17809L12.39628,9.15185,17.90313,3.645h2.75342v.91781ZM5.97162,8.234A1.841,1.841,0,0,0,7.80724,6.39842,1.841,1.841,0,0,0,5.97162,4.56281,1.841,1.841,0,0,0,4.136,6.39842,1.841,1.841,0,0,0,5.97162,8.234Zm5.50685,4.13014a.47051.47051,0,1,0-.32123-.13767A.44026.44026,0,0,0,11.47847,12.36418ZM5.97162,19.24774a1.83562,1.83562,0,1,0-1.29641-3.132,1.83562,1.83562,0,0,0,1.29641,3.132Z" style="fill: currentColor"/>
|
||||
@@ -13,4 +14,5 @@
|
||||
<rect width="24" height="24" style="fill: none"/>
|
||||
</g>
|
||||
</g>
|
||||
</symbol>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
@@ -48,7 +48,7 @@ window.tooltipSetup = () => {
|
||||
tooltipElements.forEach((element) => {
|
||||
const tooltipText = element.getAttribute('title');
|
||||
element.removeAttribute('title');
|
||||
element.setAttribute('data-title', 'tooltipText');
|
||||
element.setAttribute('data-title', tooltipText);
|
||||
const customTooltip = document.createElement('div');
|
||||
customTooltip.className = 'btn-tooltip';
|
||||
customTooltip.textContent = tooltipText;
|
||||
|
||||
@@ -17,7 +17,9 @@
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-6 bg-card">
|
||||
<div class="tool-header">
|
||||
<span class="material-symbols-rounded tool-header-icon advance">cut</span>
|
||||
<svg class="material-symbols-rounded tool-header-icon advance">
|
||||
<use xlink:href="/images/split-auto.svg#icon-split-auto"></use>
|
||||
</svg>
|
||||
<span class="tool-header-text" th:text="#{autoSplitPDF.header}"></span>
|
||||
</div>
|
||||
|
||||
@@ -43,8 +45,6 @@
|
||||
<li th:text="#{autoSplitPDF.selectText.3}"></li>
|
||||
<li th:text="#{autoSplitPDF.selectText.4}"></li>
|
||||
</ul>
|
||||
<p><a th:href="@{'/files/Auto%20Splitter%20Divider%20(minimal).pdf'}" download
|
||||
th:text="#{autoSplitPDF.dividerDownload1}"></a></p>
|
||||
<p><a th:href="@{'/files/Auto%20Splitter%20Divider%20(with%20instructions).pdf'}" download
|
||||
th:text="#{autoSplitPDF.dividerDownload2}"></a></p>
|
||||
</div>
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
<th:block th:fragment="navElements">
|
||||
<div id="groupOrganize" class="feature-group">
|
||||
<div id="groupOrganize" class="feature-group">
|
||||
<div th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.organize})}">
|
||||
</div>
|
||||
<div class="nav-group-container">
|
||||
<div
|
||||
th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.organize})}">
|
||||
</div>
|
||||
<div class="nav-group-container">
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry ('multi-tool', 'construction', 'home.multiTool.title', 'home.multiTool.desc', 'multiTool.tags', 'organize')}">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry ('merge-pdfs', 'add_to_photos', 'home.merge.title', 'home.merge.desc', 'merge.tags', 'organize')}">
|
||||
</div>
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry ('split-pdfs', 'cut', 'home.split.title', 'home.split.desc', 'split.tags', 'organize')}"></div>
|
||||
<div
|
||||
</div>
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry ('split-pdfs', 'cut', 'home.split.title', 'home.split.desc', 'split.tags', 'organize')}">
|
||||
</div>
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry('rotate-pdf', 'rotate_right', 'home.rotate.title', 'home.rotate.desc', 'rotate.tags', 'organize')}">
|
||||
</div>
|
||||
<div
|
||||
@@ -37,15 +37,14 @@
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry('pdf-to-single-page', 'looks_one', 'home.PdfToSinglePage.title', 'home.PdfToSinglePage.desc', 'PdfToSinglePage.tags', 'organize')}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="groupConvertTo" class="feature-group">
|
||||
<div id="groupConvertTo" class="feature-group">
|
||||
<div th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.convertTo})}">
|
||||
</div>
|
||||
<div class="nav-group-container">
|
||||
<div
|
||||
th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.convertTo})}">
|
||||
</div>
|
||||
<div class="nav-group-container">
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry('img-to-pdf', 'picture_as_pdf', 'home.imageToPdf.title', 'home.imageToPdf.desc', 'imageToPdf.tags', 'convertto')}">
|
||||
</div>
|
||||
<div
|
||||
@@ -63,14 +62,13 @@
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry('book-to-pdf', 'book', 'home.BookToPDF.title', 'home.BookToPDF.desc', 'BookToPDF.tags', 'convertto')}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="groupConvertFrom" class="feature-group">
|
||||
</div>
|
||||
<div id="groupConvertFrom" class="feature-group">
|
||||
<div th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.convertFrom})}">
|
||||
</div>
|
||||
<div class="nav-group-container">
|
||||
<div
|
||||
th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.convertFrom})}">
|
||||
</div>
|
||||
<div class="nav-group-container">
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry('pdf-to-img', 'photo_library', 'home.pdfToImage.title', 'home.pdfToImage.desc', 'pdfToImage.tags', 'convert')}">
|
||||
</div>
|
||||
<div
|
||||
@@ -98,17 +96,16 @@
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry('pdf-to-book', 'book', 'home.PDFToBook.title', 'home.PDFToBook.desc', 'PDFToBook.tags', 'convert')}">
|
||||
</div>
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry ('pdf-to-markdown', 'markdown_copy', 'home.PDFToMarkdown.title', 'home.PDFToMarkdown.desc', 'PDFToMarkdown.tags', 'convert')}">
|
||||
</div>
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry ('pdf-to-markdown', 'markdown_copy', 'home.PDFToMarkdown.title', 'home.PDFToMarkdown.desc', 'PDFToMarkdown.tags', 'convert')}">
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div id="convertGroup" class="feature-group">
|
||||
<div th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.convertTo})}">
|
||||
</div>
|
||||
<div id="convertGroup" class="feature-group">
|
||||
<div class="nav-group-container">
|
||||
<div
|
||||
th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.convertTo})}">
|
||||
</div>
|
||||
<div class="nav-group-container">
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry('img-to-pdf', 'picture_as_pdf', 'home.imageToPdf.title', 'home.imageToPdf.desc', 'imageToPdf.tags', 'convertto')}">
|
||||
</div>
|
||||
<div
|
||||
@@ -126,12 +123,11 @@
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry('book-to-pdf', 'book', 'home.BookToPDF.title', 'home.BookToPDF.desc', 'BookToPDF.tags', 'convertto')}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.convertFrom})}">
|
||||
</div>
|
||||
<div class="nav-group-container">
|
||||
<div
|
||||
th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.convertFrom})}">
|
||||
</div>
|
||||
<div class="nav-group-container">
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry('pdf-to-img', 'photo_library', 'home.pdfToImage.title', 'home.pdfToImage.desc', 'pdfToImage.tags', 'convert')}">
|
||||
</div>
|
||||
<div
|
||||
@@ -159,13 +155,12 @@
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry('pdf-to-book', 'book', 'home.PDFToBook.title', 'home.PDFToBook.desc', 'PDFToBook.tags', 'convert')}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="groupSecurity" class="feature-group">
|
||||
<div th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.security})}">
|
||||
</div>
|
||||
<div id="groupSecurity" class="feature-group">
|
||||
<div class="nav-group-container">
|
||||
<div
|
||||
th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.security})}">
|
||||
</div>
|
||||
<div class="nav-group-container">
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry('add-password', 'lock', 'home.addPassword.title', 'home.addPassword.desc', 'addPassword.tags', 'security')}">
|
||||
</div>
|
||||
<div
|
||||
@@ -182,34 +177,34 @@
|
||||
</div>
|
||||
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry('validate-signature', 'verified', 'home.validateSignature.title', 'home.validateSignature.desc', 'validateSignature.tags', 'security')}">
|
||||
</div>
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry('remove-cert-sign', 'remove_moderator', 'home.removeCertSign.title', 'home.removeCertSign.desc', 'removeCertSign.tags', 'security')}">
|
||||
</div>
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry('sanitize-pdf', 'sanitizer', 'home.sanitizePdf.title', 'home.sanitizePdf.desc', 'sanitizePdf.tags', 'security')}">
|
||||
</div>
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntryCustom :: navbarEntry('auto-redact', '/images/redact-auto.svg#icon-redact-auto', 'home.autoRedact.title', 'home.autoRedact.desc', 'autoRedact.tags', 'security')}">
|
||||
</div>
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntryCustom :: navbarEntry('redact', '/images/redact-manual.svg#icon-redact-manual', 'home.redact.title', 'home.redact.desc', 'redact.tags', 'security')}">
|
||||
</div>
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry('stamp', 'approval', 'home.AddStampRequest.title', 'home.AddStampRequest.desc', 'AddStampRequest.tags', 'security')}">
|
||||
</div>
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry('add-watermark', 'water_drop', 'home.watermark.title', 'home.watermark.desc', 'watermark.tags', 'security')}">
|
||||
</div>
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry('validate-signature', 'verified', 'home.validateSignature.title', 'home.validateSignature.desc', 'validateSignature.tags', 'security')}">
|
||||
</div>
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry('remove-cert-sign', 'remove_moderator', 'home.removeCertSign.title', 'home.removeCertSign.desc', 'removeCertSign.tags', 'security')}">
|
||||
</div>
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry('sanitize-pdf', 'sanitizer', 'home.sanitizePdf.title', 'home.sanitizePdf.desc', 'sanitizePdf.tags', 'security')}">
|
||||
</div>
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntryCustom :: navbarEntry('auto-redact', '/images/redact-auto.svg#icon-redact-auto', 'home.autoRedact.title', 'home.autoRedact.desc', 'autoRedact.tags', 'security')}">
|
||||
</div>
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntryCustom :: navbarEntry('redact', '/images/redact-manual.svg#icon-redact-manual', 'home.redact.title', 'home.redact.desc', 'redact.tags', 'security')}">
|
||||
</div>
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry('stamp', 'approval', 'home.AddStampRequest.title', 'home.AddStampRequest.desc', 'AddStampRequest.tags', 'security')}">
|
||||
</div>
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry('add-watermark', 'water_drop', 'home.watermark.title', 'home.watermark.desc', 'watermark.tags', 'security')}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="groupView" class="feature-group">
|
||||
<div th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.edit})}">
|
||||
</div>
|
||||
<div class="nav-group-container">
|
||||
<div
|
||||
<div id="groupView" class="feature-group">
|
||||
<div th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.edit})}">
|
||||
</div>
|
||||
<div class="nav-group-container">
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry('view-pdf', 'menu_book', 'home.viewPdf.title', 'home.viewPdf.desc', 'viewPdf.tags', 'other')}">
|
||||
</div>
|
||||
<div
|
||||
@@ -246,16 +241,15 @@ th:replace="~{fragments/navbarEntryCustom :: navbarEntry('redact', '/images/reda
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry('remove-image-pdf', 'remove_selection', 'home.removeImagePdf.title', 'home.removeImagePdf.desc', 'removeImagePdf.tags', 'other')}">
|
||||
</div>
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry('replace-color-pdf', 'format_color_fill', 'home.replaceColorPdf.title', 'home.replaceColorPdf.desc', 'replaceColorPdf.tags', 'other')}">
|
||||
</div>
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry('replace-and-invert-color-pdf', 'format_color_fill', 'home.replaceColorPdf.title', 'home.replaceColorPdf.desc', 'replaceColorPdf.tags', 'other')}">
|
||||
</div>
|
||||
</div>
|
||||
<div id="groupAdvanced" class="feature-group">
|
||||
</div>
|
||||
<div id="groupAdvanced" class="feature-group">
|
||||
<div th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.advance})}">
|
||||
</div>
|
||||
<div class="nav-group-container">
|
||||
<div
|
||||
th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.advance})}">
|
||||
</div>
|
||||
<div class="nav-group-container">
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntry :: navbarEntry('pipeline', 'family_history', 'home.pipeline.title', 'home.pipeline.desc', 'pipeline.tags', 'advance')}">
|
||||
</div>
|
||||
<div
|
||||
@@ -291,6 +285,6 @@ th:replace="~{fragments/navbarEntryCustom :: navbarEntry('redact', '/images/reda
|
||||
<div
|
||||
th:replace="~{fragments/navbarEntryCustom :: navbarEntry('split-pdf-by-chapters', '/images/split-chapters.svg#icon-split-chapters', 'home.splitPdfByChapters.title', 'home.splitPdfByChapters.desc', 'splitPdfByChapters.tags', 'advance')}">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</th:block>
|
||||
</th:block>
|
||||
@@ -4,7 +4,7 @@ th:if="${@endpointConfiguration.isEndpointEnabled(endpoint)}">
|
||||
th:data-bs-link="@{${endpoint}}"
|
||||
th:classappend="${endpoint.equals(currentPage)} ? ${toolGroup} + ' active' : '' + ${toolGroup}"
|
||||
th:data-bs-tags="#{${tagKey}}" th:data-bs-title='#{${titleKey}}'>
|
||||
<div style="height:2.7rem; align-items: center;display: flex;" th:title="#{${descKey}}" class="icon" alt="icon"
|
||||
<div style="min-height:2.7rem; align-items: center;display: flex;" th:title="#{${descKey}}" class="icon" alt="icon"
|
||||
th:class="@{${toolGroup}}">
|
||||
<span class="material-symbols-rounded nav-icon" th:text="@{${toolIcon}}" style=" align-items:center; display: flex; justify-content: center; height:2.7rem; width:2.7rem"></span>
|
||||
<span class="icon-text" th:text="#{${titleKey}}"></span>
|
||||
@@ -15,4 +15,4 @@ th:if="${@endpointConfiguration.isEndpointEnabled(endpoint)}">
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</th:block>
|
||||
</th:block>
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
<th:block th:fragment="navbarEntry(endpoint, toolIcon, titleKey, descKey, tagKey, toolGroup)"
|
||||
th:if="${@endpointConfiguration.isEndpointEnabled(endpoint)}">
|
||||
th:if="${@endpointConfiguration.isEndpointEnabled(endpoint)}">
|
||||
<a th:id="@{${endpoint}}" class="dropdown-item" style="position:relative" th:href="@{${endpoint}}"
|
||||
th:data-bs-link="@{${endpoint}}"
|
||||
th:classappend="${endpoint.equals(currentPage)} ? ${toolGroup} + ' active' : '' + ${toolGroup}"
|
||||
th:data-bs-tags="#{${tagKey}}" th:data-bs-title='#{${titleKey}}'>
|
||||
<div style="height:2.5rem;align-items: center;display: flex" th:title="#{${descKey}}" class="icon" alt="icon"
|
||||
<div style="min-height:2.5rem;align-items: center;display: flex" th:title="#{${descKey}}" class="icon" alt="icon"
|
||||
th:class="@{${toolGroup}}">
|
||||
<svg class="nav-icon" style="height: 2.7rem; width:2.7rem; align-items:center; display: flex; justify-content: center;">
|
||||
<use th:href="@{${toolIcon}}"></use>
|
||||
<svg class="nav-icon"
|
||||
style="height: 2.7rem; width:2.7rem; align-items:center; display: flex; justify-content: center;">
|
||||
<use th:xlink:href="@{${toolIcon}}"></use>
|
||||
</svg>
|
||||
<span class="icon-text" th:text="#{${titleKey}}"></span>
|
||||
</div>
|
||||
@@ -17,4 +18,4 @@ th:if="${@endpointConfiguration.isEndpointEnabled(endpoint)}">
|
||||
</span>
|
||||
</a>
|
||||
|
||||
</th:block>
|
||||
</th:block>
|
||||
|
||||
@@ -27,15 +27,16 @@
|
||||
<span class="material-symbols-rounded search-icon">
|
||||
search
|
||||
</span>
|
||||
<input type="text" id="searchBar" onkeyup="filterCards()" th:placeholder="#{home.searchBar}" autofocus>
|
||||
<input type="text" id="searchBar" onkeyup="filterCardsLegacy()" th:placeholder="#{home.searchBar}" autofocus>
|
||||
<div style="display: flex; align-items: center;">
|
||||
<a href="home" onclick="setAsDefault('home')" style="text-decoration: none; color: inherit; cursor: pointer; display: flex; align-items: center;">
|
||||
<span th:text="#{home.newHomePage}">
|
||||
</span>
|
||||
<span class="material-symbols-rounded toggle-favourites" style="font-size: 2rem; margin-left: 0.2rem;" >
|
||||
home
|
||||
</span>
|
||||
</a>
|
||||
<a href="home" onclick="setAsDefault('home')"
|
||||
style="text-decoration: none; color: inherit; cursor: pointer; display: flex; align-items: center;">
|
||||
<span th:text="#{home.newHomePage}">
|
||||
</span>
|
||||
<span class="material-symbols-rounded toggle-favourites" style="font-size: 2rem; margin-left: 0.2rem;">
|
||||
home
|
||||
</span>
|
||||
</a>
|
||||
</div>
|
||||
<div id="filtersContainer">
|
||||
<span class="material-symbols-rounded filter-button" onclick="toggleFavoritesOnly()">
|
||||
@@ -70,7 +71,8 @@
|
||||
</div>
|
||||
|
||||
<div id="groupFavorites" class="feature-group-legacy">
|
||||
<div th:replace="~{fragments/featureGroupHeaderLegacy :: featureGroupHeader(groupTitle=#{navbar.favorite})}">
|
||||
<div
|
||||
th:replace="~{fragments/featureGroupHeaderLegacy :: featureGroupHeader(groupTitle=#{navbar.favorite})}">
|
||||
</div>
|
||||
<div class="feature-group-container">
|
||||
</div>
|
||||
@@ -148,7 +150,7 @@
|
||||
</div>
|
||||
<div class="feature-group-container">
|
||||
<div
|
||||
th:replace="~{fragments/card :: card(id='img-to-pdf', cardTitle=#{home.imageToPdf.title}, cardText=#{home.imageToPdf.desc}, cardLink='picture_as_pdf', toolIcon='picture_as_pdf', tags=#{imageToPdf.tags}, toolGroup='image')}">
|
||||
th:replace="~{fragments/card :: card(id='img-to-pdf', cardTitle=#{home.imageToPdf.title}, cardText=#{home.imageToPdf.desc}, cardLink='img-to-pdf', toolIcon='picture_as_pdf', tags=#{imageToPdf.tags}, toolGroup='image')}">
|
||||
</div>
|
||||
<div
|
||||
th:replace="~{fragments/card :: card(id='file-to-pdf', cardTitle=#{home.fileToPDF.title}, cardText=#{home.fileToPDF.desc}, cardLink='file-to-pdf', toolIcon='draft', tags=#{fileToPDF.tags}, toolGroup='convert')}">
|
||||
@@ -248,7 +250,8 @@
|
||||
</div>
|
||||
|
||||
<div id="groupView" class="feature-group-legacy">
|
||||
<div th:replace="~{fragments/featureGroupHeaderLegacy :: featureGroupHeader(groupTitle=#{navbar.sections.edit})}">
|
||||
<div
|
||||
th:replace="~{fragments/featureGroupHeaderLegacy :: featureGroupHeader(groupTitle=#{navbar.sections.edit})}">
|
||||
</div>
|
||||
<div class="feature-group-container">
|
||||
<div
|
||||
@@ -289,7 +292,7 @@
|
||||
th:replace="~{fragments/card :: card(id='remove-image-pdf', cardTitle=#{home.removeImagePdf.title}, cardText=#{home.removeImagePdf.desc}, cardLink='remove-image-pdf', toolIcon='remove_selection', tags=#{removeImagePdf.tags}, toolGroup='other')}">
|
||||
</div>
|
||||
<div
|
||||
th:replace="~{fragments/card :: card(id='replace-color-pdf', cardTitle=#{home.replaceColorPdf.title}, cardText=#{home.replaceColorPdf.desc}, cardLink='replace-and-invert-color-pdf', toolIcon='format_color_fill', tags=#{replaceColorPdf.tags}, toolGroup='other')}">
|
||||
th:replace="~{fragments/card :: card(id='replace-and-invert-color-pdf', cardTitle=#{home.replaceColorPdf.title}, cardText=#{home.replaceColorPdf.desc}, cardLink='replace-and-invert-color-pdf', toolIcon='format_color_fill', tags=#{replaceColorPdf.tags}, toolGroup='other')}">
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@@ -513,7 +516,7 @@
|
||||
function setAsDefault(value) {
|
||||
localStorage.setItem('defaultView', value);
|
||||
console.log(`Default view set to: ${value}`);
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
|
||||
|
||||
@@ -1,86 +1,96 @@
|
||||
<!DOCTYPE html>
|
||||
<html th:lang="${#locale.language}" th:dir="#{language.direction}" th:data-language="${#locale.toString()}" xmlns:th="https://www.thymeleaf.org">
|
||||
<head>
|
||||
<html th:lang="${#locale.language}" th:dir="#{language.direction}" th:data-language="${#locale.toString()}"
|
||||
xmlns:th="https://www.thymeleaf.org">
|
||||
|
||||
<head>
|
||||
<th:block th:insert="~{fragments/common :: head(title=#{autoRedact.title}, header=#{autoRedact.header})}"></th:block>
|
||||
</head>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="page-container">
|
||||
<div id="content-wrap">
|
||||
<th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
|
||||
<br><br>
|
||||
<div class="container">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-6 bg-card">
|
||||
<div class="tool-header">
|
||||
<span class="material-symbols-rounded tool-header-icon security">playlist_remove</span>
|
||||
<span class="tool-header-text" th:text="#{autoRedact.header}"></span>
|
||||
</div>
|
||||
<form th:action="@{'api/v1/security/auto-redact'}" method="post" enctype="multipart/form-data">
|
||||
<div class="mb-3">
|
||||
<input type="file" class="form-control" id="fileInput" name="fileInput" required accept="application/pdf">
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="listOfText" class="form-label" th:text="#{autoRedact.textsToRedactLabel}"></label>
|
||||
<textarea class="form-control" id="listOfText" name="listOfText" rows="4" required th:placeholder="#{autoRedact.textsToRedactPlaceholder}"></textarea>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="defaultColor" class="form-label" th:text="#{autoRedact.colorLabel}">Color</label>
|
||||
<select class="form-control" id="defaultColor" name="defaultColor" onchange="handleColorChange(this.value)">
|
||||
<option value="#000000" th:text="#{black}">Black</option>
|
||||
<option value="#FFFFFF" th:text="#{white}">White</option>
|
||||
<option value="#FF0000" th:text="#{red}">Red</option>
|
||||
<option value="#00FF00" th:text="#{green}">Green</option>
|
||||
<option value="#0000FF" th:text="#{blue}">Blue</option>
|
||||
<option value="custom" th:text="#{custom}">Custom...</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<!-- Custom Color Input -->
|
||||
<div class="mb-3" id="customColorContainer" style="display: none;">
|
||||
<label for="customColor" class="form-label" th:text="#{autoRedact.colorLabel}">Custom Color</label>
|
||||
<input type="text" class="form-control" id="customColor" name="redactColor" placeholder="#FF00FF">
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function handleColorChange(selectedValue) {
|
||||
if (selectedValue === "custom") {
|
||||
document.getElementById('customColorContainer').style.display = 'block';
|
||||
} else {
|
||||
document.getElementById('customColorContainer').style.display = 'none';
|
||||
document.getElementById('customColor').value = selectedValue;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<div class="mb-3 form-check">
|
||||
<input type="checkbox" id="useRegex" name="useRegex">
|
||||
<label for="useRegex" th:text="#{autoRedact.useRegexLabel}"></label>
|
||||
</div>
|
||||
|
||||
<div class="mb-3 form-check">
|
||||
<input type="checkbox" id="wholeWordSearch" name="wholeWordSearch">
|
||||
<label for="wholeWordSearch" th:text="#{autoRedact.wholeWordSearchLabel}"></label>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="customPadding" class="form-label" th:text="#{autoRedact.customPaddingLabel}"></label>
|
||||
<input type="number" step="0.1" class="form-control" id="customPadding" name="customPadding" value="0.1">
|
||||
</div>
|
||||
|
||||
<div class="mb-3 form-check">
|
||||
<input type="checkbox" id="convertPDFToImage" name="convertPDFToImage" checked>
|
||||
<label for="convertPDFToImage" th:text="#{autoRedact.convertPDFToImageLabel}"></label>
|
||||
</div>
|
||||
|
||||
<button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{autoRedact.submitButton}"></button>
|
||||
</form>
|
||||
<body>
|
||||
<div id="page-container">
|
||||
<div id="content-wrap">
|
||||
<th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
|
||||
<br><br>
|
||||
<div class="container">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-6 bg-card">
|
||||
<div class="tool-header">
|
||||
<svg class="material-symbols-rounded tool-header-icon security">
|
||||
<use xlink:href="/images/redact-auto.svg#icon-redact-auto"></use>
|
||||
</svg>
|
||||
<span class="tool-header-text" th:text="#{autoRedact.header}"></span>
|
||||
</div>
|
||||
<form th:action="@{'api/v1/security/auto-redact'}" method="post" enctype="multipart/form-data">
|
||||
<div class="mb-3">
|
||||
<input type="file" class="form-control" id="fileInput" name="fileInput" required
|
||||
accept="application/pdf">
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="listOfText" class="form-label" th:text="#{autoRedact.textsToRedactLabel}"></label>
|
||||
<textarea class="form-control" id="listOfText" name="listOfText" rows="4" required
|
||||
th:placeholder="#{autoRedact.textsToRedactPlaceholder}"></textarea>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="defaultColor" class="form-label" th:text="#{autoRedact.colorLabel}">Color</label>
|
||||
<select class="form-control" id="defaultColor" name="defaultColor"
|
||||
onchange="handleColorChange(this.value)">
|
||||
<option value="#000000" th:text="#{black}">Black</option>
|
||||
<option value="#FFFFFF" th:text="#{white}">White</option>
|
||||
<option value="#FF0000" th:text="#{red}">Red</option>
|
||||
<option value="#00FF00" th:text="#{green}">Green</option>
|
||||
<option value="#0000FF" th:text="#{blue}">Blue</option>
|
||||
<option value="custom" th:text="#{custom}">Custom...</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<!-- Custom Color Input -->
|
||||
<div class="mb-3" id="customColorContainer" style="display: none;">
|
||||
<label for="customColor" class="form-label" th:text="#{autoRedact.colorLabel}">Custom Color</label>
|
||||
<input type="text" class="form-control" id="customColor" name="redactColor" placeholder="#FF00FF">
|
||||
</div>
|
||||
|
||||
<script>
|
||||
function handleColorChange(selectedValue) {
|
||||
if (selectedValue === "custom") {
|
||||
document.getElementById('customColorContainer').style.display = 'block';
|
||||
} else {
|
||||
document.getElementById('customColorContainer').style.display = 'none';
|
||||
document.getElementById('customColor').value = selectedValue;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<div class="mb-3 form-check">
|
||||
<input type="checkbox" id="useRegex" name="useRegex">
|
||||
<label for="useRegex" th:text="#{autoRedact.useRegexLabel}"></label>
|
||||
</div>
|
||||
|
||||
<div class="mb-3 form-check">
|
||||
<input type="checkbox" id="wholeWordSearch" name="wholeWordSearch">
|
||||
<label for="wholeWordSearch" th:text="#{autoRedact.wholeWordSearchLabel}"></label>
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="customPadding" class="form-label" th:text="#{autoRedact.customPaddingLabel}"></label>
|
||||
<input type="number" step="0.1" class="form-control" id="customPadding" name="customPadding"
|
||||
value="0.1">
|
||||
</div>
|
||||
|
||||
<div class="mb-3 form-check">
|
||||
<input type="checkbox" id="convertPDFToImage" name="convertPDFToImage" checked>
|
||||
<label for="convertPDFToImage" th:text="#{autoRedact.convertPDFToImageLabel}"></label>
|
||||
</div>
|
||||
|
||||
<button type="submit" id="submitBtn" class="btn btn-primary"
|
||||
th:text="#{autoRedact.submitButton}"></button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
|
||||
</div>
|
||||
</body>
|
||||
<th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -31,7 +31,9 @@
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-6 bg-card">
|
||||
<div class="tool-header">
|
||||
<span class="material-symbols-rounded tool-header-icon security">playlist_remove</span>
|
||||
<svg class="material-symbols-rounded tool-header-icon security">
|
||||
<use xlink:href="/images/redact-manual.svg#icon-redact-manual"></use>
|
||||
</svg>
|
||||
<span class="tool-header-text" th:text="#{redact.header}"></span>
|
||||
</div>
|
||||
<form th:action="@{'api/v1/security/redact'}" method="post" enctype="multipart/form-data">
|
||||
|
||||
@@ -1,41 +1,52 @@
|
||||
<!DOCTYPE html>
|
||||
<html th:lang="${#locale.language}" th:dir="#{language.direction}" th:data-language="${#locale.toString()}" xmlns:th="https://www.thymeleaf.org">
|
||||
<head>
|
||||
<th:block th:insert="~{fragments/common :: head(title=#{split-by-size-or-count.title}, header=#{split-by-size-or-count.header})}"></th:block>
|
||||
</head>
|
||||
<html th:lang="${#locale.language}" th:dir="#{language.direction}" th:data-language="${#locale.toString()}"
|
||||
xmlns:th="https://www.thymeleaf.org">
|
||||
|
||||
<body>
|
||||
<th:block th:insert="~{fragments/common :: game}"></th:block>
|
||||
<div id="page-container">
|
||||
<div id="content-wrap">
|
||||
<th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
|
||||
<br><br>
|
||||
<div class="container">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-6 bg-card">
|
||||
<div class="tool-header">
|
||||
<span class="material-symbols-rounded tool-header-icon advance">vertical_split</span>
|
||||
<span class="tool-header-text" th:text="#{split-by-size-or-count.header}"></span>
|
||||
</div>
|
||||
<form method="post" enctype="multipart/form-data" th:action="@{'/api/v1/general/split-by-size-or-count'}">
|
||||
<div th:replace="~{fragments/common :: fileSelector(name='fileInput', multipleInputsForSingleRequest=false, accept='application/pdf')}"></div>
|
||||
<label for="splitType" th:text="#{split-by-size-or-count.type.label}">Split Type</label>
|
||||
<select id="splitType" name="splitType" class="form-control">
|
||||
<option value="0" th:text="#{split-by-size-or-count.type.size}">Size</option>
|
||||
<option value="1" th:text="#{split-by-size-or-count.type.pageCount}">Page Count</option>
|
||||
<option value="2" th:text="#{split-by-size-or-count.type.docCount}">Document Count</option>
|
||||
</select>
|
||||
<br>
|
||||
<label for="splitValue" th:text="#{split-by-size-or-count.value.label}">Split Value</label>
|
||||
<input type="text" id="splitValue" name="splitValue" class="form-control" required th:placeholder="#{split-by-size-or-count.value.placeholder}">
|
||||
<br>
|
||||
<button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{split-by-size-or-count.submit}">Submit</button>
|
||||
</form>
|
||||
<head>
|
||||
<th:block
|
||||
th:insert="~{fragments/common :: head(title=#{split-by-size-or-count.title}, header=#{split-by-size-or-count.header})}">
|
||||
</th:block>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<th:block th:insert="~{fragments/common :: game}"></th:block>
|
||||
<div id="page-container">
|
||||
<div id="content-wrap">
|
||||
<th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
|
||||
<br><br>
|
||||
<div class="container">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-6 bg-card">
|
||||
<div class="tool-header">
|
||||
<svg class="material-symbols-rounded tool-header-icon advance">
|
||||
<use xlink:href="/images/split-size.svg#icon-split-size"></use>
|
||||
</svg>
|
||||
<span class="tool-header-text" th:text="#{split-by-size-or-count.header}"></span>
|
||||
</div>
|
||||
<form method="post" enctype="multipart/form-data" th:action="@{'/api/v1/general/split-by-size-or-count'}">
|
||||
<div
|
||||
th:replace="~{fragments/common :: fileSelector(name='fileInput', multipleInputsForSingleRequest=false, accept='application/pdf')}">
|
||||
</div>
|
||||
<label for="splitType" th:text="#{split-by-size-or-count.type.label}">Split Type</label>
|
||||
<select id="splitType" name="splitType" class="form-control">
|
||||
<option value="0" th:text="#{split-by-size-or-count.type.size}">Size</option>
|
||||
<option value="1" th:text="#{split-by-size-or-count.type.pageCount}">Page Count</option>
|
||||
<option value="2" th:text="#{split-by-size-or-count.type.docCount}">Document Count</option>
|
||||
</select>
|
||||
<br>
|
||||
<label for="splitValue" th:text="#{split-by-size-or-count.value.label}">Split Value</label>
|
||||
<input type="text" id="splitValue" name="splitValue" class="form-control" required
|
||||
th:placeholder="#{split-by-size-or-count.value.placeholder}">
|
||||
<br>
|
||||
<button type="submit" id="submitBtn" class="btn btn-primary"
|
||||
th:text="#{split-by-size-or-count.submit}">Submit</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
|
||||
</div>
|
||||
</body>
|
||||
<th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,66 +1,72 @@
|
||||
<!DOCTYPE html>
|
||||
<html th:lang="${#locale.language}" th:dir="#{language.direction}" th:data-language="${#locale.toString()}"
|
||||
xmlns:th="https://www.thymeleaf.org">
|
||||
xmlns:th="https://www.thymeleaf.org">
|
||||
|
||||
<head>
|
||||
<th:block th:insert="~{fragments/common :: head(title=#{splitByChapters.title}, header=#{splitByChapters.header})}"></th:block>
|
||||
<th:block th:insert="~{fragments/common :: head(title=#{splitByChapters.title}, header=#{splitByChapters.header})}">
|
||||
</th:block>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="page-container">
|
||||
<div id="content-wrap">
|
||||
<th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
|
||||
<br><br>
|
||||
<div class="container">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-6 bg-card">
|
||||
<div class="tool-header">
|
||||
<span class="material-symbols-rounded tool-header-icon organize">book</span>
|
||||
<span class="tool-header-text" th:text="#{splitByChapters.header}"></span>
|
||||
<div id="page-container">
|
||||
<div id="content-wrap">
|
||||
<th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
|
||||
<br><br>
|
||||
<div class="container">
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-6 bg-card">
|
||||
<div class="tool-header">
|
||||
<svg class="material-symbols-rounded tool-header-icon advance">
|
||||
<use xlink:href="/images/split-chapters.svg#icon-split-chapters"></use>
|
||||
</svg>
|
||||
<span class="tool-header-text" th:text="#{splitByChapters.header}"></span>
|
||||
</div>
|
||||
<form th:action="@{'/api/v1/general/split-pdf-by-chapters'}" method="post" enctype="multipart/form-data">
|
||||
<div
|
||||
th:replace="~{fragments/common :: fileSelector(name='fileInput', multipleInputsForSingleRequest=false, accept='application/pdf')}">
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="bookmarkLevel" th:text="#{splitByChapters.bookmarkLevel}"></label>
|
||||
<input type="number" class="form-control" id="bookmarkLevel" name="bookmarkLevel" min="0" value="0"
|
||||
required>
|
||||
</div>
|
||||
|
||||
<div class="mb-3 form-check">
|
||||
<input type="checkbox" class="form-check-input" id="includeMetadata" name="includeMetadata">
|
||||
<label class="form-check-label" for="includeMetadata"
|
||||
th:text="#{splitByChapters.includeMetadata}"></label>
|
||||
<input type="hidden" name="includeMetadata" value="false" />
|
||||
</div>
|
||||
|
||||
<div class="mb-3 form-check">
|
||||
<input type="checkbox" class="form-check-input" id="allowDuplicates" name="allowDuplicates">
|
||||
<label class="form-check-label" for="allowDuplicates"
|
||||
th:text="#{splitByChapters.allowDuplicates}"></label>
|
||||
<input type="hidden" name="allowDuplicates" value="false" />
|
||||
</div>
|
||||
|
||||
<p>
|
||||
<a class="btn btn-outline-primary" data-bs-toggle="collapse" href="#info" role="button"
|
||||
aria-expanded="false" aria-controls="info" th:text="#{info}"></a>
|
||||
</p>
|
||||
<div class="collapse" id="info">
|
||||
<p th:text="#{splitByChapters.desc.1}"></p>
|
||||
<p th:text="#{splitByChapters.desc.2}"></p>
|
||||
<p th:text="#{splitByChapters.desc.3}"></p>
|
||||
<p th:text="#{splitByChapters.desc.4}"></p>
|
||||
</div>
|
||||
|
||||
<br>
|
||||
<button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{splitByChapters.submit}"></button>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
<form th:action="@{'/api/v1/general/split-pdf-by-chapters'}" method="post" enctype="multipart/form-data">
|
||||
<div
|
||||
th:replace="~{fragments/common :: fileSelector(name='fileInput', multipleInputsForSingleRequest=false, accept='application/pdf')}">
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="bookmarkLevel" th:text="#{splitByChapters.bookmarkLevel}"></label>
|
||||
<input type="number" class="form-control" id="bookmarkLevel" name="bookmarkLevel" min="0" value="0" required>
|
||||
</div>
|
||||
|
||||
<div class="mb-3 form-check">
|
||||
<input type="checkbox" class="form-check-input" id="includeMetadata" name="includeMetadata">
|
||||
<label class="form-check-label" for="includeMetadata" th:text="#{splitByChapters.includeMetadata}"></label>
|
||||
<input type="hidden" name="includeMetadata" value="false" />
|
||||
</div>
|
||||
|
||||
<div class="mb-3 form-check">
|
||||
<input type="checkbox" class="form-check-input" id="allowDuplicates" name="allowDuplicates">
|
||||
<label class="form-check-label" for="allowDuplicates" th:text="#{splitByChapters.allowDuplicates}"></label>
|
||||
<input type="hidden" name="allowDuplicates" value="false" />
|
||||
</div>
|
||||
|
||||
<p>
|
||||
<a class="btn btn-outline-primary" data-bs-toggle="collapse" href="#info" role="button"
|
||||
aria-expanded="false" aria-controls="info" th:text="#{info}"></a>
|
||||
</p>
|
||||
<div class="collapse" id="info">
|
||||
<p th:text="#{splitByChapters.desc.1}"></p>
|
||||
<p th:text="#{splitByChapters.desc.2}"></p>
|
||||
<p th:text="#{splitByChapters.desc.3}"></p>
|
||||
<p th:text="#{splitByChapters.desc.4}"></p>
|
||||
</div>
|
||||
|
||||
<br>
|
||||
<button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{splitByChapters.submit}"></button>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
|
||||
</div>
|
||||
<th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||