Compare commits

..

1 Commits

Author SHA1 Message Date
Anthony Stirling
ca8295b02e Create sonarqube.yml 2025-02-03 15:06:44 +00:00
101 changed files with 12103 additions and 877 deletions

View File

@@ -105,7 +105,7 @@ jobs:
DOCKER_ENABLE_SECURITY: false DOCKER_ENABLE_SECURITY: false
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@f7ce87c1d6bead3e36075b2ce75da1f6cc28aaca # v3.9.0 uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0
- name: Get version number - name: Get version number
id: versionNumber id: versionNumber

View File

@@ -37,6 +37,12 @@ jobs:
java-version: ${{ matrix.jdk-version }} java-version: ${{ matrix.jdk-version }}
distribution: "temurin" 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 - name: Build with Gradle and no spring security
run: ./gradlew clean build run: ./gradlew clean build
env: env:
@@ -120,7 +126,7 @@ jobs:
distribution: "adopt" distribution: "adopt"
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@f7ce87c1d6bead3e36075b2ce75da1f6cc28aaca # v3.9.0 uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0
- name: Install Docker Compose - name: Install Docker Compose
run: | run: |
@@ -141,4 +147,4 @@ jobs:
run: | run: |
chmod +x ./testing/test_webpages.sh chmod +x ./testing/test_webpages.sh
chmod +x ./testing/test.sh chmod +x ./testing/test.sh
./testing/test.sh ./testing/test.sh "${{ github.event.pull_request.user.login == 'dependabot[bot]' }}"

View File

@@ -38,7 +38,7 @@ jobs:
java-version: "17" java-version: "17"
distribution: "adopt" distribution: "adopt"
- uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0 - uses: gradle/actions/setup-gradle@0bdd871935719febd78681f197cd39af5b6e16a6 # v4.2.2
- name: check the licenses for compatibility - name: check the licenses for compatibility
run: ./gradlew clean checkLicense run: ./gradlew clean checkLicense

View File

@@ -63,7 +63,7 @@ jobs:
java-version: "21" java-version: "21"
distribution: "temurin" distribution: "temurin"
- uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0 - uses: gradle/actions/setup-gradle@0bdd871935719febd78681f197cd39af5b6e16a6 # v4.2.2
with: with:
gradle-version: 8.12 gradle-version: 8.12
@@ -151,7 +151,7 @@ jobs:
java-version: "21" java-version: "21"
distribution: "temurin" distribution: "temurin"
- uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0 - uses: gradle/actions/setup-gradle@0bdd871935719febd78681f197cd39af5b6e16a6 # v4.2.2
with: with:
gradle-version: 8.12 gradle-version: 8.12

View File

@@ -30,7 +30,7 @@ jobs:
java-version: "17" java-version: "17"
distribution: "temurin" distribution: "temurin"
- uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0 - uses: gradle/actions/setup-gradle@0bdd871935719febd78681f197cd39af5b6e16a6 # v4.2.2
with: with:
gradle-version: 8.12 gradle-version: 8.12
@@ -47,7 +47,7 @@ jobs:
- name: Set up Docker Buildx - name: Set up Docker Buildx
id: buildx id: buildx
uses: docker/setup-buildx-action@f7ce87c1d6bead3e36075b2ce75da1f6cc28aaca # v3.9.0 uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0
- name: Get version number - name: Get version number
id: versionNumber id: versionNumber
@@ -67,7 +67,7 @@ jobs:
password: ${{ github.token }} password: ${{ github.token }}
- name: Set up QEMU - name: Set up QEMU
uses: docker/setup-qemu-action@4574d27a4764455b42196d70a065bc6853246a25 # v3.4.0 uses: docker/setup-qemu-action@53851d14592bedcffcf25ea515637cff71ef929a # v3.3.0
- name: Convert repository owner to lowercase - name: Convert repository owner to lowercase
id: repoowner id: repoowner

View File

@@ -35,7 +35,7 @@ jobs:
java-version: "17" java-version: "17"
distribution: "temurin" distribution: "temurin"
- uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0 - uses: gradle/actions/setup-gradle@0bdd871935719febd78681f197cd39af5b6e16a6 # v4.2.2
with: with:
gradle-version: 8.12 gradle-version: 8.12

View File

@@ -74,6 +74,6 @@ jobs:
# Upload the results to GitHub's code scanning dashboard. # Upload the results to GitHub's code scanning dashboard.
- name: "Upload to code-scanning" - name: "Upload to code-scanning"
uses: github/codeql-action/upload-sarif@9e8d0789d4a0fa9ceb6b1738f7e269594bdd67f0 # v3.28.9 uses: github/codeql-action/upload-sarif@dd746615b3b9d728a6a37ca2045b68ca76d4841a # v3.28.8
with: with:
sarif_file: results.sarif sarif_file: results.sarif

View File

@@ -8,55 +8,30 @@ on:
permissions: permissions:
pull-requests: read pull-requests: read
actions: read
name: Run Sonarqube name: Run Sonarqube
jobs: jobs:
sonarqube: sonarqube:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Analyze with SonarCloud
# You can pin the exact commit or the version.
- name: Harden Runner # uses: SonarSource/sonarcloud-github-action@v2.2.0
uses: step-security/harden-runner@cb605e52c26070c328afc4562f0b4ada7618a84e # v2.10.4 uses: SonarSource/sonarcloud-github-action@4006f663ecaf1f8093e8e4abb9227f6041f52216 #v2.2.0
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: env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} # Generate a token on Sonarcloud.io, add it to the secrets of this repo with the name SONAR_TOKEN (Settings > Secrets > Actions > add new repository secret)
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: with:
name: gradle-problems-report # Additional arguments for the SonarScanner CLI
path: build/reports/problems/problems-report.html args:
retention-days: 7 # Unique keys of your project and organization. You can find them in SonarCloud > Information (bottom-left menu)
# mandatory
- name: Upload Sonar Logs on Failure -Dsonar.projectKey=Stirling-Tools_Stirling-PDF
if: failure() -Dsonar.organization=stirling-tools
uses: actions/upload-artifact@65c4c4a1ddee5b72f698fdd19549f0f0fb45cf08 # v4.6.0 # Comma-separated paths to directories containing main source files.
with: #-Dsonar.sources= # optional, default is project base directory
name: sonar-logs # Comma-separated paths to directories containing test source files.
path: | #-Dsonar.tests= # optional. For more info about Code Coverage, please refer to https://docs.sonarcloud.io/enriching/test-coverage/overview/
.scannerwork/report-task.txt # Adds more detail to both client and server-side analysis logs, activating DEBUG mode for the scanner, and adding client-side environment variables and system properties to the server-side log of analysis report processing.
build/sonar/ #-Dsonar.verbose= # optional, default is false
retention-days: 7 # When you need the analysis to take place in a directory other than the one from which it was launched, default is .
projectBaseDir: .

View File

@@ -26,7 +26,7 @@ jobs:
java-version: "17" java-version: "17"
distribution: "temurin" distribution: "temurin"
- uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0 - uses: gradle/actions/setup-gradle@0bdd871935719febd78681f197cd39af5b6e16a6 # v4.2.2
- name: Generate Swagger documentation - name: Generate Swagger documentation
run: ./gradlew generateOpenApiDocs run: ./gradlew generateOpenApiDocs

View File

@@ -8,6 +8,8 @@ on:
paths: paths:
- "build.gradle" - "build.gradle"
- "README.md" - "README.md"
- "gradle/verification-keyring.keys"
- "gradle/verification-metadata.xml"
- "src/main/resources/messages_*.properties" - "src/main/resources/messages_*.properties"
- "src/main/resources/static/3rdPartyLicenses.json" - "src/main/resources/static/3rdPartyLicenses.json"
- "scripts/ignore_translation.toml" - "scripts/ignore_translation.toml"
@@ -102,6 +104,22 @@ jobs:
git add README.md git add README.md
git diff --staged --quiet || git commit -m ":memo: Sync README.md" || echo "no changes" 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 - name: Create Pull Request
uses: peter-evans/create-pull-request@67ccf781d68cd99b580ae25a5c18a1cc84ffff1f # v7.0.6 uses: peter-evans/create-pull-request@67ccf781d68cd99b580ae25a5c18a1cc84ffff1f # v7.0.6
with: with:
@@ -111,11 +129,11 @@ jobs:
author: ${{ needs.read_bot_entries.outputs.committer }} author: ${{ needs.read_bot_entries.outputs.committer }}
signoff: true signoff: true
branch: sync_readme branch: sync_readme
title: ":globe_with_meridians: Sync Translations + Update README Progress Table" title: ":globe_with_meridians: Sync Translations + Update README Progress Table + Update Verification Metadata"
body: | body: |
### Description of Changes ### Description of Changes
This Pull Request was automatically generated to synchronize updates to translation files and documentation. Below are the details of the changes made: This Pull Request was automatically generated to synchronize updates to translation files, verification metadata, and documentation. Below are the details of the changes made:
#### **1. Synchronization of Translation Files** #### **1. Synchronization of Translation Files**
- Updated translation files (`messages_*.properties`) to reflect changes in the reference file `messages_en_GB.properties`. - Updated translation files (`messages_*.properties`) to reflect changes in the reference file `messages_en_GB.properties`.
@@ -127,9 +145,14 @@ jobs:
- Added a summary of the current translation status for all supported languages. - Added a summary of the current translation status for all supported languages.
- Included up-to-date statistics on translation coverage. - 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** #### **Why these changes are necessary**
- Keeps translation files aligned with the latest reference updates. - Keeps translation files aligned with the latest reference updates.
- Ensures the documentation reflects the current translation progress. - Ensures the documentation reflects the current translation progress.
- Strengthens dependency verification for a more secure build process.
--- ---
@@ -143,3 +166,5 @@ jobs:
add-paths: | add-paths: |
README.md README.md
src/main/resources/messages_*.properties src/main/resources/messages_*.properties
gradle/verification-keyring.keys
gradle/verification-metadata.xml

View File

@@ -31,7 +31,7 @@ jobs:
DOCKER_ENABLE_SECURITY: false DOCKER_ENABLE_SECURITY: false
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@f7ce87c1d6bead3e36075b2ce75da1f6cc28aaca # v3.9.0 uses: docker/setup-buildx-action@6524bf65af31da8d45b59e8c27de4bd072b392f5 # v3.8.0
- name: Get version number - name: Get version number
id: versionNumber id: versionNumber

View File

@@ -585,3 +585,41 @@ 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. 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.

View File

@@ -39,43 +39,41 @@ ENV DOCKER_ENABLE_SECURITY=false \
# JDK for app # JDK for app
RUN echo "@main https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/apk/repositories && \ RUN echo "@testing 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/community" | tee -a /etc/apk/repositories && \
echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/testing" | tee -a /etc/apk/repositories && \ echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/testing" | tee -a /etc/apk/repositories && \
apk upgrade --no-cache -a && \ apk upgrade --no-cache -a && \
apk add --no-cache \ apk add --no-cache \
ca-certificates \ ca-certificates \
tzdata \ tzdata \
tini \ tini \
bash \ bash \
curl \ curl \
qpdf \ qpdf \
shadow \ shadow \
su-exec \ su-exec \
openssl \ openssl \
openssl-dev \ openssl-dev \
openjdk21-jre \ openjdk21-jre \
# Doc conversion # Doc conversion
gcompat \ libreoffice \
libc6-compat \ # pdftohtml
libreoffice \ poppler-utils \
# pdftohtml # OCR MY PDF (unpaper for descew and other advanced features)
poppler-utils \ tesseract-ocr-data-eng \
# OCR MY PDF (unpaper for descew and other advanced features) # CV
tesseract-ocr-data-eng \ py3-opencv \
# CV # python3/pip
py3-opencv \ python3 \
python3 \ py3-pip && \
py3-unoconv@testing \ # uno unoconv and HTML
py3-pillow@testing \ pip install --break-system-packages --no-cache-dir --upgrade unoconv WeasyPrint pdf2image pillow && \
py3-pdf2image@testing \
weasyprint@community && \
mv /usr/share/tessdata /usr/share/tessdata-original && \ mv /usr/share/tessdata /usr/share/tessdata-original && \
mkdir -p $HOME /configs /logs /customFiles /pipeline/watchedFolders /pipeline/finishedFolders && \ mkdir -p $HOME /configs /logs /customFiles /pipeline/watchedFolders /pipeline/finishedFolders && \
fc-cache -f -v && \ fc-cache -f -v && \
chmod +x /scripts/* && \ chmod +x /scripts/* && \
chmod +x /scripts/init.sh && \ chmod +x /scripts/init.sh && \
# User permissions # User permissions
addgroup -S stirlingpdfgroup && adduser -S stirlingpdfuser -G stirlingpdfgroup && \ addgroup -S stirlingpdfgroup && adduser -S stirlingpdfuser -G stirlingpdfgroup && \
chown -R stirlingpdfuser:stirlingpdfgroup $HOME /scripts /usr/share/fonts/opentype/noto /configs /customFiles /pipeline && \ chown -R stirlingpdfuser:stirlingpdfgroup $HOME /scripts /usr/share/fonts/opentype/noto /configs /customFiles /pipeline && \
chown stirlingpdfuser:stirlingpdfgroup /app.jar chown stirlingpdfuser:stirlingpdfgroup /app.jar

View File

@@ -9,7 +9,7 @@ COPY . .
# Build the application with DOCKER_ENABLE_SECURITY=false # Build the application with DOCKER_ENABLE_SECURITY=false
RUN DOCKER_ENABLE_SECURITY=true \ RUN DOCKER_ENABLE_SECURITY=true \
./gradlew clean build ./gradlew clean build
# Main stage # Main stage
FROM alpine:3.21.2@sha256:56fa17d2a7e7f168a043a2712e63aed1f8543aeafdcee47c58dcffe38ed51099 FROM alpine:3.21.2@sha256:56fa17d2a7e7f168a043a2712e63aed1f8543aeafdcee47c58dcffe38ed51099
@@ -41,46 +41,42 @@ ENV DOCKER_ENABLE_SECURITY=false \
# JDK for app # JDK for app
RUN echo "@main https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /etc/apk/repositories && \ RUN echo "@testing 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/community" | tee -a /etc/apk/repositories && \
echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/testing" | tee -a /etc/apk/repositories && \ echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/testing" | tee -a /etc/apk/repositories && \
apk upgrade --no-cache -a && \ apk upgrade --no-cache -a && \
apk add --no-cache \ apk add --no-cache \
ca-certificates \ ca-certificates \
tzdata \ tzdata \
tini \ tini \
bash \ bash \
curl \ curl \
shadow \ shadow \
su-exec \ su-exec \
openssl \ openssl \
openssl-dev \ openssl-dev \
openjdk21-jre \ openjdk21-jre \
# Doc conversion # Doc conversion
gcompat \ libreoffice \
libc6-compat \ # pdftohtml
libreoffice \ poppler-utils \
# pdftohtml # OCR MY PDF (unpaper for descew and other advanced featues)
poppler-utils \ qpdf \
# OCR MY PDF (unpaper for descew and other advanced featues) tesseract-ocr-data-eng \
qpdf \ font-terminus font-dejavu font-noto font-noto-cjk font-awesome font-noto-extra \
tesseract-ocr-data-eng \ # CV
font-terminus font-dejavu font-noto font-noto-cjk font-awesome font-noto-extra \ py3-opencv \
# CV # python3/pip
py3-opencv \ python3 \
# python3/pip py3-pip && \
python3 \ # uno unoconv and HTML
py3-unoconv@testing \ pip install --break-system-packages --no-cache-dir --upgrade unoconv WeasyPrint pdf2image pillow && \
py3-pillow@testing \
py3-pdf2image@testing \
weasyprint@community && \
# uno unoconv and HTML
mv /usr/share/tessdata /usr/share/tessdata-original && \ mv /usr/share/tessdata /usr/share/tessdata-original && \
mkdir -p $HOME /configs /logs /customFiles /pipeline/watchedFolders /pipeline/finishedFolders && \ mkdir -p $HOME /configs /logs /customFiles /pipeline/watchedFolders /pipeline/finishedFolders && \
fc-cache -f -v && \ fc-cache -f -v && \
chmod +x /scripts/* && \ chmod +x /scripts/* && \
chmod +x /scripts/init.sh && \ chmod +x /scripts/init.sh && \
# User permissions # User permissions
addgroup -S stirlingpdfgroup && adduser -S stirlingpdfuser -G stirlingpdfgroup && \ addgroup -S stirlingpdfgroup && adduser -S stirlingpdfuser -G stirlingpdfgroup && \
chown -R stirlingpdfuser:stirlingpdfgroup $HOME /scripts /usr/share/fonts/opentype/noto /configs /customFiles /pipeline && \ chown -R stirlingpdfuser:stirlingpdfgroup $HOME /scripts /usr/share/fonts/opentype/noto /configs /customFiles /pipeline && \
chown stirlingpdfuser:stirlingpdfgroup /app.jar chown stirlingpdfuser:stirlingpdfgroup /app.jar

View File

@@ -130,27 +130,27 @@ Stirling-PDF currently supports 39 languages!
| English (US) (en_US) | ![100%](https://geps.dev/progress/100) | | English (US) (en_US) | ![100%](https://geps.dev/progress/100) |
| French (Français) (fr_FR) | ![96%](https://geps.dev/progress/96) | | French (Français) (fr_FR) | ![96%](https://geps.dev/progress/96) |
| German (Deutsch) (de_DE) | ![99%](https://geps.dev/progress/99) | | German (Deutsch) (de_DE) | ![99%](https://geps.dev/progress/99) |
| Greek (Ελληνικά) (el_GR) | ![97%](https://geps.dev/progress/97) | | Greek (Ελληνικά) (el_GR) | ![98%](https://geps.dev/progress/98) |
| Hindi (हिंदी) (hi_IN) | ![98%](https://geps.dev/progress/98) | | Hindi (हिंदी) (hi_IN) | ![98%](https://geps.dev/progress/98) |
| Hungarian (Magyar) (hu_HU) | ![95%](https://geps.dev/progress/95) | | Hungarian (Magyar) (hu_HU) | ![95%](https://geps.dev/progress/95) |
| Indonesian (Bahasa Indonesia) (id_ID) | ![86%](https://geps.dev/progress/86) | | Indonesian (Bahasa Indonesia) (id_ID) | ![86%](https://geps.dev/progress/86) |
| Irish (Gaeilge) (ga_IE) | ![98%](https://geps.dev/progress/98) | | Irish (Gaeilge) (ga_IE) | ![98%](https://geps.dev/progress/98) |
| Italian (Italiano) (it_IT) | ![99%](https://geps.dev/progress/99) | | Italian (Italiano) (it_IT) | ![99%](https://geps.dev/progress/99) |
| Japanese (日本語) (ja_JP) | ![93%](https://geps.dev/progress/93) | | Japanese (日本語) (ja_JP) | ![93%](https://geps.dev/progress/93) |
| Korean (한국어) (ko_KR) | ![98%](https://geps.dev/progress/98) | | Korean (한국어) (ko_KR) | ![99%](https://geps.dev/progress/99) |
| Norwegian (Norsk) (no_NB) | ![78%](https://geps.dev/progress/78) | | Norwegian (Norsk) (no_NB) | ![79%](https://geps.dev/progress/79) |
| Persian (فارسی) (fa_IR) | ![94%](https://geps.dev/progress/94) | | Persian (فارسی) (fa_IR) | ![94%](https://geps.dev/progress/94) |
| Polish (Polski) (pl_PL) | ![86%](https://geps.dev/progress/86) | | Polish (Polski) (pl_PL) | ![86%](https://geps.dev/progress/86) |
| Portuguese (Português) (pt_PT) | ![97%](https://geps.dev/progress/97) | | Portuguese (Português) (pt_PT) | ![97%](https://geps.dev/progress/97) |
| Portuguese Brazilian (Português) (pt_BR) | ![98%](https://geps.dev/progress/98) | | Portuguese Brazilian (Português) (pt_BR) | ![97%](https://geps.dev/progress/97) |
| Romanian (Română) (ro_RO) | ![81%](https://geps.dev/progress/81) | | Romanian (Română) (ro_RO) | ![81%](https://geps.dev/progress/81) |
| Russian (Русский) (ru_RU) | ![98%](https://geps.dev/progress/98) | | Russian (Русский) (ru_RU) | ![98%](https://geps.dev/progress/98) |
| Serbian Latin alphabet (Srpski) (sr_LATN_RS) | ![63%](https://geps.dev/progress/63) | | Serbian Latin alphabet (Srpski) (sr_LATN_RS) | ![64%](https://geps.dev/progress/64) |
| Simplified Chinese (简体中文) (zh_CN) | ![90%](https://geps.dev/progress/90) | | Simplified Chinese (简体中文) (zh_CN) | ![89%](https://geps.dev/progress/89) |
| Slovakian (Slovensky) (sk_SK) | ![74%](https://geps.dev/progress/74) | | Slovakian (Slovensky) (sk_SK) | ![74%](https://geps.dev/progress/74) |
| Slovenian (Slovenščina) (sl_SI) | ![97%](https://geps.dev/progress/97) | | Slovenian (Slovenščina) (sl_SI) | ![97%](https://geps.dev/progress/97) |
| Spanish (Español) (es_ES) | ![87%](https://geps.dev/progress/87) | | Spanish (Español) (es_ES) | ![87%](https://geps.dev/progress/87) |
| Swedish (Svenska) (sv_SE) | ![92%](https://geps.dev/progress/92) | | Swedish (Svenska) (sv_SE) | ![87%](https://geps.dev/progress/87) |
| Thai (ไทย) (th_TH) | ![86%](https://geps.dev/progress/86) | | Thai (ไทย) (th_TH) | ![86%](https://geps.dev/progress/86) |
| Tibetan (བོད་ཡིག་) (zh_BO) | ![95%](https://geps.dev/progress/95) | | Tibetan (བོད་ཡིག་) (zh_BO) | ![95%](https://geps.dev/progress/95) |
| Traditional Chinese (繁體中文) (zh_TW) | ![98%](https://geps.dev/progress/98) | | Traditional Chinese (繁體中文) (zh_TW) | ![98%](https://geps.dev/progress/98) |

View File

@@ -8,8 +8,7 @@ plugins {
id "com.diffplug.spotless" version "7.0.2" id "com.diffplug.spotless" version "7.0.2"
id "com.github.jk1.dependency-license-report" version "2.9" id "com.github.jk1.dependency-license-report" version "2.9"
//id "nebula.lint" version "19.0.3" //id "nebula.lint" version "19.0.3"
id("org.panteleyev.jpackageplugin") version "1.6.1" id("org.panteleyev.jpackageplugin") version "1.6.0"
id "org.sonarqube" version "6.0.1.5171"
} }
import com.github.jk1.license.render.* import com.github.jk1.license.render.*
@@ -26,7 +25,7 @@ ext {
} }
group = "stirling.software" group = "stirling.software"
version = "0.41.0" version = "0.40.1"
java { java {
// 17 is lowest but we support and recommend 21 // 17 is lowest but we support and recommend 21
@@ -35,6 +34,7 @@ java {
repositories { repositories {
mavenCentral() mavenCentral()
maven { url = "https://jitpack.io" }
maven { url = "https://build.shibboleth.net/maven/releases" } maven { url = "https://build.shibboleth.net/maven/releases" }
maven { url = "https://maven.pkg.github.com/jcefmaven/jcefmaven" } maven { url = "https://maven.pkg.github.com/jcefmaven/jcefmaven" }
} }
@@ -269,17 +269,6 @@ 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 { //gradleLint {
// rules=['unused-dependency'] // rules=['unused-dependency']
// } // }

BIN
docs/stirling-pdf.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 KiB

After

Width:  |  Height:  |  Size: 242 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 118 KiB

After

Width:  |  Height:  |  Size: 145 KiB

View File

@@ -265,6 +265,9 @@ public class EndpointConfiguration {
// Pdftohtml dependent endpoints // Pdftohtml dependent endpoints
addEndpointToGroup("Pdftohtml", "pdf-to-html"); addEndpointToGroup("Pdftohtml", "pdf-to-html");
addEndpointToGroup("Pdftohtml", "pdf-to-markdown"); addEndpointToGroup("Pdftohtml", "pdf-to-markdown");
// disabled for now while we resolve issues
disableEndpoint("pdf-to-pdfa");
} }
private void processEnvironmentConfigs() { private void processEnvironmentConfigs() {

View File

@@ -32,10 +32,7 @@ public class AdditionalLanguageJsController {
response.setContentType("application/javascript"); response.setContentType("application/javascript");
PrintWriter writer = response.getWriter(); PrintWriter writer = response.getWriter();
// Erstelle das JavaScript dynamisch // Erstelle das JavaScript dynamisch
writer.println( writer.println("const supportedLanguages = " + toJsonArray(new ArrayList<>(supportedLanguages)) + ";");
"const supportedLanguages = "
+ toJsonArray(new ArrayList<>(supportedLanguages))
+ ";");
// Generiere die `getDetailedLanguageCode`-Funktion // Generiere die `getDetailedLanguageCode`-Funktion
writer.println( writer.println(
""" """

View File

@@ -100,8 +100,6 @@ public class SplitPdfBySectionsController {
if (sectionNum == horiz * verti) pageNum++; if (sectionNum == horiz * verti) pageNum++;
} }
zipOut.finish();
data = Files.readAllBytes(zipFile); data = Files.readAllBytes(zipFile);
return WebResponseUtils.bytesToWebResponse( return WebResponseUtils.bytesToWebResponse(
data, filename + "_split.zip", MediaType.APPLICATION_OCTET_STREAM); data, filename + "_split.zip", MediaType.APPLICATION_OCTET_STREAM);

View File

@@ -13,8 +13,8 @@ import io.github.pixee.security.Filenames;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.model.ApplicationProperties;
import stirling.software.SPDF.model.api.converters.HTMLToPdfRequest; import stirling.software.SPDF.model.api.converters.HTMLToPdfRequest;
import stirling.software.SPDF.model.ApplicationProperties;
import stirling.software.SPDF.service.CustomPDDocumentFactory; import stirling.software.SPDF.service.CustomPDDocumentFactory;
import stirling.software.SPDF.utils.FileToPdf; import stirling.software.SPDF.utils.FileToPdf;
import stirling.software.SPDF.utils.WebResponseUtils; import stirling.software.SPDF.utils.WebResponseUtils;
@@ -28,23 +28,23 @@ public class ConvertHtmlToPDF {
private final CustomPDDocumentFactory pdfDocumentFactory; private final CustomPDDocumentFactory pdfDocumentFactory;
private final ApplicationProperties applicationProperties; private final ApplicationProperties applicationProperties;
@Autowired @Autowired
public ConvertHtmlToPDF( public ConvertHtmlToPDF(
CustomPDDocumentFactory pdfDocumentFactory, CustomPDDocumentFactory pdfDocumentFactory,
@Qualifier("bookAndHtmlFormatsInstalled") boolean bookAndHtmlFormatsInstalled, @Qualifier("bookAndHtmlFormatsInstalled") boolean bookAndHtmlFormatsInstalled,
ApplicationProperties applicationProperties) { ApplicationProperties applicationProperties) {
this.pdfDocumentFactory = pdfDocumentFactory; this.pdfDocumentFactory = pdfDocumentFactory;
this.bookAndHtmlFormatsInstalled = bookAndHtmlFormatsInstalled; this.bookAndHtmlFormatsInstalled = bookAndHtmlFormatsInstalled;
this.applicationProperties = applicationProperties; this.applicationProperties = applicationProperties;
} }
@PostMapping(consumes = "multipart/form-data", value = "/html/pdf") @PostMapping(consumes = "multipart/form-data", value = "/html/pdf")
@Operation( @Operation(
summary = "Convert an HTML or ZIP (containing HTML and CSS) to PDF", summary = "Convert an HTML or ZIP (containing HTML and CSS) to PDF",
description = description =
"This endpoint takes an HTML or ZIP file input and converts it to a PDF format. Input:HTML Output:PDF Type:SISO") "This endpoint takes an HTML or ZIP file input and converts it to a PDF format.")
public ResponseEntity<byte[]> HtmlToPdf(@ModelAttribute HTMLToPdfRequest request) public ResponseEntity<byte[]> HtmlToPdf(@ModelAttribute HTMLToPdfRequest request)
throws Exception { throws Exception {
MultipartFile fileInput = request.getFileInput(); MultipartFile fileInput = request.getFileInput();
@@ -60,8 +60,7 @@ public class ConvertHtmlToPDF {
throw new IllegalArgumentException("File must be either .html or .zip format."); throw new IllegalArgumentException("File must be either .html or .zip format.");
} }
boolean disableSanitize = boolean disableSanitize = Boolean.TRUE.equals(applicationProperties.getSystem().getDisableSanitize());
Boolean.TRUE.equals(applicationProperties.getSystem().getDisableSanitize());
byte[] pdfBytes = byte[] pdfBytes =
FileToPdf.convertHtmlToPdf( FileToPdf.convertHtmlToPdf(
@@ -69,7 +68,7 @@ public class ConvertHtmlToPDF {
fileInput.getBytes(), fileInput.getBytes(),
originalFilename, originalFilename,
bookAndHtmlFormatsInstalled, bookAndHtmlFormatsInstalled,
disableSanitize); disableSanitize);
pdfBytes = pdfDocumentFactory.createNewBytesBasedOnOldDocument(pdfBytes); pdfBytes = pdfDocumentFactory.createNewBytesBasedOnOldDocument(pdfBytes);

View File

@@ -23,8 +23,8 @@ import io.github.pixee.security.Filenames;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.model.ApplicationProperties;
import stirling.software.SPDF.model.api.GeneralFile; import stirling.software.SPDF.model.api.GeneralFile;
import stirling.software.SPDF.model.ApplicationProperties;
import stirling.software.SPDF.service.CustomPDDocumentFactory; import stirling.software.SPDF.service.CustomPDDocumentFactory;
import stirling.software.SPDF.utils.FileToPdf; import stirling.software.SPDF.utils.FileToPdf;
import stirling.software.SPDF.utils.WebResponseUtils; import stirling.software.SPDF.utils.WebResponseUtils;
@@ -38,16 +38,16 @@ public class ConvertMarkdownToPdf {
private final CustomPDDocumentFactory pdfDocumentFactory; private final CustomPDDocumentFactory pdfDocumentFactory;
private final ApplicationProperties applicationProperties; private final ApplicationProperties applicationProperties;
@Autowired @Autowired
public ConvertMarkdownToPdf( public ConvertMarkdownToPdf(
CustomPDDocumentFactory pdfDocumentFactory, CustomPDDocumentFactory pdfDocumentFactory,
@Qualifier("bookAndHtmlFormatsInstalled") boolean bookAndHtmlFormatsInstalled, @Qualifier("bookAndHtmlFormatsInstalled") boolean bookAndHtmlFormatsInstalled,
ApplicationProperties applicationProperties) { ApplicationProperties applicationProperties) {
this.pdfDocumentFactory = pdfDocumentFactory; this.pdfDocumentFactory = pdfDocumentFactory;
this.bookAndHtmlFormatsInstalled = bookAndHtmlFormatsInstalled; this.bookAndHtmlFormatsInstalled = bookAndHtmlFormatsInstalled;
this.applicationProperties = applicationProperties; this.applicationProperties = applicationProperties;
} }
@PostMapping(consumes = "multipart/form-data", value = "/markdown/pdf") @PostMapping(consumes = "multipart/form-data", value = "/markdown/pdf")
@@ -81,8 +81,7 @@ public class ConvertMarkdownToPdf {
String htmlContent = renderer.render(document); String htmlContent = renderer.render(document);
boolean disableSanitize = boolean disableSanitize = Boolean.TRUE.equals(applicationProperties.getSystem().getDisableSanitize());
Boolean.TRUE.equals(applicationProperties.getSystem().getDisableSanitize());
byte[] pdfBytes = byte[] pdfBytes =
FileToPdf.convertHtmlToPdf( FileToPdf.convertHtmlToPdf(
@@ -90,7 +89,7 @@ public class ConvertMarkdownToPdf {
htmlContent.getBytes(), htmlContent.getBytes(),
"converted.html", "converted.html",
bookAndHtmlFormatsInstalled, bookAndHtmlFormatsInstalled,
disableSanitize); disableSanitize);
pdfBytes = pdfDocumentFactory.createNewBytesBasedOnOldDocument(pdfBytes); pdfBytes = pdfDocumentFactory.createNewBytesBasedOnOldDocument(pdfBytes);
String outputFilename = String outputFilename =
originalFilename.replaceFirst("[.][^.]+$", "") originalFilename.replaceFirst("[.][^.]+$", "")

View File

@@ -73,8 +73,8 @@ public class ConvertPDFToPDFA {
// Determine PDF/A filter based on requested format // Determine PDF/A filter based on requested format
String pdfFilter = String pdfFilter =
"pdfa".equals(outputFormat) "pdfa".equals(outputFormat)
? "pdf:writer_pdf_Export:{\"SelectPdfVersion\":{\"type\":\"long\",\"value\":\"2\"}}" ? "writer_pdf_Export:{'SelectPdfVersion':{'Value':'2'}}:writer_pdf_Export"
: "pdf:writer_pdf_Export:{\"SelectPdfVersion\":{\"type\":\"long\",\"value\":\"1\"}}"; : "writer_pdf_Export:{'SelectPdfVersion':{'Value':'1'}}:writer_pdf_Export";
// Prepare LibreOffice command // Prepare LibreOffice command
List<String> command = List<String> command =
@@ -84,7 +84,7 @@ public class ConvertPDFToPDFA {
"--headless", "--headless",
"--nologo", "--nologo",
"--convert-to", "--convert-to",
pdfFilter, "pdf:" + pdfFilter,
"--outdir", "--outdir",
tempOutputDir.toString(), tempOutputDir.toString(),
tempInputFile.toString())); tempInputFile.toString()));

View File

@@ -8,9 +8,7 @@ import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Set;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream; import java.util.zip.ZipOutputStream;
@@ -43,12 +41,8 @@ import stirling.software.SPDF.utils.WebResponseUtils;
@Tag(name = "Misc", description = "Miscellaneous APIs") @Tag(name = "Misc", description = "Miscellaneous APIs")
public class AutoSplitPdfController { public class AutoSplitPdfController {
private static final Set<String> VALID_QR_CONTENTS = private static final String QR_CONTENT = "https://github.com/Stirling-Tools/Stirling-PDF";
new HashSet<>( private static final String QR_CONTENT_OLD = "https://github.com/Frooodle/Stirling-PDF";
Set.of(
"https://github.com/Stirling-Tools/Stirling-PDF",
"https://github.com/Frooodle/Stirling-PDF",
"https://stirlingpdf.com"));
private final CustomPDDocumentFactory pdfDocumentFactory; private final CustomPDDocumentFactory pdfDocumentFactory;
@@ -126,14 +120,13 @@ public class AutoSplitPdfController {
for (int page = 0; page < document.getNumberOfPages(); ++page) { for (int page = 0; page < document.getNumberOfPages(); ++page) {
BufferedImage bim = pdfRenderer.renderImageWithDPI(page, 150); BufferedImage bim = pdfRenderer.renderImageWithDPI(page, 150);
String result = decodeQRCode(bim); 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()); splitDocuments.add(new PDDocument());
} }
if (!splitDocuments.isEmpty() && !isValidQrCode) { if (!splitDocuments.isEmpty()
&& !QR_CONTENT.equals(result)
&& !QR_CONTENT_OLD.equals(result)) {
splitDocuments.get(splitDocuments.size() - 1).addPage(document.getPage(page)); splitDocuments.get(splitDocuments.size() - 1).addPage(document.getPage(page));
} else if (page == 0) { } else if (page == 0) {
PDDocument firstDocument = new PDDocument(); PDDocument firstDocument = new PDDocument();
@@ -142,7 +135,7 @@ public class AutoSplitPdfController {
} }
// If duplexMode is true and current page is a divider, then skip next page // If duplexMode is true and current page is a divider, then skip next page
if (duplexMode && isValidQrCode) { if (duplexMode && (QR_CONTENT.equals(result) || QR_CONTENT_OLD.equals(result))) {
page++; page++;
} }
} }
@@ -175,9 +168,6 @@ public class AutoSplitPdfController {
return WebResponseUtils.bytesToWebResponse( return WebResponseUtils.bytesToWebResponse(
data, filename + ".zip", MediaType.APPLICATION_OCTET_STREAM); data, filename + ".zip", MediaType.APPLICATION_OCTET_STREAM);
} catch (Exception e) {
log.error("Error in auto split", e);
throw e;
} finally { } finally {
// Clean up resources // Clean up resources
if (document != null) { if (document != null) {

View File

@@ -5,7 +5,6 @@ import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -95,9 +94,7 @@ public class CompressController {
} }
} }
} }
Path tempOutput = Files.createTempFile("output_", ".pdf"); doc.save(pdfFile.toString());
doc.save(tempOutput.toString());
Files.move(tempOutput, pdfFile, StandardCopyOption.REPLACE_EXISTING);
} }
} }
@@ -191,7 +188,7 @@ public class CompressController {
optimizeLevel = optimizeLevel =
incrementOptimizeLevel( incrementOptimizeLevel(
optimizeLevel, outputFileSize, expectedOutputSize); optimizeLevel, outputFileSize, expectedOutputSize);
if (autoMode && optimizeLevel >= 9) { if (autoMode && optimizeLevel > 9) {
log.info("Maximum compression level reached in auto mode"); log.info("Maximum compression level reached in auto mode");
sizeMet = true; sizeMet = true;
} }

View File

@@ -52,7 +52,7 @@ public class ExtractImagesController {
@Operation( @Operation(
summary = "Extract images from a PDF file", summary = "Extract images from a PDF file",
description = 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) public ResponseEntity<byte[]> extractImages(@ModelAttribute PDFExtractImagesRequest request)
throws IOException, InterruptedException, ExecutionException { throws IOException, InterruptedException, ExecutionException {
MultipartFile file = request.getFileInput(); MultipartFile file = request.getFileInput();

View File

@@ -46,7 +46,7 @@ public class FlattenController {
@Operation( @Operation(
summary = "Flatten PDF form fields or full page", summary = "Flatten PDF form fields or full page",
description = 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 { public ResponseEntity<byte[]> flatten(@ModelAttribute FlattenRequest request) throws Exception {
MultipartFile file = request.getFileInput(); MultipartFile file = request.getFileInput();

View File

@@ -26,7 +26,6 @@ import org.springframework.web.multipart.MultipartFile;
import io.github.pixee.security.BoundedLineReader; import io.github.pixee.security.BoundedLineReader;
import io.github.pixee.security.Filenames; import io.github.pixee.security.Filenames;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@@ -66,10 +65,6 @@ public class OCRController {
} }
@PostMapping(consumes = "multipart/form-data", value = "/ocr-pdf") @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( public ResponseEntity<byte[]> processPdfWithOCR(
@ModelAttribute ProcessPdfWithOcrRequest request) @ModelAttribute ProcessPdfWithOcrRequest request)
throws IOException, InterruptedException { throws IOException, InterruptedException {

View File

@@ -25,7 +25,6 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.model.PipelineConfig; import stirling.software.SPDF.model.PipelineConfig;
import stirling.software.SPDF.model.PipelineResult;
import stirling.software.SPDF.model.api.HandleDataRequest; import stirling.software.SPDF.model.api.HandleDataRequest;
import stirling.software.SPDF.utils.WebResponseUtils; import stirling.software.SPDF.utils.WebResponseUtils;
@@ -59,8 +58,7 @@ public class PipelineController {
if (inputFiles == null || inputFiles.size() == 0) { if (inputFiles == null || inputFiles.size() == 0) {
return null; return null;
} }
PipelineResult result = processor.runPipelineAgainstFiles(inputFiles, config); List<Resource> outputFiles = processor.runPipelineAgainstFiles(inputFiles, config);
List<Resource> outputFiles = result.getOutputFiles();
if (outputFiles != null && outputFiles.size() == 1) { if (outputFiles != null && outputFiles.size() == 1) {
// If there is only one file, return it directly // If there is only one file, return it directly
Resource singleFile = outputFiles.get(0); Resource singleFile = outputFiles.get(0);

View File

@@ -27,7 +27,6 @@ import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.config.InstallationPathConfig; import stirling.software.SPDF.config.InstallationPathConfig;
import stirling.software.SPDF.model.PipelineConfig; import stirling.software.SPDF.model.PipelineConfig;
import stirling.software.SPDF.model.PipelineOperation; import stirling.software.SPDF.model.PipelineOperation;
import stirling.software.SPDF.model.PipelineResult;
import stirling.software.SPDF.utils.FileMonitor; import stirling.software.SPDF.utils.FileMonitor;
@Service @Service
@@ -144,64 +143,19 @@ public class PipelineDirectoryProcessor {
private File[] collectFilesForProcessing(Path dir, Path jsonFile, PipelineOperation operation) private File[] collectFilesForProcessing(Path dir, Path jsonFile, PipelineOperation operation)
throws IOException { 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)) { try (Stream<Path> paths = Files.list(dir)) {
File[] files = if ("automated".equals(operation.getParameters().get("fileInput"))) {
paths.filter( return paths.filter(
path -> { path ->
if (Files.isDirectory(path)) { !Files.isDirectory(path)
return false; && !path.equals(jsonFile)
} && fileMonitor.isFileReadyForProcessing(path))
if (path.equals(jsonFile)) { .map(Path::toFile)
return false; .toArray(File[]::new);
} } else {
String fileInput = (String) operation.getParameters().get("fileInput");
// Get file extension return new File[] {new File(fileInput)};
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;
} }
} }
@@ -244,37 +198,19 @@ public class PipelineDirectoryProcessor {
try { try {
List<Resource> inputFiles = List<Resource> inputFiles =
processor.generateInputFiles(filesToProcess.toArray(new File[0])); processor.generateInputFiles(filesToProcess.toArray(new File[0]));
if (inputFiles == null || inputFiles.isEmpty()) { if (inputFiles == null || inputFiles.size() == 0) {
return; return;
} }
PipelineResult result = processor.runPipelineAgainstFiles(inputFiles, config); List<Resource> outputFiles = processor.runPipelineAgainstFiles(inputFiles, config);
if (outputFiles == null) return;
if (result.isHasErrors()) { moveAndRenameFiles(outputFiles, config, dir);
log.error("Errors occurred during processing, retaining original files"); deleteOriginalFiles(filesToProcess, processingDir);
moveToErrorDirectory(filesToProcess, dir);
} else {
moveAndRenameFiles(result.getOutputFiles(), config, dir);
deleteOriginalFiles(filesToProcess, processingDir);
}
} catch (Exception e) { } catch (Exception e) {
log.error("Error during processing", e); log.error("error during processing", e);
moveFilesBack(filesToProcess, processingDir); 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) private void moveAndRenameFiles(List<Resource> resources, PipelineConfig config, Path dir)
throws IOException { throws IOException {
for (Resource resource : resources) { for (Resource resource : resources) {

View File

@@ -33,7 +33,6 @@ import lombok.extern.slf4j.Slf4j;
import stirling.software.SPDF.SPDFApplication; import stirling.software.SPDF.SPDFApplication;
import stirling.software.SPDF.model.PipelineConfig; import stirling.software.SPDF.model.PipelineConfig;
import stirling.software.SPDF.model.PipelineOperation; import stirling.software.SPDF.model.PipelineOperation;
import stirling.software.SPDF.model.PipelineResult;
import stirling.software.SPDF.model.Role; import stirling.software.SPDF.model.Role;
@Service @Service
@@ -85,10 +84,8 @@ public class PipelineProcessor {
return "http://localhost:" + port + contextPath + "/"; return "http://localhost:" + port + contextPath + "/";
} }
PipelineResult runPipelineAgainstFiles(List<Resource> outputFiles, PipelineConfig config) List<Resource> runPipelineAgainstFiles(List<Resource> outputFiles, PipelineConfig config)
throws Exception { throws Exception {
PipelineResult result = new PipelineResult();
ByteArrayOutputStream logStream = new ByteArrayOutputStream(); ByteArrayOutputStream logStream = new ByteArrayOutputStream();
PrintStream logPrintStream = new PrintStream(logStream); PrintStream logPrintStream = new PrintStream(logStream);
boolean hasErrors = false; boolean hasErrors = false;
@@ -133,8 +130,7 @@ public class PipelineProcessor {
if (operation.startsWith("filter-") if (operation.startsWith("filter-")
&& (response.getBody() == null && (response.getBody() == null
|| response.getBody().length == 0)) { || response.getBody().length == 0)) {
result.setFiltersApplied(true); log.info("Skipping file due to failing {}", operation);
log.info("Skipping file due to filtering {}", operation);
continue; continue;
} }
if (!response.getStatusCode().equals(HttpStatus.OK)) { if (!response.getStatusCode().equals(HttpStatus.OK)) {
@@ -212,10 +208,7 @@ public class PipelineProcessor {
if (hasErrors) { if (hasErrors) {
log.error("Errors occurred during processing. Log: {}", logStream.toString()); log.error("Errors occurred during processing. Log: {}", logStream.toString());
} }
result.setHasErrors(hasErrors); return outputFiles;
result.setFiltersApplied(hasErrors);
result.setOutputFiles(outputFiles);
return result;
} }
private ResponseEntity<byte[]> sendWebRequest(String url, MultiValueMap<String, Object> body) { private ResponseEntity<byte[]> sendWebRequest(String url, MultiValueMap<String, Object> body) {

View File

@@ -40,7 +40,8 @@ public class RemoveCertSignController {
@Operation( @Operation(
summary = "Remove digital signature from PDF", summary = "Remove digital signature from PDF",
description = description =
"This endpoint accepts a PDF file and returns the PDF file without the digital signature. Input:PDF, Output:PDF Type:SISO") "This endpoint accepts a PDF file and returns the PDF file without the digital signature."
+ " Input: PDF, Output: PDF")
public ResponseEntity<byte[]> removeCertSignPDF(@ModelAttribute PDFFile request) public ResponseEntity<byte[]> removeCertSignPDF(@ModelAttribute PDFFile request)
throws Exception { throws Exception {
MultipartFile pdf = request.getFileInput(); MultipartFile pdf = request.getFileInput();

View File

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

View File

@@ -1,10 +1,10 @@
package stirling.software.SPDF.service; package stirling.software.SPDF.service;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.Arrays;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
@@ -21,7 +21,8 @@ public class LanguageService {
private final PathMatchingResourcePatternResolver resourcePatternResolver = private final PathMatchingResourcePatternResolver resourcePatternResolver =
new PathMatchingResourcePatternResolver(); new PathMatchingResourcePatternResolver();
public LanguageService(ApplicationProperties applicationProperties) { public LanguageService(
ApplicationProperties applicationProperties) {
this.applicationProperties = applicationProperties; this.applicationProperties = applicationProperties;
} }

View File

@@ -27,7 +27,7 @@ public class FileToPdf {
byte[] fileBytes, byte[] fileBytes,
String fileName, String fileName,
boolean htmlFormatsInstalled, boolean htmlFormatsInstalled,
boolean disableSanitize) boolean disableSanitize)
throws IOException, InterruptedException { throws IOException, InterruptedException {
Path tempOutputFile = Files.createTempFile("output_", ".pdf"); Path tempOutputFile = Files.createTempFile("output_", ".pdf");
@@ -36,9 +36,7 @@ public class FileToPdf {
try { try {
if (fileName.endsWith(".html")) { if (fileName.endsWith(".html")) {
tempInputFile = Files.createTempFile("input_", ".html"); tempInputFile = Files.createTempFile("input_", ".html");
String sanitizedHtml = String sanitizedHtml = sanitizeHtmlContent(new String(fileBytes, StandardCharsets.UTF_8), disableSanitize);
sanitizeHtmlContent(
new String(fileBytes, StandardCharsets.UTF_8), disableSanitize);
Files.write(tempInputFile, sanitizedHtml.getBytes(StandardCharsets.UTF_8)); Files.write(tempInputFile, sanitizedHtml.getBytes(StandardCharsets.UTF_8));
} else if (fileName.endsWith(".zip")) { } else if (fileName.endsWith(".zip")) {
tempInputFile = Files.createTempFile("input_", ".zip"); tempInputFile = Files.createTempFile("input_", ".zip");
@@ -95,8 +93,7 @@ public class FileToPdf {
return (!disableSanitize) ? CustomHtmlSanitizer.sanitize(htmlContent) : htmlContent; return (!disableSanitize) ? CustomHtmlSanitizer.sanitize(htmlContent) : htmlContent;
} }
private static void sanitizeHtmlFilesInZip(Path zipFilePath, boolean disableSanitize) private static void sanitizeHtmlFilesInZip(Path zipFilePath, boolean disableSanitize) throws IOException {
throws IOException {
Path tempUnzippedDir = Files.createTempDirectory("unzipped_"); Path tempUnzippedDir = Files.createTempDirectory("unzipped_");
try (ZipInputStream zipIn = try (ZipInputStream zipIn =
ZipSecurity.createHardenedInputStream( ZipSecurity.createHardenedInputStream(

View File

@@ -587,7 +587,9 @@ public class GeneralUtils {
for (byte b : hash) { for (byte b : hash) {
fingerprint.append(String.format("%02x", b)); fingerprint.append(String.format("%02x", b));
} }
return fingerprint.toString(); return fingerprint.toString();
} catch (Exception e) { } catch (Exception e) {
return "GenericID"; return "GenericID";
} }

View File

@@ -218,9 +218,6 @@ public class ProcessExecutor {
errorReaderThread.join(); errorReaderThread.join();
outputReaderThread.join(); outputReaderThread.join();
boolean isQpdf =
command != null && !command.isEmpty() && command.get(0).contains("qpdf");
if (outputLines.size() > 0) { if (outputLines.size() > 0) {
String outputMessage = String.join("\n", outputLines); String outputMessage = String.join("\n", outputLines);
messages += outputMessage; messages += outputMessage;
@@ -236,28 +233,20 @@ public class ProcessExecutor {
log.warn("Command error output:\n" + errorMessage); log.warn("Command error output:\n" + errorMessage);
} }
if (exitCode != 0) { if (exitCode != 0) {
if (isQpdf && exitCode == 3) { throw new IOException(
log.warn("qpdf succeeded with warnings: {}", messages); "Command process failed with exit code "
} else { + exitCode
throw new IOException( + ". Error message: "
"Command process failed with exit code " + errorMessage);
+ exitCode
+ ". Error message: "
+ errorMessage);
}
} }
} }
if (exitCode != 0) { if (exitCode != 0) {
if (isQpdf && exitCode == 3) { throw new IOException(
log.warn("qpdf succeeded with warnings: {}", messages); "Command process failed with exit code "
} else { + exitCode
throw new IOException( + "\nLogs: "
"Command process failed with exit code " + messages);
+ exitCode
+ "\nLogs: "
+ messages);
}
} }
} finally { } finally {
semaphore.release(); semaphore.release();

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=Show Attachments
redact.showLayers=Show Layers (double-click to reset all layers to the default state) redact.showLayers=Show Layers (double-click to reset all layers to the default state)
redact.colourPicker=Colour Picker redact.colourPicker=Colour Picker
redact.findCurrentOutlineItem=Find current outline item redact.findCurrentOutlineItem=Find current outline item
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=إظهار جافا سكريبت showJS.title=إظهار جافا سكريبت
@@ -769,6 +768,7 @@ autoSplitPDF.selectText.3=ارفع ملف PDF الممسوح ضوئيًا الك
autoSplitPDF.selectText.4=يتم اكتشاف صفحات الفاصل تلقائيًا وإزالتها، مما يضمن مستندًا نهائيًا نظيفًا. autoSplitPDF.selectText.4=يتم اكتشاف صفحات الفاصل تلقائيًا وإزالتها، مما يضمن مستندًا نهائيًا نظيفًا.
autoSplitPDF.formPrompt=أرسل ملف PDF يحتوي على فواصل صفحات Stirling-PDF: autoSplitPDF.formPrompt=أرسل ملف PDF يحتوي على فواصل صفحات Stirling-PDF:
autoSplitPDF.duplexMode=وضع الطباعة على الوجهين (المسح الضوئي للوجه الأمامي والخلفي) autoSplitPDF.duplexMode=وضع الطباعة على الوجهين (المسح الضوئي للوجه الأمامي والخلفي)
autoSplitPDF.dividerDownload1=تنزيل 'فاصل التقسيم التلقائي (الحد الأدنى).pdf'
autoSplitPDF.dividerDownload2=تنزيل 'فاصل التقسيم التلقائي (مع التعليمات).pdf' autoSplitPDF.dividerDownload2=تنزيل 'فاصل التقسيم التلقائي (مع التعليمات).pdf'
autoSplitPDF.submit=إرسال autoSplitPDF.submit=إرسال
@@ -1185,7 +1185,7 @@ changeMetadata.submit=تغيير
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF إلى PDF/A pdfToPDFA.title=PDF إلى PDF/A
pdfToPDFA.header=PDF إلى PDF/A pdfToPDFA.header=PDF إلى PDF/A
pdfToPDFA.credit=تستخدم هذه الخدمة libreoffice لتحويل PDF/A. pdfToPDFA.credit=تستخدم هذه الخدمة qpdf لتحويل PDF/A.
pdfToPDFA.submit=تحويل pdfToPDFA.submit=تحويل
pdfToPDFA.tip=لا يعمل حاليًا لمدخلات متعددة في وقت واحد pdfToPDFA.tip=لا يعمل حاليًا لمدخلات متعددة في وقت واحد
pdfToPDFA.outputFormat=تنسيق الإخراج pdfToPDFA.outputFormat=تنسيق الإخراج

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=Show Attachments
redact.showLayers=Show Layers (double-click to reset all layers to the default state) redact.showLayers=Show Layers (double-click to reset all layers to the default state)
redact.colourPicker=Colour Picker redact.colourPicker=Colour Picker
redact.findCurrentOutlineItem=Find current outline item redact.findCurrentOutlineItem=Find current outline item
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Javascripti Göstər showJS.title=Javascripti Göstər
@@ -769,6 +768,7 @@ 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.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.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.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.dividerDownload2='Auto Splitter Divider (with instructions).pdf'-ı yükləyin
autoSplitPDF.submit=Təsdiq edin autoSplitPDF.submit=Təsdiq edin
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Dəyiş
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF-i PDF/A-ya pdfToPDFA.title=PDF-i PDF/A-ya
pdfToPDFA.header=PDF-i PDF/A-ya pdfToPDFA.header=PDF-i PDF/A-ya
pdfToPDFA.credit=Bu Servis PDF/A Çevirmək Üçün libreoffice İşlədir pdfToPDFA.credit=Bu Servis PDF/A Çevirmək Üçün ghostscript İşlədir
pdfToPDFA.submit=Çevir pdfToPDFA.submit=Çevir
pdfToPDFA.tip=Hazırda Birdən Çox Giriş Üçün İşləmir pdfToPDFA.tip=Hazırda Birdən Çox Giriş Üçün İşləmir
pdfToPDFA.outputFormat=Çıxış Formatı pdfToPDFA.outputFormat=Çıxış Formatı

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=Show Attachments
redact.showLayers=Show Layers (double-click to reset all layers to the default state) redact.showLayers=Show Layers (double-click to reset all layers to the default state)
redact.colourPicker=Colour Picker redact.colourPicker=Colour Picker
redact.findCurrentOutlineItem=Find current outline item redact.findCurrentOutlineItem=Find current outline item
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Покажи Javascript showJS.title=Покажи Javascript
@@ -769,6 +768,7 @@ autoSplitPDF.selectText.3=Качете единствения голям ска
autoSplitPDF.selectText.4=Разделителните страници се откриват и премахват автоматично, което гарантира чист краен документ. autoSplitPDF.selectText.4=Разделителните страници се откриват и премахват автоматично, което гарантира чист краен документ.
autoSplitPDF.formPrompt=Изпратете PDF, съдържащ разделители на страници на Stirling-PDF: autoSplitPDF.formPrompt=Изпратете PDF, съдържащ разделители на страници на Stirling-PDF:
autoSplitPDF.duplexMode=Дуплексен режим (сканиране отпред и отзад) autoSplitPDF.duplexMode=Дуплексен режим (сканиране отпред и отзад)
autoSplitPDF.dividerDownload1=Изтеглете 'Автоматичен сплитер разделител (минимален).pdf'
autoSplitPDF.dividerDownload2=Изтеглете 'Автоматичен сплитер разделител (с инструкции).pdf' autoSplitPDF.dividerDownload2=Изтеглете 'Автоматичен сплитер разделител (с инструкции).pdf'
autoSplitPDF.submit=Подайте autoSplitPDF.submit=Подайте
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Промени
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF към PDF/A pdfToPDFA.title=PDF към PDF/A
pdfToPDFA.header=PDF към PDF/A pdfToPDFA.header=PDF към PDF/A
pdfToPDFA.credit=Тази услуга използва libreoffice за PDF/A преобразуване. pdfToPDFA.credit=Тази услуга използва qpdf за PDF/A преобразуване.
pdfToPDFA.submit=Преобразуване pdfToPDFA.submit=Преобразуване
pdfToPDFA.tip=В момента не работи за няколко входа наведнъж pdfToPDFA.tip=В момента не работи за няколко входа наведнъж
pdfToPDFA.outputFormat=Изходен формат pdfToPDFA.outputFormat=Изходен формат

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=Show Attachments
redact.showLayers=Show Layers (double-click to reset all layers to the default state) redact.showLayers=Show Layers (double-click to reset all layers to the default state)
redact.colourPicker=Colour Picker redact.colourPicker=Colour Picker
redact.findCurrentOutlineItem=Find current outline item redact.findCurrentOutlineItem=Find current outline item
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Mostra Javascript showJS.title=Mostra Javascript
@@ -769,6 +768,7 @@ 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.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.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.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.dividerDownload2=Descarrega 'Divisor Automàtic (amb instruccions).pdf'
autoSplitPDF.submit=Envia autoSplitPDF.submit=Envia
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Canvia
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF a PDF/A pdfToPDFA.title=PDF a PDF/A
pdfToPDFA.header=PDF a PDF/A pdfToPDFA.header=PDF a PDF/A
pdfToPDFA.credit=Utilitza libreoffice per a la conversió a PDF/A pdfToPDFA.credit=Utilitza qpdf per a la conversió a PDF/A
pdfToPDFA.submit=Converteix pdfToPDFA.submit=Converteix
pdfToPDFA.tip=Actualment no funciona per a múltiples entrades al mateix temps pdfToPDFA.tip=Actualment no funciona per a múltiples entrades al mateix temps
pdfToPDFA.outputFormat=Format de sortida pdfToPDFA.outputFormat=Format de sortida

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=Zobrazit přílohy
redact.showLayers=Zobrazit vrstvy (dvojklik pro obnovení všech vrstev do výchozího stavu) redact.showLayers=Zobrazit vrstvy (dvojklik pro obnovení všech vrstev do výchozího stavu)
redact.colourPicker=Výběr barvy redact.colourPicker=Výběr barvy
redact.findCurrentOutlineItem=Najít aktuální položku osnovy redact.findCurrentOutlineItem=Najít aktuální položku osnovy
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Zobrazit Javascript showJS.title=Zobrazit Javascript
@@ -769,6 +768,7 @@ 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.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.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.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.dividerDownload2=Stáhnout 'Automatický oddělovač (s instrukcemi).pdf'
autoSplitPDF.submit=Odeslat autoSplitPDF.submit=Odeslat
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Změnit
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF na PDF/A pdfToPDFA.title=PDF na PDF/A
pdfToPDFA.header=PDF na PDF/A pdfToPDFA.header=PDF na PDF/A
pdfToPDFA.credit=Tato služba používá libreoffice pro konverzi do PDF/A pdfToPDFA.credit=Tato služba používá qpdf pro konverzi do PDF/A
pdfToPDFA.submit=Převést pdfToPDFA.submit=Převést
pdfToPDFA.tip=Momentálně nefunguje pro více vstupů najednou pdfToPDFA.tip=Momentálně nefunguje pro více vstupů najednou
pdfToPDFA.outputFormat=Výstupní formát pdfToPDFA.outputFormat=Výstupní formát

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=Show Attachments
redact.showLayers=Show Layers (double-click to reset all layers to the default state) redact.showLayers=Show Layers (double-click to reset all layers to the default state)
redact.colourPicker=Colour Picker redact.colourPicker=Colour Picker
redact.findCurrentOutlineItem=Find current outline item redact.findCurrentOutlineItem=Find current outline item
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Vis Javascript showJS.title=Vis Javascript
@@ -769,6 +768,7 @@ 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.selectText.4=Skillesider detekteres automatisk og fjernes, hvilket garanterer et pænt endeligt dokument.
autoSplitPDF.formPrompt=Indsend PDF indeholdende Stirling-PDF Sideopdelere: autoSplitPDF.formPrompt=Indsend PDF indeholdende Stirling-PDF Sideopdelere:
autoSplitPDF.duplexMode=Duplex-tilstand (For- og bagside scanning) 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.dividerDownload2=Download 'Auto Splitter Divider (med instruktioner).pdf'
autoSplitPDF.submit=Indsend autoSplitPDF.submit=Indsend
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Ændre
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF Til PDF/A pdfToPDFA.title=PDF Til PDF/A
pdfToPDFA.header=PDF Til PDF/A pdfToPDFA.header=PDF Til PDF/A
pdfToPDFA.credit=Denne tjeneste bruger libreoffice til PDF/A-konvertering pdfToPDFA.credit=Denne tjeneste bruger qpdf til PDF/A-konvertering
pdfToPDFA.submit=Konvertér pdfToPDFA.submit=Konvertér
pdfToPDFA.tip=Fungerer i øjeblikket ikke for flere input på én gang pdfToPDFA.tip=Fungerer i øjeblikket ikke for flere input på én gang
pdfToPDFA.outputFormat=Outputformat pdfToPDFA.outputFormat=Outputformat

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=Zeige Anhänge
redact.showLayers=Ebenen anzeigen (Doppelklick, um alle Ebenen auf den Standardzustand zurückzusetzen) redact.showLayers=Ebenen anzeigen (Doppelklick, um alle Ebenen auf den Standardzustand zurückzusetzen)
redact.colourPicker=Farbauswahl redact.colourPicker=Farbauswahl
redact.findCurrentOutlineItem=Aktuell gewähltes Element finden redact.findCurrentOutlineItem=Aktuell gewähltes Element finden
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Javascript anzeigen showJS.title=Javascript anzeigen
@@ -769,6 +768,7 @@ 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.selectText.4=Trennseiten werden automatisch erkannt und entfernt, so dass ein sauberes Enddokument garantiert ist.
autoSplitPDF.formPrompt=PDF mit Stirling-PDF Seitentrennern hochladen: autoSplitPDF.formPrompt=PDF mit Stirling-PDF Seitentrennern hochladen:
autoSplitPDF.duplexMode=Duplex-Modus (Scannen von Vorder- und Rückseite) 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.dividerDownload2=Download 'Auto Splitter Divider (mit Anleitung).pdf'
autoSplitPDF.submit=Aufteilen autoSplitPDF.submit=Aufteilen
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Ändern
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF zu PDF/A pdfToPDFA.title=PDF zu PDF/A
pdfToPDFA.header=PDF zu PDF/A pdfToPDFA.header=PDF zu PDF/A
pdfToPDFA.credit=Dieser Dienst verwendet libreoffice für die PDF/A-Konvertierung pdfToPDFA.credit=Dieser Dienst verwendet qpdf für die PDF/A-Konvertierung
pdfToPDFA.submit=Konvertieren pdfToPDFA.submit=Konvertieren
pdfToPDFA.tip=Dieser Dienst kann nur einzelne Eingangsdateien verarbeiten. pdfToPDFA.tip=Dieser Dienst kann nur einzelne Eingangsdateien verarbeiten.
pdfToPDFA.outputFormat=Ausgabeformat pdfToPDFA.outputFormat=Ausgabeformat

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=Εμφάνιση συνημμένων
redact.showLayers=Εμφάνιση επιπέδων (διπλό κλικ για επαναφορά όλων των επιπέδων στην προεπιλεγμένη κατάσταση) redact.showLayers=Εμφάνιση επιπέδων (διπλό κλικ για επαναφορά όλων των επιπέδων στην προεπιλεγμένη κατάσταση)
redact.colourPicker=Επιλογέας χρώματος redact.colourPicker=Επιλογέας χρώματος
redact.findCurrentOutlineItem=Εύρεση τρέχοντος στοιχείου περιγράμματος redact.findCurrentOutlineItem=Εύρεση τρέχοντος στοιχείου περιγράμματος
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Εμφάνιση Javascript showJS.title=Εμφάνιση Javascript
@@ -769,6 +768,7 @@ autoSplitPDF.selectText.3=Μεταφορτώστε το ενιαίο μεγάλ
autoSplitPDF.selectText.4=Οι σελίδες διαχωρισμού ανιχνεύονται και αφαιρούνται αυτόματα, εξασφαλίζοντας ένα καθαρό τελικό έγγραφο. autoSplitPDF.selectText.4=Οι σελίδες διαχωρισμού ανιχνεύονται και αφαιρούνται αυτόματα, εξασφαλίζοντας ένα καθαρό τελικό έγγραφο.
autoSplitPDF.formPrompt=Υποβολή PDF που περιέχει διαχωριστές σελίδων Stirling-PDF: autoSplitPDF.formPrompt=Υποβολή PDF που περιέχει διαχωριστές σελίδων Stirling-PDF:
autoSplitPDF.duplexMode=Λειτουργία διπλής όψης (Σάρωση μπρος και πίσω) autoSplitPDF.duplexMode=Λειτουργία διπλής όψης (Σάρωση μπρος και πίσω)
autoSplitPDF.dividerDownload1=Λήψη 'Αυτόματος διαχωριστής (ελάχιστος).pdf'
autoSplitPDF.dividerDownload2=Λήψη 'Αυτόματος διαχωριστής (με οδηγίες).pdf' autoSplitPDF.dividerDownload2=Λήψη 'Αυτόματος διαχωριστής (με οδηγίες).pdf'
autoSplitPDF.submit=Υποβολή autoSplitPDF.submit=Υποβολή
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Αλλαγή
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF σε PDF/A pdfToPDFA.title=PDF σε PDF/A
pdfToPDFA.header=PDF σε PDF/A pdfToPDFA.header=PDF σε PDF/A
pdfToPDFA.credit=Αυτή η υπηρεσία χρησιμοποιεί libreoffice για μετατροπή PDF/A pdfToPDFA.credit=Αυτή η υπηρεσία χρησιμοποιεί qpdf για μετατροπή PDF/A
pdfToPDFA.submit=Μετατροπή pdfToPDFA.submit=Μετατροπή
pdfToPDFA.tip=Προς το παρόν δεν λειτουργεί για πολλαπλές εισόδους ταυτόχρονα pdfToPDFA.tip=Προς το παρόν δεν λειτουργεί για πολλαπλές εισόδους ταυτόχρονα
pdfToPDFA.outputFormat=Μορφή εξόδου pdfToPDFA.outputFormat=Μορφή εξόδου

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=Show Attachments
redact.showLayers=Show Layers (double-click to reset all layers to the default state) redact.showLayers=Show Layers (double-click to reset all layers to the default state)
redact.colourPicker=Colour Picker redact.colourPicker=Colour Picker
redact.findCurrentOutlineItem=Find current outline item redact.findCurrentOutlineItem=Find current outline item
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Show Javascript showJS.title=Show Javascript
@@ -769,6 +768,7 @@ 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.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document.
autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers: autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers:
autoSplitPDF.duplexMode=Duplex Mode (Front and back scanning) 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.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=Submit autoSplitPDF.submit=Submit
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Change
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF To PDF/A pdfToPDFA.title=PDF To PDF/A
pdfToPDFA.header=PDF To PDF/A pdfToPDFA.header=PDF To PDF/A
pdfToPDFA.credit=This service uses libreoffice for PDF/A conversion pdfToPDFA.credit=This service uses qpdf for PDF/A conversion
pdfToPDFA.submit=Convert pdfToPDFA.submit=Convert
pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.tip=Currently does not work for multiple inputs at once
pdfToPDFA.outputFormat=Output format pdfToPDFA.outputFormat=Output format

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=Show Attachments
redact.showLayers=Show Layers (double-click to reset all layers to the default state) redact.showLayers=Show Layers (double-click to reset all layers to the default state)
redact.colourPicker=Colour Picker redact.colourPicker=Colour Picker
redact.findCurrentOutlineItem=Find current outline item redact.findCurrentOutlineItem=Find current outline item
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Show Javascript showJS.title=Show Javascript
@@ -769,6 +768,7 @@ 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.selectText.4=Divider pages are automatically detected and removed, guaranteeing a neat final document.
autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers: autoSplitPDF.formPrompt=Submit PDF containing Stirling-PDF Page dividers:
autoSplitPDF.duplexMode=Duplex Mode (Front and back scanning) 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.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=Submit autoSplitPDF.submit=Submit
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Change
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF To PDF/A pdfToPDFA.title=PDF To PDF/A
pdfToPDFA.header=PDF To PDF/A pdfToPDFA.header=PDF To PDF/A
pdfToPDFA.credit=This service uses libreoffice for PDF/A conversion pdfToPDFA.credit=This service uses qpdf for PDF/A conversion
pdfToPDFA.submit=Convert pdfToPDFA.submit=Convert
pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.tip=Currently does not work for multiple inputs at once
pdfToPDFA.outputFormat=Output format pdfToPDFA.outputFormat=Output format

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=Show Attachments
redact.showLayers=Show Layers (double-click to reset all layers to the default state) redact.showLayers=Show Layers (double-click to reset all layers to the default state)
redact.colourPicker=Colour Picker redact.colourPicker=Colour Picker
redact.findCurrentOutlineItem=Find current outline item redact.findCurrentOutlineItem=Find current outline item
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Mostrar Javascript showJS.title=Mostrar Javascript
@@ -769,6 +768,7 @@ 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.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.formPrompt=Entregar PDF conteniendo divisores de página de Stirling-PDF:
autoSplitPDF.duplexMode=Modo Dúplex (Escaneado de ambas caras) 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.dividerDownload2=Descargar 'Divisor automático (con instrucciones).pdf'
autoSplitPDF.submit=Entregar autoSplitPDF.submit=Entregar
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Cambiar
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF a PDF/A pdfToPDFA.title=PDF a PDF/A
pdfToPDFA.header=PDF a PDF/A pdfToPDFA.header=PDF a PDF/A
pdfToPDFA.credit=Este servicio usa libreoffice para la conversión a PDF/A pdfToPDFA.credit=Este servicio usa qpdf para la conversión a PDF/A
pdfToPDFA.submit=Convertir pdfToPDFA.submit=Convertir
pdfToPDFA.tip=Actualmente no funciona para múltiples entrada a la vez pdfToPDFA.tip=Actualmente no funciona para múltiples entrada a la vez
pdfToPDFA.outputFormat=Formato de salida pdfToPDFA.outputFormat=Formato de salida

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=Show Attachments
redact.showLayers=Show Layers (double-click to reset all layers to the default state) redact.showLayers=Show Layers (double-click to reset all layers to the default state)
redact.colourPicker=Colour Picker redact.colourPicker=Colour Picker
redact.findCurrentOutlineItem=Find current outline item redact.findCurrentOutlineItem=Find current outline item
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Javascript erakutsi showJS.title=Javascript erakutsi
@@ -769,6 +768,7 @@ 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.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.formPrompt=Submit PDF containing Stirling-PDF Page dividers:
autoSplitPDF.duplexMode=Duplex Mode (Front and back scanning)Duplex modua (aurreko eta atzeko azterketa) 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.dividerDownload2=Deskargatu 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=Bidali autoSplitPDF.submit=Bidali
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Aldatu
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDFa PDF/A bihurtu pdfToPDFA.title=PDFa PDF/A bihurtu
pdfToPDFA.header=PDFa PDF/A bihurtu pdfToPDFA.header=PDFa PDF/A bihurtu
pdfToPDFA.credit=Zerbitzu honek libreoffice erabiltzen du PDFak PDF/A bihurtzeko pdfToPDFA.credit=Zerbitzu honek qpdf erabiltzen du PDFak PDF/A bihurtzeko
pdfToPDFA.submit=Bihurtu pdfToPDFA.submit=Bihurtu
pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.tip=Currently does not work for multiple inputs at once
pdfToPDFA.outputFormat=Output format pdfToPDFA.outputFormat=Output format

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=Show Attachments
redact.showLayers=Show Layers (double-click to reset all layers to the default state) redact.showLayers=Show Layers (double-click to reset all layers to the default state)
redact.colourPicker=Colour Picker redact.colourPicker=Colour Picker
redact.findCurrentOutlineItem=Find current outline item redact.findCurrentOutlineItem=Find current outline item
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=نمایش جاوااسکریپت showJS.title=نمایش جاوااسکریپت
@@ -769,6 +768,7 @@ autoSplitPDF.selectText.3=فایل PDF بزرگ اسکن شده را بارگذ
autoSplitPDF.selectText.4=صفحات جداکننده به طور خودکار تشخیص داده و حذف می‌شوند، تضمین‌کننده یک سند نهایی منظم. autoSplitPDF.selectText.4=صفحات جداکننده به طور خودکار تشخیص داده و حذف می‌شوند، تضمین‌کننده یک سند نهایی منظم.
autoSplitPDF.formPrompt=PDF حاوی جداکننده‌های Stirling-PDF را ارسال کنید: autoSplitPDF.formPrompt=PDF حاوی جداکننده‌های Stirling-PDF را ارسال کنید:
autoSplitPDF.duplexMode=حالت دوبلکس (اسکن جلو و عقب) autoSplitPDF.duplexMode=حالت دوبلکس (اسکن جلو و عقب)
autoSplitPDF.dividerDownload1=دانلود 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=دانلود 'Auto Splitter Divider (with instructions).pdf' autoSplitPDF.dividerDownload2=دانلود 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=ارسال autoSplitPDF.submit=ارسال
@@ -1185,7 +1185,7 @@ changeMetadata.submit=تغییر
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF به PDF/A pdfToPDFA.title=PDF به PDF/A
pdfToPDFA.header=PDF به PDF/A pdfToPDFA.header=PDF به PDF/A
pdfToPDFA.credit=این سرویس از libreoffice برای تبدیل PDF/A استفاده می‌کند pdfToPDFA.credit=این سرویس از qpdf برای تبدیل PDF/A استفاده می‌کند
pdfToPDFA.submit=تبدیل pdfToPDFA.submit=تبدیل
pdfToPDFA.tip=در حال حاضر برای چندین ورودی به طور همزمان کار نمی‌کند pdfToPDFA.tip=در حال حاضر برای چندین ورودی به طور همزمان کار نمی‌کند
pdfToPDFA.outputFormat=فرمت خروجی pdfToPDFA.outputFormat=فرمت خروجی

View File

@@ -138,7 +138,7 @@ analytics.settings=Vous pouvez modifier les paramètres des analyses dans le fic
# NAVBAR # # NAVBAR #
############# #############
navbar.favorite=Favoris navbar.favorite=Favoris
navbar.recent=Nouveau et mise à jour navbar.recent=New and recently updated
navbar.darkmode=Mode sombre navbar.darkmode=Mode sombre
navbar.language=Langues navbar.language=Langues
navbar.settings=Paramètres 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. home.viewPdf.desc=Visionner, annoter, ajouter du texte ou des images.
viewPdf.tags=visualiser,lire,annoter,texte,image viewPdf.tags=visualiser,lire,annoter,texte,image
home.setFavorites=Ajouter des favoris home.setFavorites=Set Favourites
home.hideFavorites=Cacher les favoris home.hideFavorites=Hide Favourites
home.showFavorites=Montrer les favoris home.showFavorites=Show Favourites
home.legacyHomepage=Ancienne Homepage home.legacyHomepage=Old homepage
home.newHomePage=Essayez notre nouvelle Homepage ! home.newHomePage=Try our new homepage!
home.alphabetical=Alphabétique home.alphabetical=Alphabetical
home.globalPopularity=Popularité globale home.globalPopularity=Global Popularity
home.sortBy=Trier par : home.sortBy=Sort by:
home.multiTool.title=Outil multifonction PDF home.multiTool.title=Outil multifonction PDF
home.multiTool.desc=Fusionnez, faites pivoter, réorganisez et supprimez des pages. home.multiTool.desc=Fusionnez, faites pivoter, réorganisez et supprimez des pages.
@@ -623,7 +623,6 @@ 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.showLayers=Montrer les calques (double-click pour réinitialiser tous les calques à l'état par défaut)
redact.colourPicker=Sélection de couleur redact.colourPicker=Sélection de couleur
redact.findCurrentOutlineItem=Trouver l'élément de contour courrant redact.findCurrentOutlineItem=Trouver l'élément de contour courrant
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Afficher le JavaScript showJS.title=Afficher le JavaScript
@@ -769,6 +768,7 @@ 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.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.formPrompt=PDF contenant des feuilles de séparation de Stirling PDF :
autoSplitPDF.duplexMode=Mode recto-verso autoSplitPDF.duplexMode=Mode recto-verso
autoSplitPDF.dividerDownload1=Auto Splitter Divider (minimal).pdf
autoSplitPDF.dividerDownload2=Auto Splitter Divider (with instructions).pdf autoSplitPDF.dividerDownload2=Auto Splitter Divider (with instructions).pdf
autoSplitPDF.submit=Séparer autoSplitPDF.submit=Séparer
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Modifier
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF en PDF/A pdfToPDFA.title=PDF en PDF/A
pdfToPDFA.header=PDF en PDF/A pdfToPDFA.header=PDF en PDF/A
pdfToPDFA.credit=Ce service utilise libreoffice pour la conversion en PDF/A. pdfToPDFA.credit=Ce service utilise qpdf pour la conversion en PDF/A.
pdfToPDFA.submit=Convertir pdfToPDFA.submit=Convertir
pdfToPDFA.tip=Ne fonctionne actuellement pas pour plusieurs entrées à la fois pdfToPDFA.tip=Ne fonctionne actuellement pas pour plusieurs entrées à la fois
pdfToPDFA.outputFormat=Format de sortie pdfToPDFA.outputFormat=Format de sortie

View File

@@ -623,7 +623,6 @@ 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.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.colourPicker=Roghnóir Dathanna
redact.findCurrentOutlineItem=Faigh imlíne reatha redact.findCurrentOutlineItem=Faigh imlíne reatha
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Taispeáin Javascript showJS.title=Taispeáin Javascript
@@ -769,6 +768,7 @@ 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.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.formPrompt=Cuir PDF isteach ina bhfuil roinnteoirí Leathanaigh Stirling-PDF:
autoSplitPDF.duplexMode=Mód Duplex (scanadh tosaigh agus cúil) 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.dividerDownload2=Íoslódáil 'Auto Splitter Divider (le treoracha).pdf'
autoSplitPDF.submit=Cuir isteach autoSplitPDF.submit=Cuir isteach
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Athrú
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF Go PDF/A pdfToPDFA.title=PDF Go PDF/A
pdfToPDFA.header=PDF Go PDF/A pdfToPDFA.header=PDF Go PDF/A
pdfToPDFA.credit=Úsáideann an tseirbhís seo libreoffice chun PDF/A a thiontú pdfToPDFA.credit=Úsáideann an tseirbhís seo qpdf chun PDF/A a thiontú
pdfToPDFA.submit=Tiontaigh pdfToPDFA.submit=Tiontaigh
pdfToPDFA.tip=Faoi láthair ní oibríonn sé le haghaidh ionchuir iolracha ag an am céanna pdfToPDFA.tip=Faoi láthair ní oibríonn sé le haghaidh ionchuir iolracha ag an am céanna
pdfToPDFA.outputFormat=Formáid aschuir pdfToPDFA.outputFormat=Formáid aschuir

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=अटैचमेंट दिखाएं
redact.showLayers=लेयर्स दिखाएं (सभी लेयर्स को डिफ़ॉल्ट स्थिति में रीसेट करने के लिए डबल-क्लिक करें) redact.showLayers=लेयर्स दिखाएं (सभी लेयर्स को डिफ़ॉल्ट स्थिति में रीसेट करने के लिए डबल-क्लिक करें)
redact.colourPicker=रंग चयनकर्ता redact.colourPicker=रंग चयनकर्ता
redact.findCurrentOutlineItem=वर्तमान आउटलाइन आइटम खोजें redact.findCurrentOutlineItem=वर्तमान आउटलाइन आइटम खोजें
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=जावास्क्रिप्ट दिखाएं showJS.title=जावास्क्रिप्ट दिखाएं
@@ -769,6 +768,7 @@ autoSplitPDF.selectText.3=एक बड़ी स्कैन की गई PDF
autoSplitPDF.selectText.4=विभाजक पृष्ठ स्वचालित रूप से पहचाने जाते हैं और हटा दिए जाते हैं, एक साफ अंतिम दस्तावेज़ सुनिश्चित करते हैं। autoSplitPDF.selectText.4=विभाजक पृष्ठ स्वचालित रूप से पहचाने जाते हैं और हटा दिए जाते हैं, एक साफ अंतिम दस्तावेज़ सुनिश्चित करते हैं।
autoSplitPDF.formPrompt=Stirling-PDF पृष्ठ विभाजक वाली PDF जमा करें: autoSplitPDF.formPrompt=Stirling-PDF पृष्ठ विभाजक वाली PDF जमा करें:
autoSplitPDF.duplexMode=डुप्लेक्स मोड (सामने और पीछे स्कैनिंग) autoSplitPDF.duplexMode=डुप्लेक्स मोड (सामने और पीछे स्कैनिंग)
autoSplitPDF.dividerDownload1='स्वतः विभाजक (न्यूनतम).pdf' डाउनलोड करें
autoSplitPDF.dividerDownload2='स्वतः विभाजक (निर्देशों के साथ).pdf' डाउनलोड करें autoSplitPDF.dividerDownload2='स्वतः विभाजक (निर्देशों के साथ).pdf' डाउनलोड करें
autoSplitPDF.submit=जमा करें autoSplitPDF.submit=जमा करें
@@ -1185,7 +1185,7 @@ changeMetadata.submit=बदलें
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF से PDF/A pdfToPDFA.title=PDF से PDF/A
pdfToPDFA.header=PDF से PDF/A pdfToPDFA.header=PDF से PDF/A
pdfToPDFA.credit=यह सेवा PDF/A रूपांतरण के लिए libreoffice का उपयोग करती है pdfToPDFA.credit=यह सेवा PDF/A रूपांतरण के लिए qpdf का उपयोग करती है
pdfToPDFA.submit=बदलें pdfToPDFA.submit=बदलें
pdfToPDFA.tip=वर्तमान में एक बार में कई इनपुट के लिए काम नहीं करता pdfToPDFA.tip=वर्तमान में एक बार में कई इनपुट के लिए काम नहीं करता
pdfToPDFA.outputFormat=आउटपुट प्रारूप pdfToPDFA.outputFormat=आउटपुट प्रारूप

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=Show Attachments
redact.showLayers=Show Layers (double-click to reset all layers to the default state) redact.showLayers=Show Layers (double-click to reset all layers to the default state)
redact.colourPicker=Colour Picker redact.colourPicker=Colour Picker
redact.findCurrentOutlineItem=Find current outline item redact.findCurrentOutlineItem=Find current outline item
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Prikaži Javascript showJS.title=Prikaži Javascript
@@ -769,6 +768,7 @@ 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.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.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.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.dividerDownload2=Preuzmite 'Auto Splitter Divider (s uputama).pdf'
autoSplitPDF.submit=Potvrdi autoSplitPDF.submit=Potvrdi
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Promijeniti
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF u PDF/A pdfToPDFA.title=PDF u PDF/A
pdfToPDFA.header=PDF u PDF/A pdfToPDFA.header=PDF u PDF/A
pdfToPDFA.credit=Ova usluga koristi libreoffice za PDF/A pretvorbu pdfToPDFA.credit=Ova usluga koristi qpdf za PDF/A pretvorbu
pdfToPDFA.submit=Pretvoriti pdfToPDFA.submit=Pretvoriti
pdfToPDFA.tip=Trenutno ne radi za više unosa odjednom pdfToPDFA.tip=Trenutno ne radi za više unosa odjednom
pdfToPDFA.outputFormat=Izlazni format pdfToPDFA.outputFormat=Izlazni format

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=Show Attachments
redact.showLayers=Show Layers (double-click to reset all layers to the default state) redact.showLayers=Show Layers (double-click to reset all layers to the default state)
redact.colourPicker=Colour Picker redact.colourPicker=Colour Picker
redact.findCurrentOutlineItem=Find current outline item redact.findCurrentOutlineItem=Find current outline item
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=JavaScript megjelenítése showJS.title=JavaScript megjelenítése
@@ -769,6 +768,7 @@ 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.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.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.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.dividerDownload2='Automatikus elválasztó (utasításokkal).pdf' letöltése
autoSplitPDF.submit=Küldés autoSplitPDF.submit=Küldés
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Módosítás
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF konvertálása PDF/A formátumba pdfToPDFA.title=PDF konvertálása PDF/A formátumba
pdfToPDFA.header=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 libreoffice használatával végzi a PDF/A konverziót pdfToPDFA.credit=Ez a szolgáltatás a qpdf használatával végzi a PDF/A konverziót
pdfToPDFA.submit=Konvertálás pdfToPDFA.submit=Konvertálás
pdfToPDFA.tip=Jelenleg nem támogatja a több fájl egyidejű feldolgozását pdfToPDFA.tip=Jelenleg nem támogatja a több fájl egyidejű feldolgozását
pdfToPDFA.outputFormat=Kimeneti formátum pdfToPDFA.outputFormat=Kimeneti formátum

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=Show Attachments
redact.showLayers=Show Layers (double-click to reset all layers to the default state) redact.showLayers=Show Layers (double-click to reset all layers to the default state)
redact.colourPicker=Colour Picker redact.colourPicker=Colour Picker
redact.findCurrentOutlineItem=Find current outline item redact.findCurrentOutlineItem=Find current outline item
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Tampilkan Javascript showJS.title=Tampilkan Javascript
@@ -769,6 +768,7 @@ 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.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.formPrompt=Kirimkan PDF yang berisi pembagi Halaman Stirling-PDF:
autoSplitPDF.duplexMode=Mode Dupleks (Pemindaian depan dan belakang) 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.dividerDownload2=Unduh 'Pembagi Pembagi Otomatis (dengan instruksi).pdf'
autoSplitPDF.submit=Kirim autoSplitPDF.submit=Kirim
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Ganti
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF Ke PDF/A pdfToPDFA.title=PDF Ke PDF/A
pdfToPDFA.header=PDF ke PDF/A pdfToPDFA.header=PDF ke PDF/A
pdfToPDFA.credit=Layanan ini menggunakan libreoffice untuk konversi PDF/A. pdfToPDFA.credit=Layanan ini menggunakan qpdf untuk konversi PDF/A.
pdfToPDFA.submit=Konversi pdfToPDFA.submit=Konversi
pdfToPDFA.tip=Saat ini tidak dapat digunakan untuk beberapa input sekaligus pdfToPDFA.tip=Saat ini tidak dapat digunakan untuk beberapa input sekaligus
pdfToPDFA.outputFormat=Format keluaran pdfToPDFA.outputFormat=Format keluaran

View File

@@ -27,7 +27,7 @@ bored=Stanco di aspettare?
alphabet=Alfabeto alphabet=Alfabeto
downloadPdf=Scarica PDF downloadPdf=Scarica PDF
text=Testo text=Testo
font=Font font=Fonte
selectFillter=-- Seleziona -- selectFillter=-- Seleziona --
pageNum=Numero pagina pageNum=Numero pagina
sizes.small=Piccolo sizes.small=Piccolo
@@ -272,8 +272,8 @@ home.showFavorites=Mostra preferiti
home.legacyHomepage=Vecchia homepage home.legacyHomepage=Vecchia homepage
home.newHomePage=Prova la nostra nuova homepage! home.newHomePage=Prova la nostra nuova homepage!
home.alphabetical=Alfabetico home.alphabetical=Alfabetico
home.globalPopularity=Popolarità home.globalPopularity=Popolarità globale
home.sortBy=Ordinamento: home.sortBy=Sort by:
home.multiTool.title=Multifunzione PDF home.multiTool.title=Multifunzione PDF
home.multiTool.desc=Unisci, Ruota, Riordina, e Rimuovi pagine home.multiTool.desc=Unisci, Ruota, Riordina, e Rimuovi pagine
@@ -623,7 +623,6 @@ redact.showAttatchments=Mostra allegati
redact.showLayers=Mostra livelli (fare doppio clic per ripristinare tutti i livelli allo stato predefinito) redact.showLayers=Mostra livelli (fare doppio clic per ripristinare tutti i livelli allo stato predefinito)
redact.colourPicker=Selettore colore redact.colourPicker=Selettore colore
redact.findCurrentOutlineItem=Trova l'elemento di contorno corrente redact.findCurrentOutlineItem=Trova l'elemento di contorno corrente
redact.applyChanges=Applica modifiche
#showJS #showJS
showJS.title=Mostra Javascript showJS.title=Mostra Javascript
@@ -769,6 +768,7 @@ 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.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.formPrompt=Invia PDF contenente divisori di pagina Stirling-PDF:
autoSplitPDF.duplexMode=Modalità duplex (scansione fronte e retro) autoSplitPDF.duplexMode=Modalità duplex (scansione fronte e retro)
autoSplitPDF.dividerDownload1=Scarica 'Divisore automatico (minimo).pdf'
autoSplitPDF.dividerDownload2=Scarica 'Divisore automatico (con istruzioni).pdf' autoSplitPDF.dividerDownload2=Scarica 'Divisore automatico (con istruzioni).pdf'
autoSplitPDF.submit=Invia 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.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.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.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 ocr.submit=Scansiona testo nel PDF con OCR
@@ -952,7 +952,7 @@ compress.title=Comprimi
compress.header=Comprimi PDF compress.header=Comprimi PDF
compress.credit=Questo servizio utilizza qpdf per la compressione/ottimizzazione dei 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=Modalità manuale - Da 1 a 5
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.1.1=In optimization levels 6 to 9, in addition to general PDF compression, image resolution is scaled down to further reduce file size. Higher levels result in stronger image compression (up to 50% of the original size), achieving greater size reduction but with potential quality loss in images.
compress.selectText.2=Livello di ottimizzazione: compress.selectText.2=Livello di ottimizzazione:
compress.selectText.3=4 (Terribile per le immagini di testo) 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 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
pdfToPDFA.title=Da PDF a PDF/A pdfToPDFA.title=Da PDF a PDF/A
pdfToPDFA.header=Da PDF a PDF/A pdfToPDFA.header=Da PDF a PDF/A
pdfToPDFA.credit=Questo servizio utilizza libreoffice per la conversione in PDF/A. pdfToPDFA.credit=Questo servizio utilizza qpdf per la conversione in PDF/A.
pdfToPDFA.submit=Converti pdfToPDFA.submit=Converti
pdfToPDFA.tip=Attualmente non funziona per più input contemporaneamente pdfToPDFA.tip=Attualmente non funziona per più input contemporaneamente
pdfToPDFA.outputFormat=Formato di output pdfToPDFA.outputFormat=Formato di output

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=添付ファイルを表示
redact.showLayers=レイヤーを表示(ダブルクリックするとすべてのレイヤーがデフォルトの状態にリセットされます) redact.showLayers=レイヤーを表示(ダブルクリックするとすべてのレイヤーがデフォルトの状態にリセットされます)
redact.colourPicker=カラー選択 redact.colourPicker=カラー選択
redact.findCurrentOutlineItem=現在のアウトライン項目を検索 redact.findCurrentOutlineItem=現在のアウトライン項目を検索
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Javascriptを表示 showJS.title=Javascriptを表示
@@ -769,6 +768,7 @@ autoSplitPDF.selectText.3=スキャンしたPDFファイルをアップロード
autoSplitPDF.selectText.4=仕切りページは自動的に検出、削除されるので、最終的な文書はきれいに仕上がります。 autoSplitPDF.selectText.4=仕切りページは自動的に検出、削除されるので、最終的な文書はきれいに仕上がります。
autoSplitPDF.formPrompt=Stirling-PDF仕切り用紙を含むPDFを送信: autoSplitPDF.formPrompt=Stirling-PDF仕切り用紙を含むPDFを送信:
autoSplitPDF.duplexMode=両面モード (表裏スキャン) autoSplitPDF.duplexMode=両面モード (表裏スキャン)
autoSplitPDF.dividerDownload1=ダウンロード '自動仕切り用紙 (最小).pdf'
autoSplitPDF.dividerDownload2=ダウンロード '自動仕切り用紙 (手順書付き).pdf' autoSplitPDF.dividerDownload2=ダウンロード '自動仕切り用紙 (手順書付き).pdf'
autoSplitPDF.submit=送信 autoSplitPDF.submit=送信
@@ -1185,7 +1185,7 @@ changeMetadata.submit=変更
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDFをPDF/Aに変換 pdfToPDFA.title=PDFをPDF/Aに変換
pdfToPDFA.header=PDFをPDF/Aに変換 pdfToPDFA.header=PDFをPDF/Aに変換
pdfToPDFA.credit=本サービスはPDF/Aの変換にlibreofficeを使用しています。 pdfToPDFA.credit=本サービスはPDF/Aの変換にqpdfを使用しています。
pdfToPDFA.submit=変換 pdfToPDFA.submit=変換
pdfToPDFA.tip=現在、一度に複数の入力に対して機能しません pdfToPDFA.tip=現在、一度に複数の入力に対して機能しません
pdfToPDFA.outputFormat=出力形式 pdfToPDFA.outputFormat=出力形式

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=첨부 파일 보기
redact.showLayers=레이어 보기 (더블클릭하여 모든 레이어를 기본 상태로 재설정) redact.showLayers=레이어 보기 (더블클릭하여 모든 레이어를 기본 상태로 재설정)
redact.colourPicker=색상 선택기 redact.colourPicker=색상 선택기
redact.findCurrentOutlineItem=현재 개요 항목 찾기 redact.findCurrentOutlineItem=현재 개요 항목 찾기
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=JavaScript 보기 showJS.title=JavaScript 보기
@@ -769,6 +768,7 @@ autoSplitPDF.selectText.3=스캔한 단일 PDF 파일을 업로드하고 나머
autoSplitPDF.selectText.4=구분자 페이지는 자동으로 감지되고 제거되어 깔끔한 최종 문서를 보장합니다. autoSplitPDF.selectText.4=구분자 페이지는 자동으로 감지되고 제거되어 깔끔한 최종 문서를 보장합니다.
autoSplitPDF.formPrompt=Stirling-PDF 페이지 구분자가 포함된 PDF 제출: autoSplitPDF.formPrompt=Stirling-PDF 페이지 구분자가 포함된 PDF 제출:
autoSplitPDF.duplexMode=양면 모드 (앞뒷면 스캔) autoSplitPDF.duplexMode=양면 모드 (앞뒷면 스캔)
autoSplitPDF.dividerDownload1='자동 분할 구분자 (최소)' PDF 다운로드
autoSplitPDF.dividerDownload2='자동 분할 구분자 (설명 포함)' PDF 다운로드 autoSplitPDF.dividerDownload2='자동 분할 구분자 (설명 포함)' PDF 다운로드
autoSplitPDF.submit=제출 autoSplitPDF.submit=제출
@@ -1185,7 +1185,7 @@ changeMetadata.submit=변경
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF를 PDF/A로 pdfToPDFA.title=PDF를 PDF/A로
pdfToPDFA.header=PDF를 PDF/A로 pdfToPDFA.header=PDF를 PDF/A로
pdfToPDFA.credit=이 서비스는 PDF/A 변환을 위해 libreoffice를 사용합니다 pdfToPDFA.credit=이 서비스는 PDF/A 변환을 위해 qpdf를 사용합니다
pdfToPDFA.submit=변환 pdfToPDFA.submit=변환
pdfToPDFA.tip=현재 여러 입력을 한 번에 처리할 수 없습니다 pdfToPDFA.tip=현재 여러 입력을 한 번에 처리할 수 없습니다
pdfToPDFA.outputFormat=출력 형식 pdfToPDFA.outputFormat=출력 형식

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=Show Attachments
redact.showLayers=Show Layers (double-click to reset all layers to the default state) redact.showLayers=Show Layers (double-click to reset all layers to the default state)
redact.colourPicker=Colour Picker redact.colourPicker=Colour Picker
redact.findCurrentOutlineItem=Find current outline item redact.findCurrentOutlineItem=Find current outline item
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Toon Javascript showJS.title=Toon Javascript
@@ -769,6 +768,7 @@ 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.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.formPrompt=Dien PDF in met Stirling-PDF Pagina-scheiders:
autoSplitPDF.duplexMode=Duplex Modus (voor- en achterkant scannen) 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.dividerDownload2=Download 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=Indienen autoSplitPDF.submit=Indienen
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Wijzigen
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF naar PDF/A pdfToPDFA.title=PDF naar PDF/A
pdfToPDFA.header=PDF naar PDF/A pdfToPDFA.header=PDF naar PDF/A
pdfToPDFA.credit=Deze service gebruikt libreoffice voor PDF/A-conversie pdfToPDFA.credit=Deze service gebruikt qpdf voor PDF/A-conversie
pdfToPDFA.submit=Converteren pdfToPDFA.submit=Converteren
pdfToPDFA.tip=Werkt momenteel niet voor meerdere inputs tegelijkertijd. pdfToPDFA.tip=Werkt momenteel niet voor meerdere inputs tegelijkertijd.
pdfToPDFA.outputFormat=Uitvoerindeling pdfToPDFA.outputFormat=Uitvoerindeling

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=Show Attachments
redact.showLayers=Show Layers (double-click to reset all layers to the default state) redact.showLayers=Show Layers (double-click to reset all layers to the default state)
redact.colourPicker=Colour Picker redact.colourPicker=Colour Picker
redact.findCurrentOutlineItem=Find current outline item redact.findCurrentOutlineItem=Find current outline item
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Vis Javascript showJS.title=Vis Javascript
@@ -769,6 +768,7 @@ 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.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.formPrompt=Send inn PDF som inneholder Stirling-PDF-sideskillere:
autoSplitPDF.duplexMode=Dupleksmodus (Front- og bakskanning) 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.dividerDownload2=Last ned 'Auto Splitter Divider (med instruksjoner).pdf'
autoSplitPDF.submit=Send inn autoSplitPDF.submit=Send inn
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Endre
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF til PDF/A pdfToPDFA.title=PDF til PDF/A
pdfToPDFA.header=PDF til PDF/A pdfToPDFA.header=PDF til PDF/A
pdfToPDFA.credit=Denne tjenesten bruker libreoffice for PDF/A-konvertering pdfToPDFA.credit=Denne tjenesten bruker qpdf for PDF/A-konvertering
pdfToPDFA.submit=Konverter pdfToPDFA.submit=Konverter
pdfToPDFA.tip=Fungere for øyeblikket ikke for flere innganger samtidig pdfToPDFA.tip=Fungere for øyeblikket ikke for flere innganger samtidig
pdfToPDFA.outputFormat=Utdataformat pdfToPDFA.outputFormat=Utdataformat

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=Show Attachments
redact.showLayers=Show Layers (double-click to reset all layers to the default state) redact.showLayers=Show Layers (double-click to reset all layers to the default state)
redact.colourPicker=Colour Picker redact.colourPicker=Colour Picker
redact.findCurrentOutlineItem=Find current outline item redact.findCurrentOutlineItem=Find current outline item
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Pokaż Javascript showJS.title=Pokaż Javascript
@@ -769,6 +768,7 @@ 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.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.formPrompt=Wyślij dokument PDF zawierający strony podziału z Stirling PDF.
autoSplitPDF.duplexMode=Skanowanie dwustronne autoSplitPDF.duplexMode=Skanowanie dwustronne
autoSplitPDF.dividerDownload1=Pobierz 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=Pobierz 'Auto Splitter Divider (with instructions).pdf' autoSplitPDF.dividerDownload2=Pobierz 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=Wyślij autoSplitPDF.submit=Wyślij
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Zmień
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF na PDF/A pdfToPDFA.title=PDF na PDF/A
pdfToPDFA.header=PDF na PDF/A pdfToPDFA.header=PDF na PDF/A
pdfToPDFA.credit=Ta usługa używa libreoffice do konwersji PDF/A pdfToPDFA.credit=Ta usługa używa qpdf do konwersji PDF/A
pdfToPDFA.submit=Konwertuj pdfToPDFA.submit=Konwertuj
pdfToPDFA.tip=Tylko jeden plik na raz pdfToPDFA.tip=Tylko jeden plik na raz
pdfToPDFA.outputFormat=Format wyjściowy: pdfToPDFA.outputFormat=Format wyjściowy:

View File

@@ -138,7 +138,7 @@ analytics.settings=Você pode alterar as configurações de coleta de dados no a
# NAVBAR # # NAVBAR #
############# #############
navbar.favorite=Favoritos navbar.favorite=Favoritos
navbar.recent=Novos e Recentemente Atualizados navbar.recent=New and recently updated
navbar.darkmode=Modo Escuro navbar.darkmode=Modo Escuro
navbar.language=Idiomas navbar.language=Idiomas
navbar.settings=Configurações navbar.settings=Configurações
@@ -266,14 +266,14 @@ home.viewPdf.title=Visualizar PDF
home.viewPdf.desc=Visualizar, anotar, adicionar texto ou imagens ao PDF. home.viewPdf.desc=Visualizar, anotar, adicionar texto ou imagens ao PDF.
viewPdf.tags=visualizar,ler,anotar,texto,imagem viewPdf.tags=visualizar,ler,anotar,texto,imagem
home.setFavorites=Adicionar Favoritos home.setFavorites=Set Favourites
home.hideFavorites=Ocultar Favoritos home.hideFavorites=Hide Favourites
home.showFavorites=Mostrar Favoritos home.showFavorites=Show Favourites
home.legacyHomepage=Homepage Antiga home.legacyHomepage=Old homepage
home.newHomePage=Experimente nossa nova Homepage! home.newHomePage=Try our new homepage!
home.alphabetical=Alfabética home.alphabetical=Alphabetical
home.globalPopularity=Popularidade Global home.globalPopularity=Global Popularity
home.sortBy=Ordenar por: home.sortBy=Sort by:
home.multiTool.title=Multiferramentas de PDF home.multiTool.title=Multiferramentas de PDF
home.multiTool.desc=Mesclar, girar, reorganizar, dividir, inserir e remover páginas. 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. home.pageLayout.desc=Mesclar várias páginas de um documento PDF em uma única página.
pageLayout.tags=mesclar,composto,vista-única,organizar pageLayout.tags=mesclar,composto,vista-única,organizar
home.scalePages.title=Ajustar Dimensões da Página home.scalePages.title=Ajustar Tamanho/Escala da Página
home.scalePages.desc=Alterar o tamanho/escala da página e/ou seu conteúdo. home.scalePages.desc=Alterar o tamanho/escala da página e/ou seu conteúdo.
scalePages.tags=redimensionar,modificar,dimensão,adaptar 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. 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 add-page-numbers.tags=paginar,rotular,organizar,índice
home.auto-rename.title=Renomeação Automática do PDF home.auto-rename.title=Renomear Automaticamente o PDF
home.auto-rename.desc=Renomeia automaticamente o PDF com base no cabeçalho detectado. 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 auto-rename.tags=detecção-automática,baseado-em-cabeçalho,organizar,relabel
@@ -623,7 +623,6 @@ redact.showAttatchments=Mostrar Anexos
redact.showLayers=Mostrar Camadas (duplo clique para restabelecer as camadas para o estado padrão) redact.showLayers=Mostrar Camadas (duplo clique para restabelecer as camadas para o estado padrão)
redact.colourPicker=Seletor de Cores redact.colourPicker=Seletor de Cores
redact.findCurrentOutlineItem=Encontrar item atual redact.findCurrentOutlineItem=Encontrar item atual
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Mostrar JavaScript showJS.title=Mostrar JavaScript
@@ -739,8 +738,8 @@ addPageNumbers.submit=Adicionar Números de Página
#auto-rename #auto-rename
auto-rename.title=Renomeação Automática do PDF auto-rename.title=Renomear Automaticamente o PDF
auto-rename.header=Renomeação Automática do PDF auto-rename.header=Renomear Automaticamente o PDF
auto-rename.submit=Renomeação Automática auto-rename.submit=Renomeação Automática
@@ -769,6 +768,7 @@ 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.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.formPrompt=Enviar PDF contendo folhas divisórias Stirling-PDF:
autoSplitPDF.duplexMode=Modo Duplex (Digitalização frente e verso). 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.dividerDownload2=Baixar 'Folha Divisória Automática (com instruções).pdf'
autoSplitPDF.submit=Enviar autoSplitPDF.submit=Enviar
@@ -786,8 +786,8 @@ pageLayout.submit=Enviar
#scalePages #scalePages
scalePages.title=Ajustar Dimensões da Página scalePages.title=Ajustar Tamanho/Escala da Página
scalePages.header=Ajustar Dimensões da Página scalePages.header=Ajustar Tamanho/Escala da Página
scalePages.pageSize=Tamanho desejado do documento: scalePages.pageSize=Tamanho desejado do documento:
scalePages.keepPageSize=Tamanho Original scalePages.keepPageSize=Tamanho Original
scalePages.scaleFactor=Fator de zoom (corte) de uma página: scalePages.scaleFactor=Fator de zoom (corte) de uma página:
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Alterar
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF para PDF/A pdfToPDFA.title=PDF para PDF/A
pdfToPDFA.header=PDF para PDF/A pdfToPDFA.header=PDF para PDF/A
pdfToPDFA.credit=Este serviço usa o LibreOffice para conversão para PDF/A. pdfToPDFA.credit=Este serviço usa Qpdf para conversão para PDF/A.
pdfToPDFA.submit=Converter pdfToPDFA.submit=Converter
pdfToPDFA.tip=Atenção, atualmente não funciona para múltiplas entradas ao mesmo tempo. pdfToPDFA.tip=Atenção, atualmente não funciona para múltiplas entradas ao mesmo tempo.
pdfToPDFA.outputFormat=Formato de saída: pdfToPDFA.outputFormat=Formato de saída:

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=Mostrar Anexos
redact.showLayers=Mostrar Camadas (duplo clique para repor todas as camadas para o estado predefinido) redact.showLayers=Mostrar Camadas (duplo clique para repor todas as camadas para o estado predefinido)
redact.colourPicker=Seletor de Cor redact.colourPicker=Seletor de Cor
redact.findCurrentOutlineItem=Encontrar item atual do esquema redact.findCurrentOutlineItem=Encontrar item atual do esquema
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Mostrar Javascript showJS.title=Mostrar Javascript
@@ -769,6 +768,7 @@ 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.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.formPrompt=Submeter PDF contendo separadores de página Stirling-PDF:
autoSplitPDF.duplexMode=Modo Duplex (Digitalização frente e verso) 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.dividerDownload2=Transferir 'Separador de Divisão Automática (com instruções).pdf'
autoSplitPDF.submit=Submeter autoSplitPDF.submit=Submeter
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Alterar
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF Para PDF/A pdfToPDFA.title=PDF Para PDF/A
pdfToPDFA.header=PDF Para PDF/A pdfToPDFA.header=PDF Para PDF/A
pdfToPDFA.credit=Este serviço usa libreoffice para conversão PDF/A pdfToPDFA.credit=Este serviço usa qpdf para conversão PDF/A
pdfToPDFA.submit=Converter pdfToPDFA.submit=Converter
pdfToPDFA.tip=Atualmente não funciona para múltiplas entradas de uma só vez pdfToPDFA.tip=Atualmente não funciona para múltiplas entradas de uma só vez
pdfToPDFA.outputFormat=Formato de saída pdfToPDFA.outputFormat=Formato de saída

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=Show Attachments
redact.showLayers=Show Layers (double-click to reset all layers to the default state) redact.showLayers=Show Layers (double-click to reset all layers to the default state)
redact.colourPicker=Colour Picker redact.colourPicker=Colour Picker
redact.findCurrentOutlineItem=Find current outline item redact.findCurrentOutlineItem=Find current outline item
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Arată Javascript showJS.title=Arată Javascript
@@ -769,6 +768,7 @@ 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.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.formPrompt=Trimite PDF-ul conținând separatoarele de pagini Stirling-PDF:
autoSplitPDF.duplexMode=Mod Duplex (Scanare față-verso) 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.dividerDownload2=Descarcă 'Separator Auto Splitter (cu instrucțiuni).pdf'
autoSplitPDF.submit=Trimite autoSplitPDF.submit=Trimite
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Schimbă
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF către PDF/A pdfToPDFA.title=PDF către PDF/A
pdfToPDFA.header=PDF către PDF/A pdfToPDFA.header=PDF către PDF/A
pdfToPDFA.credit=Acest serviciu utilizează libreoffice pentru conversia în PDF/A pdfToPDFA.credit=Acest serviciu utilizează qpdf pentru conversia în PDF/A
pdfToPDFA.submit=Convertește pdfToPDFA.submit=Convertește
pdfToPDFA.tip=În prezent nu funcționează pentru mai multe intrări simultan pdfToPDFA.tip=În prezent nu funcționează pentru mai multe intrări simultan
pdfToPDFA.outputFormat=Format de ieșire pdfToPDFA.outputFormat=Format de ieșire

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=Показать вложения
redact.showLayers=Показать слои (двойной щелчок для сброса всех слоев к состоянию по умолчанию) redact.showLayers=Показать слои (двойной щелчок для сброса всех слоев к состоянию по умолчанию)
redact.colourPicker=Выбор цвета redact.colourPicker=Выбор цвета
redact.findCurrentOutlineItem=Найти текущий элемент структуры redact.findCurrentOutlineItem=Найти текущий элемент структуры
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Показать Javascript showJS.title=Показать Javascript
@@ -769,6 +768,7 @@ autoSplitPDF.selectText.3=Загрузите один большой отска
autoSplitPDF.selectText.4=Разделительные страницы автоматически обнаруживаются и удаляются, гарантируя аккуратный конечный документ. autoSplitPDF.selectText.4=Разделительные страницы автоматически обнаруживаются и удаляются, гарантируя аккуратный конечный документ.
autoSplitPDF.formPrompt=Отправить PDF, содержащий разделители страниц Stirling-PDF: autoSplitPDF.formPrompt=Отправить PDF, содержащий разделители страниц Stirling-PDF:
autoSplitPDF.duplexMode=Двусторонний режим (сканирование с двух сторон) autoSplitPDF.duplexMode=Двусторонний режим (сканирование с двух сторон)
autoSplitPDF.dividerDownload1=Скачать 'Автоматический разделитель (минимальный).pdf'
autoSplitPDF.dividerDownload2=Скачать 'Автоматический разделитель (с инструкциями).pdf' autoSplitPDF.dividerDownload2=Скачать 'Автоматический разделитель (с инструкциями).pdf'
autoSplitPDF.submit=Отправить autoSplitPDF.submit=Отправить
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Изменить
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF в PDF/A pdfToPDFA.title=PDF в PDF/A
pdfToPDFA.header=PDF в PDF/A pdfToPDFA.header=PDF в PDF/A
pdfToPDFA.credit=Этот сервис использует libreoffice для преобразования в PDF/A pdfToPDFA.credit=Этот сервис использует qpdf для преобразования в PDF/A
pdfToPDFA.submit=Преобразовать pdfToPDFA.submit=Преобразовать
pdfToPDFA.tip=В настоящее время не работает с несколькими входными файлами одновременно pdfToPDFA.tip=В настоящее время не работает с несколькими входными файлами одновременно
pdfToPDFA.outputFormat=Формат вывода pdfToPDFA.outputFormat=Формат вывода

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=Show Attachments
redact.showLayers=Show Layers (double-click to reset all layers to the default state) redact.showLayers=Show Layers (double-click to reset all layers to the default state)
redact.colourPicker=Colour Picker redact.colourPicker=Colour Picker
redact.findCurrentOutlineItem=Find current outline item redact.findCurrentOutlineItem=Find current outline item
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Zobraziť JavaScript showJS.title=Zobraziť JavaScript
@@ -769,6 +768,7 @@ 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.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.formPrompt=Odoslať PDF obsahujúce Stirling-PDF rozdeľovače stránok:
autoSplitPDF.duplexMode=Duplex režim (skanovanie prednej a zadnej strany) 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.dividerDownload2=Stiahnuť 'Auto Splitter Divider (s inštrukciami).pdf'
autoSplitPDF.submit=Odoslať autoSplitPDF.submit=Odoslať
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Zmeniť
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF na PDF/A pdfToPDFA.title=PDF na PDF/A
pdfToPDFA.header=PDF na PDF/A pdfToPDFA.header=PDF na PDF/A
pdfToPDFA.credit=Táto služba používa libreoffice na konverziu PDF/A pdfToPDFA.credit=Táto služba používa qpdf na konverziu PDF/A
pdfToPDFA.submit=Konvertovať pdfToPDFA.submit=Konvertovať
pdfToPDFA.tip=Momentálne nefunguje pre viacero vstupov naraz pdfToPDFA.tip=Momentálne nefunguje pre viacero vstupov naraz
pdfToPDFA.outputFormat=Výstupný formát pdfToPDFA.outputFormat=Výstupný formát

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=Prikaži priloge
redact.showLayers=Prikaži plasti (dvokliknite za ponastavitev vseh plasti na privzeto stanje) redact.showLayers=Prikaži plasti (dvokliknite za ponastavitev vseh plasti na privzeto stanje)
redact.colourPicker=Izbirnik barv redact.colourPicker=Izbirnik barv
redact.findCurrentOutlineItem=Poišči trenutno postavko orisa redact.findCurrentOutlineItem=Poišči trenutno postavko orisa
redact.applyChanges=Uporabi spremembe
#showJS #showJS
showJS.title=Prikaži Javascript showJS.title=Prikaži Javascript
@@ -769,6 +768,7 @@ 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.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.formPrompt=Pošljite PDF, ki vsebuje razdelilnike strani Stirling-PDF:
autoSplitPDF.duplexMode=Dupleksni način (skeniranje spredaj in zadaj) 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.dividerDownload2=Prenesi 'Auto Splitter Divider (z navodili).pdf'
autoSplitPDF.submit=Pošlji autoSplitPDF.submit=Pošlji
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Spremeni
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF v PDF/A pdfToPDFA.title=PDF v PDF/A
pdfToPDFA.header=PDF v PDF/A pdfToPDFA.header=PDF v PDF/A
pdfToPDFA.credit=Ta storitev uporablja libreoffice za pretvorbo PDF/A pdfToPDFA.credit=Ta storitev uporablja qpdf za pretvorbo PDF/A
pdfToPDFA.submit=Pretvori pdfToPDFA.submit=Pretvori
pdfToPDFA.tip=Trenutno ne deluje za več vnosov hkrati pdfToPDFA.tip=Trenutno ne deluje za več vnosov hkrati
pdfToPDFA.outputFormat=Izhodna oblika pdfToPDFA.outputFormat=Izhodna oblika

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=Show Attachments
redact.showLayers=Show Layers (double-click to reset all layers to the default state) redact.showLayers=Show Layers (double-click to reset all layers to the default state)
redact.colourPicker=Colour Picker redact.colourPicker=Colour Picker
redact.findCurrentOutlineItem=Find current outline item redact.findCurrentOutlineItem=Find current outline item
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Prikaži Javascript showJS.title=Prikaži Javascript
@@ -769,6 +768,7 @@ 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.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.formPrompt=Potvrdite PDF koji sadrži Stirling-PDF listove razdeljivača:
autoSplitPDF.duplexMode=Dupleks režim (skeniranje prednje i zadnje strane) 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.dividerDownload2=Preuzmi 'Auto Splitter Divider (sa uputstvima).pdf'
autoSplitPDF.submit=Potvrdi autoSplitPDF.submit=Potvrdi
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Promeni
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF u PDF/A pdfToPDFA.title=PDF u PDF/A
pdfToPDFA.header=PDF u PDF/A pdfToPDFA.header=PDF u PDF/A
pdfToPDFA.credit=Ova usluga koristi libreoffice za konverziju u PDF/A format pdfToPDFA.credit=Ova usluga koristi qpdf za konverziju u PDF/A format
pdfToPDFA.submit=Konvertuj pdfToPDFA.submit=Konvertuj
pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.tip=Currently does not work for multiple inputs at once
pdfToPDFA.outputFormat=Output format pdfToPDFA.outputFormat=Output format

View File

@@ -23,7 +23,7 @@ close=Stäng
filesSelected=filer valda filesSelected=filer valda
noFavourites=Inga favoriter har lagts till noFavourites=Inga favoriter har lagts till
downloadComplete=Nedladdning klar downloadComplete=Nedladdning klar
bored=Trött på att vänta? bored=Utråkad att vänta?
alphabet=Alfabet alphabet=Alfabet
downloadPdf=Ladda ner PDF downloadPdf=Ladda ner PDF
text=Text text=Text
@@ -31,7 +31,7 @@ font=Teckensnitt
selectFillter=-- Välj -- selectFillter=-- Välj --
pageNum=Sidnummer pageNum=Sidnummer
sizes.small=Liten sizes.small=Liten
sizes.medium=Mellan sizes.medium=Mellanvärd
sizes.large=Stor sizes.large=Stor
sizes.x-large=Extra stor sizes.x-large=Extra stor
error.pdfPassword=PDF-dokumentet är lösenordsskyddat och antingen har lösenordet inte angetts eller är felaktigt 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 green=Grön
blue=Blå blue=Blå
custom=Anpassad... custom=Anpassad...
WorkInProgess=Pågående arbete, kan vara icke fungerande eller buggigt. Rapportera eventuella problem! WorkInProgess=Pågående arbete, kan inte fungera eller vara buggigt. Rapportera eventuella problem!
poweredBy=Drivs av poweredBy=Drivs av
yes=Ja yes=Ja
no=Nej no=Nej
@@ -240,17 +240,17 @@ database.creationDate=Skapelsedatum
database.fileSize=Filstorlek database.fileSize=Filstorlek
database.deleteBackupFile=Ta bort säkerhetskopieringsfil database.deleteBackupFile=Ta bort säkerhetskopieringsfil
database.importBackupFile=Importera säkerhetskopieringsfil database.importBackupFile=Importera säkerhetskopieringsfil
database.createBackupFile=Skapa säkerhetskopieringsfil database.createBackupFile=Create Backup File
database.downloadBackupFile=Ladda ner 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_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.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.submit=Importera säkerhetskopia
database.importIntoDatabaseSuccessed=Import till databas lyckades database.importIntoDatabaseSuccessed=Import till databas lyckades
database.backupCreated=Backup av databas lyckades database.backupCreated=Database backup successful
database.fileNotFound=Filen hittades inte database.fileNotFound=Filen hittades inte
database.fileNullOrEmpty=Filen får inte vara null eller tom database.fileNullOrEmpty=Filen får inte vara null eller tom
database.failedImportFile=Misslyckades med att importera fil database.failedImportFile=Misslyckades med att importera fil
database.notSupported=Denna funktion är inte tillgänglig för din databasanslutning. database.notSupported=This function is not available for your database connection.
session.expired=Din session har löpt ut. Uppdatera sidan och försök igen. session.expired=Din session har löpt ut. Uppdatera sidan och försök igen.
session.refreshPage=Uppdatera sida session.refreshPage=Uppdatera sida
@@ -266,14 +266,14 @@ home.viewPdf.title=Visa PDF
home.viewPdf.desc=Visa, kommentera, lägg till text eller bilder home.viewPdf.desc=Visa, kommentera, lägg till text eller bilder
viewPdf.tags=visa,läs,kommentera,text,bild viewPdf.tags=visa,läs,kommentera,text,bild
home.setFavorites=Välj Favoriter home.setFavorites=Set Favourites
home.hideFavorites=Dölj Favoriter home.hideFavorites=Hide Favourites
home.showFavorites=Visa Favoriter home.showFavorites=Show Favourites
home.legacyHomepage=Gammal Hem-vy. home.legacyHomepage=Old homepage
home.newHomePage=Testa vår nya Hem-vy! home.newHomePage=Try our new homepage!
home.alphabetical=Alfabetisk home.alphabetical=Alphabetical
home.globalPopularity=Global Popularity home.globalPopularity=Global Popularity
home.sortBy=Sortera efter: home.sortBy=Sort by:
home.multiTool.title=PDF Multi-verktyg home.multiTool.title=PDF Multi-verktyg
home.multiTool.desc=Sammanfoga, rotera, ordna om och ta bort sidor 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 home.MarkdownToPDF.desc=Konverterar valfri Markdown-fil till PDF
MarkdownToPDF.tags=markup,webbinnehåll,transformation,konvertera MarkdownToPDF.tags=markup,webbinnehåll,transformation,konvertera
home.PDFToMarkdown.title=PDF till Markdown home.PDFToMarkdown.title=PDF to Markdown
home.PDFToMarkdown.desc=Konvertera PDF till Markdown home.PDFToMarkdown.desc=Converts any PDF to Markdown
PDFToMarkdown.tags=markup,web-content,transformation,convert,md PDFToMarkdown.tags=markup,web-content,transformation,convert,md
home.getPdfInfo.title=Hämta ALL information om PDF 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. home.splitPdfByChapters.desc=Dela upp en PDF till flera filer baserat på dess kapitelstruktur.
splitPdfByChapters.tags=dela,kapitel,bokmärken,organisera splitPdfByChapters.tags=dela,kapitel,bokmärken,organisera
home.validateSignature.title=Validera PDF signature home.validateSignature.title=Validate PDF Signature
home.validateSignature.desc=Verifiera digitala signaturer och certifiakt i PDF dokument home.validateSignature.desc=Verify digital signatures and certificates in PDF documents
validateSignature.tags=signatur,verifiera,validera,pdf,certifikat,digital signatur,Validera Signatur,Validera certifikat validateSignature.tags=signature,verify,validate,pdf,certificate,digital signature,Validate Signature,Validate certificate
#replace-invert-color #replace-invert-color
replace-color.title=Ersätt-Invertera-Färg replace-color.title=Ersätt-Invertera-Färg
@@ -623,7 +623,6 @@ redact.showAttatchments=Show Attachments
redact.showLayers=Show Layers (double-click to reset all layers to the default state) redact.showLayers=Show Layers (double-click to reset all layers to the default state)
redact.colourPicker=Colour Picker redact.colourPicker=Colour Picker
redact.findCurrentOutlineItem=Find current outline item redact.findCurrentOutlineItem=Find current outline item
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Visa Javascript showJS.title=Visa Javascript
@@ -661,9 +660,9 @@ MarkdownToPDF.credit=Använder WeasyPrint
#pdf-to-markdown #pdf-to-markdown
PDFToMarkdown.title=PDF Till Markdown PDFToMarkdown.title=PDF To Markdown
PDFToMarkdown.header=PDF Till Markdown PDFToMarkdown.header=PDF To Markdown
PDFToMarkdown.submit=Konvertera PDFToMarkdown.submit=Convert
#url-to-pdf #url-to-pdf
@@ -769,6 +768,7 @@ 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.selectText.4=Avdelarsidor detekteras automatiskt och tas bort, vilket garanterar ett prydligt slutdokument.
autoSplitPDF.formPrompt=Skicka PDF som innehåller Stirling-PDF-sidavdelare: autoSplitPDF.formPrompt=Skicka PDF som innehåller Stirling-PDF-sidavdelare:
autoSplitPDF.duplexMode=Duplexläge (Fram- och baksideskanning) 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.dividerDownload2=Ladda ner 'Auto-delningsavdelare (med instruktioner).pdf'
autoSplitPDF.submit=Skicka autoSplitPDF.submit=Skicka
@@ -874,12 +874,12 @@ sign.save=Spara signatur
sign.personalSigs=Personliga signaturer sign.personalSigs=Personliga signaturer
sign.sharedSigs=Delade signaturer sign.sharedSigs=Delade signaturer
sign.noSavedSigs=Inga sparade signaturer hittades sign.noSavedSigs=Inga sparade signaturer hittades
sign.addToAll=Lägg till på alla sidor sign.addToAll=Add to all pages
sign.delete=Ta bort sign.delete=Delete
sign.first=Första sidan sign.first=First page
sign.last=Sista sidan sign.last=Last page
sign.next=Nästa sida sign.next=Next page
sign.previous=Föregående sida sign.previous=Previous page
sign.maintainRatio=Toggle maintain aspect ratio 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.title=PDF-multiverktyg
multiTool.header=PDF Multi-verktyg multiTool.header=PDF Multi-verktyg
multiTool.uploadPrompts=Filnamn multiTool.uploadPrompts=Filnamn
multiTool.selectAll=Välj allt multiTool.selectAll=Select All
multiTool.deselectAll=Deselect All multiTool.deselectAll=Deselect All
multiTool.selectPages=Välj sidor multiTool.selectPages=Page Select
multiTool.selectedPages=Valda sidor multiTool.selectedPages=Selected Pages
multiTool.page=Sida multiTool.page=Page
multiTool.deleteSelected=Ta bort valda multiTool.deleteSelected=Delete Selected
multiTool.downloadAll=Exportera multiTool.downloadAll=Export
multiTool.downloadSelected=Exportersa valda multiTool.downloadSelected=Export Selected
multiTool.insertPageBreak=Insert Page Break multiTool.insertPageBreak=Insert Page Break
multiTool.addFile=Lägg till fil multiTool.addFile=Add File
multiTool.rotateLeft=Rotera Vänster multiTool.rotateLeft=Rotate Left
multiTool.rotateRight=Rotera Höger multiTool.rotateRight=Rotate Right
multiTool.split=Dela upp multiTool.split=Split
multiTool.moveLeft=Flytta Vänster multiTool.moveLeft=Move Left
multiTool.moveRight=Flytta Höger multiTool.moveRight=Move Right
multiTool.delete=Ta bort multiTool.delete=Delete
multiTool.dragDropMessage=Valda sid(or) multiTool.dragDropMessage=Page(s) Selected
multiTool.undo=Undo multiTool.undo=Undo
multiTool.redo=Redo multiTool.redo=Redo
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Ändra
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF till PDF/A pdfToPDFA.title=PDF till PDF/A
pdfToPDFA.header=PDF till PDF/A pdfToPDFA.header=PDF till PDF/A
pdfToPDFA.credit=Denna tjänst använder libreoffice för PDF/A-konvertering pdfToPDFA.credit=Denna tjänst använder qpdf för PDF/A-konvertering
pdfToPDFA.submit=Konvertera pdfToPDFA.submit=Konvertera
pdfToPDFA.tip=Fungerar för närvarande inte för flera inmatningar samtidigt pdfToPDFA.tip=Fungerar för närvarande inte för flera inmatningar samtidigt
pdfToPDFA.outputFormat=Utdataformat pdfToPDFA.outputFormat=Utdataformat
@@ -1335,34 +1335,34 @@ splitByChapters.desc.4=Tillåt duplicieringar: Om kryssrutan är markerad tillå
splitByChapters.submit=Dela upp PDF splitByChapters.submit=Dela upp PDF
#File Chooser #File Chooser
fileChooser.click=Klicka fileChooser.click=Click
fileChooser.or=eller fileChooser.or=or
fileChooser.dragAndDrop=Dra & Släpp fileChooser.dragAndDrop=Drag & Drop
fileChooser.dragAndDropPDF=Dra & Släpp PDF fil fileChooser.dragAndDropPDF=Drag & Drop PDF file
fileChooser.dragAndDropImage=Dra & Släpp bildfil fileChooser.dragAndDropImage=Drag & Drop Image file
fileChooser.hoveredDragAndDrop=Dra & Släpp fil(er) här fileChooser.hoveredDragAndDrop=Drag & Drop file(s) here
#release notes #release notes
releases.footer=Utgåvor releases.footer=Releases
releases.title=Release Notes releases.title=Release Notes
releases.header=Release Notes releases.header=Release Notes
releases.current.version=Nuvarande Utgåva releases.current.version=Current Release
releases.note=Release notes are only available in English releases.note=Release notes are only available in English
#Validate Signature #Validate Signature
validateSignature.title=Validera PDF Signaturer validateSignature.title=Validate PDF Signatures
validateSignature.header=Validera Digitala Signaturer validateSignature.header=Validate Digital Signatures
validateSignature.selectPDF=Välj signerad PDF fil validateSignature.selectPDF=Select signed PDF file
validateSignature.submit=Validera Signaturer validateSignature.submit=Validate Signatures
validateSignature.results=Valideringsresultat validateSignature.results=Validation Results
validateSignature.status=Status validateSignature.status=Status
validateSignature.signer=Signer validateSignature.signer=Signer
validateSignature.date=Datum validateSignature.date=Date
validateSignature.reason=Anledning validateSignature.reason=Reason
validateSignature.location=Plats validateSignature.location=Location
validateSignature.noSignatures=Inga digitala signaturer hittade i detta dokument validateSignature.noSignatures=No digital signatures found in this document
validateSignature.status.valid=Giltig validateSignature.status.valid=Valid
validateSignature.status.invalid=Ogiltig validateSignature.status.invalid=Invalid
validateSignature.chain.invalid=Certificate chain validation failed - cannot verify signer's identity 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.trust.invalid=Certificate not in trust store - source cannot be verified
validateSignature.cert.expired=Certificate has expired validateSignature.cert.expired=Certificate has expired

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=Show Attachments
redact.showLayers=Show Layers (double-click to reset all layers to the default state) redact.showLayers=Show Layers (double-click to reset all layers to the default state)
redact.colourPicker=Colour Picker redact.colourPicker=Colour Picker
redact.findCurrentOutlineItem=Find current outline item redact.findCurrentOutlineItem=Find current outline item
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=แสดง Javascript showJS.title=แสดง Javascript
@@ -769,6 +768,7 @@ autoSplitPDF.selectText.3=อัปโหลดไฟล์ PDF ที่สแ
autoSplitPDF.selectText.4=หน้ากั้นจะถูกตรวจจับและลบโดยอัตโนมัติ รับประกันเอกสารสุดท้ายที่เรียบร้อย autoSplitPDF.selectText.4=หน้ากั้นจะถูกตรวจจับและลบโดยอัตโนมัติ รับประกันเอกสารสุดท้ายที่เรียบร้อย
autoSplitPDF.formPrompt=ส่ง PDF ที่มีแผ่นแยก Stirling-PDF: autoSplitPDF.formPrompt=ส่ง PDF ที่มีแผ่นแยก Stirling-PDF:
autoSplitPDF.duplexMode=โหมด Duplex (การสแกนหน้าและหลัง) autoSplitPDF.duplexMode=โหมด Duplex (การสแกนหน้าและหลัง)
autoSplitPDF.dividerDownload1=ดาวน์โหลด 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=ดาวน์โหลด 'Auto Splitter Divider (with instructions).pdf' autoSplitPDF.dividerDownload2=ดาวน์โหลด 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=ส่ง autoSplitPDF.submit=ส่ง
@@ -1185,7 +1185,7 @@ changeMetadata.submit=เปลี่ยน
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF เป็น PDF/A pdfToPDFA.title=PDF เป็น PDF/A
pdfToPDFA.header=PDF เป็น PDF/A pdfToPDFA.header=PDF เป็น PDF/A
pdfToPDFA.credit=บริการนี้ใช้ libreoffice สำหรับการแปลง PDF/A pdfToPDFA.credit=บริการนี้ใช้ qpdf สำหรับการแปลง PDF/A
pdfToPDFA.submit=แปลง pdfToPDFA.submit=แปลง
pdfToPDFA.tip=ปัจจุบันไม่ทำงานสำหรับการป้อนข้อมูลหลายรายการพร้อมกัน pdfToPDFA.tip=ปัจจุบันไม่ทำงานสำหรับการป้อนข้อมูลหลายรายการพร้อมกัน
pdfToPDFA.outputFormat=รูปแบบผลลัพธ์ pdfToPDFA.outputFormat=รูปแบบผลลัพธ์

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=Show Attachments
redact.showLayers=Show Layers (double-click to reset all layers to the default state) redact.showLayers=Show Layers (double-click to reset all layers to the default state)
redact.colourPicker=Colour Picker redact.colourPicker=Colour Picker
redact.findCurrentOutlineItem=Find current outline item redact.findCurrentOutlineItem=Find current outline item
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Javascript'i Göster showJS.title=Javascript'i Göster
@@ -769,6 +768,7 @@ 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.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.formPrompt=Stirling-PDF Sayfa ayırıcıları içeren PDF'i gönderin:
autoSplitPDF.duplexMode=Çift Taraflı Mod (Ön ve arka tarama) 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.dividerDownload2='Otomatik Ayırıcı Ayırıcı (talimatlarla).pdf' indir
autoSplitPDF.submit=Gönder autoSplitPDF.submit=Gönder
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Değiştir
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF'den PDF/A'ya pdfToPDFA.title=PDF'den PDF/A'ya
pdfToPDFA.header=PDF'den PDF/A'ya pdfToPDFA.header=PDF'den PDF/A'ya
pdfToPDFA.credit=Bu hizmet PDF/A dönüşümü için libreoffice kullanır pdfToPDFA.credit=Bu hizmet PDF/A dönüşümü için qpdf kullanır
pdfToPDFA.submit=Dönüştür pdfToPDFA.submit=Dönüştür
pdfToPDFA.tip=Şu anda aynı anda birden fazla giriş için çalışmıyor pdfToPDFA.tip=Şu anda aynı anda birden fazla giriş için çalışmıyor
pdfToPDFA.outputFormat=Çıkış formatı pdfToPDFA.outputFormat=Çıkış formatı

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=Show Attachments
redact.showLayers=Show Layers (double-click to reset all layers to the default state) redact.showLayers=Show Layers (double-click to reset all layers to the default state)
redact.colourPicker=Colour Picker redact.colourPicker=Colour Picker
redact.findCurrentOutlineItem=Find current outline item redact.findCurrentOutlineItem=Find current outline item
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Показати JavaScript showJS.title=Показати JavaScript
@@ -769,6 +768,7 @@ autoSplitPDF.selectText.3=Завантажте один великий відс
autoSplitPDF.selectText.4=Роздільні сторінки автоматично виявляються і видаляються, забезпечуючи акуратний кінцевий документ. autoSplitPDF.selectText.4=Роздільні сторінки автоматично виявляються і видаляються, забезпечуючи акуратний кінцевий документ.
autoSplitPDF.formPrompt=Надіслати PDF-файл, що містить роздільні сторінки Stirling-PDF: autoSplitPDF.formPrompt=Надіслати PDF-файл, що містить роздільні сторінки Stirling-PDF:
autoSplitPDF.duplexMode=Дуплексний режим (сканування спереду і ззаду) autoSplitPDF.duplexMode=Дуплексний режим (сканування спереду і ззаду)
autoSplitPDF.dividerDownload1=Завантажити 'Auto Splitter Divider (minimal).pdf'
autoSplitPDF.dividerDownload2=Завантажити 'Auto Splitter Divider (with instructions).pdf' autoSplitPDF.dividerDownload2=Завантажити 'Auto Splitter Divider (with instructions).pdf'
autoSplitPDF.submit=Надіслати autoSplitPDF.submit=Надіслати
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Змінити
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF в PDF/A pdfToPDFA.title=PDF в PDF/A
pdfToPDFA.header=PDF в PDF/A pdfToPDFA.header=PDF в PDF/A
pdfToPDFA.credit=Цей сервіс використовує libreoffice для перетворення у формат PDF/A pdfToPDFA.credit=Цей сервіс використовує qpdf для перетворення у формат PDF/A
pdfToPDFA.submit=Конвертувати pdfToPDFA.submit=Конвертувати
pdfToPDFA.tip=Наразі не працює для кількох вхідних файлів одночасно pdfToPDFA.tip=Наразі не працює для кількох вхідних файлів одночасно
pdfToPDFA.outputFormat=Вихідний формат pdfToPDFA.outputFormat=Вихідний формат

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=Show Attachments
redact.showLayers=Show Layers (double-click to reset all layers to the default state) redact.showLayers=Show Layers (double-click to reset all layers to the default state)
redact.colourPicker=Colour Picker redact.colourPicker=Colour Picker
redact.findCurrentOutlineItem=Find current outline item redact.findCurrentOutlineItem=Find current outline item
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Hiển thị Javascript showJS.title=Hiển thị Javascript
@@ -769,6 +768,7 @@ 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.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.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.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.dividerDownload2=Tải xuống 'Trang phân cách tự động (có hướng dẫn).pdf'
autoSplitPDF.submit=Gửi autoSplitPDF.submit=Gửi
@@ -1185,7 +1185,7 @@ changeMetadata.submit=Thay đổi
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF sang PDF/A pdfToPDFA.title=PDF sang PDF/A
pdfToPDFA.header=PDF sang PDF/A pdfToPDFA.header=PDF sang PDF/A
pdfToPDFA.credit=Dịch vụ này sử dụng libreoffice để chuyển đổi PDF/A pdfToPDFA.credit=Dịch vụ này sử dụng qpdf để chuyển đổi PDF/A
pdfToPDFA.submit=Chuyển đổi 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.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 pdfToPDFA.outputFormat=Định dạng đầu ra

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=ཟུར་སྦྱར་སྟོན།
redact.showLayers=རིམ་པ་སྟོན། (རིམ་པ་ཚང་མ་སྔོན་སྒྲིག་གནས་བབ་ལ་བསྐྱར་སྒྲིག་བྱེད་པར་ཉིས་རྡེབ།) redact.showLayers=རིམ་པ་སྟོན། (རིམ་པ་ཚང་མ་སྔོན་སྒྲིག་གནས་བབ་ལ་བསྐྱར་སྒྲིག་བྱེད་པར་ཉིས་རྡེབ།)
redact.colourPicker=ཚོས་གཞི་འདེམས་བྱེད<EFBFBD><EFBFBD><EFBFBD> redact.colourPicker=ཚོས་གཞི་འདེམས་བྱེད<EFBFBD><EFBFBD><EFBFBD>
redact.findCurrentOutlineItem=ད་ལྟའི་སྒྲོམ་གཞིའི་ནང་དོན་འཚོལ་བ། redact.findCurrentOutlineItem=ད་ལྟའི་སྒྲོམ་གཞིའི་ནང་དོན་འཚོལ་བ།
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=Javascript ས<>ོན་པ། showJS.title=Javascript ས<>ོན་པ།
@@ -769,6 +768,7 @@ autoSplitPDF.selectText.3=བཤེར་འབེབས་བྱས་པའི
autoSplitPDF.selectText.4=བར་མཚམས་ཤོག་ངོས་རྣམས་རང་འགུལ་གྱིས་ངོས་འཛིན་དང་སུབ་པ་བྱས་ནས་མཐའ་མའི་ཡིག་ཆ་གཙང་མ་ཞིག་ངེས་པར་དུ་ཐོབ་ཐུབ། autoSplitPDF.selectText.4=བར་མཚམས་ཤོག་ངོས་རྣམས་རང་འགུལ་གྱིས་ངོས་འཛིན་དང་སུབ་པ་བྱས་ནས་མཐའ་མའི་ཡིག་ཆ་གཙང་མ་ཞིག་ངེས་པར་དུ་ཐོབ་ཐུབ།
autoSplitPDF.formPrompt=Stirling-PDF ཤོག་ངོས་བར་མཚམས་ཡོད་པའི་ PDF ཕུལ་བ། autoSplitPDF.formPrompt=Stirling-PDF ཤོག་ངོས་བར་མཚམས་ཡོད་པའི་ PDF ཕུལ་བ།
autoSplitPDF.duplexMode=ཕྱོགས་གཉིས་ཀྱི་རྣམ་པ། (མདུན་རྒྱབ་བཤེར་འབེབས།) autoSplitPDF.duplexMode=ཕྱོགས་གཉིས་ཀྱི་རྣམ་པ། (མདུན་རྒྱབ་བཤེར་འབེབས།)
autoSplitPDF.dividerDownload1='རང་འགུལ་ཁ་གྱེས་བར་མཚམས། (ཉུང་ཤོས།).pdf' ཕབ་ལེན།
autoSplitPDF.dividerDownload2='རང་འགུལ་ཁ་གྱེས་བར་མཚམས། (བཀོལ་སྤྱོད་ལམ་སྟོན་དང་བཅས་པ།).pdf' ཕབ་ལེན། autoSplitPDF.dividerDownload2='རང་འགུལ་ཁ་གྱེས་བར་མཚམས། (བཀོལ་སྤྱོད་ལམ་སྟོན་དང་བཅས་པ།).pdf' ཕབ་ལེན།
autoSplitPDF.submit=ཕུལ་བ། autoSplitPDF.submit=ཕུལ་བ།
@@ -1185,7 +1185,7 @@ changeMetadata.submit=བསྒྱུར་བ།
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF ནས་ PDF/A ལ། pdfToPDFA.title=PDF ནས་ PDF/A ལ།
pdfToPDFA.header=PDF ནས་ PDF/A ལ། pdfToPDFA.header=PDF ནས་ PDF/A ལ།
pdfToPDFA.credit=ཞབས་ཞུ་འདིས་ PDF/A བསྒྱུར་བའི་ཆེད་དུ་ libreoffice བེད་སྤྱོད་བྱེད་པ། pdfToPDFA.credit=ཞབས་ཞུ་འདིས་ PDF/A བསྒྱུར་བའི་ཆེད་དུ་ qpdf བེད་སྤྱོད་བྱེད་པ།
pdfToPDFA.submit=བསྒྱུར་བ། pdfToPDFA.submit=བསྒྱུར་བ།
pdfToPDFA.tip=ད་ལྟ་ཡིག་ཆ་མང་པོ་དུས་གཅིག་ལ་བསྒྱུར་མི་ཐུབ། pdfToPDFA.tip=ད་ལྟ་ཡིག་ཆ་མང་པོ་དུས་གཅིག་ལ་བསྒྱུར་མི་ཐུབ།
pdfToPDFA.outputFormat=ཕྱིར་འདོན་རྣམ་གཞག pdfToPDFA.outputFormat=ཕྱིར་འདོན་རྣམ་གཞག

View File

@@ -82,7 +82,7 @@ pages=Pages
loading=加载中... loading=加载中...
addToDoc=Add to Document addToDoc=Add to Document
reset=重置 reset=重置
apply=应用 apply=Apply
legal.privacy=隐私政策 legal.privacy=隐私政策
legal.terms=服务条款 legal.terms=服务条款
@@ -138,20 +138,20 @@ analytics.settings=You can change the settings for analytics in the config/setti
# NAVBAR # # NAVBAR #
############# #############
navbar.favorite=收藏 navbar.favorite=收藏
navbar.recent=新功能和最近更新 navbar.recent=New and recently updated
navbar.darkmode=暗黑模式 navbar.darkmode=暗黑模式
navbar.language=语言 navbar.language=语言
navbar.settings=设置 navbar.settings=设置
navbar.allTools=工具箱 navbar.allTools=工具箱
navbar.multiTool=多功能工具 navbar.multiTool=多功能工具
navbar.search=搜索 navbar.search=Search
navbar.sections.organize=组织 navbar.sections.organize=组织
navbar.sections.convertTo=转换成PDF navbar.sections.convertTo=转换成PDF
navbar.sections.convertFrom=从PDF转换 navbar.sections.convertFrom=从PDF转换
navbar.sections.security=签名和安全 navbar.sections.security=签名和安全
navbar.sections.advance=高级功能 navbar.sections.advance=高级功能
navbar.sections.edit=查看和编辑 navbar.sections.edit=查看和编辑
navbar.sections.popular=热门 navbar.sections.popular=Popular
############# #############
# SETTINGS # # SETTINGS #
@@ -266,14 +266,14 @@ home.viewPdf.title=浏览 PDF
home.viewPdf.desc=浏览、注释、添加文本或图像 home.viewPdf.desc=浏览、注释、添加文本或图像
viewPdf.tags=浏览、阅读、注释、文本、图像 viewPdf.tags=浏览、阅读、注释、文本、图像
home.setFavorites=编辑收藏夹 home.setFavorites=Set Favourites
home.hideFavorites=Hide Favourites home.hideFavorites=Hide Favourites
home.showFavorites=Show Favourites home.showFavorites=Show Favourites
home.legacyHomepage=使用旧版主页 home.legacyHomepage=Old homepage
home.newHomePage=试用新版主页! home.newHomePage=Try our new homepage!
home.alphabetical=按字母顺序 home.alphabetical=Alphabetical
home.globalPopularity=按全球热度 home.globalPopularity=Global Popularity
home.sortBy=排序: home.sortBy=Sort by:
home.multiTool.title=PDF 多功能工具 home.multiTool.title=PDF 多功能工具
home.multiTool.desc=合并、旋转、重新排列和删除 PDF 页面 home.multiTool.desc=合并、旋转、重新排列和删除 PDF 页面
@@ -623,7 +623,6 @@ redact.showAttatchments=Show Attachments
redact.showLayers=Show Layers (double-click to reset all layers to the default state) redact.showLayers=Show Layers (double-click to reset all layers to the default state)
redact.colourPicker=Colour Picker redact.colourPicker=Colour Picker
redact.findCurrentOutlineItem=Find current outline item redact.findCurrentOutlineItem=Find current outline item
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=显示 JavaScript showJS.title=显示 JavaScript
@@ -769,6 +768,7 @@ autoSplitPDF.selectText.3=上传单个大型扫描的 PDF 文件,让 Stirling
autoSplitPDF.selectText.4=分隔页会自动检测和删除,确保最终文档整洁。 autoSplitPDF.selectText.4=分隔页会自动检测和删除,确保最终文档整洁。
autoSplitPDF.formPrompt=提交包含 Stirling-PDF 分隔页的 PDF autoSplitPDF.formPrompt=提交包含 Stirling-PDF 分隔页的 PDF
autoSplitPDF.duplexMode=双面模式(正反面扫描) autoSplitPDF.duplexMode=双面模式(正反面扫描)
autoSplitPDF.dividerDownload1=下载“自动拆分分隔页(最小化).pdf”
autoSplitPDF.dividerDownload2=下载“自动拆分分隔页(带指导说明).pdf” autoSplitPDF.dividerDownload2=下载“自动拆分分隔页(带指导说明).pdf”
autoSplitPDF.submit=提交 autoSplitPDF.submit=提交
@@ -1185,7 +1185,7 @@ changeMetadata.submit=更改
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF 转 PDF/A pdfToPDFA.title=PDF 转 PDF/A
pdfToPDFA.header=将 PDF 转换为 PDF/A pdfToPDFA.header=将 PDF 转换为 PDF/A
pdfToPDFA.credit=此服务使用 libreoffice 进行 PDF/A 转换 pdfToPDFA.credit=此服务使用 qpdf 进行 PDF/A 转换
pdfToPDFA.submit=转换 pdfToPDFA.submit=转换
pdfToPDFA.tip=目前不支持上传多个 pdfToPDFA.tip=目前不支持上传多个
pdfToPDFA.outputFormat=输出格式 pdfToPDFA.outputFormat=输出格式

View File

@@ -623,7 +623,6 @@ redact.showAttatchments=顯示附件
redact.showLayers=顯示圖層(按兩下可將所有圖層重設為預設狀態) redact.showLayers=顯示圖層(按兩下可將所有圖層重設為預設狀態)
redact.colourPicker=顏色選擇器 redact.colourPicker=顏色選擇器
redact.findCurrentOutlineItem=尋找目前的大綱項目 redact.findCurrentOutlineItem=尋找目前的大綱項目
redact.applyChanges=Apply Changes
#showJS #showJS
showJS.title=顯示 JavaScript showJS.title=顯示 JavaScript
@@ -769,6 +768,7 @@ autoSplitPDF.selectText.3=上傳單一大的掃描 PDF 檔案,讓 Stirling PDF
autoSplitPDF.selectText.4=自動偵測並移除分隔頁面,確保最終文件整潔。 autoSplitPDF.selectText.4=自動偵測並移除分隔頁面,確保最終文件整潔。
autoSplitPDF.formPrompt=送出包含 Stirling-PDF 頁面分隔器的 PDF autoSplitPDF.formPrompt=送出包含 Stirling-PDF 頁面分隔器的 PDF
autoSplitPDF.duplexMode=雙面模式(正反面掃描) autoSplitPDF.duplexMode=雙面模式(正反面掃描)
autoSplitPDF.dividerDownload1=下載 '自動分割器分隔器(最小化).pdf'
autoSplitPDF.dividerDownload2=下載 '自動分割器分隔器(帶說明).pdf' autoSplitPDF.dividerDownload2=下載 '自動分割器分隔器(帶說明).pdf'
autoSplitPDF.submit=送出 autoSplitPDF.submit=送出
@@ -1185,7 +1185,7 @@ changeMetadata.submit=變更
#pdfToPDFA #pdfToPDFA
pdfToPDFA.title=PDF 轉 PDF/A pdfToPDFA.title=PDF 轉 PDF/A
pdfToPDFA.header=PDF 轉 PDF/A pdfToPDFA.header=PDF 轉 PDF/A
pdfToPDFA.credit=此服務使用 libreoffice 進行 PDF/A 轉換 pdfToPDFA.credit=此服務使用 qpdf 進行 PDF/A 轉換
pdfToPDFA.submit=轉換 pdfToPDFA.submit=轉換
pdfToPDFA.tip=目前不支援上傳多個 pdfToPDFA.tip=目前不支援上傳多個
pdfToPDFA.outputFormat=輸出格式 pdfToPDFA.outputFormat=輸出格式

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24"> <svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<symbol id="icon-redact-auto" viewBox="0 0 24 24"> <g id="Layer_2" data-name="Layer 2"> <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"> <g id="Layer_1-2" data-name="Layer 1">
<rect width="24" height="24" style="fill: none"/> <rect width="24" height="24" style="fill: none"/>
@@ -14,5 +14,4 @@
</g> </g>
</g> </g>
</g> </g>
</symbol>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24"> <svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<symbol id="icon-redact-manual" viewBox="-2 0 24 24"> <symbol id="icon-redact-manual" viewBox="-2 0 24 24">
<g id="Layer_2" data-name="Layer 2"> <g id="Layer_2" data-name="Layer 2">
<g id="Layer_1-2" data-name="Layer 1"> <g id="Layer_1-2" data-name="Layer 1">

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24"> <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"> <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">
<g id="Layer_2" data-name="Layer 2">
<g id="Layer_1-2" data-name="Layer 1"> <g id="Layer_1-2" data-name="Layer 1">
<g> <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"/> <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"/>
@@ -10,5 +9,4 @@
<rect width="24" height="24" style="fill: none"/> <rect width="24" height="24" style="fill: none"/>
</g> </g>
</g> </g>
</symbol>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24"> <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"> <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">
<g id="Layer_2" data-name="Layer 2">
<g id="Layer_1-2" data-name="Layer 1"> <g id="Layer_1-2" data-name="Layer 1">
<g> <g>
<path d="M17.632,9.18527v5.44l1.94-1.16,1.94,1.16v-5.44Z" style="fill: currentColor"/> <path d="M17.632,9.18527v5.44l1.94-1.16,1.94,1.16v-5.44Z" style="fill: currentColor"/>
@@ -10,5 +9,4 @@
<rect width="24" height="24" style="fill: none"/> <rect width="24" height="24" style="fill: none"/>
</g> </g>
</g> </g>
</symbol>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -1,7 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 24 24"> <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"> <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">
<g id="Layer_2" data-name="Layer 2">
<g id="Layer_1-2" data-name="Layer 1"> <g id="Layer_1-2" data-name="Layer 1">
<g> <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"/> <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"/>
@@ -14,5 +13,4 @@
<rect width="24" height="24" style="fill: none"/> <rect width="24" height="24" style="fill: none"/>
</g> </g>
</g> </g>
</symbol>
</svg> </svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -48,7 +48,7 @@ window.tooltipSetup = () => {
tooltipElements.forEach((element) => { tooltipElements.forEach((element) => {
const tooltipText = element.getAttribute('title'); const tooltipText = element.getAttribute('title');
element.removeAttribute('title'); element.removeAttribute('title');
element.setAttribute('data-title', tooltipText); element.setAttribute('data-title', 'tooltipText');
const customTooltip = document.createElement('div'); const customTooltip = document.createElement('div');
customTooltip.className = 'btn-tooltip'; customTooltip.className = 'btn-tooltip';
customTooltip.textContent = tooltipText; customTooltip.textContent = tooltipText;

View File

@@ -17,9 +17,7 @@
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-md-6 bg-card"> <div class="col-md-6 bg-card">
<div class="tool-header"> <div class="tool-header">
<svg class="material-symbols-rounded tool-header-icon advance"> <span class="material-symbols-rounded tool-header-icon advance">cut</span>
<use xlink:href="/images/split-auto.svg#icon-split-auto"></use>
</svg>
<span class="tool-header-text" th:text="#{autoSplitPDF.header}"></span> <span class="tool-header-text" th:text="#{autoSplitPDF.header}"></span>
</div> </div>
@@ -45,6 +43,8 @@
<li th:text="#{autoSplitPDF.selectText.3}"></li> <li th:text="#{autoSplitPDF.selectText.3}"></li>
<li th:text="#{autoSplitPDF.selectText.4}"></li> <li th:text="#{autoSplitPDF.selectText.4}"></li>
</ul> </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 <p><a th:href="@{'/files/Auto%20Splitter%20Divider%20(with%20instructions).pdf'}" download
th:text="#{autoSplitPDF.dividerDownload2}"></a></p> th:text="#{autoSplitPDF.dividerDownload2}"></a></p>
</div> </div>

View File

@@ -1,19 +1,19 @@
<th:block th:fragment="navElements"> <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 <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')}"> 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')}"> th:replace="~{fragments/navbarEntry :: navbarEntry ('merge-pdfs', 'add_to_photos', 'home.merge.title', 'home.merge.desc', 'merge.tags', 'organize')}">
</div> </div>
<div <div
th:replace="~{fragments/navbarEntry :: navbarEntry ('split-pdfs', 'cut', 'home.split.title', 'home.split.desc', 'split.tags', 'organize')}"> 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('rotate-pdf', 'rotate_right', 'home.rotate.title', 'home.rotate.desc', 'rotate.tags', 'organize')}"> th:replace="~{fragments/navbarEntry :: navbarEntry('rotate-pdf', 'rotate_right', 'home.rotate.title', 'home.rotate.desc', 'rotate.tags', 'organize')}">
</div> </div>
<div <div
@@ -37,14 +37,15 @@
<div <div
th:replace="~{fragments/navbarEntry :: navbarEntry('pdf-to-single-page', 'looks_one', 'home.PdfToSinglePage.title', 'home.PdfToSinglePage.desc', 'PdfToSinglePage.tags', 'organize')}"> 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>
</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 <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')}"> th:replace="~{fragments/navbarEntry :: navbarEntry('img-to-pdf', 'picture_as_pdf', 'home.imageToPdf.title', 'home.imageToPdf.desc', 'imageToPdf.tags', 'convertto')}">
</div> </div>
<div <div
@@ -62,13 +63,14 @@
<div <div
th:replace="~{fragments/navbarEntry :: navbarEntry('book-to-pdf', 'book', 'home.BookToPDF.title', 'home.BookToPDF.desc', 'BookToPDF.tags', 'convertto')}"> th:replace="~{fragments/navbarEntry :: navbarEntry('book-to-pdf', 'book', 'home.BookToPDF.title', 'home.BookToPDF.desc', 'BookToPDF.tags', 'convertto')}">
</div> </div>
</div>
</div> </div>
</div> <div id="groupConvertFrom" class="feature-group">
<div id="groupConvertFrom" class="feature-group">
<div th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.convertFrom})}">
</div>
<div class="nav-group-container">
<div <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')}"> th:replace="~{fragments/navbarEntry :: navbarEntry('pdf-to-img', 'photo_library', 'home.pdfToImage.title', 'home.pdfToImage.desc', 'pdfToImage.tags', 'convert')}">
</div> </div>
<div <div
@@ -96,16 +98,17 @@
th:replace="~{fragments/navbarEntry :: navbarEntry('pdf-to-book', 'book', 'home.PDFToBook.title', 'home.PDFToBook.desc', 'PDFToBook.tags', 'convert')}"> th:replace="~{fragments/navbarEntry :: navbarEntry('pdf-to-book', 'book', 'home.PDFToBook.title', 'home.PDFToBook.desc', 'PDFToBook.tags', 'convert')}">
</div> </div>
<div <div
th:replace="~{fragments/navbarEntry :: navbarEntry ('pdf-to-markdown', 'markdown_copy', 'home.PDFToMarkdown.title', 'home.PDFToMarkdown.desc', 'PDFToMarkdown.tags', 'convert')}"> th:replace="~{fragments/navbarEntry :: navbarEntry ('pdf-to-markdown', 'markdown_copy', 'home.PDFToMarkdown.title', 'home.PDFToMarkdown.desc', 'PDFToMarkdown.tags', 'convert')}">
</div> </div>
</div> </div>
</div>
<div id="convertGroup" class="feature-group">
<div th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.convertTo})}">
</div> </div>
<div class="nav-group-container"> <div id="convertGroup" class="feature-group">
<div <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')}"> th:replace="~{fragments/navbarEntry :: navbarEntry('img-to-pdf', 'picture_as_pdf', 'home.imageToPdf.title', 'home.imageToPdf.desc', 'imageToPdf.tags', 'convertto')}">
</div> </div>
<div <div
@@ -123,11 +126,12 @@
<div <div
th:replace="~{fragments/navbarEntry :: navbarEntry('book-to-pdf', 'book', 'home.BookToPDF.title', 'home.BookToPDF.desc', 'BookToPDF.tags', 'convertto')}"> th:replace="~{fragments/navbarEntry :: navbarEntry('book-to-pdf', 'book', 'home.BookToPDF.title', 'home.BookToPDF.desc', 'BookToPDF.tags', 'convertto')}">
</div> </div>
</div> </div>
<div th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.convertFrom})}">
</div>
<div class="nav-group-container">
<div <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')}"> th:replace="~{fragments/navbarEntry :: navbarEntry('pdf-to-img', 'photo_library', 'home.pdfToImage.title', 'home.pdfToImage.desc', 'pdfToImage.tags', 'convert')}">
</div> </div>
<div <div
@@ -155,12 +159,13 @@
th:replace="~{fragments/navbarEntry :: navbarEntry('pdf-to-book', 'book', 'home.PDFToBook.title', 'home.PDFToBook.desc', 'PDFToBook.tags', 'convert')}"> th:replace="~{fragments/navbarEntry :: navbarEntry('pdf-to-book', 'book', 'home.PDFToBook.title', 'home.PDFToBook.desc', 'PDFToBook.tags', 'convert')}">
</div> </div>
</div> </div>
</div>
<div id="groupSecurity" class="feature-group">
<div th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.security})}">
</div> </div>
<div class="nav-group-container"> <div id="groupSecurity" class="feature-group">
<div <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')}"> th:replace="~{fragments/navbarEntry :: navbarEntry('add-password', 'lock', 'home.addPassword.title', 'home.addPassword.desc', 'addPassword.tags', 'security')}">
</div> </div>
<div <div
@@ -177,34 +182,34 @@
</div> </div>
<div <div
th:replace="~{fragments/navbarEntry :: navbarEntry('validate-signature', 'verified', 'home.validateSignature.title', 'home.validateSignature.desc', 'validateSignature.tags', 'security')}"> th:replace="~{fragments/navbarEntry :: navbarEntry('validate-signature', 'verified', 'home.validateSignature.title', 'home.validateSignature.desc', 'validateSignature.tags', 'security')}">
</div> </div>
<div <div
th:replace="~{fragments/navbarEntry :: navbarEntry('remove-cert-sign', 'remove_moderator', 'home.removeCertSign.title', 'home.removeCertSign.desc', 'removeCertSign.tags', 'security')}"> th:replace="~{fragments/navbarEntry :: navbarEntry('remove-cert-sign', 'remove_moderator', 'home.removeCertSign.title', 'home.removeCertSign.desc', 'removeCertSign.tags', 'security')}">
</div> </div>
<div <div
th:replace="~{fragments/navbarEntry :: navbarEntry('sanitize-pdf', 'sanitizer', 'home.sanitizePdf.title', 'home.sanitizePdf.desc', 'sanitizePdf.tags', 'security')}"> th:replace="~{fragments/navbarEntry :: navbarEntry('sanitize-pdf', 'sanitizer', 'home.sanitizePdf.title', 'home.sanitizePdf.desc', 'sanitizePdf.tags', 'security')}">
</div> </div>
<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')}"> 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>
<div <div
th:replace="~{fragments/navbarEntryCustom :: navbarEntry('redact', '/images/redact-manual.svg#icon-redact-manual', 'home.redact.title', 'home.redact.desc', 'redact.tags', 'security')}"> th:replace="~{fragments/navbarEntryCustom :: navbarEntry('redact', '/images/redact-manual.svg#icon-redact-manual', 'home.redact.title', 'home.redact.desc', 'redact.tags', 'security')}">
</div> </div>
<div <div
th:replace="~{fragments/navbarEntry :: navbarEntry('stamp', 'approval', 'home.AddStampRequest.title', 'home.AddStampRequest.desc', 'AddStampRequest.tags', 'security')}"> th:replace="~{fragments/navbarEntry :: navbarEntry('stamp', 'approval', 'home.AddStampRequest.title', 'home.AddStampRequest.desc', 'AddStampRequest.tags', 'security')}">
</div> </div>
<div <div
th:replace="~{fragments/navbarEntry :: navbarEntry('add-watermark', 'water_drop', 'home.watermark.title', 'home.watermark.desc', 'watermark.tags', 'security')}"> th:replace="~{fragments/navbarEntry :: navbarEntry('add-watermark', 'water_drop', 'home.watermark.title', 'home.watermark.desc', 'watermark.tags', 'security')}">
</div>
</div> </div>
</div> </div>
</div>
<div id="groupView" class="feature-group"> <div id="groupView" class="feature-group">
<div th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.edit})}"> <div th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.edit})}">
</div> </div>
<div class="nav-group-container"> <div class="nav-group-container">
<div <div
th:replace="~{fragments/navbarEntry :: navbarEntry('view-pdf', 'menu_book', 'home.viewPdf.title', 'home.viewPdf.desc', 'viewPdf.tags', 'other')}"> th:replace="~{fragments/navbarEntry :: navbarEntry('view-pdf', 'menu_book', 'home.viewPdf.title', 'home.viewPdf.desc', 'viewPdf.tags', 'other')}">
</div> </div>
<div <div
@@ -241,15 +246,16 @@
th:replace="~{fragments/navbarEntry :: navbarEntry('remove-image-pdf', 'remove_selection', 'home.removeImagePdf.title', 'home.removeImagePdf.desc', 'removeImagePdf.tags', 'other')}"> th:replace="~{fragments/navbarEntry :: navbarEntry('remove-image-pdf', 'remove_selection', 'home.removeImagePdf.title', 'home.removeImagePdf.desc', 'removeImagePdf.tags', 'other')}">
</div> </div>
<div <div
th:replace="~{fragments/navbarEntry :: navbarEntry('replace-and-invert-color-pdf', 'format_color_fill', 'home.replaceColorPdf.title', 'home.replaceColorPdf.desc', 'replaceColorPdf.tags', 'other')}"> th:replace="~{fragments/navbarEntry :: navbarEntry('replace-color-pdf', 'format_color_fill', 'home.replaceColorPdf.title', 'home.replaceColorPdf.desc', 'replaceColorPdf.tags', 'other')}">
</div>
</div> </div>
</div> </div>
</div> <div id="groupAdvanced" class="feature-group">
<div id="groupAdvanced" class="feature-group">
<div th:replace="~{fragments/featureGroupHeader :: featureGroupHeader(groupTitle=#{navbar.sections.advance})}">
</div>
<div class="nav-group-container">
<div <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')}"> th:replace="~{fragments/navbarEntry :: navbarEntry('pipeline', 'family_history', 'home.pipeline.title', 'home.pipeline.desc', 'pipeline.tags', 'advance')}">
</div> </div>
<div <div
@@ -285,6 +291,6 @@
<div <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')}"> 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>
</div> </div>
</th:block> </th:block>

View File

@@ -4,7 +4,7 @@ th:if="${@endpointConfiguration.isEndpointEnabled(endpoint)}">
th:data-bs-link="@{${endpoint}}" th:data-bs-link="@{${endpoint}}"
th:classappend="${endpoint.equals(currentPage)} ? ${toolGroup} + ' active' : '' + ${toolGroup}" th:classappend="${endpoint.equals(currentPage)} ? ${toolGroup} + ' active' : '' + ${toolGroup}"
th:data-bs-tags="#{${tagKey}}" th:data-bs-title='#{${titleKey}}'> th:data-bs-tags="#{${tagKey}}" th:data-bs-title='#{${titleKey}}'>
<div style="min-height:2.7rem; align-items: center;display: flex;" th:title="#{${descKey}}" class="icon" alt="icon" <div style="height:2.7rem; align-items: center;display: flex;" th:title="#{${descKey}}" class="icon" alt="icon"
th:class="@{${toolGroup}}"> 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="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> <span class="icon-text" th:text="#{${titleKey}}"></span>

View File

@@ -1,14 +1,13 @@
<th:block th:fragment="navbarEntry(endpoint, toolIcon, titleKey, descKey, tagKey, toolGroup)" <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}}" <a th:id="@{${endpoint}}" class="dropdown-item" style="position:relative" th:href="@{${endpoint}}"
th:data-bs-link="@{${endpoint}}" th:data-bs-link="@{${endpoint}}"
th:classappend="${endpoint.equals(currentPage)} ? ${toolGroup} + ' active' : '' + ${toolGroup}" th:classappend="${endpoint.equals(currentPage)} ? ${toolGroup} + ' active' : '' + ${toolGroup}"
th:data-bs-tags="#{${tagKey}}" th:data-bs-title='#{${titleKey}}'> th:data-bs-tags="#{${tagKey}}" th:data-bs-title='#{${titleKey}}'>
<div style="min-height:2.5rem;align-items: center;display: flex" th:title="#{${descKey}}" class="icon" alt="icon" <div style="height:2.5rem;align-items: center;display: flex" th:title="#{${descKey}}" class="icon" alt="icon"
th:class="@{${toolGroup}}"> th:class="@{${toolGroup}}">
<svg class="nav-icon" <svg class="nav-icon" style="height: 2.7rem; width:2.7rem; align-items:center; display: flex; justify-content: center;">
style="height: 2.7rem; width:2.7rem; align-items:center; display: flex; justify-content: center;"> <use th:href="@{${toolIcon}}"></use>
<use th:xlink:href="@{${toolIcon}}"></use>
</svg> </svg>
<span class="icon-text" th:text="#{${titleKey}}"></span> <span class="icon-text" th:text="#{${titleKey}}"></span>
</div> </div>

View File

@@ -27,16 +27,15 @@
<span class="material-symbols-rounded search-icon"> <span class="material-symbols-rounded search-icon">
search search
</span> </span>
<input type="text" id="searchBar" onkeyup="filterCardsLegacy()" th:placeholder="#{home.searchBar}" autofocus> <input type="text" id="searchBar" onkeyup="filterCards()" th:placeholder="#{home.searchBar}" autofocus>
<div style="display: flex; align-items: center;"> <div style="display: flex; align-items: center;">
<a href="home" onclick="setAsDefault('home')" <a href="home" onclick="setAsDefault('home')" style="text-decoration: none; color: inherit; cursor: pointer; display: flex; align-items: center;">
style="text-decoration: none; color: inherit; cursor: pointer; display: flex; align-items: center;"> <span th:text="#{home.newHomePage}">
<span th:text="#{home.newHomePage}"> </span>
</span> <span class="material-symbols-rounded toggle-favourites" style="font-size: 2rem; margin-left: 0.2rem;" >
<span class="material-symbols-rounded toggle-favourites" style="font-size: 2rem; margin-left: 0.2rem;"> home
home </span>
</span> </a>
</a>
</div> </div>
<div id="filtersContainer"> <div id="filtersContainer">
<span class="material-symbols-rounded filter-button" onclick="toggleFavoritesOnly()"> <span class="material-symbols-rounded filter-button" onclick="toggleFavoritesOnly()">
@@ -71,8 +70,7 @@
</div> </div>
<div id="groupFavorites" class="feature-group-legacy"> <div id="groupFavorites" class="feature-group-legacy">
<div <div th:replace="~{fragments/featureGroupHeaderLegacy :: featureGroupHeader(groupTitle=#{navbar.favorite})}">
th:replace="~{fragments/featureGroupHeaderLegacy :: featureGroupHeader(groupTitle=#{navbar.favorite})}">
</div> </div>
<div class="feature-group-container"> <div class="feature-group-container">
</div> </div>
@@ -150,7 +148,7 @@
</div> </div>
<div class="feature-group-container"> <div class="feature-group-container">
<div <div
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')}"> 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')}">
</div> </div>
<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')}"> 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')}">
@@ -250,8 +248,7 @@
</div> </div>
<div id="groupView" class="feature-group-legacy"> <div id="groupView" class="feature-group-legacy">
<div <div th:replace="~{fragments/featureGroupHeaderLegacy :: featureGroupHeader(groupTitle=#{navbar.sections.edit})}">
th:replace="~{fragments/featureGroupHeaderLegacy :: featureGroupHeader(groupTitle=#{navbar.sections.edit})}">
</div> </div>
<div class="feature-group-container"> <div class="feature-group-container">
<div <div
@@ -292,7 +289,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')}"> 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>
<div <div
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')}"> 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')}">
</div> </div>
</div> </div>
@@ -516,7 +513,7 @@
function setAsDefault(value) { function setAsDefault(value) {
localStorage.setItem('defaultView', value); localStorage.setItem('defaultView', value);
console.log(`Default view set to: ${value}`); console.log(`Default view set to: ${value}`);
} }
</script> </script>

View File

@@ -1,96 +1,86 @@
<!DOCTYPE html> <!DOCTYPE html>
<html th:lang="${#locale.language}" th:dir="#{language.direction}" th:data-language="${#locale.toString()}" <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>
<head>
<th:block th:insert="~{fragments/common :: head(title=#{autoRedact.title}, header=#{autoRedact.header})}"></th:block> <th:block th:insert="~{fragments/common :: head(title=#{autoRedact.title}, header=#{autoRedact.header})}"></th:block>
</head> </head>
<body> <body>
<div id="page-container"> <div id="page-container">
<div id="content-wrap"> <div id="content-wrap">
<th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block> <th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
<br><br> <br><br>
<div class="container"> <div class="container">
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-md-6 bg-card"> <div class="col-md-6 bg-card">
<div class="tool-header"> <div class="tool-header">
<svg class="material-symbols-rounded tool-header-icon security"> <span class="material-symbols-rounded tool-header-icon security">playlist_remove</span>
<use xlink:href="/images/redact-auto.svg#icon-redact-auto"></use> <span class="tool-header-text" th:text="#{autoRedact.header}"></span>
</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>
<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"> <div class="mb-3">
<label for="listOfText" class="form-label" th:text="#{autoRedact.textsToRedactLabel}"></label> <label for="listOfText" class="form-label" th:text="#{autoRedact.textsToRedactLabel}"></label>
<textarea class="form-control" id="listOfText" name="listOfText" rows="4" required <textarea class="form-control" id="listOfText" name="listOfText" rows="4" required th:placeholder="#{autoRedact.textsToRedactPlaceholder}"></textarea>
th:placeholder="#{autoRedact.textsToRedactPlaceholder}"></textarea> </div>
</div>
<div class="mb-3"> <div class="mb-3">
<label for="defaultColor" class="form-label" th:text="#{autoRedact.colorLabel}">Color</label> <label for="defaultColor" class="form-label" th:text="#{autoRedact.colorLabel}">Color</label>
<select class="form-control" id="defaultColor" name="defaultColor" <select class="form-control" id="defaultColor" name="defaultColor" onchange="handleColorChange(this.value)">
onchange="handleColorChange(this.value)"> <option value="#000000" th:text="#{black}">Black</option>
<option value="#000000" th:text="#{black}">Black</option> <option value="#FFFFFF" th:text="#{white}">White</option>
<option value="#FFFFFF" th:text="#{white}">White</option> <option value="#FF0000" th:text="#{red}">Red</option>
<option value="#FF0000" th:text="#{red}">Red</option> <option value="#00FF00" th:text="#{green}">Green</option>
<option value="#00FF00" th:text="#{green}">Green</option> <option value="#0000FF" th:text="#{blue}">Blue</option>
<option value="#0000FF" th:text="#{blue}">Blue</option> <option value="custom" th:text="#{custom}">Custom...</option>
<option value="custom" th:text="#{custom}">Custom...</option> </select>
</select> </div>
</div>
<!-- Custom Color Input --> <!-- Custom Color Input -->
<div class="mb-3" id="customColorContainer" style="display: none;"> <div class="mb-3" id="customColorContainer" style="display: none;">
<label for="customColor" class="form-label" th:text="#{autoRedact.colorLabel}">Custom Color</label> <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"> <input type="text" class="form-control" id="customColor" name="redactColor" placeholder="#FF00FF">
</div> </div>
<script> <script>
function handleColorChange(selectedValue) { function handleColorChange(selectedValue) {
if (selectedValue === "custom") { if (selectedValue === "custom") {
document.getElementById('customColorContainer').style.display = 'block'; document.getElementById('customColorContainer').style.display = 'block';
} else { } else {
document.getElementById('customColorContainer').style.display = 'none'; document.getElementById('customColorContainer').style.display = 'none';
document.getElementById('customColor').value = selectedValue; document.getElementById('customColor').value = selectedValue;
}
} }
} </script>
</script> <div class="mb-3 form-check">
<div class="mb-3 form-check"> <input type="checkbox" id="useRegex" name="useRegex">
<input type="checkbox" id="useRegex" name="useRegex"> <label for="useRegex" th:text="#{autoRedact.useRegexLabel}"></label>
<label for="useRegex" th:text="#{autoRedact.useRegexLabel}"></label> </div>
</div>
<div class="mb-3 form-check"> <div class="mb-3 form-check">
<input type="checkbox" id="wholeWordSearch" name="wholeWordSearch"> <input type="checkbox" id="wholeWordSearch" name="wholeWordSearch">
<label for="wholeWordSearch" th:text="#{autoRedact.wholeWordSearchLabel}"></label> <label for="wholeWordSearch" th:text="#{autoRedact.wholeWordSearchLabel}"></label>
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label for="customPadding" class="form-label" th:text="#{autoRedact.customPaddingLabel}"></label> <label for="customPadding" class="form-label" th:text="#{autoRedact.customPaddingLabel}"></label>
<input type="number" step="0.1" class="form-control" id="customPadding" name="customPadding" <input type="number" step="0.1" class="form-control" id="customPadding" name="customPadding" value="0.1">
value="0.1"> </div>
</div>
<div class="mb-3 form-check"> <div class="mb-3 form-check">
<input type="checkbox" id="convertPDFToImage" name="convertPDFToImage" checked> <input type="checkbox" id="convertPDFToImage" name="convertPDFToImage" checked>
<label for="convertPDFToImage" th:text="#{autoRedact.convertPDFToImageLabel}"></label> <label for="convertPDFToImage" th:text="#{autoRedact.convertPDFToImageLabel}"></label>
</div> </div>
<button type="submit" id="submitBtn" class="btn btn-primary" <button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{autoRedact.submitButton}"></button>
th:text="#{autoRedact.submitButton}"></button> </form>
</form> </div>
</div> </div>
</div> </div>
</div> </div>
<th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
</div> </div>
<th:block th:insert="~{fragments/footer.html :: footer}"></th:block> </body>
</div>
</body>
</html> </html>

View File

@@ -31,9 +31,7 @@
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-md-6 bg-card"> <div class="col-md-6 bg-card">
<div class="tool-header"> <div class="tool-header">
<svg class="material-symbols-rounded tool-header-icon security"> <span class="material-symbols-rounded tool-header-icon security">playlist_remove</span>
<use xlink:href="/images/redact-manual.svg#icon-redact-manual"></use>
</svg>
<span class="tool-header-text" th:text="#{redact.header}"></span> <span class="tool-header-text" th:text="#{redact.header}"></span>
</div> </div>
<form th:action="@{'api/v1/security/redact'}" method="post" enctype="multipart/form-data"> <form th:action="@{'api/v1/security/redact'}" method="post" enctype="multipart/form-data">

View File

@@ -1,52 +1,41 @@
<!DOCTYPE html> <!DOCTYPE html>
<html th:lang="${#locale.language}" th:dir="#{language.direction}" th:data-language="${#locale.toString()}" <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=#{split-by-size-or-count.title}, header=#{split-by-size-or-count.header})}"></th:block>
</head>
<head> <body>
<th:block <th:block th:insert="~{fragments/common :: game}"></th:block>
th:insert="~{fragments/common :: head(title=#{split-by-size-or-count.title}, header=#{split-by-size-or-count.header})}"> <div id="page-container">
</th:block> <div id="content-wrap">
</head> <th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
<br><br>
<body> <div class="container">
<th:block th:insert="~{fragments/common :: game}"></th:block> <div class="row justify-content-center">
<div id="page-container"> <div class="col-md-6 bg-card">
<div id="content-wrap"> <div class="tool-header">
<th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block> <span class="material-symbols-rounded tool-header-icon advance">vertical_split</span>
<br><br> <span class="tool-header-text" th:text="#{split-by-size-or-count.header}"></span>
<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> </div>
<label for="splitType" th:text="#{split-by-size-or-count.type.label}">Split Type</label> <form method="post" enctype="multipart/form-data" th:action="@{'/api/v1/general/split-by-size-or-count'}">
<select id="splitType" name="splitType" class="form-control"> <div th:replace="~{fragments/common :: fileSelector(name='fileInput', multipleInputsForSingleRequest=false, accept='application/pdf')}"></div>
<option value="0" th:text="#{split-by-size-or-count.type.size}">Size</option> <label for="splitType" th:text="#{split-by-size-or-count.type.label}">Split Type</label>
<option value="1" th:text="#{split-by-size-or-count.type.pageCount}">Page Count</option> <select id="splitType" name="splitType" class="form-control">
<option value="2" th:text="#{split-by-size-or-count.type.docCount}">Document Count</option> <option value="0" th:text="#{split-by-size-or-count.type.size}">Size</option>
</select> <option value="1" th:text="#{split-by-size-or-count.type.pageCount}">Page Count</option>
<br> <option value="2" th:text="#{split-by-size-or-count.type.docCount}">Document Count</option>
<label for="splitValue" th:text="#{split-by-size-or-count.value.label}">Split Value</label> </select>
<input type="text" id="splitValue" name="splitValue" class="form-control" required <br>
th:placeholder="#{split-by-size-or-count.value.placeholder}"> <label for="splitValue" th:text="#{split-by-size-or-count.value.label}">Split Value</label>
<br> <input type="text" id="splitValue" name="splitValue" class="form-control" required th:placeholder="#{split-by-size-or-count.value.placeholder}">
<button type="submit" id="submitBtn" class="btn btn-primary" <br>
th:text="#{split-by-size-or-count.submit}">Submit</button> <button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{split-by-size-or-count.submit}">Submit</button>
</form> </form>
</div>
</div> </div>
</div> </div>
</div> </div>
<th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
</div> </div>
<th:block th:insert="~{fragments/footer.html :: footer}"></th:block> </body>
</div>
</body>
</html> </html>

View File

@@ -1,72 +1,66 @@
<!DOCTYPE html> <!DOCTYPE html>
<html th:lang="${#locale.language}" th:dir="#{language.direction}" th:data-language="${#locale.toString()}" <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> <head>
<th:block th:insert="~{fragments/common :: head(title=#{splitByChapters.title}, header=#{splitByChapters.header})}"> <th:block th:insert="~{fragments/common :: head(title=#{splitByChapters.title}, header=#{splitByChapters.header})}"></th:block>
</th:block>
</head> </head>
<body> <body>
<div id="page-container"> <div id="page-container">
<div id="content-wrap"> <div id="content-wrap">
<th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block> <th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
<br><br> <br><br>
<div class="container"> <div class="container">
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-md-6 bg-card"> <div class="col-md-6 bg-card">
<div class="tool-header"> <div class="tool-header">
<svg class="material-symbols-rounded tool-header-icon advance"> <span class="material-symbols-rounded tool-header-icon organize">book</span>
<use xlink:href="/images/split-chapters.svg#icon-split-chapters"></use> <span class="tool-header-text" th:text="#{splitByChapters.header}"></span>
</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> </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> </div>
</div> </div>
<th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
</div> </div>
<th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
</div>
</body> </body>
</html> </html>

Some files were not shown because too many files have changed in this diff Show More