Compare commits

...

55 Commits

Author SHA1 Message Date
github-actions[bot]
4fea8d10f8 💾 Update Version (#1130)
💾 Sync Versions
> Made via sync_files.yml

Co-authored-by: GitHub Action action@github.com <GitHub Action action@github.com>
2024-04-27 11:04:28 +01:00
Anthony Stirling
8c9d6f7b66 Custom HTML support #355 (#1129)
* test

* settings

* version
2024-04-27 11:03:57 +01:00
Anthony Stirling
30444fc9bb commit (#1128)
* commit

* formatting
2024-04-26 23:27:40 +01:00
Han
70349d642b Update messages_tr_TR.properties (#1126)
* Update messages_tr_TR.properties

* Update messages_tr_TR.properties
2024-04-26 19:37:09 +01:00
albanobattistella
afaec64afd Update messages_it_IT.properties (#1120) 2024-04-24 21:57:56 +01:00
github-actions[bot]
2a9fdff605 📝 Update README: Translation Progress Table (#1119)
📝 Sync README
> Made via sync_files.yml

Co-authored-by: GitHub Action action@github.com <GitHub Action action@github.com>
2024-04-24 19:59:53 +01:00
Anthony Stirling
34c7ee46a0 lang adds 2024-04-24 19:59:01 +01:00
phfuh
5ee702f364 PDF to PDF/A language files (#1118)
* Update messages_en_GB.properties

* Update messages_en_US.properties

* Update messages_de_DE.properties
2024-04-24 19:56:35 +01:00
Ludy
1b5d21a22e Bugfix: Login page shows wrong selected country flag/language (#1117)
Closes #1116
2024-04-24 09:10:16 +01:00
Anthony Stirling
c3e5157dee Delete CNAME 2024-04-23 22:35:21 +01:00
Anthony Stirling
6d859e4c25 Create CNAME 2024-04-23 22:34:29 +01:00
diemade
95a9aca5b5 Update CONTRIBUTING.md (#1115)
adding a chapter on how to edit Docs
2024-04-23 22:32:12 +01:00
github-actions[bot]
4c8f582c56 💾 Update Version (#1108)
💾 Sync Versions
> Made via sync_files.yml

Co-authored-by: GitHub Action action@github.com <GitHub Action action@github.com>
2024-04-21 23:08:06 +01:00
Anthony Stirling
71e93e3cb5 print (WIP), fake scan (WIP) and text conversion for ultra-lite (#1098)
* Changes!

* lang

* fake scan init, print init and pdf to text for exe

* Hardening suggestions for Stirling-PDF / changes (#1099)

* Switch order of literals to prevent NullPointerException

* Introduced protections against predictable RNG abuse

---------

Co-authored-by: pixeebot[bot] <104101892+pixeebot[bot]@users.noreply.github.com>

* Update README.md

* install custom fonts

* Formats etc

* version bump

* disable WIP work

* remove chinese font

---------

Co-authored-by: pixeebot[bot] <104101892+pixeebot[bot]@users.noreply.github.com>
Co-authored-by: systo <systo@host.docker.internal>
2024-04-21 23:06:44 +01:00
github-actions[bot]
6c052a7b25 📝 Update README: Translation Progress Table (#1107)
📝 Sync README
> Made via sync_files.yml

Co-authored-by: GitHub Action action@github.com <GitHub Action action@github.com>
2024-04-21 23:00:40 +01:00
NeilJared
1e0ec8345a >Updated es_ES (100% completed) (#1106)
Update messages_es_ES.properties

Updated es_ES translation (100% done)
2024-04-21 22:50:36 +01:00
diemade
eddcc11fe4 German translation for Print Tool (#1104)
* Update messages_de_DE.properties

Only full sentences should end in a period,

* Update messages_de_DE.properties

* Update messages_de_DE.properties

---------

Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com>
2024-04-21 22:31:45 +01:00
Ludy
3189d9dda8 Check DOCKER_ENABLE_SECURITY for UI (#1103)
When using `DOCKER_ENABLE_SECURITY=false`, the logout button and `Account Settings` are no longer displayed.
2024-04-21 21:16:39 +01:00
Ludy
5185fd13b8 updating the build files (#1100) 2024-04-21 16:30:17 +01:00
Ludy
a5000fbbc5 UI: settings show/hide update display (#1072)
* UI: settings show/hide update display

This PR replaces the PR #1003

In this PR, the visual for available update is added to the foreground.

There are new settings to generally show/hide the update display, and only administrators receive the update display.

* change to `Bean`

* Update AppUpdateShowService.java

* add update message

* revision service

* change shouldShow

* Update githubVersion.js

* rm folder

* Update AppUpdateService.java
2024-04-21 12:15:18 +01:00
albanobattistella
e74a8e434b Update messages_it_IT.properties (#1096) 2024-04-21 09:16:05 +01:00
phfuh
b702f5772d Add selection for PDF/A output format (#1095)
* Create PdfToPdfARequest.java

* Change class, add output format

* Add input field for output format

* Change output format selection order
2024-04-21 08:44:05 +01:00
github-actions[bot]
214e23fd93 📝 Update README: Translation Progress Table (#1093)
📝 Sync README
> Made via sync_files.yml

Co-authored-by: GitHub Action action@github.com <GitHub Action action@github.com>
2024-04-20 20:45:45 +01:00
Han
943071ebb7 Update messages_tr_TR.properties (#1092) 2024-04-20 19:18:20 +01:00
github-actions[bot]
c575ed2036 📝 Update README: Translation Progress Table (#1091)
📝 Sync README
> Made via sync_files.yml

Co-authored-by: GitHub Action action@github.com <GitHub Action action@github.com>
2024-04-20 15:28:10 +01:00
Anthony Stirling
06a178cc03 Cache form inputs between runs (#1066)
* Changes!

* lang
2024-04-20 14:46:49 +01:00
diemade
73f90885b4 Update messages_de_DE.properties (#1069)
Only full sentences should end in a period,

Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com>
2024-04-20 10:45:58 +01:00
Ludy
ace4e200b1 Fix: Resolve Username Case Sensitivity Issue in Login Flow (#1070)
* Fix: Username changing

The only situation where the username must be unique is when changing the username.

* Update UserController.java
2024-04-14 22:07:03 +01:00
github-actions[bot]
032388a8e3 📝 Update README: Translation Progress Table (#1063)
📝 Sync README
> Made via sync_files.yml

Co-authored-by: GitHub Action action@github.com <GitHub Action action@github.com>
2024-04-11 22:49:12 +01:00
albanobattistella
276b6e521a Update messages_it_IT.properties (#1062) 2024-04-11 22:40:05 +01:00
Ludy
35a4462a86 replace comma to dot (#1057)
In several countries the comma is used as a decimal, the PR will replace the comma with a dot.
2024-04-09 17:47:53 +01:00
pixeebot[bot]
5564f378e5 (Sonar) Fix "String#replace should be preferred to String#replaceAll" (#1056)
Co-authored-by: pixeebot[bot] <104101892+pixeebot[bot]@users.noreply.github.com>
2024-04-09 06:52:52 +01:00
Ludy
66d5f3e4b5 add sync-readme (#1051) 2024-04-08 23:33:58 +01:00
Dimitris Kaitantzidis
0f367c23aa 359 split metadata lost (#1049)
* Closes #359

* Adds a minor fix, the modified date should be changed after a modification is made.
2024-04-08 20:53:00 +00:00
Ludy
7dd1679588 Ukrainian - add missing strings (#1048)
add missing strings
2024-04-08 21:37:30 +01:00
Foivos Proestakis
6b186d5d8e Improve Greek translation (#1046)
* Update and Improve Greek translation

# Update Greek Translations

## Description

- Updated translations for all pages and content on the website.
- Corrected grammatical errors or typos in the Greek translation.
- Improved the overall readability and flow of the translated text.

This commit aims to enhance the user experience for Greek-speaking users of the website.

* Update messages_el_GR.properties
2024-04-08 21:29:31 +01:00
Ludy
d53be3aa14 add Ukrainian README, languages.html and correction FR, IT (#1044) 2024-04-08 21:29:13 +01:00
Eric
3dbfde534e fix: missing pdf to html endpoint (#1043)
* fix: missing pdf to html endpoint

* refactor: remove unused variable

---------

Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com>
2024-04-08 21:28:57 +01:00
vkykalo
9a57842ece Feature: Add Ukrainian Language Support (#1039)
* Add uk_UA lang

* Add added error translation block into  uk_UA lang

---------

Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com>
2024-04-08 21:27:55 +01:00
CocoMaster-AI
ec83b9a17d Update ja_JP,ko_KR,ru_RU,zh_TW.properties (#1036) 2024-04-08 21:27:36 +01:00
Ludy
59a19b0091 Update messages_de_DE.properties (#1045) 2024-04-08 20:25:14 +00:00
Dimitris Kaitantzidis
471865e4a3 Closes #359 (#1047) 2024-04-08 21:23:03 +01:00
Anthony Stirling
3868b4eca2 updates 2024-04-05 13:05:16 +01:00
Han
64f8765115 Update messages_tr_TR.properties (#1032)
update TR
2024-04-05 12:58:54 +01:00
github-actions[bot]
3804656218 💾 Update Version (#1033)
💾 Sync Versions
> Made via sync_versions.yml

Co-authored-by: GitHub Action action@github.com <GitHub Action action@github.com>
2024-04-05 12:58:05 +01:00
Anthony Stirling
a5d824213c OCR fix for #1019 2024-04-05 12:51:22 +01:00
albanobattistella
160a4e9f8d Update messages_it_IT.properties (#1031) 2024-04-04 21:52:24 +01:00
Ludy
74a0574462 Update progress of language (#1029) 2024-04-04 10:16:10 +01:00
Muhammad Sani Ibrahim
1cf23b3542 Update README.md (#606)
Make the English more standard

Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com>
2024-04-03 22:51:59 +01:00
github-actions[bot]
2ef1242cd8 💾 Update Version (#1015)
💾 Sync Versions
> Made via sync_versions.yml

Co-authored-by: GitHub Action action@github.com <GitHub Action action@github.com>
2024-04-03 22:41:33 +01:00
pixeebot[bot]
54c3bee205 Replaced Stream.collect(Collectors.toList()) with Stream.toList() (Sonar) (#1018)
Co-authored-by: pixeebot[bot] <104101892+pixeebot[bot]@users.noreply.github.com>
2024-04-03 22:41:24 +01:00
NicolasFR
a63c0a3625 lang: update fr_FR (#1020)
Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com>
2024-04-03 22:41:07 +01:00
Dimitris Doukas
3103a0bffc Enhance description for "Split PDF" functionality (#1025)
* Update screen of homepage

* Fix description for "Split PDF" except AR

* Fix description for "Split PDF" in AR

* Fix one mistake on AR

* Keep clear this branch from other branches
2024-04-03 22:40:35 +01:00
Dimitris Doukas
5d71ffbfaa Update homepage screen in README (#1021)
Update screen of homepage
2024-04-03 22:40:09 +01:00
CocoMaster-AI
c0c137d1b0 Sponsor information supports translate now (#1023)
Sponsored information supports translate now
2024-04-03 10:02:01 +01:00
95 changed files with 3875 additions and 1353 deletions

View File

@@ -2,12 +2,12 @@ name: "Build repo"
on: on:
push: push:
branches: [ "main" ] branches: ["main"]
paths-ignore: paths-ignore:
- ".github/**" - ".github/**"
- "**/*.md" - "**/*.md"
pull_request: pull_request:
branches: [ "main" ] branches: ["main"]
paths-ignore: paths-ignore:
- ".github/**" - ".github/**"
- "**/*.md" - "**/*.md"
@@ -25,16 +25,18 @@ jobs:
fail-fast: false fail-fast: false
steps: steps:
- name: Checkout repository - name: Checkout repository
uses: actions/checkout@v3 uses: actions/checkout@v4
- name: Set up JDK 17 - name: Set up JDK 17
uses: actions/setup-java@v3 uses: actions/setup-java@v4
with: with:
java-version: '17' java-version: "17"
distribution: 'temurin' distribution: "temurin"
- uses: gradle/gradle-build-action@v2.4.2 - uses: gradle/actions/setup-gradle@v3
with: with:
gradle-version: 7.6 gradle-version: 7.6
arguments: build --no-build-cache
- name: Build with Gradle
run: ./gradlew build --no-build-cache

View File

@@ -5,7 +5,7 @@ on:
branches: branches:
- main - main
paths: paths:
- 'build.gradle' - "build.gradle"
permissions: permissions:
contents: write contents: write
@@ -17,13 +17,15 @@ jobs:
steps: steps:
- name: Check out code - name: Check out code
uses: actions/checkout@v3 uses: actions/checkout@v4
- name: Set up JDK 17 - name: Set up JDK 17
uses: actions/setup-java@v3 uses: actions/setup-java@v4
with: with:
java-version: '17' java-version: "17"
distribution: 'adopt' distribution: "adopt"
- uses: gradle/actions/setup-gradle@v3
- name: Run Gradle Command - name: Run Gradle Command
run: ./gradlew clean generateLicenseReport run: ./gradlew clean generateLicenseReport
@@ -44,7 +46,7 @@ jobs:
- name: Create Pull Request - name: Create Pull Request
if: env.CHANGES_DETECTED == 'true' if: env.CHANGES_DETECTED == 'true'
uses: peter-evans/create-pull-request@v3 uses: peter-evans/create-pull-request@v6
with: with:
token: ${{ secrets.GITHUB_TOKEN }} token: ${{ secrets.GITHUB_TOKEN }}
commit-message: "Update 3rd Party Licenses" commit-message: "Update 3rd Party Licenses"
@@ -58,4 +60,3 @@ jobs:
[1]: https://github.com/peter-evans/create-pull-request [1]: https://github.com/peter-evans/create-pull-request
draft: false draft: false
delete-branch: true delete-branch: true

View File

@@ -14,105 +14,99 @@ jobs:
push: push:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v3.5.2 - name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: "17"
distribution: "temurin"
- name: Set up JDK 17 - uses: gradle/actions/setup-gradle@v3
uses: actions/setup-java@v3.11.0 with:
with: gradle-version: 7.6
java-version: '17'
distribution: 'temurin'
- name: Run Gradle Command
run: ./gradlew clean build
env:
DOCKER_ENABLE_SECURITY: false
- uses: gradle/gradle-build-action@v2.4.2 - name: Set up Docker Buildx
env: id: buildx
DOCKER_ENABLE_SECURITY: false uses: docker/setup-buildx-action@v3
with:
gradle-version: 7.6
arguments: clean build
- name: Make Gradle wrapper executable - name: Get version number
run: chmod +x gradlew id: versionNumber
run: echo "versionNumber=$(./gradlew printVersion --quiet | tail -1)" >> $GITHUB_OUTPUT
- name: Get version number - name: Login to Docker Hub
id: versionNumber uses: docker/login-action@v3
run: echo "::set-output name=versionNumber::$(./gradlew printVersion --quiet | tail -1)" with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_API }}
- name: Login to Docker Hub - name: Login to GitHub Container Registry
uses: docker/login-action@v2.1.0 uses: docker/login-action@v3
with: with:
username: ${{ secrets.DOCKER_HUB_USERNAME }} registry: ghcr.io
password: ${{ secrets.DOCKER_HUB_API }} username: ${{ github.actor }}
password: ${{ github.token }}
- name: Login to GitHub Container Registry - name: Set up QEMU
uses: docker/login-action@v2.1.0 uses: docker/setup-qemu-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ github.token }}
- name: Convert repository owner to lowercase - name: Convert repository owner to lowercase
id: repoowner id: repoowner
run: echo "::set-output name=lowercase::$(echo ${{ github.repository_owner }} | awk '{print tolower($0)}')" run: echo "lowercase=$(echo ${{ github.repository_owner }} | awk '{print tolower($0)}')" >> $GITHUB_OUTPUT
- name: Generate tags - name: Generate tags
id: meta id: meta
uses: docker/metadata-action@v4.4.0 uses: docker/metadata-action@v5
with: with:
images: | images: |
${{ secrets.DOCKER_HUB_USERNAME }}/s-pdf ${{ secrets.DOCKER_HUB_USERNAME }}/s-pdf
ghcr.io/${{ steps.repoowner.outputs.lowercase }}/s-pdf ghcr.io/${{ steps.repoowner.outputs.lowercase }}/s-pdf
tags: | tags: |
type=raw,value=${{ steps.versionNumber.outputs.versionNumber }},enable=${{ github.ref == 'refs/heads/master' }} type=raw,value=${{ steps.versionNumber.outputs.versionNumber }},enable=${{ github.ref == 'refs/heads/master' }}
type=raw,value=latest,enable=${{ github.ref == 'refs/heads/master' }} type=raw,value=latest,enable=${{ github.ref == 'refs/heads/master' }}
type=raw,value=alpha,enable=${{ github.ref == 'refs/heads/main' }} type=raw,value=alpha,enable=${{ github.ref == 'refs/heads/main' }}
- name: Set up QEMU - name: Build and push main Dockerfile
uses: docker/setup-qemu-action@v2.1.0 uses: docker/build-push-action@v5
with:
builder: ${{ steps.buildx.outputs.name }}
context: .
file: ./Dockerfile
push: true
cache-from: type=gha
cache-to: type=gha,mode=max
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
build-args: VERSION_TAG=${{ steps.versionNumber.outputs.versionNumber }}
platforms: linux/amd64,linux/arm64/v8
- name: Set up Docker Buildx - name: Generate tags ultra-lite
uses: docker/setup-buildx-action@v2.5.0 id: meta2
uses: docker/metadata-action@v5
if: github.ref != 'refs/heads/main'
with:
images: |
${{ secrets.DOCKER_HUB_USERNAME }}/s-pdf
ghcr.io/${{ steps.repoowner.outputs.lowercase }}/s-pdf
tags: |
type=raw,value=${{ steps.versionNumber.outputs.versionNumber }}-ultra-lite,enable=${{ github.ref == 'refs/heads/master' }}
type=raw,value=latest-ultra-lite,enable=${{ github.ref == 'refs/heads/master' }}
- name: Build and push main Dockerfile - name: Build and push Dockerfile-ultra-lite
uses: docker/build-push-action@v4.0.0 uses: docker/build-push-action@v5
with: if: github.ref != 'refs/heads/main'
context: . with:
dockerfile: ./Dockerfile context: .
push: true file: ./Dockerfile-ultra-lite
cache-from: type=gha push: true
cache-to: type=gha,mode=max cache-from: type=gha
tags: ${{ steps.meta.outputs.tags }} cache-to: type=gha,mode=max
labels: ${{ steps.meta.outputs.labels }} tags: ${{ steps.meta2.outputs.tags }}
build-args: labels: ${{ steps.meta2.outputs.labels }}
VERSION_TAG=${{ steps.versionNumber.outputs.versionNumber }} build-args: VERSION_TAG=${{ steps.versionNumber.outputs.versionNumber }}
platforms: linux/amd64,linux/arm64/v8 platforms: linux/amd64,linux/arm64/v8
- name: Generate tags ultra-lite
id: meta2
uses: docker/metadata-action@v4.4.0
if: github.ref != 'refs/heads/main'
with:
images: |
${{ secrets.DOCKER_HUB_USERNAME }}/s-pdf
ghcr.io/${{ steps.repoowner.outputs.lowercase }}/s-pdf
tags: |
type=raw,value=${{ steps.versionNumber.outputs.versionNumber }}-ultra-lite,enable=${{ github.ref == 'refs/heads/master' }}
type=raw,value=latest-ultra-lite,enable=${{ github.ref == 'refs/heads/master' }}
- name: Build and push Dockerfile-ultra-lite
uses: docker/build-push-action@v4.0.0
if: github.ref != 'refs/heads/main'
with:
context: .
file: ./Dockerfile-ultra-lite
push: true
cache-from: type=gha
cache-to: type=gha,mode=max
tags: ${{ steps.meta2.outputs.tags }}
labels: ${{ steps.meta2.outputs.labels }}
build-args:
VERSION_TAG=${{ steps.versionNumber.outputs.versionNumber }}
platforms: linux/amd64,linux/arm64/v8

View File

@@ -1,6 +1,7 @@
name: Release Artifacts name: Release Artifacts
on: on:
workflow_dispatch:
release: release:
types: [created] types: [created]
permissions: permissions:
@@ -14,44 +15,61 @@ jobs:
enable_security: [true, false] enable_security: [true, false]
include: include:
- enable_security: true - enable_security: true
file_suffix: '-with-login' file_suffix: "-with-login"
- enable_security: false - enable_security: false
file_suffix: '' file_suffix: ""
steps: steps:
- uses: actions/checkout@v3.5.2 - uses: actions/checkout@v4
- name: Set up JDK 17 - name: Set up JDK 17
uses: actions/setup-java@v3.11.0 uses: actions/setup-java@v4
with: with:
java-version: '17' java-version: "17"
distribution: 'temurin' distribution: "temurin"
- name: Grant execute permission for gradlew - uses: gradle/actions/setup-gradle@v3
run: chmod +x gradlew with:
gradle-version: 7.6
- name: Generate jar (With Security=${{ matrix.enable_security }}) - name: Generate jar (With Security=${{ matrix.enable_security }})
run: ./gradlew clean createExe run: ./gradlew clean createExe
env: env:
DOCKER_ENABLE_SECURITY: ${{ matrix.enable_security }} DOCKER_ENABLE_SECURITY: ${{ matrix.enable_security }}
- name: Upload binaries to release - name: Get version number
uses: svenstaro/upload-release-action@v2 id: versionNumber
with: run: echo "versionNumber=$(./gradlew printVersion --quiet | tail -1)" >> $GITHUB_OUTPUT
repo_token: ${{ secrets.GITHUB_TOKEN }}
file: ./build/launch4j/Stirling-PDF.exe
asset_name: Stirling-PDF${{ matrix.file_suffix }}.exe
tag: ${{ github.ref }}
overwrite: true
- name: Get version number - name: Rename binarie
id: versionNumber if: matrix.file_suffix != ''
run: echo "::set-output name=versionNumber::$(./gradlew printVersion --quiet | tail -1)" run: cp ./build/launch4j/Stirling-PDF.exe ./build/launch4j/Stirling-PDF${{ matrix.file_suffix }}.exe
- name: Upload jar binaries to release - name: Upload Assets binarie
uses: svenstaro/upload-release-action@v2 uses: actions/upload-artifact@v4
with: with:
repo_token: ${{ secrets.GITHUB_TOKEN }} path: ./build/launch4j/Stirling-PDF${{ matrix.file_suffix }}.exe
file: ./build/libs/Stirling-PDF-${{ steps.versionNumber.outputs.versionNumber }}.jar name: Stirling-PDF${{ matrix.file_suffix }}.exe
asset_name: Stirling-PDF${{ matrix.file_suffix }}.jar overwrite: true
tag: ${{ github.ref }} retention-days: 1
overwrite: true if-no-files-found: error
- name: Upload binaries to release
uses: softprops/action-gh-release@v2
with:
files: ./build/launch4j/Stirling-PDF${{ matrix.file_suffix }}.exe
- name: Rename jar binaries
run: cp ./build/libs/Stirling-PDF-${{ steps.versionNumber.outputs.versionNumber }}.jar ./build/libs/Stirling-PDF${{ matrix.file_suffix }}.jar
- name: Upload Assets jar binaries
uses: actions/upload-artifact@v4
with:
path: ./build/libs/Stirling-PDF${{ matrix.file_suffix }}.jar
name: Stirling-PDF${{ matrix.file_suffix }}.jar
overwrite: true
retention-days: 1
if-no-files-found: error
- name: Upload jar binaries to release
uses: softprops/action-gh-release@v2
with:
files: ./build/libs/Stirling-PDF${{ matrix.file_suffix }}.jar

View File

@@ -8,31 +8,32 @@ on:
jobs: jobs:
push: push:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v3.5.2 - name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: "17"
distribution: "temurin"
- name: Set up JDK 17 - uses: gradle/actions/setup-gradle@v3
uses: actions/setup-java@v3.11.0
with:
java-version: '17'
distribution: 'temurin'
- name: Grant execute permission for gradlew - name: Generate Swagger documentation
run: chmod +x gradlew run: ./gradlew generateOpenApiDocs
- name: Generate Swagger documentation - name: Upload Swagger Documentation to SwaggerHub
run: ./gradlew generateOpenApiDocs run: ./gradlew swaggerhubUpload
env:
SWAGGERHUB_API_KEY: ${{ secrets.SWAGGERHUB_API_KEY }}
- name: Upload Swagger Documentation to SwaggerHub - name: Get version number
run: ./gradlew swaggerhubUpload id: versionNumber
env: run: echo "versionNumber=$(./gradlew printVersion --quiet | tail -1)" >> $GITHUB_OUTPUT
SWAGGERHUB_API_KEY: ${{ secrets.SWAGGERHUB_API_KEY }}
- name: Set API version as published and default on SwaggerHub - name: Set API version as published and default on SwaggerHub
run: | run: |
curl -X PUT -H "Authorization: ${SWAGGERHUB_API_KEY}" "https://api.swaggerhub.com/apis/Frooodle/Stirling-PDF/${{ steps.versionNumber.outputs.versionNumber }}/settings/lifecycle" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"published\":true,\"default\":true}" curl -X PUT -H "Authorization: ${SWAGGERHUB_API_KEY}" "https://api.swaggerhub.com/apis/Frooodle/Stirling-PDF/${{ steps.versionNumber.outputs.versionNumber }}/settings/lifecycle" -H "accept: application/json" -H "Content-Type: application/json" -d "{\"published\":true,\"default\":true}"
env: env:
SWAGGERHUB_API_KEY: ${{ secrets.SWAGGERHUB_API_KEY }} SWAGGERHUB_API_KEY: ${{ secrets.SWAGGERHUB_API_KEY }}

87
.github/workflows/sync_files.yml vendored Normal file
View File

@@ -0,0 +1,87 @@
name: Sync Files
on:
push:
branches:
- main
paths:
- "build.gradle"
- "src/main/resources/messages_*.properties"
permissions:
contents: write
pull-requests: write
jobs:
sync-versions:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4.1.1
- name: Set up Python
uses: actions/setup-python@v5.1.0
with:
python-version: "3.x"
- name: Install dependencies
run: pip install pyyaml
- name: Sync versions
run: python .github/scripts/gradle_to_chart.py
- name: Set up git config
run: |
git config --global user.email "GitHub Action <action@github.com>"
git config --global user.name "GitHub Action <action@github.com>"
- name: Run git add
run: |
git add .
git diff --staged --quiet || git commit -m ":floppy_disk: Sync Versions
> Made via sync_files.yml" || echo "no changes"
- name: Create Pull Request
uses: peter-evans/create-pull-request@v6.0.1
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: Update files
committer: GitHub Action <action@github.com>
author: GitHub Action <action@github.com>
signoff: true
branch: sync_version
title: ":floppy_disk: Update Version"
body: |
Auto-generated by [create-pull-request][1]
[1]: https://github.com/peter-evans/create-pull-request
draft: false
delete-branch: true
sync-readme:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4.1.1
- name: Set up Python
uses: actions/setup-python@v5.1.0
with:
python-version: "3.x"
- name: Sync README
run: python scripts/counter_translation.py
- name: Set up git config
run: |
git config --global user.email "GitHub Action <action@github.com>"
git config --global user.name "GitHub Action <action@github.com>"
- name: Run git add
run: |
git add .
git diff --staged --quiet || git commit -m ":memo: Sync README
> Made via sync_files.yml" || echo "no changes"
- name: Create Pull Request
uses: peter-evans/create-pull-request@v6.0.1
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: Update files
committer: GitHub Action <action@github.com>
author: GitHub Action <action@github.com>
signoff: true
branch: sync_readme
title: ":memo: Update README: Translation Progress Table"
body: |
Auto-generated by [create-pull-request][1]
[1]: https://github.com/peter-evans/create-pull-request
draft: false
delete-branch: true

View File

@@ -1,51 +0,0 @@
name: Sync Versions
on:
push:
branches:
- main
paths:
- "build.gradle"
permissions:
contents: write
pull-requests: write
jobs:
sync-versions:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4.1.1
- name: Set up Python
uses: actions/setup-python@v5.0.0
with:
python-version: '3.x'
- name: Install dependencies
run: pip install pyyaml
- name: Sync versions
run: python .github/scripts/gradle_to_chart.py
- name: Set up git config
run: |
git config --global user.email "GitHub Action <action@github.com>"
git config --global user.name "GitHub Action <action@github.com>"
- name: Run git add
run: |
git add .
git diff --staged --quiet || git commit -m ":floppy_disk: Sync Versions
> Made via sync_versions.yml" || echo "no changes"
- name: Create Pull Request
uses: peter-evans/create-pull-request@v6.0.0
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: Update files
committer: GitHub Action <action@github.com>
author: GitHub Action <action@github.com>
signoff: true
branch: sync_version
title: ":floppy_disk: Update Version"
body: |
Auto-generated by [create-pull-request][1]
[1]: https://github.com/peter-evans/create-pull-request
draft: false
delete-branch: true

View File

@@ -3,54 +3,36 @@ name: Docker Compose Tests
on: on:
pull_request: pull_request:
paths: paths:
- 'src/**' - "src/**"
- '**.gradle' - "**.gradle"
- '!src/main/java/resources/messages*' - "!src/main/java/resources/messages*"
- 'exampleYmlFiles/**' - "exampleYmlFiles/**"
- 'Dockerfile' - "Dockerfile"
- 'Dockerfile**' - "Dockerfile**"
jobs: jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout Repository - name: Checkout Repository
uses: actions/checkout@v2 uses: actions/checkout@v4
- name: Set up Java 17 - name: Set up Java 17
uses: actions/setup-java@v2 uses: actions/setup-java@v4
with: with:
java-version: '17' java-version: "17"
distribution: 'adopt' distribution: "adopt"
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1 uses: docker/setup-buildx-action@v3
- name: Run Docker Compose Tests - name: Install Docker Compose
run: | run: |
chmod +x ./gradlew sudo curl -SL "https://github.com/docker/compose/releases/download/v2.26.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# sudo chmod +x /usr/local/bin/docker-compose
- name: Get version number - name: Run Docker Compose Tests
id: versionNumber run: |
run: echo "::set-output name=versionNumber::$(./gradlew printVersion --quiet | tail -1)" chmod +x ./test.sh
./test.sh
- name: Cache Docker layers
uses: actions/cache@v2
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ steps.versionNumber.outputs.versionNumber }}
restore-keys: |
${{ runner.os }}-buildx-
- name: Install Docker Compose
run: |
sudo curl -L "https://github.com/docker/compose/releases/download/v2.6.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
- name: Run Docker Compose Tests
run: |
chmod +x ./test.sh
./test.sh

View File

@@ -27,6 +27,10 @@ Please make sure your Pull Request adheres to the following guidelines:
If you would like to add or modify a translation, please see [How to add new languages to Stirling-PDF](HowToAddNewLanguage.md). Also, please create a Pull Request so others can use it! If you would like to add or modify a translation, please see [How to add new languages to Stirling-PDF](HowToAddNewLanguage.md). Also, please create a Pull Request so others can use it!
## Docs
Documentation for Stirling-PDF is handled in a seperate repository. Please see [Docs repository](https://github.com/Stirling-Tools/Stirling-Tools.github.io) or use "edit this page"-button at the bottom of each page at [https://stirlingtools.com/docs/](https://stirlingtools.com/docs/).
## Fixing Bugs or Adding a New Feature ## Fixing Bugs or Adding a New Feature
First, make sure you've read the section [Pull Requests](#pull-requests). First, make sure you've read the section [Pull Requests](#pull-requests).

View File

@@ -25,15 +25,17 @@ ENV DOCKER_ENABLE_SECURITY=false \
RUN echo "@testing 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 "@testing 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 update && \
apk add --no-cache \ apk add --no-cache \
ca-certificates \ ca-certificates \
tzdata \ tzdata \
tini \ tini \
openssl \
openssl-dev \
bash \ bash \
curl \ curl \
openjdk17-jre \ openjdk17-jre \
su-exec \ su-exec \
font-noto-cjk \
shadow \ shadow \
# Doc conversion # Doc conversion
libreoffice@testing \ libreoffice@testing \
@@ -57,7 +59,9 @@ RUN echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /et
# 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 && \
tesseract --list-langs && \
rm -rf /var/cache/apk/*
EXPOSE 8080 EXPOSE 8080

106
README.md
View File

@@ -1,5 +1,5 @@
<p align="center"><img src="https://raw.githubusercontent.com/Stirling-Tools/Stirling-PDF/main/docs/stirling.png" width="80" ><br><h1 align="center">Stirling-PDF</h1> <p align="center"><img src="https://raw.githubusercontent.com/Stirling-Tools/Stirling-PDF/main/docs/stirling.png" width="80" ></p>
</p> <h1 align="center">Stirling-PDF</h1>
[![Docker Pulls](https://img.shields.io/docker/pulls/frooodle/s-pdf)](https://hub.docker.com/r/frooodle/s-pdf) [![Docker Pulls](https://img.shields.io/docker/pulls/frooodle/s-pdf)](https://hub.docker.com/r/frooodle/s-pdf)
[![Discord](https://img.shields.io/discord/1068636748814483718?label=Discord)](https://discord.gg/Cn8pWhQRxZ) [![Discord](https://img.shields.io/discord/1068636748814483718?label=Discord)](https://discord.gg/Cn8pWhQRxZ)
@@ -10,25 +10,26 @@
[![Deploy to DO](https://www.deploytodo.com/do-btn-blue.svg)](https://cloud.digitalocean.com/apps/new?repo=https://github.com/Stirling-Tools/Stirling-PDF/tree/digitalOcean&refcode=c3210994b1af) [![Deploy to DO](https://www.deploytodo.com/do-btn-blue.svg)](https://cloud.digitalocean.com/apps/new?repo=https://github.com/Stirling-Tools/Stirling-PDF/tree/digitalOcean&refcode=c3210994b1af)
This is a powerful locally hosted web based PDF manipulation tool using docker that allows you to perform various operations on PDF files, such as splitting merging, converting, reorganizing, adding images, rotating, compressing, and more. This locally hosted web application started as a 100% ChatGPT-made application and has evolved to include a wide range of features to handle all your PDF needs. This is a robust, locally hosted web-based PDF manipulation tool using Docker. It enables you to carry out various operations on PDF files, including splitting, merging, converting, reorganizing, adding images, rotating, compressing, and more. Originally developed entirely by ChatGPT, this locally hosted web application has evolved to encompass a comprehensive set of features, addressing all your PDF requirements.
Stirling PDF makes no outbound calls for any record keeping or tracking. Stirling PDF does not initiate any outbound calls for record-keeping or tracking purposes.
All files and PDFs exist either exclusively on the client side, reside in server memory only during task execution, or temporarily reside in a file solely for the execution of the task. Any file downloaded by the user will have been deleted from the server by that point. All files and PDFs exist either exclusively on the client side, reside in server memory only during task execution, or temporarily reside in a file solely for the execution of the task. Any file downloaded by the user will have been deleted from the server by that point.
![stirling-home](images/stirling-home.png) ![stirling-home](images/stirling-home.jpg)
## Features ## Features
- Dark mode support. - Dark mode support.
- Custom download options (see [here](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/images/settings.png) for example) - Custom download options (see [here](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/images/settings.png) for example)
- Parallel file processing and downloads - Parallel file processing and downloads
- API for integration with external scripts - API for integration with external scripts
- Optional Login and Authentication support (see [here](https://github.com/Stirling-Tools/Stirling-PDF/tree/main#login-authentication) for documentation) - Optional Login and Authentication support (see [here](https://github.com/Stirling-Tools/Stirling-PDF/tree/main#login-authentication) for documentation)
## **PDF Features** ## **PDF Features**
### **Page Operations** ### **Page Operations**
- View and modify PDFs - View multi page PDFs with custom viewing sorting and searching. Plus on page edit features like annotate, draw and adding text and images. (Using PDF.js with Joxit and Liberation.Liberation fonts) - View and modify PDFs - View multi page PDFs with custom viewing sorting and searching. Plus on page edit features like annotate, draw and adding text and images. (Using PDF.js with Joxit and Liberation.Liberation fonts)
- Full interactive GUI for merging/splitting/rotating/moving PDFs and their pages. - Full interactive GUI for merging/splitting/rotating/moving PDFs and their pages.
- Merge multiple PDFs together into a single resultant file. - Merge multiple PDFs together into a single resultant file.
@@ -45,6 +46,7 @@ All files and PDFs exist either exclusively on the client side, reside in server
- Convert PDF to a single page. - Convert PDF to a single page.
### **Conversion Operations** ### **Conversion Operations**
- Convert PDFs to and from images. - Convert PDFs to and from images.
- Convert any common file to PDF (using LibreOffice). - Convert any common file to PDF (using LibreOffice).
- Convert PDF to Word/Powerpoint/Others (using LibreOffice). - Convert PDF to Word/Powerpoint/Others (using LibreOffice).
@@ -53,6 +55,7 @@ All files and PDFs exist either exclusively on the client side, reside in server
- Markdown to PDF. - Markdown to PDF.
### **Security & Permissions** ### **Security & Permissions**
- Add and remove passwords. - Add and remove passwords.
- Change/set PDF Permissions. - Change/set PDF Permissions.
- Add watermark(s). - Add watermark(s).
@@ -61,6 +64,7 @@ All files and PDFs exist either exclusively on the client side, reside in server
- Auto-redact text. - Auto-redact text.
### **Other Operations** ### **Other Operations**
- Add/Generate/Write signatures. - Add/Generate/Write signatures.
- Repair PDFs. - Repair PDFs.
- Detect and remove blank pages. - Detect and remove blank pages.
@@ -77,11 +81,11 @@ All files and PDFs exist either exclusively on the client side, reside in server
- Flatten PDFs. - Flatten PDFs.
- Get all information on a PDF to view or export as JSON. - Get all information on a PDF to view or export as JSON.
For a overview of the tasks and the technology each uses please view [Endpoint-groups.md](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/Endpoint-groups.md) For a overview of the tasks and the technology each uses please view [Endpoint-groups.md](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/Endpoint-groups.md)
Demo of the app is available [here](https://stirlingpdf.io). username: demo, password: demo Demo of the app is available [here](https://stirlingpdf.io). username: demo, password: demo
## Technologies used ## Technologies used
- Spring Boot + Thymeleaf - Spring Boot + Thymeleaf
- [PDFBox](https://github.com/apache/pdfbox/tree/trunk) - [PDFBox](https://github.com/apache/pdfbox/tree/trunk)
- [LibreOffice](https://www.libreoffice.org/discover/libreoffice/) for advanced conversions - [LibreOffice](https://www.libreoffice.org/discover/libreoffice/) for advanced conversions
@@ -94,9 +98,11 @@ Demo of the app is available [here](https://stirlingpdf.io). username: demo, pas
## How to use ## How to use
### Locally ### Locally
Please view https://github.com/Stirling-Tools/Stirling-PDF/blob/main/LocalRunGuide.md Please view https://github.com/Stirling-Tools/Stirling-PDF/blob/main/LocalRunGuide.md
### Docker / Podman ### Docker / Podman
https://hub.docker.com/r/frooodle/s-pdf https://hub.docker.com/r/frooodle/s-pdf
Stirling PDF has 2 different versions, a Full version and ultra-Lite version. Depending on the types of features you use you may want a smaller image to save on space. Stirling PDF has 2 different versions, a Full version and ultra-Lite version. Depending on the types of features you use you may want a smaller image to save on space.
@@ -106,6 +112,7 @@ For people that don't mind about space optimization just use the latest tag.
![Docker Image Size (tag)](https://img.shields.io/docker/image-size/frooodle/s-pdf/latest-ultra-lite?label=Stirling-PDF%20Ultra-Lite) ![Docker Image Size (tag)](https://img.shields.io/docker/image-size/frooodle/s-pdf/latest-ultra-lite?label=Stirling-PDF%20Ultra-Lite)
Docker Run Docker Run
```bash ```bash
docker run -d \ docker run -d \
-p 8080:8080 \ -p 8080:8080 \
@@ -114,6 +121,7 @@ docker run -d \
-v /location/of/logs:/logs \ -v /location/of/logs:/logs \
-e DOCKER_ENABLE_SECURITY=false \ -e DOCKER_ENABLE_SECURITY=false \
-e INSTALL_BOOK_AND_ADVANCED_HTML_OPS=false \ -e INSTALL_BOOK_AND_ADVANCED_HTML_OPS=false \
-e LANGS=en_GB \
--name stirling-pdf \ --name stirling-pdf \
frooodle/s-pdf:latest frooodle/s-pdf:latest
@@ -122,7 +130,9 @@ docker run -d \
-v /location/of/customFiles:/customFiles \ -v /location/of/customFiles:/customFiles \
``` ```
Docker Compose Docker Compose
```yaml ```yaml
version: '3.3' version: '3.3'
services: services:
@@ -138,59 +148,67 @@ services:
environment: environment:
- DOCKER_ENABLE_SECURITY=false - DOCKER_ENABLE_SECURITY=false
- INSTALL_BOOK_AND_ADVANCED_HTML_OPS=false - INSTALL_BOOK_AND_ADVANCED_HTML_OPS=false
- LANGS=en_GB
``` ```
Note: Podman is CLI-compatible with Docker, so simply replace "docker" with "podman". Note: Podman is CLI-compatible with Docker, so simply replace "docker" with "podman".
## Enable OCR/Compression feature ## Enable OCR/Compression feature
Please view https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToUseOCR.md Please view https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToUseOCR.md
## Supported Languages ## Supported Languages
Stirling PDF currently supports 26! Stirling PDF currently supports 27!
- English (English) (en_GB)
- English (US) (en_US) | Language | Progress |
- Arabic (العربية) (ar_AR) | ------------------------------------------- | -------------------------------------- |
- German (Deutsch) (de_DE) | English (English) (en_GB) | ![100%](https://geps.dev/progress/100) |
- French (Français) (fr_FR) | English (US) (en_US) | ![100%](https://geps.dev/progress/100) |
- Spanish (Español) (es_ES) | Arabic (العربية) (ar_AR) | ![58%](https://geps.dev/progress/58) |
- Simplified Chinese (简体中文) (zh_CN) | German (Deutsch) (de_DE) | ![98%](https://geps.dev/progress/98) |
- Traditional Chinese (繁體中文) (zh_TW) | French (Français) (fr_FR) | ![93%](https://geps.dev/progress/93) |
- Catalan (Català) (ca_CA) | Spanish (Español) (es_ES) | ![99%](https://geps.dev/progress/99) |
- Italian (Italiano) (it_IT) | Simplified Chinese (简体中文) (zh_CN) | ![98%](https://geps.dev/progress/98) |
- Swedish (Svenska) (sv_SE) | Traditional Chinese (繁體中文) (zh_TW) | ![98%](https://geps.dev/progress/98) |
- Polish (Polski) (pl_PL) | Catalan (Català) (ca_CA) | ![64%](https://geps.dev/progress/64) |
- Romanian (Română) (ro_RO) | Italian (Italiano) (it_IT) | ![98%](https://geps.dev/progress/98) |
- Korean (한국어) (ko_KR) | Swedish (Svenska) (sv_SE) | ![58%](https://geps.dev/progress/58) |
- Portuguese Brazilian (Português) (pt_BR) | Polish (Polski) (pl_PL) | ![59%](https://geps.dev/progress/59) |
- Russian (Русский) (ru_RU) | Romanian (Română) (ro_RO) | ![57%](https://geps.dev/progress/57) |
- Basque (Euskara) (eu_ES) | Korean (한국어) (ko_KR) | ![93%](https://geps.dev/progress/93) |
- Japanese (日本語) (ja_JP) | Portuguese Brazilian (Português) (pt_BR) | ![73%](https://geps.dev/progress/73) |
- Dutch (Nederlands) (nl_NL) | Russian (Русский) (ru_RU) | ![93%](https://geps.dev/progress/93) |
- Greek (el_GR) | Basque (Euskara) (eu_ES) | ![75%](https://geps.dev/progress/75) |
- Turkish (Türkçe) (tr_TR) | Japanese (日本語) (ja_JP) | ![93%](https://geps.dev/progress/93) |
- Indonesia (Bahasa Indonesia) (id_ID) | Dutch (Nederlands) (nl_NL) | ![91%](https://geps.dev/progress/91) |
- Hindi (हिंदी) (hi_IN) | Greek (Ελληνικά) (el_GR) | ![91%](https://geps.dev/progress/91) |
- Hungarian (Magyar) (hu_HU) | Turkish (Türkçe) (tr_TR) | ![99%](https://geps.dev/progress/99) |
- Bulgarian (Български) (bg_BG) | Indonesia (Bahasa Indonesia) (id_ID) | ![86%](https://geps.dev/progress/86) |
- Sebian Latin alphabet (Srpski) (sr_LATN_RS) | Hindi (हिंदी) (hi_IN) | ![87%](https://geps.dev/progress/87) |
| Hungarian (Magyar) (hu_HU) | ![86%](https://geps.dev/progress/86) |
| Bulgarian (Български) (bg_BG) | ![81%](https://geps.dev/progress/81) |
| Sebian Latin alphabet (Srpski) (sr_LATN_RS) | ![88%](https://geps.dev/progress/88) |
| Ukrainian (Українська) (uk_UA) | ![93%](https://geps.dev/progress/93) |
## Contributing (creating issues, translations, fixing bugs, etc.) ## Contributing (creating issues, translations, fixing bugs, etc.)
Please see our [Contributing Guide](CONTRIBUTING.md)! Please see our [Contributing Guide](CONTRIBUTING.md)!
## Customisation ## Customisation
Stirling PDF allows easy customization of the app. Stirling PDF allows easy customization of the app.
Includes things like Includes things like
- Custom application name
- Custom slogans, icons, images, and even custom HTML (via file overrides)
- Custom application name
- Custom slogans, icons, HTML, images CSS etc (via file overrides)
There are two options for this, either using the generated settings file ``settings.yml`` There are two options for this, either using the generated settings file ``settings.yml``
This file is located in the ``/configs`` directory and follows standard YAML formatting This file is located in the ``/configs`` directory and follows standard YAML formatting
Environment variables are also supported and would override the settings file Environment variables are also supported and would override the settings file
For example in the settings.yml you have For example in the settings.yml you have
```yaml ```yaml
system: system:
defaultLocale: 'en-US' defaultLocale: 'en-US'
@@ -199,6 +217,7 @@ system:
To have this via an environment variable you would have ``SYSTEM_DEFAULTLOCALE`` To have this via an environment variable you would have ``SYSTEM_DEFAULTLOCALE``
The Current list of settings is The Current list of settings is
```yaml ```yaml
security: security:
enableLogin: false # set to 'true' to enable login enableLogin: false # set to 'true' to enable login
@@ -208,6 +227,9 @@ system:
defaultLocale: 'en-US' # Set the default language (e.g. 'de-DE', 'fr-FR', etc) defaultLocale: 'en-US' # Set the default language (e.g. 'de-DE', 'fr-FR', etc)
googlevisibility: false # 'true' to allow Google visibility (via robots.txt), 'false' to disallow googlevisibility: false # 'true' to allow Google visibility (via robots.txt), 'false' to disallow
customStaticFilePath: '/customFiles/static/' # Directory path for custom static files customStaticFilePath: '/customFiles/static/' # Directory path for custom static files
showUpdate: true # see when a new update is available
showUpdateOnlyAdmin: false # Only admins can see when a new update is available, depending on showUpdate it must be set to 'true'
customHTMLFiles: false # enable to have files placed in /customFiles/templates override the existing template html files
#ui: #ui:
# appName: exampleAppName # Application's visible name # appName: exampleAppName # Application's visible name
@@ -221,24 +243,31 @@ endpoints:
metrics: metrics:
enabled: true # 'true' to enable Info APIs endpoints (view http://localhost:8080/swagger-ui/index.html#/API to learn more), 'false' to disable enabled: true # 'true' to enable Info APIs endpoints (view http://localhost:8080/swagger-ui/index.html#/API to learn more), 'false' to disable
``` ```
### Extra notes ### Extra notes
- Endpoints. Currently, the endpoints ENDPOINTS_TO_REMOVE and GROUPS_TO_REMOVE can include comma separate lists of endpoints and groups to disable as example ENDPOINTS_TO_REMOVE=img-to-pdf,remove-pages would disable both image-to-pdf and remove pages, GROUPS_TO_REMOVE=LibreOffice Would disable all things that use LibreOffice. You can see a list of all endpoints and groups [here](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/Endpoint-groups.md) - Endpoints. Currently, the endpoints ENDPOINTS_TO_REMOVE and GROUPS_TO_REMOVE can include comma separate lists of endpoints and groups to disable as example ENDPOINTS_TO_REMOVE=img-to-pdf,remove-pages would disable both image-to-pdf and remove pages, GROUPS_TO_REMOVE=LibreOffice Would disable all things that use LibreOffice. You can see a list of all endpoints and groups [here](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/Endpoint-groups.md)
- customStaticFilePath. Customise static files such as the app logo by placing files in the /customFiles/static/ directory. An example of customising app logo is placing a /customFiles/static/favicon.svg to override current SVG. This can be used to change any images/icons/css/fonts/js etc in Stirling-PDF - customStaticFilePath. Customise static files such as the app logo by placing files in the /customFiles/static/ directory. An example of customising app logo is placing a /customFiles/static/favicon.svg to override current SVG. This can be used to change any images/icons/css/fonts/js etc in Stirling-PDF
### Environment only parameters ### Environment only parameters
- ``SYSTEM_ROOTURIPATH`` ie set to ``/pdf-app`` to Set the application's root URI to ``localhost:8080/pdf-app`` - ``SYSTEM_ROOTURIPATH`` ie set to ``/pdf-app`` to Set the application's root URI to ``localhost:8080/pdf-app``
- ``SYSTEM_CONNECTIONTIMEOUTMINUTES`` to set custom connection timeout values - ``SYSTEM_CONNECTIONTIMEOUTMINUTES`` to set custom connection timeout values
- ``DOCKER_ENABLE_SECURITY`` to tell docker to download security jar (required as true for auth login) - ``DOCKER_ENABLE_SECURITY`` to tell docker to download security jar (required as true for auth login)
- ``INSTALL_BOOK_AND_ADVANCED_HTML_OPS`` to download calibre onto stirling-pdf enabling pdf to/from book and advanced html conversion - ``INSTALL_BOOK_AND_ADVANCED_HTML_OPS`` to download calibre onto stirling-pdf enabling pdf to/from book and advanced html conversion
- ``LANGS`` to define custom font libraries to install for use for document conversions
## API ## API
For those wanting to use Stirling-PDFs backend API to link with their own custom scripting to edit PDFs you can view all existing API documentation For those wanting to use Stirling-PDFs backend API to link with their own custom scripting to edit PDFs you can view all existing API documentation
[here](https://app.swaggerhub.com/apis-docs/Stirling-Tools/Stirling-PDF/) or navigate to /swagger-ui/index.html of your stirling-pdf instance for your versions documentation (Or by following the API button in your settings of Stirling-PDF) [here](https://app.swaggerhub.com/apis-docs/Stirling-Tools/Stirling-PDF/) or navigate to /swagger-ui/index.html of your stirling-pdf instance for your versions documentation (Or by following the API button in your settings of Stirling-PDF)
## Login authentication ## Login authentication
![stirling-login](images/login-light.png) ![stirling-login](images/login-light.png)
### Prerequisites: ### Prerequisites:
- User must have the folder ./configs volumed within docker so that it is retained during updates. - User must have the folder ./configs volumed within docker so that it is retained during updates.
- Docker uses must download the security jar version by setting ``DOCKER_ENABLE_SECURITY`` to ``true`` in environment variables. - Docker uses must download the security jar version by setting ``DOCKER_ENABLE_SECURITY`` to ``true`` in environment variables.
- Then either enable login via the settings.yml file or via setting ``SECURITY_ENABLE_LOGIN`` to ``true`` - Then either enable login via the settings.yml file or via setting ``SECURITY_ENABLE_LOGIN`` to ``true``
@@ -257,6 +286,7 @@ For API usage you must provide a header with 'X-API-Key' and the associated API
## FAQ ## FAQ
### Q1: What are your planned features? ### Q1: What are your planned features?
- Progress bar/Tracking - Progress bar/Tracking
- Full custom logic pipelines to combine multiple operations together. - Full custom logic pipelines to combine multiple operations together.
- Folder support with auto scanning to perform operations on - Folder support with auto scanning to perform operations on
@@ -266,7 +296,9 @@ For API usage you must provide a header with 'X-API-Key' and the associated API
- Fill forms manually or automatically - Fill forms manually or automatically
### Q2: Why is my application downloading .htm files? ### Q2: Why is my application downloading .htm files?
This is an issue caused commonly by your NGINX configuration. The default file upload size for NGINX is 1MB, you need to add the following in your Nginx sites-available file. ``client_max_body_size SIZE;`` Where "SIZE" is 50M for example for 50MB files. This is an issue caused commonly by your NGINX configuration. The default file upload size for NGINX is 1MB, you need to add the following in your Nginx sites-available file. ``client_max_body_size SIZE;`` Where "SIZE" is 50M for example for 50MB files.
### Q3: Why is my download timing out ### Q3: Why is my download timing out
NGINX has timeout values by default so if you are running Stirling-PDF behind NGINX you may need to set a timeout value such as adding the config ``proxy_read_timeout 3600;`` NGINX has timeout values by default so if you are running Stirling-PDF behind NGINX you may need to set a timeout value such as adding the config ``proxy_read_timeout 3600;``

View File

@@ -12,7 +12,7 @@ plugins {
import com.github.jk1.license.render.* import com.github.jk1.license.render.*
group = 'stirling.software' group = 'stirling.software'
version = '0.22.7' version = '0.23.1'
sourceCompatibility = '17' sourceCompatibility = '17'
repositories { repositories {

View File

@@ -1,5 +1,5 @@
apiVersion: v2 apiVersion: v2
appVersion: 0.22.6 appVersion: 0.23.1
description: locally hosted web application that allows you to perform various operations description: locally hosted web application that allows you to perform various operations
on PDF files on PDF files
home: https://github.com/Stirling-Tools/Stirling-PDF home: https://github.com/Stirling-Tools/Stirling-PDF

View File

@@ -21,6 +21,8 @@ services:
environment: environment:
DOCKER_ENABLE_SECURITY: "false" DOCKER_ENABLE_SECURITY: "false"
SECURITY_ENABLELOGIN: "false" SECURITY_ENABLELOGIN: "false"
LANGS: "en_GB,en_US,ar_AR,de_DE,fr_FR,es_ES,zh_CN,zh_TW,ca_CA,it_IT,sv_SE,pl_PL,ro_RO,ko_KR,pt_BR,ru_RU,el_GR,hi_IN,hu_HU,tr_TR,id_ID"
INSTALL_BOOK_AND_ADVANCED_HTML_OPS: "true"
SYSTEM_DEFAULTLOCALE: en-US SYSTEM_DEFAULTLOCALE: en-US
UI_APPNAME: Stirling-PDF UI_APPNAME: Stirling-PDF
UI_HOMEDESCRIPTION: Demo site for Stirling-PDF Latest UI_HOMEDESCRIPTION: Demo site for Stirling-PDF Latest

BIN
images/stirling-home.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 203 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 131 KiB

View File

@@ -0,0 +1,122 @@
"""A script to update language progress status in README.md based on
properties file comparison.
This script compares default properties file with others in a directory to
determine language progress.
It then updates README.md based on provided progress list.
Author: Ludy87
Example:
To use this script, simply run it from command line:
$ python counter_translation.py
"""
import os
import glob
import re
from typing import List, Tuple
def write_readme(progress_list: List[Tuple[str, int]]) -> None:
"""
Updates the progress status in the README.md file based
on the provided progress list.
Parameters:
progress_list (List[Tuple[str, int]]): A list of tuples containing
language and progress percentage.
Returns:
None
"""
with open("README.md", "r", encoding="utf-8") as file:
content = file.read()
lines = content.split("\n")
for i, line in enumerate(lines[2:], start=2):
for progress in progress_list:
language, value = progress
if language in line:
match = re.search(r"\!\[(\d+(\.\d+)?)%\]\(.*\)", line)
if match:
lines[i] = line.replace(
match.group(0),
f"![{value}%](https://geps.dev/progress/{value})",
)
new_content = "\n".join(lines)
with open("README.md", "w", encoding="utf-8") as file:
file.write(new_content)
def compare_files(default_file_path, files_directory) -> List[Tuple[str, int]]:
"""
Compares the default properties file with other
properties files in the directory.
Parameters:
default_file_path (str): The path to the default properties file.
files_directory (str): The directory containing other properties files.
Returns:
List[Tuple[str, int]]: A list of tuples containing
language and progress percentage.
"""
file_paths = glob.glob(os.path.join(files_directory, "messages_*.properties"))
num_lines = sum(1 for _ in open(default_file_path, encoding="utf-8"))
result_list = []
for file_path in file_paths:
language = (
os.path.basename(file_path)
.split("messages_", 1)[1]
.split(".properties", 1)[0]
)
fails = 0
if "en_GB" in language or "en_US" in language:
result_list.append(("en_GB", 100))
result_list.append(("en_US", 100))
continue
with open(default_file_path, "r", encoding="utf-8") as default_file, open(
file_path, "r", encoding="utf-8"
) as file:
for _ in range(5):
next(default_file)
try:
next(file)
except StopIteration:
fails = num_lines
for _, (line_default, line_file) in enumerate(
zip(default_file, file), start=6
):
try:
if (
line_default.split("=", 1)[1].strip()
== line_file.split("=", 1)[1].strip()
):
fails += 1
except IndexError:
pass
result_list.append(
(
language,
int((num_lines - fails) * 100 / num_lines),
)
)
unique_data = list(set(result_list))
unique_data.sort(key=lambda x: x[1], reverse=True)
return unique_data
if __name__ == "__main__":
directory = os.path.join(os.getcwd(), "src", "main", "resources")
reference_file = os.path.join(directory, "messages_en_GB.properties")
write_readme(compare_files(reference_file, directory))

View File

@@ -1,26 +1,31 @@
#!/bin/sh #!/bin/bash
# Update the user and group IDs as per environment variables # Update the user and group IDs as per environment variables
if [ ! -z "$PUID" ] && [ "$PUID" != "$(id -u stirlingpdfuser)" ]; then if [ ! -z "$PUID" ] && [ "$PUID" != "$(id -u stirlingpdfuser)" ]; then
usermod -o -u "$PUID" stirlingpdfuser || true usermod -o -u "$PUID" stirlingpdfuser || true
fi fi
if [ ! -z "$PGID" ] && [ "$PGID" != "$(getent group stirlingpdfgroup | cut -d: -f3)" ]; then if [ ! -z "$PGID" ] && [ "$PGID" != "$(getent group stirlingpdfgroup | cut -d: -f3)" ]; then
groupmod -o -g "$PGID" stirlingpdfgroup || true groupmod -o -g "$PGID" stirlingpdfgroup || true
fi fi
umask "$UMASK" || true umask "$UMASK" || true
if [[ "$INSTALL_BOOK_AND_ADVANCED_HTML_OPS" == "true" ]]; then if [[ "$INSTALL_BOOK_AND_ADVANCED_HTML_OPS" == "true" ]]; then
apk add --no-cache calibre@testing apk add --no-cache calibre@testing
fi fi
/scripts/download-security-jar.sh /scripts/download-security-jar.sh
if [[ -n "$LANGS" ]]; then
/scripts/installFonts.sh $LANGS
fi
echo "Setting permissions and ownership for necessary directories..." echo "Setting permissions and ownership for necessary directories..."
if chown -R stirlingpdfuser:stirlingpdfgroup $HOME /logs /scripts /usr/share/fonts/opentype/noto /usr/share/tessdata /configs /customFiles /pipeline /app.jar; then # Attempt to change ownership of directories and files
chmod -R 755 /logs /scripts /usr/share/fonts/opentype/noto /usr/share/tessdata /configs /customFiles /pipeline /app.jar || true if chown -R stirlingpdfuser:stirlingpdfgroup $HOME /logs /scripts /usr/share/fonts/opentype/noto /configs /customFiles /pipeline /app.jar; then
# If chown succeeds, execute the command as stirlingpdfuser chmod -R 755 /logs /scripts /usr/share/fonts/opentype/noto /configs /customFiles /pipeline /app.jar || true
# If chown succeeds, execute the command as stirlingpdfuser
exec su-exec stirlingpdfuser "$@" exec su-exec stirlingpdfuser "$@"
else else
# If chown fails, execute the command without changing the user context # If chown fails, execute the command without changing the user context

View File

@@ -13,18 +13,6 @@ if [ -d /usr/share/tesseract-ocr/5/tessdata ]; then
cp -r /usr/share/tesseract-ocr/5/tessdata/* /usr/share/tessdata || true; cp -r /usr/share/tesseract-ocr/5/tessdata/* /usr/share/tessdata || true;
fi fi
# Update the user and group IDs as per environment variables
if [ ! -z "$PUID" ] && [ "$PUID" != "$(id -u stirlingpdfuser)" ]; then
usermod -o -u "$PUID" stirlingpdfuser || true
fi
if [ ! -z "$PGID" ] && [ "$PGID" != "$(getent group stirlingpdfgroup | cut -d: -f3)" ]; then
groupmod -o -g "$PGID" stirlingpdfgroup || true
fi
umask "$UMASK" || true
# Check if TESSERACT_LANGS environment variable is set and is not empty # Check if TESSERACT_LANGS environment variable is set and is not empty
if [[ -n "$TESSERACT_LANGS" ]]; then if [[ -n "$TESSERACT_LANGS" ]]; then
# Convert comma-separated values to a space-separated list # Convert comma-separated values to a space-separated list
@@ -40,20 +28,4 @@ if [[ -n "$TESSERACT_LANGS" ]]; then
done done
fi fi
if [[ "$INSTALL_BOOK_AND_ADVANCED_HTML_OPS" == "true" ]]; then /scripts/init-without-ocr.sh "$@"
apk add --no-cache calibre@testing
fi
/scripts/download-security-jar.sh
echo "Setting permissions and ownership for necessary directories..."
# Attempt to change ownership of directories and files
if chown -R stirlingpdfuser:stirlingpdfgroup $HOME /logs /scripts /usr/share/fonts/opentype/noto /usr/share/tessdata /configs /customFiles /pipeline /app.jar; then
chmod -R 755 /logs /scripts /usr/share/fonts/opentype/noto /usr/share/tessdata /configs /customFiles /pipeline /app.jar || true
# If chown succeeds, execute the command as stirlingpdfuser
exec su-exec stirlingpdfuser "$@"
else
# If chown fails, execute the command without changing the user context
echo "[WARN] Chown failed, running as host user"
exec "$@"
fi

67
scripts/installFonts.sh Normal file
View File

@@ -0,0 +1,67 @@
#!/bin/bash
LANGS=$1
# Function to install a font package
install_font() {
echo "Installing font package: $1"
if ! apk add "$1" --no-cache; then
echo "Failed to install $1"
fi
}
# Install common fonts used across many languages
#common_fonts=(
# font-terminus
# font-dejavu
# font-noto
# font-noto-cjk
# font-awesome
# font-noto-extra
#)
#
#for font in "${common_fonts[@]}"; do
# install_font $font
#done
# Map languages to specific font packages
declare -A language_fonts=(
["ar_AR"]="font-noto-arabic"
["zh_CN"]="font-isas-misc"
["zh_TW"]="font-isas-misc"
["ja_JP"]="font-noto font-noto-thai font-noto-tibetan font-ipa font-sony-misc font-jis-misc"
["ru_RU"]="font-vollkorn font-misc-cyrillic font-mutt-misc font-screen-cyrillic font-winitzki-cyrillic font-cronyx-cyrillic"
["sr_LATN_RS"]="font-vollkorn font-misc-cyrillic font-mutt-misc font-screen-cyrillic font-winitzki-cyrillic font-cronyx-cyrillic"
["uk_UA"]="font-vollkorn font-misc-cyrillic font-mutt-misc font-screen-cyrillic font-winitzki-cyrillic font-cronyx-cyrillic"
["ko_KR"]="font-noto font-noto-thai font-noto-tibetan"
["el_GR"]="font-noto"
["hi_IN"]="font-noto-devanagari"
["bg_BG"]="font-vollkorn font-misc-cyrillic"
["GENERAL"]="font-terminus font-dejavu font-noto font-noto-cjk font-awesome font-noto-extra"
)
# Install fonts for other languages which generally do not need special packages beyond 'font-noto'
other_langs=("en_GB" "en_US" "de_DE" "fr_FR" "es_ES" "ca_CA" "it_IT" "pt_BR" "nl_NL" "sv_SE" "pl_PL" "ro_RO" "hu_HU" "tr_TR" "id_ID" "eu_ES")
if [[ $LANGS == "ALL" ]]; then
# Install all fonts from the language_fonts map
for fonts in "${language_fonts[@]}"; do
for font in $fonts; do
install_font $font
done
done
else
# Split comma-separated languages and install necessary fonts
IFS=',' read -ra LANG_CODES <<< "$LANGS"
for code in "${LANG_CODES[@]}"; do
if [[ " ${other_langs[@]} " =~ " ${code} " ]]; then
install_font font-noto
else
fonts_to_install=${language_fonts[$code]}
if [ ! -z "$fonts_to_install" ]; then
for font in $fonts_to_install; do
install_font $font
done
fi
fi
done
fi

View File

@@ -62,6 +62,7 @@ public class SPdfApplication {
} }
public static void main(String[] args) throws IOException, InterruptedException { public static void main(String[] args) throws IOException, InterruptedException {
SpringApplication app = new SpringApplication(SPdfApplication.class); SpringApplication app = new SpringApplication(SPdfApplication.class);
app.addInitializers(new ConfigInitializer()); app.addInitializers(new ConfigInitializer());
if (Files.exists(Paths.get("configs/settings.yml"))) { if (Files.exists(Paths.get("configs/settings.yml"))) {

View File

@@ -6,18 +6,35 @@ import java.nio.file.Paths;
import java.util.Properties; import java.util.Properties;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.thymeleaf.spring6.SpringTemplateEngine;
import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.ApplicationProperties;
@Configuration @Configuration
@Lazy
public class AppConfig { public class AppConfig {
@Autowired ApplicationProperties applicationProperties; @Autowired ApplicationProperties applicationProperties;
@Bean
@ConditionalOnProperty(
name = "system.customHTMLFiles",
havingValue = "true",
matchIfMissing = false)
public SpringTemplateEngine templateEngine(ResourceLoader resourceLoader) {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.addTemplateResolver(new FileFallbackTemplateResolver(resourceLoader));
return templateEngine;
}
@Bean(name = "loginEnabled") @Bean(name = "loginEnabled")
public boolean loginEnabled() { public boolean loginEnabled() {
return applicationProperties.getSecurity().getEnableLogin(); return applicationProperties.getSecurity().getEnableLogin();
@@ -85,4 +102,10 @@ public class AppConfig {
} }
return "true".equalsIgnoreCase(installOps); return "true".equalsIgnoreCase(installOps);
} }
@ConditionalOnMissingClass("stirling.software.SPDF.config.security.SecurityConfiguration")
@Bean(name = "activSecurity")
public boolean missingActivSecurity() {
return false;
}
} }

View File

@@ -0,0 +1,25 @@
package stirling.software.SPDF.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;
import stirling.software.SPDF.model.ApplicationProperties;
@Service
class AppUpdateService {
@Autowired private ApplicationProperties applicationProperties;
@Autowired(required = false)
ShowAdminInterface showAdmin;
@Bean(name = "shouldShow")
@Scope("request")
public boolean shouldShow() {
boolean showUpdate = applicationProperties.getSystem().getShowUpdate();
boolean showAdminResult = (showAdmin != null) ? showAdmin.getShowUpdateOnlyAdmins() : true;
return showUpdate && showAdminResult;
}
}

View File

@@ -146,7 +146,6 @@ public class EndpointConfiguration {
addEndpointToGroup("CLI", "xlsx-to-pdf"); addEndpointToGroup("CLI", "xlsx-to-pdf");
addEndpointToGroup("CLI", "pdf-to-word"); addEndpointToGroup("CLI", "pdf-to-word");
addEndpointToGroup("CLI", "pdf-to-presentation"); addEndpointToGroup("CLI", "pdf-to-presentation");
addEndpointToGroup("CLI", "pdf-to-text");
addEndpointToGroup("CLI", "pdf-to-html"); addEndpointToGroup("CLI", "pdf-to-html");
addEndpointToGroup("CLI", "pdf-to-xml"); addEndpointToGroup("CLI", "pdf-to-xml");
addEndpointToGroup("CLI", "ocr-pdf"); addEndpointToGroup("CLI", "ocr-pdf");
@@ -154,6 +153,7 @@ public class EndpointConfiguration {
addEndpointToGroup("CLI", "url-to-pdf"); addEndpointToGroup("CLI", "url-to-pdf");
addEndpointToGroup("CLI", "book-to-pdf"); addEndpointToGroup("CLI", "book-to-pdf");
addEndpointToGroup("CLI", "pdf-to-book"); addEndpointToGroup("CLI", "pdf-to-book");
addEndpointToGroup("CLI", "pdf-to-rtf");
// Calibre // Calibre
addEndpointToGroup("Calibre", "book-to-pdf"); addEndpointToGroup("Calibre", "book-to-pdf");
@@ -175,7 +175,7 @@ public class EndpointConfiguration {
addEndpointToGroup("LibreOffice", "xlsx-to-pdf"); addEndpointToGroup("LibreOffice", "xlsx-to-pdf");
addEndpointToGroup("LibreOffice", "pdf-to-word"); addEndpointToGroup("LibreOffice", "pdf-to-word");
addEndpointToGroup("LibreOffice", "pdf-to-presentation"); addEndpointToGroup("LibreOffice", "pdf-to-presentation");
addEndpointToGroup("LibreOffice", "pdf-to-text"); addEndpointToGroup("LibreOffice", "pdf-to-rtf");
addEndpointToGroup("LibreOffice", "pdf-to-html"); addEndpointToGroup("LibreOffice", "pdf-to-html");
addEndpointToGroup("LibreOffice", "pdf-to-xml"); addEndpointToGroup("LibreOffice", "pdf-to-xml");
@@ -218,6 +218,7 @@ public class EndpointConfiguration {
addEndpointToGroup("Java", "overlay-pdf"); addEndpointToGroup("Java", "overlay-pdf");
addEndpointToGroup("Java", "split-pdf-by-sections"); addEndpointToGroup("Java", "split-pdf-by-sections");
addEndpointToGroup("Java", REMOVE_BLANKS); addEndpointToGroup("Java", REMOVE_BLANKS);
addEndpointToGroup("Java", "pdf-to-text");
// Javascript // Javascript
addEndpointToGroup("Javascript", "pdf-organizer"); addEndpointToGroup("Javascript", "pdf-organizer");

View File

@@ -0,0 +1,48 @@
package stirling.software.SPDF.config;
import java.io.IOException;
import java.util.Map;
import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.thymeleaf.IEngineConfiguration;
import org.thymeleaf.templateresolver.AbstractConfigurableTemplateResolver;
import org.thymeleaf.templateresource.ClassLoaderTemplateResource;
import org.thymeleaf.templateresource.FileTemplateResource;
import org.thymeleaf.templateresource.ITemplateResource;
public class FileFallbackTemplateResolver extends AbstractConfigurableTemplateResolver {
private final ResourceLoader resourceLoader;
public FileFallbackTemplateResolver(ResourceLoader resourceLoader) {
super();
this.resourceLoader = resourceLoader;
setSuffix(".html");
}
// Note this does not work in local IDE, Prod jar only.
@Override
protected ITemplateResource computeTemplateResource(
IEngineConfiguration configuration,
String ownerTemplate,
String template,
String resourceName,
String characterEncoding,
Map<String, Object> templateResolutionAttributes) {
Resource resource =
resourceLoader.getResource("file:./customFiles/templates/" + resourceName);
try {
if (resource.exists() && resource.isReadable()) {
return new FileTemplateResource(resource.getFile().getPath(), characterEncoding);
}
} catch (IOException e) {
}
return new ClassLoaderTemplateResource(
Thread.currentThread().getContextClassLoader(),
"classpath:/templates/" + resourceName,
characterEncoding);
}
}

View File

@@ -0,0 +1,7 @@
package stirling.software.SPDF.config;
public interface ShowAdminInterface {
default boolean getShowUpdateOnlyAdmins() {
return true;
}
}

View File

@@ -0,0 +1,46 @@
package stirling.software.SPDF.config.security;
import java.util.Optional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;
import stirling.software.SPDF.config.ShowAdminInterface;
import stirling.software.SPDF.model.ApplicationProperties;
import stirling.software.SPDF.model.User;
import stirling.software.SPDF.repository.UserRepository;
@Service
class AppUpdateAuthService implements ShowAdminInterface {
@Autowired private UserRepository userRepository;
@Autowired private ApplicationProperties applicationProperties;
public boolean getShowUpdateOnlyAdmins() {
boolean showUpdate = applicationProperties.getSystem().getShowUpdate();
if (!showUpdate) {
return showUpdate;
}
boolean showUpdateOnlyAdmin = applicationProperties.getSystem().getShowUpdateOnlyAdmin();
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication == null || !authentication.isAuthenticated()) {
return !showUpdateOnlyAdmin;
}
if (authentication.getName().equalsIgnoreCase("anonymousUser")) {
return !showUpdateOnlyAdmin;
}
Optional<User> user = userRepository.findByUsername(authentication.getName());
if (user.isPresent() && showUpdateOnlyAdmin) {
return "ROLE_ADMIN".equals(user.get().getRolesAsString());
}
return showUpdate;
}
}

View File

@@ -56,7 +56,7 @@ public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationF
} }
private boolean isDemoUser(String username) { private boolean isDemoUser(String username) {
Optional<User> user = userService.findByUsername(username); Optional<User> user = userService.findByUsernameIgnoreCase(username);
return user.isPresent() return user.isPresent()
&& user.get().getAuthorities().stream() && user.get().getAuthorities().stream()
.anyMatch(authority -> "ROLE_DEMO_USER".equals(authority.getAuthority())); .anyMatch(authority -> "ROLE_DEMO_USER".equals(authority.getAuthority()));

View File

@@ -39,7 +39,7 @@ public class FirstLoginFilter extends OncePerRequestFilter {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication != null && authentication.isAuthenticated()) { if (authentication != null && authentication.isAuthenticated()) {
Optional<User> user = userService.findByUsername(authentication.getName()); Optional<User> user = userService.findByUsernameIgnoreCase(authentication.getName());
if ("GET".equalsIgnoreCase(method) if ("GET".equalsIgnoreCase(method)
&& user.isPresent() && user.isPresent()
&& user.get().isFirstLogin() && user.get().isFirstLogin()

View File

@@ -38,7 +38,7 @@ public class InitialSecuritySetup {
initialUsername, initialPassword, Role.ADMIN.getRoleId(), true); initialUsername, initialPassword, Role.ADMIN.getRoleId(), true);
} }
} }
if (!userService.usernameExists(Role.INTERNAL_API_USER.getRoleId())) { if (!userService.usernameExistsIgnoreCase(Role.INTERNAL_API_USER.getRoleId())) {
userService.saveUser( userService.saveUser(
Role.INTERNAL_API_USER.getRoleId(), Role.INTERNAL_API_USER.getRoleId(),
UUID.randomUUID().toString(), UUID.randomUUID().toString(),

View File

@@ -166,4 +166,9 @@ public class SecurityConfiguration {
public PersistentTokenRepository persistentTokenRepository() { public PersistentTokenRepository persistentTokenRepository() {
return new JPATokenRepositoryImpl(); return new JPATokenRepositoryImpl();
} }
@Bean
public boolean activSecurity() {
return true;
}
} }

View File

@@ -62,7 +62,7 @@ public class UserService implements UserServiceInterface {
public User addApiKeyToUser(String username) { public User addApiKeyToUser(String username) {
User user = User user =
userRepository userRepository
.findByUsername(username) .findByUsernameIgnoreCase(username)
.orElseThrow(() -> new UsernameNotFoundException("User not found")); .orElseThrow(() -> new UsernameNotFoundException("User not found"));
user.setApiKey(generateApiKey()); user.setApiKey(generateApiKey());
@@ -76,7 +76,7 @@ public class UserService implements UserServiceInterface {
public String getApiKeyForUser(String username) { public String getApiKeyForUser(String username) {
User user = User user =
userRepository userRepository
.findByUsername(username) .findByUsernameIgnoreCase(username)
.orElseThrow(() -> new UsernameNotFoundException("User not found")); .orElseThrow(() -> new UsernameNotFoundException("User not found"));
return user.getApiKey(); return user.getApiKey();
} }
@@ -103,7 +103,7 @@ public class UserService implements UserServiceInterface {
} }
public boolean validateApiKeyForUser(String username, String apiKey) { public boolean validateApiKeyForUser(String username, String apiKey) {
Optional<User> userOpt = userRepository.findByUsername(username); Optional<User> userOpt = userRepository.findByUsernameIgnoreCase(username);
return userOpt.isPresent() && userOpt.get().getApiKey().equals(apiKey); return userOpt.isPresent() && userOpt.get().getApiKey().equals(apiKey);
} }
@@ -136,7 +136,7 @@ public class UserService implements UserServiceInterface {
} }
public void deleteUser(String username) { public void deleteUser(String username) {
Optional<User> userOpt = userRepository.findByUsername(username); Optional<User> userOpt = userRepository.findByUsernameIgnoreCase(username);
if (userOpt.isPresent()) { if (userOpt.isPresent()) {
for (Authority authority : userOpt.get().getAuthorities()) { for (Authority authority : userOpt.get().getAuthorities()) {
if (authority.getAuthority().equals(Role.INTERNAL_API_USER.getRoleId())) { if (authority.getAuthority().equals(Role.INTERNAL_API_USER.getRoleId())) {
@@ -151,12 +151,16 @@ public class UserService implements UserServiceInterface {
return userRepository.findByUsername(username).isPresent(); return userRepository.findByUsername(username).isPresent();
} }
public boolean usernameExistsIgnoreCase(String username) {
return userRepository.findByUsernameIgnoreCase(username).isPresent();
}
public boolean hasUsers() { public boolean hasUsers() {
return userRepository.count() > 0; return userRepository.count() > 0;
} }
public void updateUserSettings(String username, Map<String, String> updates) { public void updateUserSettings(String username, Map<String, String> updates) {
Optional<User> userOpt = userRepository.findByUsername(username); Optional<User> userOpt = userRepository.findByUsernameIgnoreCase(username);
if (userOpt.isPresent()) { if (userOpt.isPresent()) {
User user = userOpt.get(); User user = userOpt.get();
Map<String, String> settingsMap = user.getSettings(); Map<String, String> settingsMap = user.getSettings();

View File

@@ -27,7 +27,9 @@ 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.PdfMetadata;
import stirling.software.SPDF.model.api.PDFWithPageNums; import stirling.software.SPDF.model.api.PDFWithPageNums;
import stirling.software.SPDF.utils.PdfUtils;
import stirling.software.SPDF.utils.WebResponseUtils; import stirling.software.SPDF.utils.WebResponseUtils;
@RestController @RestController
@@ -49,6 +51,7 @@ public class SplitPDFController {
// open the pdf document // open the pdf document
PDDocument document = Loader.loadPDF(file.getBytes()); PDDocument document = Loader.loadPDF(file.getBytes());
PdfMetadata metadata = PdfUtils.extractMetadataFromPdf(document);
int totalPages = document.getNumberOfPages(); int totalPages = document.getNumberOfPages();
List<Integer> pageNumbers = request.getPageNumbersList(document, false); List<Integer> pageNumbers = request.getPageNumbersList(document, false);
System.out.println( System.out.println(
@@ -75,6 +78,9 @@ public class SplitPDFController {
} }
previousPageNumber = splitPoint + 1; previousPageNumber = splitPoint + 1;
// Transfer metadata to split pdf
PdfUtils.setMetadataToPdf(splitDocument, metadata);
ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream();
splitDocument.save(baos); splitDocument.save(baos);

View File

@@ -4,8 +4,6 @@ import java.io.ByteArrayOutputStream;
import java.io.IOException; 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.List;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream; import java.util.zip.ZipOutputStream;
@@ -41,117 +39,137 @@ public class SplitPdfBySizeController {
+ " if 10MB and each page is 1MB and you enter 2MB then 5 docs each 2MB (rounded so that it accepts 1.9MB but not 2.1MB) Input:PDF Output:ZIP-PDF Type:SISO") + " if 10MB and each page is 1MB and you enter 2MB then 5 docs each 2MB (rounded so that it accepts 1.9MB but not 2.1MB) Input:PDF Output:ZIP-PDF Type:SISO")
public ResponseEntity<byte[]> autoSplitPdf(@ModelAttribute SplitPdfBySizeOrCountRequest request) public ResponseEntity<byte[]> autoSplitPdf(@ModelAttribute SplitPdfBySizeOrCountRequest request)
throws Exception { throws Exception {
List<ByteArrayOutputStream> splitDocumentsBoas = new ArrayList<ByteArrayOutputStream>();
MultipartFile file = request.getFileInput(); MultipartFile file = request.getFileInput();
PDDocument sourceDocument = Loader.loadPDF(file.getBytes());
// 0 = size, 1 = page count, 2 = doc count
int type = request.getSplitType();
String value = request.getSplitValue();
if (type == 0) { // Split by size
long maxBytes = GeneralUtils.convertSizeToBytes(value);
long currentSize = 0;
PDDocument currentDoc = new PDDocument();
for (PDPage page : sourceDocument.getPages()) {
ByteArrayOutputStream pageOutputStream = new ByteArrayOutputStream();
PDDocument tempDoc = new PDDocument();
tempDoc.addPage(page);
tempDoc.save(pageOutputStream);
tempDoc.close();
long pageSize = pageOutputStream.size();
if (currentSize + pageSize > maxBytes) {
// Save and reset current document
splitDocumentsBoas.add(currentDocToByteArray(currentDoc));
currentDoc = new PDDocument();
currentSize = 0;
}
currentDoc.addPage(page);
currentSize += pageSize;
}
// Add the last document if it contains any pages
if (currentDoc.getPages().getCount() != 0) {
splitDocumentsBoas.add(currentDocToByteArray(currentDoc));
}
} else if (type == 1) { // Split by page count
int pageCount = Integer.parseInt(value);
int currentPageCount = 0;
PDDocument currentDoc = new PDDocument();
for (PDPage page : sourceDocument.getPages()) {
currentDoc.addPage(page);
currentPageCount++;
if (currentPageCount == pageCount) {
// Save and reset current document
splitDocumentsBoas.add(currentDocToByteArray(currentDoc));
currentDoc = new PDDocument();
currentPageCount = 0;
}
}
// Add the last document if it contains any pages
if (currentDoc.getPages().getCount() != 0) {
splitDocumentsBoas.add(currentDocToByteArray(currentDoc));
}
} else if (type == 2) { // Split by doc count
int documentCount = Integer.parseInt(value);
int totalPageCount = sourceDocument.getNumberOfPages();
int pagesPerDocument = totalPageCount / documentCount;
int extraPages = totalPageCount % documentCount;
int currentPageIndex = 0;
for (int i = 0; i < documentCount; i++) {
PDDocument currentDoc = new PDDocument();
int pagesToAdd = pagesPerDocument + (i < extraPages ? 1 : 0);
for (int j = 0; j < pagesToAdd; j++) {
currentDoc.addPage(sourceDocument.getPage(currentPageIndex++));
}
splitDocumentsBoas.add(currentDocToByteArray(currentDoc));
}
} else {
throw new IllegalArgumentException("Invalid argument for split type");
}
sourceDocument.close();
Path zipFile = Files.createTempFile("split_documents", ".zip"); Path zipFile = Files.createTempFile("split_documents", ".zip");
String filename = String filename =
Filenames.toSimpleFileName(file.getOriginalFilename()) Filenames.toSimpleFileName(file.getOriginalFilename())
.replaceFirst("[.][^.]+$", ""); .replaceFirst("[.][^.]+$", "");
byte[] data; byte[] data = null;
try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipFile));
PDDocument sourceDocument = Loader.loadPDF(file.getBytes())) {
try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipFile))) { int type = request.getSplitType();
for (int i = 0; i < splitDocumentsBoas.size(); i++) { String value = request.getSplitValue();
String fileName = filename + "_" + (i + 1) + ".pdf";
ByteArrayOutputStream baos = splitDocumentsBoas.get(i);
byte[] pdf = baos.toByteArray();
ZipEntry pdfEntry = new ZipEntry(fileName); if (type == 0) {
zipOut.putNextEntry(pdfEntry); long maxBytes = GeneralUtils.convertSizeToBytes(value);
zipOut.write(pdf); handleSplitBySize(sourceDocument, maxBytes, zipOut, filename);
zipOut.closeEntry(); } else if (type == 1) {
int pageCount = Integer.parseInt(value);
handleSplitByPageCount(sourceDocument, pageCount, zipOut, filename);
} else if (type == 2) {
int documentCount = Integer.parseInt(value);
handleSplitByDocCount(sourceDocument, documentCount, zipOut, filename);
} else {
throw new IllegalArgumentException("Invalid argument for split type");
} }
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} finally { } finally {
data = Files.readAllBytes(zipFile); data = Files.readAllBytes(zipFile);
Files.delete(zipFile); Files.deleteIfExists(zipFile);
} }
return WebResponseUtils.bytesToWebResponse( return WebResponseUtils.bytesToWebResponse(
data, filename + ".zip", MediaType.APPLICATION_OCTET_STREAM); data, filename + ".zip", MediaType.APPLICATION_OCTET_STREAM);
} }
private ByteArrayOutputStream currentDocToByteArray(PDDocument document) throws IOException { private void handleSplitBySize(
ByteArrayOutputStream baos = new ByteArrayOutputStream(); PDDocument sourceDocument, long maxBytes, ZipOutputStream zipOut, String baseFilename)
document.save(baos); throws IOException {
document.close(); long currentSize = 0;
return baos; PDDocument currentDoc = new PDDocument();
int fileIndex = 1;
for (int pageIndex = 0; pageIndex < sourceDocument.getNumberOfPages(); pageIndex++) {
PDPage page = sourceDocument.getPage(pageIndex);
ByteArrayOutputStream pageOutputStream = new ByteArrayOutputStream();
try (PDDocument tempDoc = new PDDocument()) {
PDPage importedPage = tempDoc.importPage(page); // This creates a new PDPage object
tempDoc.save(pageOutputStream);
}
long pageSize = pageOutputStream.size();
if (currentSize + pageSize > maxBytes) {
if (currentDoc.getNumberOfPages() > 0) {
saveDocumentToZip(currentDoc, zipOut, baseFilename, fileIndex++);
currentDoc.close(); // Make sure to close the document
currentDoc = new PDDocument();
currentSize = 0;
}
}
PDPage newPage = new PDPage(page.getCOSObject()); // Re-create the page
currentDoc.addPage(newPage);
currentSize += pageSize;
}
if (currentDoc.getNumberOfPages() != 0) {
saveDocumentToZip(currentDoc, zipOut, baseFilename, fileIndex++);
currentDoc.close();
}
}
private void handleSplitByPageCount(
PDDocument sourceDocument, int pageCount, ZipOutputStream zipOut, String baseFilename)
throws IOException {
int currentPageCount = 0;
PDDocument currentDoc = new PDDocument();
int fileIndex = 1;
for (PDPage page : sourceDocument.getPages()) {
currentDoc.addPage(page);
currentPageCount++;
if (currentPageCount == pageCount) {
// Save and reset current document
saveDocumentToZip(currentDoc, zipOut, baseFilename, fileIndex++);
currentDoc = new PDDocument();
currentPageCount = 0;
}
}
// Add the last document if it contains any pages
if (currentDoc.getPages().getCount() != 0) {
saveDocumentToZip(currentDoc, zipOut, baseFilename, fileIndex++);
}
}
private void handleSplitByDocCount(
PDDocument sourceDocument,
int documentCount,
ZipOutputStream zipOut,
String baseFilename)
throws IOException {
int totalPageCount = sourceDocument.getNumberOfPages();
int pagesPerDocument = totalPageCount / documentCount;
int extraPages = totalPageCount % documentCount;
int currentPageIndex = 0;
int fileIndex = 1;
for (int i = 0; i < documentCount; i++) {
PDDocument currentDoc = new PDDocument();
int pagesToAdd = pagesPerDocument + (i < extraPages ? 1 : 0);
for (int j = 0; j < pagesToAdd; j++) {
currentDoc.addPage(sourceDocument.getPage(currentPageIndex++));
}
saveDocumentToZip(currentDoc, zipOut, baseFilename, fileIndex++);
}
}
private void saveDocumentToZip(
PDDocument document, ZipOutputStream zipOut, String baseFilename, int index)
throws IOException {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
document.save(outStream);
document.close(); // Close the document to free resources
// Create a new zip entry
ZipEntry zipEntry = new ZipEntry(baseFilename + "_" + index + ".pdf");
zipOut.putNextEntry(zipEntry);
zipOut.write(outStream.toByteArray());
zipOut.closeEntry();
} }
} }

View File

@@ -43,7 +43,7 @@ public class UserController {
@PreAuthorize("!hasAuthority('ROLE_DEMO_USER')") @PreAuthorize("!hasAuthority('ROLE_DEMO_USER')")
@PostMapping("/register") @PostMapping("/register")
public String register(@ModelAttribute UsernameAndPass requestModel, Model model) { public String register(@ModelAttribute UsernameAndPass requestModel, Model model) {
if (userService.usernameExists(requestModel.getUsername())) { if (userService.usernameExistsIgnoreCase(requestModel.getUsername())) {
model.addAttribute("error", "Username already exists"); model.addAttribute("error", "Username already exists");
return "register"; return "register";
} }
@@ -70,7 +70,8 @@ public class UserController {
return new RedirectView("/account?messageType=notAuthenticated"); return new RedirectView("/account?messageType=notAuthenticated");
} }
Optional<User> userOpt = userService.findByUsernameIgnoreCase(principal.getName()); // The username MUST be unique when renaming
Optional<User> userOpt = userService.findByUsername(principal.getName());
if (userOpt == null || userOpt.isEmpty()) { if (userOpt == null || userOpt.isEmpty()) {
return new RedirectView("/account?messageType=userNotFound"); return new RedirectView("/account?messageType=userNotFound");
@@ -113,7 +114,7 @@ public class UserController {
return new RedirectView("/change-creds?messageType=notAuthenticated"); return new RedirectView("/change-creds?messageType=notAuthenticated");
} }
Optional<User> userOpt = userService.findByUsername(principal.getName()); Optional<User> userOpt = userService.findByUsernameIgnoreCase(principal.getName());
if (userOpt == null || userOpt.isEmpty()) { if (userOpt == null || userOpt.isEmpty()) {
return new RedirectView("/change-creds?messageType=userNotFound"); return new RedirectView("/change-creds?messageType=userNotFound");
@@ -146,7 +147,7 @@ public class UserController {
return new RedirectView("/account?messageType=notAuthenticated"); return new RedirectView("/account?messageType=notAuthenticated");
} }
Optional<User> userOpt = userService.findByUsername(principal.getName()); Optional<User> userOpt = userService.findByUsernameIgnoreCase(principal.getName());
if (userOpt == null || userOpt.isEmpty()) { if (userOpt == null || userOpt.isEmpty()) {
return new RedirectView("/account?messageType=userNotFound"); return new RedirectView("/account?messageType=userNotFound");
@@ -207,7 +208,7 @@ public class UserController {
return new RedirectView("/addUsers?messageType=usernameExists"); return new RedirectView("/addUsers?messageType=usernameExists");
} }
} }
if (userService.usernameExists(username)) { if (userService.usernameExistsIgnoreCase(username)) {
return new RedirectView("/addUsers?messageType=usernameExists"); return new RedirectView("/addUsers?messageType=usernameExists");
} }
try { try {
@@ -231,7 +232,7 @@ public class UserController {
public RedirectView deleteUser( public RedirectView deleteUser(
@PathVariable(name = "username") String username, Authentication authentication) { @PathVariable(name = "username") String username, Authentication authentication) {
if (!userService.usernameExists(username)) { if (!userService.usernameExistsIgnoreCase(username)) {
return new RedirectView("/addUsers?messageType=deleteUsernameExists"); return new RedirectView("/addUsers?messageType=deleteUsernameExists");
} }
@@ -239,7 +240,7 @@ public class UserController {
String currentUsername = authentication.getName(); String currentUsername = authentication.getName();
// Check if the provided username matches the current session's username // Check if the provided username matches the current session's username
if (currentUsername.equals(username)) { if (currentUsername.equalsIgnoreCase(username)) {
return new RedirectView("/addUsers?messageType=deleteCurrentUser"); return new RedirectView("/addUsers?messageType=deleteCurrentUser");
} }
invalidateUserSessions(username); invalidateUserSessions(username);

View File

@@ -0,0 +1,32 @@
package stirling.software.SPDF.controller.api.converters;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.model.api.PDFFile;
import stirling.software.SPDF.utils.PDFToFile;
@RestController
@Tag(name = "Convert", description = "Convert APIs")
@RequestMapping("/api/v1/convert")
public class ConvertPDFToHtml {
@PostMapping(consumes = "multipart/form-data", value = "/pdf/html")
@Operation(
summary = "Convert PDF to HTML",
description =
"This endpoint converts a PDF file to HTML format. Input:PDF Output:HTML Type:SISO")
public ResponseEntity<byte[]> processPdfToHTML(@ModelAttribute PDFFile request)
throws Exception {
MultipartFile inputFile = request.getFileInput();
PDFToFile pdfToFile = new PDFToFile();
return pdfToFile.processPdfToHtml(inputFile);
}
}

View File

@@ -16,7 +16,7 @@ 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.api.PDFFile; import stirling.software.SPDF.model.api.converters.PdfToPdfARequest;
import stirling.software.SPDF.utils.ProcessExecutor; import stirling.software.SPDF.utils.ProcessExecutor;
import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult;
import stirling.software.SPDF.utils.WebResponseUtils; import stirling.software.SPDF.utils.WebResponseUtils;
@@ -31,8 +31,10 @@ public class ConvertPDFToPDFA {
summary = "Convert a PDF to a PDF/A", summary = "Convert a PDF to a PDF/A",
description = description =
"This endpoint converts a PDF file to a PDF/A file. PDF/A is a format designed for long-term archiving of digital documents. Input:PDF Output:PDF Type:SISO") "This endpoint converts a PDF file to a PDF/A file. PDF/A is a format designed for long-term archiving of digital documents. Input:PDF Output:PDF Type:SISO")
public ResponseEntity<byte[]> pdfToPdfA(@ModelAttribute PDFFile request) throws Exception { public ResponseEntity<byte[]> pdfToPdfA(@ModelAttribute PdfToPdfARequest request)
throws Exception {
MultipartFile inputFile = request.getFileInput(); MultipartFile inputFile = request.getFileInput();
String outputFormat = request.getOutputFormat();
// Save the uploaded file to a temporary location // Save the uploaded file to a temporary location
Path tempInputFile = Files.createTempFile("input_", ".pdf"); Path tempInputFile = Files.createTempFile("input_", ".pdf");
@@ -47,7 +49,7 @@ public class ConvertPDFToPDFA {
command.add("--skip-text"); command.add("--skip-text");
command.add("--tesseract-timeout=0"); command.add("--tesseract-timeout=0");
command.add("--output-type"); command.add("--output-type");
command.add("pdfa"); command.add(outputFormat.toString());
command.add(tempInputFile.toString()); command.add(tempInputFile.toString());
command.add(tempOutputFile.toString()); command.add(tempOutputFile.toString());

View File

@@ -9,7 +9,6 @@ import java.nio.file.StandardCopyOption;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream; import java.util.zip.ZipOutputStream;
@@ -143,8 +142,7 @@ public class ExtractImageScansController {
.runCommandWithOutputHandling(command); .runCommandWithOutputHandling(command);
// Read the output photos in temp directory // Read the output photos in temp directory
List<Path> tempOutputFiles = List<Path> tempOutputFiles = Files.list(tempDir).sorted().toList();
Files.list(tempDir).sorted().collect(Collectors.toList());
for (Path tempOutputFile : tempOutputFiles) { for (Path tempOutputFile : tempOutputFiles) {
byte[] imageBytes = Files.readAllBytes(tempOutputFile); byte[] imageBytes = Files.readAllBytes(tempOutputFile);
processedImageBytes.add(imageBytes); processedImageBytes.add(imageBytes);

View File

@@ -1,27 +1,29 @@
package stirling.software.SPDF.controller.api.misc; package stirling.software.SPDF.controller.api.misc;
import java.awt.AlphaComposite;
import java.awt.BasicStroke;
import java.awt.Color; import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.AffineTransform; import java.awt.geom.AffineTransform;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Path2D;
import java.awt.image.AffineTransformOp; import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp; import java.awt.image.BufferedImageOp;
import java.awt.image.ConvolveOp; import java.awt.image.ConvolveOp;
import java.awt.image.Kernel; import java.awt.image.Kernel;
import java.awt.image.RescaleOp;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.security.SecureRandom; import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.List;
import java.util.Random; import java.util.Random;
import javax.imageio.ImageIO;
import org.apache.pdfbox.Loader; import org.apache.pdfbox.Loader;
import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.graphics.image.JPEGFactory;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.rendering.ImageType; import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer; import org.apache.pdfbox.rendering.PDFRenderer;
@@ -29,6 +31,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
@@ -39,6 +42,7 @@ 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.api.PDFFile; import stirling.software.SPDF.model.api.PDFFile;
import stirling.software.SPDF.utils.PdfUtils;
import stirling.software.SPDF.utils.WebResponseUtils; import stirling.software.SPDF.utils.WebResponseUtils;
@RestController @RestController
@@ -48,98 +52,39 @@ public class FakeScanControllerWIP {
private static final Logger logger = LoggerFactory.getLogger(FakeScanControllerWIP.class); private static final Logger logger = LoggerFactory.getLogger(FakeScanControllerWIP.class);
// TODO // TODO finish
@PostMapping(consumes = "multipart/form-data", value = "/fake-scan")
@Hidden @Hidden
// @PostMapping(consumes = "multipart/form-data", value = "/fakeScan")
@Operation( @Operation(
summary = "Repair a PDF file", summary = "Repair a PDF file",
description = description =
"This endpoint repairs a given PDF file by running Ghostscript command. The PDF is first saved to a temporary location, repaired, read back, and then returned as a response.") "This endpoint repairs a given PDF file by running Ghostscript command. The PDF is first saved to a temporary location, repaired, read back, and then returned as a response.")
public ResponseEntity<byte[]> repairPdf(@ModelAttribute PDFFile request) throws IOException { public ResponseEntity<byte[]> fakeScan(@ModelAttribute PDFFile request) throws IOException {
MultipartFile inputFile = request.getFileInput(); MultipartFile inputFile = request.getFileInput();
// Load the PDF document
PDDocument document = Loader.loadPDF(inputFile.getBytes()); PDDocument document = Loader.loadPDF(inputFile.getBytes());
PDFRenderer pdfRenderer = new PDFRenderer(document); PDFRenderer renderer = new PDFRenderer(document);
pdfRenderer.setSubsamplingAllowed(true); List<BufferedImage> images = new ArrayList<>();
for (int page = 0; page < document.getNumberOfPages(); ++page) { // Convert each page to an image
BufferedImage image = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB); for (int i = 0; i < document.getNumberOfPages(); i++) {
ImageIO.write(image, "png", new File("scanned-" + (page + 1) + ".png")); BufferedImage image = renderer.renderImageWithDPI(i, 150, ImageType.GRAY);
images.add(processImage(image));
} }
document.close(); document.close();
// Constants // Create a new PDF document with the processed images
int scannedness = 90; // Value between 0 and 100
int dirtiness = 0; // Value between 0 and 100
// Load the source image
BufferedImage sourceImage = ImageIO.read(new File("scanned-1.png"));
// Create the destination image
BufferedImage destinationImage =
new BufferedImage(
sourceImage.getWidth(), sourceImage.getHeight(), sourceImage.getType());
// Apply a brightness and contrast effect based on the "scanned-ness"
float scaleFactor = 1.0f + (scannedness / 100.0f) * 0.5f; // Between 1.0 and 1.5
float offset = scannedness * 1.5f; // Between 0 and 150
BufferedImageOp op = new RescaleOp(scaleFactor, offset, null);
op.filter(sourceImage, destinationImage);
// Apply a rotation effect
double rotationRequired =
Math.toRadians(
(new SecureRandom().nextInt(3 - 1)
+ 1)); // Random angle between 1 and 3 degrees
double locationX = destinationImage.getWidth() / 2;
double locationY = destinationImage.getHeight() / 2;
AffineTransform tx =
AffineTransform.getRotateInstance(rotationRequired, locationX, locationY);
AffineTransformOp rotateOp = new AffineTransformOp(tx, AffineTransformOp.TYPE_BILINEAR);
destinationImage = rotateOp.filter(destinationImage, null);
// Apply a blur effect based on the "scanned-ness"
float blurIntensity = scannedness / 100.0f * 0.2f; // Between 0.0 and 0.2
float[] matrix = {
blurIntensity, blurIntensity, blurIntensity,
blurIntensity, blurIntensity, blurIntensity,
blurIntensity, blurIntensity, blurIntensity
};
BufferedImageOp blurOp =
new ConvolveOp(new Kernel(3, 3, matrix), ConvolveOp.EDGE_NO_OP, null);
destinationImage = blurOp.filter(destinationImage, null);
// Add noise to the image based on the "dirtiness"
Random random = new SecureRandom();
for (int y = 0; y < destinationImage.getHeight(); y++) {
for (int x = 0; x < destinationImage.getWidth(); x++) {
if (random.nextInt(100) < dirtiness) {
// Change the pixel color to black randomly based on the "dirtiness"
destinationImage.setRGB(x, y, Color.BLACK.getRGB());
}
}
}
// Save the image
ImageIO.write(destinationImage, "PNG", new File("scanned-1.png"));
PDDocument documentOut = new PDDocument();
for (int page = 1; page <= document.getNumberOfPages(); ++page) {
BufferedImage bim = ImageIO.read(new File("scanned-" + page + ".png"));
// Adjust the dimensions of the page
PDPage pdPage = new PDPage(new PDRectangle(bim.getWidth() - 1, bim.getHeight() - 1));
documentOut.addPage(pdPage);
PDImageXObject pdImage = LosslessFactory.createFromImage(documentOut, bim);
PDPageContentStream contentStream = new PDPageContentStream(documentOut, pdPage);
// Draw the image with a slight offset and enlarged dimensions
contentStream.drawImage(pdImage, -1, -1, bim.getWidth() + 2, bim.getHeight() + 2);
contentStream.close();
}
ByteArrayOutputStream baos = new ByteArrayOutputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream();
documentOut.save(baos); PDDocument newDocument = new PDDocument();
documentOut.close(); for (BufferedImage img : images) {
// PDPageContentStream contentStream = new PDPageContentStream(newDocument, new
// PDPage());
PDImageXObject pdImage = JPEGFactory.createFromImage(newDocument, img);
PdfUtils.addImageToDocument(newDocument, pdImage, "maintainAspectRatio", false);
}
newDocument.save(baos);
newDocument.close();
// Return the optimized PDF as a response // Return the optimized PDF as a response
String outputFilename = String outputFilename =
@@ -148,4 +93,232 @@ public class FakeScanControllerWIP {
+ "_scanned.pdf"; + "_scanned.pdf";
return WebResponseUtils.boasToWebResponse(baos, outputFilename); return WebResponseUtils.boasToWebResponse(baos, outputFilename);
} }
public BufferedImage processImage(BufferedImage image) {
// Rotation
image = softenEdges(image, 50);
image = rotate(image, 1);
image = applyGaussianBlur(image, 0.5);
addGaussianNoise(image, 0.5);
image = linearStretch(image);
addDustAndHairs(image, 3);
return image;
}
private BufferedImage rotate(BufferedImage image, double rotation) {
double rotationRequired = Math.toRadians(rotation);
double locationX = image.getWidth() / 2;
double locationY = image.getHeight() / 2;
AffineTransform tx =
AffineTransform.getRotateInstance(rotationRequired, locationX, locationY);
AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_BICUBIC);
return op.filter(image, null);
}
private BufferedImage applyGaussianBlur(BufferedImage image, double sigma) {
int radius = 3; // Fixed radius size for simplicity
int size = 2 * radius + 1;
float[] data = new float[size * size];
double sum = 0.0;
for (int i = -radius; i <= radius; i++) {
for (int j = -radius; j <= radius; j++) {
double xDistance = i * i;
double yDistance = j * j;
double g = Math.exp(-(xDistance + yDistance) / (2 * sigma * sigma));
data[(i + radius) * size + j + radius] = (float) g;
sum += g;
}
}
// Normalize the kernel
for (int i = 0; i < data.length; i++) {
data[i] /= sum;
}
Kernel kernel = new Kernel(size, size, data);
BufferedImageOp op = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
return op.filter(image, null);
}
public BufferedImage softenEdges(BufferedImage image, int featherRadius) {
int width = image.getWidth();
int height = image.getHeight();
BufferedImage output = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = output.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
g2.setRenderingHint(
RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
g2.drawImage(image, 0, 0, null);
g2.setComposite(AlphaComposite.DstIn);
// Top edge
g2.setPaint(
new GradientPaint(
0,
0,
new Color(0, 0, 0, 1f),
0,
featherRadius * 2,
new Color(0, 0, 0, 0f)));
g2.fillRect(0, 0, width, featherRadius);
// Bottom edge
g2.setPaint(
new GradientPaint(
0,
height - featherRadius * 2,
new Color(0, 0, 0, 0f),
0,
height,
new Color(0, 0, 0, 1f)));
g2.fillRect(0, height - featherRadius, width, featherRadius);
// Left edge
g2.setPaint(
new GradientPaint(
0,
0,
new Color(0, 0, 0, 1f),
featherRadius * 2,
0,
new Color(0, 0, 0, 0f)));
g2.fillRect(0, 0, featherRadius, height);
// Right edge
g2.setPaint(
new GradientPaint(
width - featherRadius * 2,
0,
new Color(0, 0, 0, 0f),
width,
0,
new Color(0, 0, 0, 1f)));
g2.fillRect(width - featherRadius, 0, featherRadius, height);
g2.dispose();
return output;
}
private void addDustAndHairs(BufferedImage image, float intensity) {
int width = image.getWidth();
int height = image.getHeight();
Graphics2D g2d = image.createGraphics();
Random random = new SecureRandom();
// Set rendering hints for better quality
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// Calculate the number of artifacts based on intensity
int numSpots = (int) (intensity * 10);
int numHairs = (int) (intensity * 20);
// Add spots with more variable sizes
g2d.setColor(new Color(100, 100, 100, 50)); // Semi-transparent gray
for (int i = 0; i < numSpots; i++) {
int x = random.nextInt(width);
int y = random.nextInt(height);
int ovalSize = 1 + random.nextInt(3); // Base size + variable component
if (random.nextFloat() > 0.9) {
// 10% chance to get a larger spot
ovalSize += random.nextInt(3);
}
g2d.fill(new Ellipse2D.Double(x, y, ovalSize, ovalSize));
}
// Add hairs
g2d.setStroke(new BasicStroke(0.5f)); // Thin stroke for hairs
g2d.setColor(new Color(80, 80, 80, 40)); // Slightly lighter and more transparent
for (int i = 0; i < numHairs; i++) {
int x1 = random.nextInt(width);
int y1 = random.nextInt(height);
int x2 = x1 + random.nextInt(20) - 10; // Random length and direction
int y2 = y1 + random.nextInt(20) - 10;
Path2D.Double hair = new Path2D.Double();
hair.moveTo(x1, y1);
hair.curveTo(x1, y1, (x1 + x2) / 2, (y1 + y2) / 2, x2, y2);
g2d.draw(hair);
}
g2d.dispose();
}
private void addGaussianNoise(BufferedImage image, double strength) {
Random rand = new SecureRandom();
int width = image.getWidth();
int height = image.getHeight();
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
int rgba = image.getRGB(i, j);
int alpha = (rgba >> 24) & 0xff;
int red = (rgba >> 16) & 0xff;
int green = (rgba >> 8) & 0xff;
int blue = rgba & 0xff;
// Apply Gaussian noise
red = (int) (red + rand.nextGaussian() * strength);
green = (int) (green + rand.nextGaussian() * strength);
blue = (int) (blue + rand.nextGaussian() * strength);
// Clamping values to the 0-255 range
red = Math.min(Math.max(0, red), 255);
green = Math.min(Math.max(0, green), 255);
blue = Math.min(Math.max(0, blue), 255);
image.setRGB(i, j, (alpha << 24) | (red << 16) | (green << 8) | blue);
}
}
}
public BufferedImage linearStretch(BufferedImage image) {
int width = image.getWidth();
int height = image.getHeight();
int min = 255;
int max = 0;
// First pass: find the min and max grayscale values
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
int rgb = image.getRGB(x, y);
int gray =
(int)
(((rgb >> 16) & 0xff) * 0.299
+ ((rgb >> 8) & 0xff) * 0.587
+ (rgb & 0xff) * 0.114); // Convert to grayscale
if (gray < min) min = gray;
if (gray > max) max = gray;
}
}
// Second pass: stretch the histogram
for (int y = 0; y < height; y++) {
for (int x = 0; x < width; x++) {
int rgb = image.getRGB(x, y);
int alpha = (rgb >> 24) & 0xff;
int red = (rgb >> 16) & 0xff;
int green = (rgb >> 8) & 0xff;
int blue = rgb & 0xff;
// Apply linear stretch to each channel
red = (int) (((red - min) / (float) (max - min)) * 255);
green = (int) (((green - min) / (float) (max - min)) * 255);
blue = (int) (((blue - min) / (float) (max - min)) * 255);
// Set new RGB value maintaining the alpha channel
rgb = (alpha << 24) | (red << 16) | (green << 8) | blue;
image.setRGB(x, y, rgb);
}
}
return image;
}
} }

View File

@@ -0,0 +1,105 @@
package stirling.software.SPDF.controller.api.misc;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.awt.print.PageFormat;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.IOException;
import java.util.Arrays;
import javax.imageio.ImageIO;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import org.apache.pdfbox.Loader;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.printing.PDFPageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import io.swagger.v3.oas.annotations.tags.Tag;
import stirling.software.SPDF.model.api.misc.PrintFileRequest;
@RestController
@RequestMapping("/api/v1/misc")
@Tag(name = "Misc", description = "Miscellaneous APIs")
public class PrintFileController {
// TODO
// @PostMapping(value = "/print-file", consumes = "multipart/form-data")
// @Operation(
// summary = "Prints PDF/Image file to a set printer",
// description =
// "Input of PDF or Image along with a printer name/URL/IP to match against to
// send it to (Fire and forget) Input:Any Output:N/A Type:SISO")
public ResponseEntity<String> printFile(@ModelAttribute PrintFileRequest request)
throws IOException {
MultipartFile file = request.getFileInput();
String printerName = request.getPrinterName();
String contentType = file.getContentType();
try {
// Find matching printer
PrintService[] services = PrintServiceLookup.lookupPrintServices(null, null);
PrintService selectedService =
Arrays.stream(services)
.filter(
service ->
service.getName().toLowerCase().contains(printerName))
.findFirst()
.orElseThrow(
() ->
new IllegalArgumentException(
"No matching printer found"));
System.out.println("Selected Printer: " + selectedService.getName());
if ("application/pdf".equals(contentType)) {
PDDocument document = Loader.loadPDF(file.getBytes());
PrinterJob job = PrinterJob.getPrinterJob();
job.setPrintService(selectedService);
job.setPageable(new PDFPageable(document));
job.print();
document.close();
} else if (contentType.startsWith("image/")) {
BufferedImage image = ImageIO.read(file.getInputStream());
PrinterJob job = PrinterJob.getPrinterJob();
job.setPrintService(selectedService);
job.setPrintable(
new Printable() {
public int print(
Graphics graphics, PageFormat pageFormat, int pageIndex)
throws PrinterException {
if (pageIndex != 0) {
return NO_SUCH_PAGE;
}
Graphics2D g2d = (Graphics2D) graphics;
g2d.translate(
pageFormat.getImageableX(), pageFormat.getImageableY());
g2d.drawImage(
image,
0,
0,
(int) pageFormat.getImageableWidth(),
(int) pageFormat.getImageableHeight(),
null);
return PAGE_EXISTS;
}
});
job.print();
}
return new ResponseEntity<>(
"File printed successfully to " + selectedService.getName(), HttpStatus.OK);
} catch (Exception e) {
System.err.println("Failed to print: " + e.getMessage());
return new ResponseEntity<>(e.getMessage(), HttpStatus.BAD_REQUEST);
}
}
}

View File

@@ -139,25 +139,29 @@ public class SanitizeController {
for (PDPage page : allPages) { for (PDPage page : allPages) {
PDResources res = page.getResources(); PDResources res = page.getResources();
if (res != null && res.getCOSObject() != null) {
// Remove embedded files from the PDF res.getCOSObject().removeItem(COSName.getPDFName("EmbeddedFiles"));
res.getCOSObject().removeItem(COSName.getPDFName("EmbeddedFiles")); }
} }
} }
private void sanitizeMetadata(PDDocument document) { private void sanitizeMetadata(PDDocument document) {
PDMetadata metadata = document.getDocumentCatalog().getMetadata(); if (document.getDocumentCatalog() != null) {
if (metadata != null) { PDMetadata metadata = document.getDocumentCatalog().getMetadata();
document.getDocumentCatalog().setMetadata(null); if (metadata != null) {
document.getDocumentCatalog().setMetadata(null);
}
} }
} }
private void sanitizeLinks(PDDocument document) throws IOException { private void sanitizeLinks(PDDocument document) throws IOException {
for (PDPage page : document.getPages()) { for (PDPage page : document.getPages()) {
for (PDAnnotation annotation : page.getAnnotations()) { for (PDAnnotation annotation : page.getAnnotations()) {
if (annotation instanceof PDAnnotationLink) { if (annotation != null && annotation instanceof PDAnnotationLink) {
PDAction action = ((PDAnnotationLink) annotation).getAction(); PDAction action = ((PDAnnotationLink) annotation).getAction();
if (action instanceof PDActionLaunch || action instanceof PDActionURI) { if (action != null
&& (action instanceof PDActionLaunch
|| action instanceof PDActionURI)) {
((PDAnnotationLink) annotation).setAction(null); ((PDAnnotationLink) annotation).setAction(null);
} }
} }
@@ -167,7 +171,11 @@ public class SanitizeController {
private void sanitizeFonts(PDDocument document) { private void sanitizeFonts(PDDocument document) {
for (PDPage page : document.getPages()) { for (PDPage page : document.getPages()) {
page.getResources().getCOSObject().removeItem(COSName.getPDFName("Font")); if (page != null
&& page.getResources() != null
&& page.getResources().getCOSObject() != null) {
page.getResources().getCOSObject().removeItem(COSName.getPDFName("Font"));
}
} }
} }
} }

View File

@@ -95,7 +95,7 @@ public class AccountWebController {
// Fetch user details from the database // Fetch user details from the database
Optional<User> user = Optional<User> user =
userRepository.findByUsername( userRepository.findByUsernameIgnoreCase(
username); // Assuming findByUsername method exists username); // Assuming findByUsername method exists
if (!user.isPresent()) { if (!user.isPresent()) {
// Handle error appropriately // Handle error appropriately
@@ -145,7 +145,7 @@ public class AccountWebController {
// Fetch user details from the database // Fetch user details from the database
Optional<User> user = Optional<User> user =
userRepository.findByUsername( userRepository.findByUsernameIgnoreCase(
username); // Assuming findByUsername method exists username); // Assuming findByUsername method exists
if (!user.isPresent()) { if (!user.isPresent()) {
// Handle error appropriately // Handle error appropriately

View File

@@ -17,6 +17,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
@Controller @Controller
@Tag(name = "Misc", description = "Miscellaneous APIs") @Tag(name = "Misc", description = "Miscellaneous APIs")
public class OtherWebController { public class OtherWebController {
@GetMapping("/compress-pdf") @GetMapping("/compress-pdf")
@Hidden @Hidden
public String compressPdfForm(Model model) { public String compressPdfForm(Model model) {
@@ -53,6 +54,13 @@ public class OtherWebController {
return "misc/add-page-numbers"; return "misc/add-page-numbers";
} }
@GetMapping("/fake-scan")
@Hidden
public String fakeScanForm(Model model) {
model.addAttribute("currentPage", "fake-scan");
return "misc/fake-scan";
}
@GetMapping("/extract-images") @GetMapping("/extract-images")
@Hidden @Hidden
public String extractImagesForm(Model model) { public String extractImagesForm(Model model) {
@@ -81,6 +89,13 @@ public class OtherWebController {
return "misc/compare"; return "misc/compare";
} }
@GetMapping("/print-file")
@Hidden
public String printFileForm(Model model) {
model.addAttribute("currentPage", "print-file");
return "misc/print-file";
}
public List<String> getAvailableTesseractLanguages() { public List<String> getAvailableTesseractLanguages() {
String tessdataDir = "/usr/share/tessdata"; String tessdataDir = "/usr/share/tessdata";
File[] files = new File(tessdataDir).listFiles(); File[] files = new File(tessdataDir).listFiles();

View File

@@ -210,6 +210,33 @@ public class ApplicationProperties {
private String rootURIPath; private String rootURIPath;
private String customStaticFilePath; private String customStaticFilePath;
private Integer maxFileSize; private Integer maxFileSize;
private boolean showUpdate;
private Boolean showUpdateOnlyAdmin;
private boolean customHTMLFiles;
public boolean isCustomHTMLFiles() {
return customHTMLFiles;
}
public void setCustomHTMLFiles(boolean customHTMLFiles) {
this.customHTMLFiles = customHTMLFiles;
}
public boolean getShowUpdateOnlyAdmin() {
return showUpdateOnlyAdmin;
}
public void setShowUpdateOnlyAdmin(boolean showUpdateOnlyAdmin) {
this.showUpdateOnlyAdmin = showUpdateOnlyAdmin;
}
public boolean getShowUpdate() {
return showUpdate;
}
public void setShowUpdate(boolean showUpdate) {
this.showUpdate = showUpdate;
}
private Boolean enableAlphaFunctionality; private Boolean enableAlphaFunctionality;
@@ -275,6 +302,10 @@ public class ApplicationProperties {
+ maxFileSize + maxFileSize
+ ", enableAlphaFunctionality=" + ", enableAlphaFunctionality="
+ enableAlphaFunctionality + enableAlphaFunctionality
+ ", showUpdate="
+ showUpdate
+ ", showUpdateOnlyAdmin="
+ showUpdateOnlyAdmin
+ "]"; + "]";
} }
} }

View File

@@ -0,0 +1,19 @@
package stirling.software.SPDF.model;
import java.util.Calendar;
import lombok.Builder;
import lombok.Data;
@Data
@Builder
public class PdfMetadata {
private String author;
private String producer;
private String title;
private String creator;
private String subject;
private String keywords;
private Calendar creationDate;
private Calendar modificationDate;
}

View File

@@ -0,0 +1,17 @@
package stirling.software.SPDF.model.api.converters;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import stirling.software.SPDF.model.api.PDFFile;
@Data
@EqualsAndHashCode(callSuper = true)
public class PdfToPdfARequest extends PDFFile {
@Schema(
description = "The output PDF/A type",
allowableValues = {"pdfa", "pdfa-1"})
private String outputFormat;
}

View File

@@ -0,0 +1,15 @@
package stirling.software.SPDF.model.api.misc;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import stirling.software.SPDF.model.api.PDFFile;
@Data
@EqualsAndHashCode(callSuper = true)
public class PrintFileRequest extends PDFFile {
@Schema(description = "Name of printer to match against", required = true)
private String printerName;
}

View File

@@ -88,6 +88,7 @@ public class GeneralUtils {
} }
sizeStr = sizeStr.trim().toUpperCase(); sizeStr = sizeStr.trim().toUpperCase();
sizeStr = sizeStr.replace(",", ".").replace(" ", "");
try { try {
if (sizeStr.endsWith("KB")) { if (sizeStr.endsWith("KB")) {
return (long) return (long)
@@ -185,7 +186,7 @@ public class GeneralUtils {
// Insert multiplication between a number and 'n' (e.g., "4n" becomes "4*n") // Insert multiplication between a number and 'n' (e.g., "4n" becomes "4*n")
String withMultiplication = expression.replaceAll("(\\d)n", "$1*n"); String withMultiplication = expression.replaceAll("(\\d)n", "$1*n");
// Now replace 'n' with its current value // Now replace 'n' with its current value
return withMultiplication.replaceAll("n", String.valueOf(nValue)); return withMultiplication.replace("n", String.valueOf(nValue));
} }
private static List<Integer> handlePart(String part, int totalPages, int offset) { private static List<Integer> handlePart(String part, int totalPages, int offset) {

View File

@@ -6,6 +6,7 @@ import java.awt.image.RenderedImage;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Calendar;
import java.util.List; import java.util.List;
import java.util.zip.ZipEntry; import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream; import java.util.zip.ZipOutputStream;
@@ -19,11 +20,8 @@ import javax.imageio.stream.ImageOutputStream;
import org.apache.pdfbox.Loader; import org.apache.pdfbox.Loader;
import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.*;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode; import org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode;
import org.apache.pdfbox.pdmodel.PDResources;
import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.PDXObject; import org.apache.pdfbox.pdmodel.graphics.PDXObject;
import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject; import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
@@ -39,6 +37,8 @@ import org.springframework.web.multipart.MultipartFile;
import io.github.pixee.security.Filenames; import io.github.pixee.security.Filenames;
import stirling.software.SPDF.model.PdfMetadata;
public class PdfUtils { public class PdfUtils {
private static final Logger logger = LoggerFactory.getLogger(PdfUtils.class); private static final Logger logger = LoggerFactory.getLogger(PdfUtils.class);
@@ -336,14 +336,12 @@ public class PdfUtils {
} }
} }
private static void addImageToDocument( public static void addImageToDocument(
PDDocument doc, PDImageXObject image, String fitOption, boolean autoRotate) PDDocument doc, PDImageXObject image, String fitOption, boolean autoRotate)
throws IOException { throws IOException {
boolean imageIsLandscape = image.getWidth() > image.getHeight(); boolean imageIsLandscape = image.getWidth() > image.getHeight();
PDRectangle pageSize = PDRectangle.A4; PDRectangle pageSize = PDRectangle.A4;
System.out.println(fitOption);
if (autoRotate && imageIsLandscape) { if (autoRotate && imageIsLandscape) {
pageSize = new PDRectangle(pageSize.getHeight(), pageSize.getWidth()); pageSize = new PDRectangle(pageSize.getHeight(), pageSize.getWidth());
} }
@@ -421,4 +419,28 @@ public class PdfUtils {
logger.info("PDF successfully saved to byte array"); logger.info("PDF successfully saved to byte array");
return baos.toByteArray(); return baos.toByteArray();
} }
public static PdfMetadata extractMetadataFromPdf(PDDocument pdf) {
return PdfMetadata.builder()
.author(pdf.getDocumentInformation().getAuthor())
.producer(pdf.getDocumentInformation().getProducer())
.title(pdf.getDocumentInformation().getTitle())
.creator(pdf.getDocumentInformation().getCreator())
.subject(pdf.getDocumentInformation().getSubject())
.keywords(pdf.getDocumentInformation().getKeywords())
.creationDate(pdf.getDocumentInformation().getCreationDate())
.modificationDate(pdf.getDocumentInformation().getModificationDate())
.build();
}
public static void setMetadataToPdf(PDDocument pdf, PdfMetadata pdfMetadata) {
pdf.getDocumentInformation().setAuthor(pdfMetadata.getAuthor());
pdf.getDocumentInformation().setProducer(pdfMetadata.getProducer());
pdf.getDocumentInformation().setTitle(pdfMetadata.getTitle());
pdf.getDocumentInformation().setCreator(pdfMetadata.getCreator());
pdf.getDocumentInformation().setSubject(pdfMetadata.getSubject());
pdf.getDocumentInformation().setKeywords(pdfMetadata.getKeywords());
pdf.getDocumentInformation().setCreationDate(pdfMetadata.getCreationDate());
pdf.getDocumentInformation().setModificationDate(Calendar.getInstance());
}
} }

View File

@@ -66,6 +66,7 @@ seeDockerHub=See Docker Hub
visitGithub=Visit Github Repository visitGithub=Visit Github Repository
donate=Donate donate=Donate
color=Color color=Color
sponsor=Sponsor
@@ -111,6 +112,7 @@ navbar.settings=إعدادات
############# #############
settings.title=الإعدادات settings.title=الإعدادات
settings.update=التحديث متاح settings.update=التحديث متاح
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=إصدار التطبيق: settings.appVersion=إصدار التطبيق:
settings.downloadOption.title=تحديد خيار التنزيل (للتنزيلات ذات الملف الواحد غير المضغوط): settings.downloadOption.title=تحديد خيار التنزيل (للتنزيلات ذات الملف الواحد غير المضغوط):
settings.downloadOption.1=فتح في نفس النافذة settings.downloadOption.1=فتح في نفس النافذة
@@ -119,8 +121,9 @@ settings.downloadOption.3=تنزيل الملف
settings.zipThreshold=ملفات مضغوطة عند تجاوز عدد الملفات التي تم تنزيلها settings.zipThreshold=ملفات مضغوطة عند تجاوز عدد الملفات التي تم تنزيلها
settings.signOut=Sign Out settings.signOut=Sign Out
settings.accountSettings=Account Settings settings.accountSettings=Account Settings
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Change Credentials changeCreds.title=Change Credentials
changeCreds.header=Update Your Account Details changeCreds.header=Update Your Account Details
@@ -806,17 +809,17 @@ rotate.selectAngle=حدد زاوية الدوران (بمضاعفات 90 درج
rotate.submit=استدارة rotate.submit=استدارة
#merge #split-pdfs
split.title=انقسام PDF split.title=انقسام PDF
split.header=تقسيم PDF split.header=تقسيم PDF
split.desc.1=الأرقام التي تحددها هي رقم الصفحة التي تريد تقسيمها split.desc.1=الأرقام التي تحددها هي رقم الصفحة التي تريد تقسيمها
split.desc.2=على هذا النحو ، سيؤدي تحديد 1،3،7-8 إلى تقسيم مستند من 10 صفحات إلى 6 PDFS منفصلة مع: split.desc.2=على هذا النحو ، سيؤدي تحديد 1،3،7-9 إلى تقسيم مستند من 10 صفحات إلى 6 PDFS منفصلة مع:
split.desc.3=المستند رقم 1: الصفحة 1 split.desc.3=المستند رقم 1: الصفحة 1
split.desc.4=المستند رقم 2: الصفحتان 2 و 3 split.desc.4=المستند رقم 2: الصفحتان 2 و 3
split.desc.5=المستند رقم 3: الصفحة 4 و 5 و 6 split.desc.5=المستند رقم 3: الصفحة 4 و 5 و 6 و 7
split.desc.6=المستند رقم 4: الصفحة 7 split.desc.6=المستند رقم 4: الصفحة 8
split.desc.7=المستند رقم 5: الصفحة 8 split.desc.7=المستند رقم 5: الصفحة 9
split.desc.8=المستند رقم 6: الصفحتان 9 و 10 split.desc.8=المستند رقم 6: الصفحة 10
split.splitPages=أدخل الصفحات المراد تقسيمها: split.splitPages=أدخل الصفحات المراد تقسيمها:
split.submit=Split split.submit=Split
@@ -938,6 +941,7 @@ pdfToPDFA.header=PDF إلى PDF / A
pdfToPDFA.credit=تستخدم هذه الخدمة OCRmyPDF لتحويل PDF / A. pdfToPDFA.credit=تستخدم هذه الخدمة OCRmyPDF لتحويل PDF / A.
pdfToPDFA.submit=تحويل pdfToPDFA.submit=تحويل
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
#PDFToWord #PDFToWord
@@ -1021,6 +1025,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions
split-by-sections.submit=Split PDF split-by-sections.submit=Split PDF
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Merge Into One PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenses licenses.nav=Licenses
licenses.title=3rd Party Licenses licenses.title=3rd Party Licenses

View File

@@ -66,6 +66,7 @@ seeDockerHub=See Docker Hub
visitGithub=Visit Github Repository visitGithub=Visit Github Repository
donate=Donate donate=Donate
color=Color color=Color
sponsor=Sponsor
@@ -111,6 +112,7 @@ navbar.settings=Настройки
############# #############
settings.title=Настройки settings.title=Настройки
settings.update=Налична актуализация settings.update=Налична актуализация
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=Версия на приложението: settings.appVersion=Версия на приложението:
settings.downloadOption.title=Изберете опция за изтегляне (за изтегляния на един файл без да е архивиран): settings.downloadOption.title=Изберете опция за изтегляне (за изтегляния на един файл без да е архивиран):
settings.downloadOption.1=Отваряне в същия прозорец settings.downloadOption.1=Отваряне в същия прозорец
@@ -119,8 +121,9 @@ settings.downloadOption.3=Изтегли файл
settings.zipThreshold=Архивирайте файловете, когато броят на изтеглените файлове надвишава settings.zipThreshold=Архивирайте файловете, когато броят на изтеглените файлове надвишава
settings.signOut=Изход settings.signOut=Изход
settings.accountSettings=Настройки на акаунта settings.accountSettings=Настройки на акаунта
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Промяна на идентификационните данни changeCreds.title=Промяна на идентификационните данни
changeCreds.header=Актуализирайте данните за акаунта си changeCreds.header=Актуализирайте данните за акаунта си
@@ -806,17 +809,17 @@ rotate.selectAngle=Изберете ъгъл на въртене (кратно
rotate.submit=Завъртане rotate.submit=Завъртане
#merge #split-pdfs
split.title=Разделяне на PDF split.title=Разделяне на PDF
split.header=Разделяне на PDF split.header=Разделяне на PDF
split.desc.1=Числата, които избирате, са номера на страницата, на която искате да направите разделяне split.desc.1=Числата, които избирате, са номера на страницата, на която искате да направите разделяне
split.desc.2=Така че избирането на 1,3,7-8 ще раздели документ от 10 страници на 6 отделни PDF файла с: split.desc.2=Така че избирането на 1,3,7-9 ще раздели документ от 10 страници на 6 отделни PDF файла с:
split.desc.3=Документ #1: Страница 1 split.desc.3=Документ #1: Страница 1
split.desc.4=Документ #2: Страница 2 и 3 split.desc.4=Документ #2: Страница 2 и 3
split.desc.5=Документ #3: Страница 4, 5 и 6 split.desc.5=Документ #3: Страница 4, 5, 6 и 7
split.desc.6=Документ #4: Страница 7 split.desc.6=Документ #4: Страница 8
split.desc.7=Документ #5: Страница 8 split.desc.7=Документ #5: Страница 9
split.desc.8=Документ #6: Страница 9 и 10 split.desc.8=Документ #6: Страница 10
split.splitPages=Въведете страници за разделяне: split.splitPages=Въведете страници за разделяне:
split.submit=Разделяне split.submit=Разделяне
@@ -938,6 +941,7 @@ pdfToPDFA.header=PDF към PDF/A
pdfToPDFA.credit=Тази услуга използва OCRmyPDF за PDF/A преобразуване. pdfToPDFA.credit=Тази услуга използва OCRmyPDF за PDF/A преобразуване.
pdfToPDFA.submit=Преобразуване pdfToPDFA.submit=Преобразуване
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
#PDFToWord #PDFToWord
@@ -1021,6 +1025,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions
split-by-sections.submit=Split PDF split-by-sections.submit=Split PDF
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Merge Into One PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenses licenses.nav=Licenses
licenses.title=3rd Party Licenses licenses.title=3rd Party Licenses

View File

@@ -66,6 +66,7 @@ seeDockerHub=See Docker Hub
visitGithub=Visit Github Repository visitGithub=Visit Github Repository
donate=Donate donate=Donate
color=Color color=Color
sponsor=Sponsor
@@ -111,6 +112,7 @@ navbar.settings=Opcions
############# #############
settings.title=Opcions settings.title=Opcions
settings.update=Actualització Disponible settings.update=Actualització Disponible
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=Versió App: settings.appVersion=Versió App:
settings.downloadOption.title=Trieu l'opció de descàrrega (per a descàrregues d'un sol fitxer no zip): settings.downloadOption.title=Trieu l'opció de descàrrega (per a descàrregues d'un sol fitxer no zip):
settings.downloadOption.1=Obre mateixa finestra settings.downloadOption.1=Obre mateixa finestra
@@ -119,8 +121,9 @@ settings.downloadOption.3=Descarrega Arxiu
settings.zipThreshold=Comprimiu els fitxers quan el nombre de fitxers baixats superi settings.zipThreshold=Comprimiu els fitxers quan el nombre de fitxers baixats superi
settings.signOut=Sortir settings.signOut=Sortir
settings.accountSettings=Account Settings settings.accountSettings=Account Settings
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Change Credentials changeCreds.title=Change Credentials
changeCreds.header=Update Your Account Details changeCreds.header=Update Your Account Details
@@ -806,17 +809,17 @@ rotate.selectAngle=Selecciona l'angle de gir (en múltiples de 90 graus):
rotate.submit=Rota rotate.submit=Rota
#merge #split-pdfs
split.title=Divideix PDF split.title=Divideix PDF
split.header=Divideix PDF split.header=Divideix PDF
split.desc.1=Els números seleccionats són el número de pàgina en què voleu fer la divisió split.desc.1=Els números seleccionats són el número de pàgina en què voleu fer la divisió
split.desc.2=Per tant, seleccionant 1,3,7-8 dividiria un document de 10 pàgines en 6 PDFS separats amb: split.desc.2=Per tant, seleccionant 1,3,7-9 dividiria un document de 10 pàgines en 6 PDFS separats amb:
split.desc.3=Document #1: Pàgina 1 split.desc.3=Document #1: Pàgina 1
split.desc.4=Document #2: Pàgina 2 i 3 split.desc.4=Document #2: Pàgina 2 i 3
split.desc.5=Document #3: Pàgina 4, 5 i 6 split.desc.5=Document #3: Pàgina 4, 5, 6 i 7
split.desc.6=Document #4: Pàgina 7 split.desc.6=Document #4: Pàgina 8
split.desc.7=Document #5: Pàgina 8 split.desc.7=Document #5: Pàgina 9
split.desc.8=Document #6: Pàgina 9 i 10 split.desc.8=Document #6: Pàgina 10
split.splitPages=Introdueix pàgines per dividir-les: split.splitPages=Introdueix pàgines per dividir-les:
split.submit=Divideix split.submit=Divideix
@@ -938,6 +941,7 @@ pdfToPDFA.header=PDF a PDF/A
pdfToPDFA.credit=Utilitza OCRmyPDF per la conversió a PDF/A pdfToPDFA.credit=Utilitza OCRmyPDF per la conversió a PDF/A
pdfToPDFA.submit=Converteix pdfToPDFA.submit=Converteix
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
#PDFToWord #PDFToWord
@@ -1021,6 +1025,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions
split-by-sections.submit=Split PDF split-by-sections.submit=Split PDF
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Merge Into One PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenses licenses.nav=Licenses
licenses.title=3rd Party Licenses licenses.title=3rd Party Licenses

View File

@@ -57,15 +57,16 @@ usernameExistsMessage=Neuer Benutzername existiert bereits.
invalidUsernameMessage=Ungültiger Benutzername. Der Benutzername darf nur Buchstaben und Zahlen enthalten. invalidUsernameMessage=Ungültiger Benutzername. Der Benutzername darf nur Buchstaben und Zahlen enthalten.
deleteCurrentUserMessage=Der aktuell angemeldete Benutzer kann nicht gelöscht werden. deleteCurrentUserMessage=Der aktuell angemeldete Benutzer kann nicht gelöscht werden.
deleteUsernameExistsMessage=Der Benutzername existiert nicht und kann nicht gelöscht werden. deleteUsernameExistsMessage=Der Benutzername existiert nicht und kann nicht gelöscht werden.
error=Error error=Fehler
oops=Oops! oops=Hoppla!
help=Help help=Hilfe
goHomepage=Go to Homepage goHomepage=Zur Startseite gehen
joinDiscord=Join our Discord server joinDiscord=Unserem Discord-Server beitreten
seeDockerHub=See Docker Hub seeDockerHub=Docker Hub ansehen
visitGithub=Visit Github Repository visitGithub=GitHub-Repository besuchen
donate=Donate donate=Spenden
color=Color color=Farbe
sponsor=Sponsor
@@ -77,8 +78,8 @@ pipeline.uploadButton=Benutzerdefinierter Upload
pipeline.configureButton=Konfigurieren pipeline.configureButton=Konfigurieren
pipeline.defaultOption=Benutzerdefiniert pipeline.defaultOption=Benutzerdefiniert
pipeline.submitButton=Speichern pipeline.submitButton=Speichern
pipeline.help=Pipeline Help pipeline.help=Hilfe für Pipeline
pipeline.scanHelp=Folder Scanning Help pipeline.scanHelp=Hilfe zum Ordnerscan
###################### ######################
# Pipeline Options # # Pipeline Options #
@@ -111,6 +112,7 @@ navbar.settings=Einstellungen
############# #############
settings.title=Einstellungen settings.title=Einstellungen
settings.update=Update verfügbar settings.update=Update verfügbar
settings.updateAvailable={0} ist die aktuelle installierte Version. Eine neue Version ({1}) ist verfügbar.
settings.appVersion=App-Version: settings.appVersion=App-Version:
settings.downloadOption.title=Download-Option wählen (für einzelne Dateien, die keine Zip-Downloads sind): settings.downloadOption.title=Download-Option wählen (für einzelne Dateien, die keine Zip-Downloads sind):
settings.downloadOption.1=Im selben Fenster öffnen settings.downloadOption.1=Im selben Fenster öffnen
@@ -119,8 +121,9 @@ settings.downloadOption.3=Datei herunterladen
settings.zipThreshold=Dateien komprimieren, wenn die Anzahl der heruntergeladenen Dateien überschritten wird settings.zipThreshold=Dateien komprimieren, wenn die Anzahl der heruntergeladenen Dateien überschritten wird
settings.signOut=Abmelden settings.signOut=Abmelden
settings.accountSettings=Kontoeinstellungen settings.accountSettings=Kontoeinstellungen
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Anmeldeinformationen ändern changeCreds.title=Anmeldeinformationen ändern
changeCreds.header=Aktualisieren Sie Ihre Kontodaten changeCreds.header=Aktualisieren Sie Ihre Kontodaten
@@ -187,58 +190,58 @@ home.multiTool.desc=Seiten zusammenführen, drehen, neu anordnen und entfernen
multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side
home.merge.title=Zusammenführen home.merge.title=Zusammenführen
home.merge.desc=Mehrere PDF-Dateien zu einer einzigen zusammenführen. home.merge.desc=Mehrere PDF-Dateien zu einer einzigen zusammenführen
merge.tags=zusammenführen,seitenvorgänge,back end,serverseite merge.tags=zusammenführen,seitenvorgänge,back end,serverseite
home.split.title=Aufteilen home.split.title=Aufteilen
home.split.desc=PDFs in mehrere Dokumente aufteilen. home.split.desc=PDFs in mehrere Dokumente aufteilen
split.tags=seitenoperationen,teilen,mehrseitig,ausschneiden,serverseitig split.tags=seitenoperationen,teilen,mehrseitig,ausschneiden,serverseitig
home.rotate.title=Drehen home.rotate.title=Drehen
home.rotate.desc=Drehen Sie Ihre PDFs ganz einfach. home.rotate.desc=Drehen Sie Ihre PDFs ganz einfach
rotate.tags=serverseitig rotate.tags=serverseitig
home.imageToPdf.title=Bild zu PDF home.imageToPdf.title=Bild zu PDF
home.imageToPdf.desc=Konvertieren Sie ein Bild (PNG, JPEG, GIF) in ein PDF. home.imageToPdf.desc=Konvertieren Sie ein Bild (PNG, JPEG, GIF) in ein PDF
imageToPdf.tags=konvertierung,img,jpg,bild,foto imageToPdf.tags=konvertierung,img,jpg,bild,foto
home.pdfToImage.title=PDF zu Bild home.pdfToImage.title=PDF zu Bild
home.pdfToImage.desc=Konvertieren Sie ein PDF in ein Bild (PNG, JPEG, GIF). home.pdfToImage.desc=Konvertieren Sie ein PDF in ein Bild (PNG, JPEG, GIF)
pdfToImage.tags=konvertierung,img,jpg,bild,foto pdfToImage.tags=konvertierung,img,jpg,bild,foto
home.pdfOrganiser.title=Organisieren home.pdfOrganiser.title=Organisieren
home.pdfOrganiser.desc=Seiten entfernen und Seitenreihenfolge ändern. home.pdfOrganiser.desc=Seiten entfernen und Seitenreihenfolge ändern
pdfOrganiser.tags=duplex,gerade,ungerade,sortieren,verschieben pdfOrganiser.tags=duplex,gerade,ungerade,sortieren,verschieben
home.addImage.title=Bild einfügen home.addImage.title=Bild einfügen
home.addImage.desc=Fügt ein Bild an eine bestimmte Stelle im PDF ein (in Arbeit). home.addImage.desc=Fügt ein Bild an eine bestimmte Stelle im PDF ein (in Arbeit)
addImage.tags=img,jpg,bild,foto addImage.tags=img,jpg,bild,foto
home.watermark.title=Wasserzeichen hinzufügen home.watermark.title=Wasserzeichen hinzufügen
home.watermark.desc=Fügen Sie ein eigenes Wasserzeichen zu Ihrem PDF hinzu. home.watermark.desc=Fügen Sie ein eigenes Wasserzeichen zu Ihrem PDF hinzu
watermark.tags=text,wiederholend,beschriftung,besitzen,urheberrecht,marke,img,jpg,bild,foto watermark.tags=text,wiederholend,beschriftung,besitzen,urheberrecht,marke,img,jpg,bild,foto
home.permissions.title=Berechtigungen ändern home.permissions.title=Berechtigungen ändern
home.permissions.desc=Die Berechtigungen für Ihr PDF-Dokument verändern. home.permissions.desc=Die Berechtigungen für Ihr PDF-Dokument verändern
permissions.tags=lesen,schreiben,bearbeiten,drucken permissions.tags=lesen,schreiben,bearbeiten,drucken
home.removePages.title=Entfernen home.removePages.title=Entfernen
home.removePages.desc=Ungewollte Seiten aus dem PDF entfernen. home.removePages.desc=Ungewollte Seiten aus dem PDF entfernen
removePages.tags=seiten entfernen,seiten löschen removePages.tags=seiten entfernen,seiten löschen
home.addPassword.title=Passwort hinzufügen home.addPassword.title=Passwort hinzufügen
home.addPassword.desc=Das PDF mit einem Passwort verschlüsseln. home.addPassword.desc=Das PDF mit einem Passwort verschlüsseln
addPassword.tags=sicher,sicherheit addPassword.tags=sicher,sicherheit
home.removePassword.title=Passwort entfernen home.removePassword.title=Passwort entfernen
home.removePassword.desc=Den Passwortschutz eines PDFs entfernen. home.removePassword.desc=Den Passwortschutz eines PDFs entfernen
removePassword.tags=sichern,entschlüsseln,sicherheit,passwort aufheben,passwort löschen removePassword.tags=sichern,entschlüsseln,sicherheit,passwort aufheben,passwort löschen
home.compressPdfs.title=Komprimieren home.compressPdfs.title=Komprimieren
home.compressPdfs.desc=PDF komprimieren um die Dateigröße zu reduzieren. home.compressPdfs.desc=PDF komprimieren um die Dateigröße zu reduzieren
compressPdfs.tags=komprimieren,verkleinern,minimieren compressPdfs.tags=komprimieren,verkleinern,minimieren
@@ -251,7 +254,7 @@ home.fileToPDF.desc=Konvertieren Sie nahezu jede Datei in PDF (DOCX, PNG, XLS, P
fileToPDF.tags=transformation,format,dokument,bild,folie,text,konvertierung,büro,dokumente,word,excel,powerpoint fileToPDF.tags=transformation,format,dokument,bild,folie,text,konvertierung,büro,dokumente,word,excel,powerpoint
home.ocr.title=Führe OCR/Cleanup-Scans aus home.ocr.title=Führe OCR/Cleanup-Scans aus
home.ocr.desc=Cleanup scannt und erkennt Text aus Bildern in einer PDF-Datei und fügt ihn erneut als Text hinzu. home.ocr.desc=Cleanup scannt und erkennt Text aus Bildern in einer PDF-Datei und fügt ihn erneut als Text hinzu
ocr.tags=erkennung,text,bild,scannen,lesen,identifizieren,erkennung,bearbeitbar ocr.tags=erkennung,text,bild,scannen,lesen,identifizieren,erkennung,bearbeitbar
@@ -373,17 +376,17 @@ getPdfInfo.tags=infomation,daten,statistik
home.extractPage.title=Seite(n) extrahieren home.extractPage.title=Seite(n) extrahieren
home.extractPage.desc=Extrahiert ausgewählte Seiten aus einer PDF home.extractPage.desc=Extrahiert ausgewählte Seiten aus einer PDF
extractPage.tags=extrahieren extractPage.tags=extrahieren,seite
home.PdfToSinglePage.title=PDF zu einer Seite zusammenfassen home.PdfToSinglePage.title=PDF zu einer Seite zusammenfassen
home.PdfToSinglePage.desc=Fügt alle PDF-Seiten zu einer einzigen großen Seite zusammen home.PdfToSinglePage.desc=Fügt alle PDF-Seiten zu einer einzigen großen Seite zusammen
PdfToSinglePage.tags=einzelseite PdfToSinglePage.tags=einzelseite,zusammenfassen
home.showJS.title=Javascript anzeigen home.showJS.title=Javascript anzeigen
home.showJS.desc=Alle Javascript Funktionen in einer PDF anzeigen home.showJS.desc=Alle Javascript Funktionen in einer PDF anzeigen
showJS.tags=js showJS.tags=js,javascript
home.autoRedact.title=Automatisch zensieren/schwärzen home.autoRedact.title=Automatisch zensieren/schwärzen
home.autoRedact.desc=Automatisches Zensieren (Schwärzen) von Text in einer PDF-Datei basierend auf dem eingegebenen Text home.autoRedact.desc=Automatisches Zensieren (Schwärzen) von Text in einer PDF-Datei basierend auf dem eingegebenen Text
@@ -391,7 +394,7 @@ autoRedact.tags=zensieren,schwärzen
home.tableExtraxt.title=Tabelle extrahieren home.tableExtraxt.title=Tabelle extrahieren
home.tableExtraxt.desc=Tabelle aus PDF in CSV extrahieren home.tableExtraxt.desc=Tabelle aus PDF in CSV extrahieren
tableExtraxt.tags=CSV tableExtraxt.tags=CSV,tabelle,extrahieren
home.autoSizeSplitPDF.title=Teilen nach Größe/Anzahl home.autoSizeSplitPDF.title=Teilen nach Größe/Anzahl
@@ -414,11 +417,11 @@ AddStampRequest.tags=stempeln,bild hinzufügen,bild zentrieren,wasserzeichen,pdf
home.PDFToBook.title=PDF zum Buch home.PDFToBook.title=PDF zum Buch
home.PDFToBook.desc=Konvertiert PDF mit Calibre in Buch-/Comic-Formate home.PDFToBook.desc=Konvertiert PDF mit Calibre in Buch-/Comic-Formate
PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle PDFToBook.tags=buch,comic,calibre,convert,manga,amazon,kindle
home.BookToPDF.title=Buch als PDF home.BookToPDF.title=Buch als PDF
home.BookToPDF.desc=Konvertiert Buch-/Comic-Formate mithilfe von Calibre in PDF home.BookToPDF.desc=Konvertiert Buch-/Comic-Formate mithilfe von Calibre in PDF
BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle BookToPDF.tags=buch,comic,calibre,convert,manga,amazon,kindle
########################### ###########################
@@ -444,7 +447,7 @@ autoRedact.textsToRedactLabel=Zu zensierender Text (einer pro Zeile)
autoRedact.textsToRedactPlaceholder=z.B. \nVertraulich \nStreng geheim autoRedact.textsToRedactPlaceholder=z.B. \nVertraulich \nStreng geheim
autoRedact.useRegexLabel=Regex verwenden autoRedact.useRegexLabel=Regex verwenden
autoRedact.wholeWordSearchLabel=Ganzes Wort suchen autoRedact.wholeWordSearchLabel=Ganzes Wort suchen
autoRedact.customPaddingLabel=Benutzerdefinierte Extra-Padding autoRedact.customPaddingLabel=Zensierten Bereich vergrößern
autoRedact.convertPDFToImageLabel=PDF in PDF-Bild konvertieren (zum Entfernen von Text hinter dem Kasten) autoRedact.convertPDFToImageLabel=PDF in PDF-Bild konvertieren (zum Entfernen von Text hinter dem Kasten)
autoRedact.submitButton=Zensieren autoRedact.submitButton=Zensieren
@@ -466,7 +469,7 @@ pdfToSinglePage.submit=Zusammenfassen
pageExtracter.title=Seiten extrahieren pageExtracter.title=Seiten extrahieren
pageExtracter.header=Seiten extrahieren pageExtracter.header=Seiten extrahieren
pageExtracter.submit=Extrahieren pageExtracter.submit=Extrahieren
pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1) pageExtracter.placeholder=(z.B. 1,2,8 oder 4,7,12-16 oder 2n-1)
#getPdfInfo #getPdfInfo
@@ -498,16 +501,16 @@ HTMLToPDF.header=HTML zu PDF
HTMLToPDF.help=Akzeptiert HTML-Dateien und ZIPs mit html/css/images etc. HTMLToPDF.help=Akzeptiert HTML-Dateien und ZIPs mit html/css/images etc.
HTMLToPDF.submit=Konvertieren HTMLToPDF.submit=Konvertieren
HTMLToPDF.credit=Verwendet WeasyPrint HTMLToPDF.credit=Verwendet WeasyPrint
HTMLToPDF.zoom=Zoomstufe zur Darstellung der Website. HTMLToPDF.zoom=Zoomstufe zur Darstellung der Website
HTMLToPDF.pageWidth=Breite der Seite in Zentimetern. (Leer auf Standard) HTMLToPDF.pageWidth=Breite der Seite in Zentimetern (Leer auf Standard)
HTMLToPDF.pageHeight=Höhe der Seite in Zentimetern. (Leer auf Standard) HTMLToPDF.pageHeight=Höhe der Seite in Zentimetern (Leer auf Standard)
HTMLToPDF.marginTop=Oberer Rand der Seite in Millimetern. (Leer auf Standard) HTMLToPDF.marginTop=Oberer Rand der Seite in Millimetern (Leer auf Standard)
HTMLToPDF.marginBottom=Unterer Rand der Seite in Millimetern. (Leer auf Standard) HTMLToPDF.marginBottom=Unterer Rand der Seite in Millimetern (Leer auf Standard)
HTMLToPDF.marginLeft=Linker Rand der Seite in Millimetern. (Leer auf Standard) HTMLToPDF.marginLeft=Linker Rand der Seite in Millimetern (Leer auf Standard)
HTMLToPDF.marginRight=Linker Rand der Seite in Millimetern. (Leer auf Standard) HTMLToPDF.marginRight=Linker Rand der Seite in Millimetern (Leer auf Standard)
HTMLToPDF.printBackground=Den Hintergrund der Website rendern. HTMLToPDF.printBackground=Den Hintergrund der Website rendern
HTMLToPDF.defaultHeader=Standardkopfzeile aktivieren (Name und Seitenzahl) HTMLToPDF.defaultHeader=Standardkopfzeile aktivieren (Name und Seitenzahl)
HTMLToPDF.cssMediaType=CSS-Medientyp der Seite ändern. HTMLToPDF.cssMediaType=CSS-Medientyp der Seite ändern
HTMLToPDF.none=Keine HTMLToPDF.none=Keine
HTMLToPDF.print=Drucken HTMLToPDF.print=Drucken
HTMLToPDF.screen=Bildschirm HTMLToPDF.screen=Bildschirm
@@ -608,8 +611,8 @@ pageLayout.submit=Abschicken
#scalePages #scalePages
scalePages.title=Seitengröße anpassen scalePages.title=Seitengröße anpassen
scalePages.header=Seitengröße anpassen scalePages.header=Seitengröße anpassen
scalePages.pageSize=Format der Seiten des Dokuments. scalePages.pageSize=Format der Seiten des Dokuments
scalePages.scaleFactor=Zoomstufe (Ausschnitt) einer Seite. scalePages.scaleFactor=Zoomstufe (Ausschnitt) einer Seite
scalePages.submit=Abschicken scalePages.submit=Abschicken
@@ -752,7 +755,7 @@ compress.submit=Komprimieren
#Add image #Add image
addImage.title=Bild hinzufügen addImage.title=Bild hinzufügen
addImage.header=Ein Bild einfügen addImage.header=Ein Bild einfügen
addImage.everyPage=Jede Seite? addImage.everyPage=In jede Seite einfügen?
addImage.upload=Bild hinzufügen addImage.upload=Bild hinzufügen
addImage.submit=Bild hinzufügen addImage.submit=Bild hinzufügen
@@ -769,23 +772,23 @@ merge.submit=Zusammenführen
pdfOrganiser.title=Seiten anordnen pdfOrganiser.title=Seiten anordnen
pdfOrganiser.header=PDF Seitenorganisation pdfOrganiser.header=PDF Seitenorganisation
pdfOrganiser.submit=Seiten anordnen pdfOrganiser.submit=Seiten anordnen
pdfOrganiser.mode=Mode pdfOrganiser.mode=Modus
pdfOrganiser.mode.1=Custom Page Order pdfOrganiser.mode.1=Benutzerdefinierte Seitenreihenfolge
pdfOrganiser.mode.2=Reverse Order pdfOrganiser.mode.2=Umgekehrte Reihenfolge
pdfOrganiser.mode.3=Duplex Sort pdfOrganiser.mode.3=Duplex-Sortierung
pdfOrganiser.mode.4=Booklet Sort pdfOrganiser.mode.4=Heftsortierung
pdfOrganiser.mode.5=Side Stitch Booklet Sort pdfOrganiser.mode.5=Seitenheftungs-Heftsortierung
pdfOrganiser.mode.6=Odd-Even Split pdfOrganiser.mode.6=Ungerade-Gerade-Teilung
pdfOrganiser.mode.7=Remove First pdfOrganiser.mode.7=Erste entfernen
pdfOrganiser.mode.8=Remove Last pdfOrganiser.mode.8=Letzte entfernen
pdfOrganiser.mode.9=Remove First and Last pdfOrganiser.mode.9=Erste und letzte entfernen
pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) pdfOrganiser.placeholder=(z.B. 1,3,2 oder 4-8,2,10-12 oder 2n-1)
#multiTool #multiTool
multiTool.title=PDF-Multitool multiTool.title=PDF-Multitool
multiTool.header=PDF-Multitool multiTool.header=PDF-Multitool
multiTool.uploadPrompts=Please Upload PDF multiTool.uploadPrompts=Bitte PDF hochladen
#view pdf #view pdf
viewPdf.title=PDF anzeigen viewPdf.title=PDF anzeigen
@@ -796,7 +799,7 @@ pageRemover.title=Seiten entfernen
pageRemover.header=PDF Seiten entfernen pageRemover.header=PDF Seiten entfernen
pageRemover.pagesToDelete=Seiten zu entfernen (geben Sie eine Kommagetrennte Liste der Seitenzahlen an): pageRemover.pagesToDelete=Seiten zu entfernen (geben Sie eine Kommagetrennte Liste der Seitenzahlen an):
pageRemover.submit=Seiten löschen pageRemover.submit=Seiten löschen
pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30) pageRemover.placeholder=(z.B. 1,2,6 oder 1-10,15-30)
#rotate #rotate
@@ -806,17 +809,17 @@ rotate.selectAngle=Wählen Sie den Winkel (in Vielfachen von 90 Grad):
rotate.submit=Herunterladen rotate.submit=Herunterladen
#merge #split-pdfs
split.title=PDF aufteilen split.title=PDF aufteilen
split.header=PDF aufteilen split.header=PDF aufteilen
split.desc.1=Die Nummern, die Sie auswählen, sind die Seitenzahlen, an denen Sie aufteilen möchten. split.desc.1=Die Nummern, die Sie auswählen, sind die Seitenzahlen, an denen Sie aufteilen möchten.
split.desc.2=So würde die Auswahl von 1,3,7-8 ein 10-seitiges Dokument in 6 separate PDFs aufteilen, mit: split.desc.2=So würde die Auswahl von 1,3,7-9 ein 10-seitiges Dokument in 6 separate PDFs aufteilen, mit:
split.desc.3=Dokument #1: Seite 1 split.desc.3=Dokument #1: Seite 1
split.desc.4=Dokument #2: Seite 2 und 3 split.desc.4=Dokument #2: Seite 2 und 3
split.desc.5=Dokument #3: Seite 4, 5 und 6 split.desc.5=Dokument #3: Seite 4, 5, 6 und 7
split.desc.6=Dokument #4: Seite 7 split.desc.6=Dokument #4: Seite 8
split.desc.7=Dokument #5: Seite 8 split.desc.7=Dokument #5: Seite 9
split.desc.8=Dokument #6: Seite 9 und 10 split.desc.8=Dokument #6: Seite 10
split.splitPages=Geben Sie die Seiten an, an denen aufgeteilt werden soll: split.splitPages=Geben Sie die Seiten an, an denen aufgeteilt werden soll:
split.submit=Aufteilen split.submit=Aufteilen
@@ -885,7 +888,7 @@ watermark.selectText.8=Wasserzeichen Typ:
watermark.selectText.9=Wasserzeichen-Bild: watermark.selectText.9=Wasserzeichen-Bild:
watermark.submit=Wasserzeichen hinzufügen watermark.submit=Wasserzeichen hinzufügen
watermark.type.1=Text watermark.type.1=Text
watermark.type.2=Image watermark.type.2=Bild
#Change permissions #Change permissions
@@ -937,7 +940,8 @@ pdfToPDFA.title=PDF zu PDF/A
pdfToPDFA.header=PDF zu PDF/A pdfToPDFA.header=PDF zu PDF/A
pdfToPDFA.credit=Dieser Dienst verwendet OCRmyPDF für die PDF/A-Konvertierung pdfToPDFA.credit=Dieser Dienst verwendet OCRmyPDF für die PDF/A-Konvertierung
pdfToPDFA.submit=Konvertieren pdfToPDFA.submit=Konvertieren
pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.tip=Dieser Dienst kann nur einzelne Eingangsdateien verarbeiten.
pdfToPDFA.outputFormat=Ausgabeformat
#PDFToWord #PDFToWord
@@ -1021,6 +1025,15 @@ split-by-sections.vertical.placeholder=Anzahl vertikaler Teiler eingeben
split-by-sections.submit=PDF teilen split-by-sections.submit=PDF teilen
split-by-sections.merge=In eine PDF zusammenfügen split-by-sections.merge=In eine PDF zusammenfügen
#printFile
printFile.title=Datei drucken
printFile.header=Datei an Drucker senden
printFile.selectText.1=Wähle die auszudruckende Datei
printFile.selectText.2=Druckernamen eingeben
printFile.submit=Drucken
#licenses #licenses
licenses.nav=Lizenzen licenses.nav=Lizenzen
licenses.title=Lizenzen von Drittanbietern licenses.title=Lizenzen von Drittanbietern
@@ -1031,15 +1044,15 @@ licenses.license=Lizenz
# error # error
error.sorry=Sorry for the issue! error.sorry=Entschuldigung für das Problem!
error.needHelp=Need help / Found an issue? error.needHelp=Brauchst du Hilfe / Ein Problem gefunden?
error.contactTip=If you're still having trouble, don't hesitate to reach out to us for help. You can submit a ticket on our GitHub page or contact us through Discord: error.contactTip=Wenn du weiterhin Probleme hast, zögere nicht, uns um Hilfe zu bitten. Du kannst ein Ticket auf unserer GitHub-Seite einreichen oder uns über Discord kontaktieren:
error.404.head=404 - Page Not Found | Oops, we tripped in the code! error.404.head=404 - Seite nicht gefunden | Ups, wir sind im Code gestolpert!
error.404.1=We can't seem to find the page you're looking for. error.404.1=Wir können die gesuchte Seite nicht finden.
error.404.2=Something went wrong error.404.2=Etwas ist schiefgelaufen
error.github=Submit a ticket on GitHub error.github=Ein Ticket auf GitHub einreichen
error.showStack=Show Stack Trace error.showStack=Stack-Trace anzeigen
error.copyStack=Copy Stack Trace error.copyStack=Stack-Trace kopieren
error.githubSubmit=GitHub - Submit a ticket error.githubSubmit=GitHub - Ein Ticket einreichen
error.discordSubmit=Discord - Submit Support post error.discordSubmit=Discord - Unterstützungsbeitrag einreichen

View File

@@ -10,18 +10,18 @@ multiPdfDropPrompt=Επιλογή (ή τράβηγμα αρχείου και α
imgPrompt=Επιλογή Εικόνας(Εικόνων) imgPrompt=Επιλογή Εικόνας(Εικόνων)
genericSubmit=Υποβολή genericSubmit=Υποβολή
processTimeWarning=Προσοχή: Αυτή η διαδικασία μπορεί να διαρκέσει έως και ένα λεπτό ανάλογα με το μέγεθος του αρχείου processTimeWarning=Προσοχή: Αυτή η διαδικασία μπορεί να διαρκέσει έως και ένα λεπτό ανάλογα με το μέγεθος του αρχείου
pageOrderPrompt=Προσαρμοσμένη Σειρά Σελίδας (Προσθέστε μία λίστε απο αριθμούς σελιδών, χωρισμένες με κόμμα ή συναρτήσεις όπως 2n+1) : pageOrderPrompt=Προσαρμοσμένη Σειρά Σελίδας (Προσθέστε μία λίστα απο αριθμούς σελιδών, χωρισμένες με κόμμα ή συναρτήσεις όπως 2n+1) :
pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) : pageSelectionPrompt=Προσαρμοσμένη Επιλογή Σελίδας (Προσθέστε μία λίστα απο αριθμούς σελιδών, χωρισμένες με κόμμα 1,5,6 ή συναρτήσεις όπως 2n+1):
goToPage=Go goToPage=Πήγαινε
true=Αληθές true=Αληθές
false=Λανθασμένο false=Λανθασμένο
unknown=Άγνωστο unknown=Άγνωστο
save=Αποθήκευση save=Αποθήκευση
saveToBrowser=Save to Browser saveToBrowser=Αποθήκευση στο Browser
close=Κλείσιμο close=Κλείσιμο
filesSelected=αρχεία που επιλέχθηκαν filesSelected=αρχεία που επιλέχθηκαν
noFavourites=Κανένα αγαπήμενο δεν έχει προστεθεί noFavourites=Κανένα αγαπήμενο δεν έχει προστεθεί
downloadComplete=Download Complete downloadComplete=Η Λήψη Ολοκληρώθηκε
bored=Βαριέστε να περιμένετε; bored=Βαριέστε να περιμένετε;
alphabet=Αλφάβητο alphabet=Αλφάβητο
downloadPdf=Κατέβασμα του PDF downloadPdf=Κατέβασμα του PDF
@@ -45,53 +45,54 @@ red=Κόκκινο
green=Πράσινο green=Πράσινο
blue=Μπλέ blue=Μπλέ
custom=Προσαρμογή... custom=Προσαρμογή...
WorkInProgess=Work in progress, May not work or be buggy, Please report any problems! WorkInProgess=Εργασία σε εξέλιξη, Ενδέχεται να μην λειτουργεί ή να έχει λάθη, Παρακαλώ αναφέρετε τυχόν προβλήματα!
poweredBy=Powered by poweredBy=Τροφοδοτείται από
yes=Yes yes=Ναι
no=No no=Όχι
changedCredsMessage=Τα διαπιστευτήρια έχουν αλλάξει! changedCredsMessage=Τα διαπιστευτήρια έχουν αλλάξει!
notAuthenticatedMessage=Ο χρήστης δεν έχει αυθεντικοποιηθεί. notAuthenticatedMessage=Ο χρήστης δεν έχει αυθεντικοποιηθεί.
userNotFoundMessage=Ο χρήστης δεν βρέθηκε. userNotFoundMessage=Ο χρήστης δεν βρέθηκε.
incorrectPasswordMessage=Ο τρέχων κωδικός πρόσβασης είναι λανθασμένος. incorrectPasswordMessage=Ο τρέχων κωδικός πρόσβασης είναι λανθασμένος.
usernameExistsMessage=Το νέο όνομα χρήστη υπάρχει ήδη. usernameExistsMessage=Το νέο όνομα χρήστη υπάρχει ήδη.
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers. invalidUsernameMessage=Μη έγκυρο όνομα χρήστη, το όνομα χρήστη πρέπει να περιέχει μόνο αλφαβητικούς χαρακτήρες και αριθμούς.
deleteCurrentUserMessage=Cannot delete currently logged in user. deleteCurrentUserMessage=Δεν είναι δυνατή η διαγραφή του τρέχοντος συνδεδεμένου χρήστη.
deleteUsernameExistsMessage=The username does not exist and cannot be deleted. deleteUsernameExistsMessage=Το όνομα χρήστη δεν υπάρχει και δεν μπορεί να διαγραφεί.
error=Error error=Σφάλμα
oops=Oops! oops=Ωχ!
help=Help help=Βοήθεια
goHomepage=Go to Homepage goHomepage=Πήγαινε στην Αρχική Σελίδα
joinDiscord=Join our Discord server joinDiscord=Εγγραφείτε στο Server του Discord μας
seeDockerHub=See Docker Hub seeDockerHub=Βλέπε το Docker Hub
visitGithub=Visit Github Repository visitGithub=Επισκεφθείτε το Αποθετήριο του Github
donate=Donate donate=Δωρισε
color=Color color=Χρώμα
sponsor=οστηρικτής
############### ###############
# Pipeline # # Pipeline #
############### ###############
pipeline.header=Pipeline Menu (Beta) pipeline.header=Μενού Pipeline (Beta)
pipeline.uploadButton=Upload Custom pipeline.uploadButton=Upload Custom
pipeline.configureButton=Configure pipeline.configureButton=Διαμόρφωσε
pipeline.defaultOption=Custom pipeline.defaultOption=Custom
pipeline.submitButton=Submit pipeline.submitButton=Υποβολή
pipeline.help=Pipeline Help pipeline.help=Βοήθεια για το Pipeline
pipeline.scanHelp=Folder Scanning Help pipeline.scanHelp=Βοήθεια για Σάρωση Φακέλων
###################### ######################
# Pipeline Options # # Pipeline Options #
###################### ######################
pipelineOptions.header=Pipeline Configuration pipelineOptions.header=Διαμόρφωση Pipeline
pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.pipelineNameLabel=Όνομα Pipeline
pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.saveSettings=Αποθήκευση Ρυθμίσεων Λειτουργίας
pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.pipelineNamePrompt=Εισαγάγετε το όνομα του pipeline εδώ
pipelineOptions.selectOperation=Select Operation pipelineOptions.selectOperation=Επιλέξτε Λειτουργία
pipelineOptions.addOperationButton=Add operation pipelineOptions.addOperationButton=Προσθήκη λειτουργίας
pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.pipelineHeader=Pipeline:
pipelineOptions.saveButton=Download pipelineOptions.saveButton=Λήψη
pipelineOptions.validateButton=Validate pipelineOptions.validateButton=Επικυρώνω
@@ -111,20 +112,22 @@ navbar.settings=Ρυθμίσεις
############# #############
settings.title=Ρυθμίσεις settings.title=Ρυθμίσεις
settings.update=Υπάρχει διαθέσιμη ενημέρωση settings.update=Υπάρχει διαθέσιμη ενημέρωση
settings.appVersion=Έκδοση εφαρμογής: App Version: settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=Έκδοση εφαρμογής:
settings.downloadOption.title=Επιλέξετε την επιλογή λήψης (Για λήψεις μεμονωμένων αρχείων χωρίς zip): settings.downloadOption.title=Επιλέξετε την επιλογή λήψης (Για λήψεις μεμονωμένων αρχείων χωρίς zip):
settings.downloadOption.1=Άνοιγμα στο ίδιο παράθυρο settings.downloadOption.1=Άνοιγμα στο ίδιο παράθυρο
settings.downloadOption.2=Άνοιγμα σε νέο παράθυρο settings.downloadOption.2=Άνοιγμα σε νέο παράθυρο
settings.downloadOption.3=Λήψη αρχείου settings.downloadOption.3=Λήψη αρχείου
settings.zipThreshold=Zip αρχεία όταν ο αριθμός των ληφθέντων αρχείων είναι πολύ μεγάλος settings.zipThreshold=Αρχεία Zip όταν ο αριθμός των ληφθέντων αρχείων είναι πολύ μεγάλος
settings.signOut=Αποσύνδεση settings.signOut=Αποσύνδεση
settings.accountSettings=Ρυθμίσεις Λογαριασμού settings.accountSettings=Ρυθμίσεις Λογαριασμού
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Αλλαγή Διαπιστευτηρίων changeCreds.title=Αλλαγή Διαπιστευτηρίων
changeCreds.header=Ενημέρωση των λεπτομερειών του Λογαριασμού σας changeCreds.header=Ενημέρωση των λεπτομερειών του Λογαριασμού σας
changeCreds.changePassword=You are using default login credentials. Please enter a new password changeCreds.changePassword=Χρησιμοποιείτε προεπιλεγμένα διαπιστευτήρια σύνδεσης. Εισαγάγετε έναν νέο κωδικό πρόσβασης
changeCreds.newUsername=Νέο Όνομα Χρήστη changeCreds.newUsername=Νέο Όνομα Χρήστη
changeCreds.oldPassword=Τρέχων Κωδικός Πρόσβασης changeCreds.oldPassword=Τρέχων Κωδικός Πρόσβασης
changeCreds.newPassword=Νέος Κωδικός Πρόσβασης changeCreds.newPassword=Νέος Κωδικός Πρόσβασης
@@ -164,10 +167,10 @@ adminUserSettings.roles=Ρόλοι
adminUserSettings.role=Ρόλος adminUserSettings.role=Ρόλος
adminUserSettings.actions=Ενέργειες adminUserSettings.actions=Ενέργειες
adminUserSettings.apiUser=Περιορισμένος Χρήστης για διεπαφή προγραμματισμού εφαρμογών (API User) adminUserSettings.apiUser=Περιορισμένος Χρήστης για διεπαφή προγραμματισμού εφαρμογών (API User)
adminUserSettings.extraApiUser=Additional Limited API User adminUserSettings.extraApiUser=Πρόσθετος Περιορισμένος Χρήστης για Διεπαφή Προγραμματισμού Εφαρμογών (API User)
adminUserSettings.webOnlyUser=Χρήστης μόνο Ιστού adminUserSettings.webOnlyUser=Χρήστης μόνο Ιστού
adminUserSettings.demoUser=Demo User (No custom settings) adminUserSettings.demoUser=Demo χρήστης (Χωρίς προσαρμοσμένες ρυθμίσεις)
adminUserSettings.internalApiUser=Internal API User adminUserSettings.internalApiUser=Εσωτερικός API χρήστης
adminUserSettings.forceChange=Αναγκάστε τον χρήστη να αλλάξει το όνομα χρήστη/κωδικό πρόσβασης κατά τη σύνδεση adminUserSettings.forceChange=Αναγκάστε τον χρήστη να αλλάξει το όνομα χρήστη/κωδικό πρόσβασης κατά τη σύνδεση
adminUserSettings.submit=Αποθήκευση Χρήστη adminUserSettings.submit=Αποθήκευση Χρήστη
@@ -175,7 +178,7 @@ adminUserSettings.submit=Αποθήκευση Χρήστη
# HOME-PAGE # # HOME-PAGE #
############# #############
home.desc=Η τοπικά φιλοξενούμενη one-stop-shop σας για όλες τις ανάγκες σας σε PDF. home.desc=Η τοπικά φιλοξενούμενη one-stop-shop σας για όλες τις ανάγκες σας σε PDF.
home.searchBar=Search for features... home.searchBar=Αναζήτηση για χαρακτηριστικά...
home.viewPdf.title=Εμφάνιση PDF home.viewPdf.title=Εμφάνιση PDF
@@ -196,7 +199,7 @@ split.tags=Page operations,divide,Multi Page,cut,server side
home.rotate.title=Περιστροφή home.rotate.title=Περιστροφή
home.rotate.desc=Περιστροφή των PDF σας με εύκολο τρόπο. home.rotate.desc=Περιστροφή των PDF σας με εύκολο τρόπο.
rotate.tags=server side rotate.tags=από την πλευρά του server
home.imageToPdf.title=Εικόνα σε PDF home.imageToPdf.title=Εικόνα σε PDF
@@ -389,35 +392,35 @@ home.autoRedact.title=Αυτόματο Μαύρισμα Κειμένου
home.autoRedact.desc=Αυτόματη επεξεργασία (Μαύρισμα) κείμενου σε PDF με βάση το κείμενο εισαγωγής home.autoRedact.desc=Αυτόματη επεξεργασία (Μαύρισμα) κείμενου σε PDF με βάση το κείμενο εισαγωγής
autoRedact.tags=Redact,Hide,black out,black,marker,hidden autoRedact.tags=Redact,Hide,black out,black,marker,hidden
home.tableExtraxt.title=PDF to CSV home.tableExtraxt.title=PDF σε CSV
home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV home.tableExtraxt.desc=Εξάγει πίνακες από PDF μετατρέποντάς το σε CSV
tableExtraxt.tags=CSV,Table Extraction,extract,convert tableExtraxt.tags=CSV,Table Extraction,extract,convert
home.autoSizeSplitPDF.title=Auto Split by Size/Count home.autoSizeSplitPDF.title=Αυτόματη διαίρεση κατά μέγεθος/πλήθος
home.autoSizeSplitPDF.desc=Split a single PDF into multiple documents based on size, page count, or document count home.autoSizeSplitPDF.desc=Διαχωρίστε ένα μόνο PDF σε πολλά έγγραφα με βάση το μέγεθος, τον αριθμό σελίδων ή τον αριθμό εγγράφων
autoSizeSplitPDF.tags=pdf,split,document,organization autoSizeSplitPDF.tags=pdf,split,document,organization
home.overlay-pdfs.title=Overlay PDFs home.overlay-pdfs.title=Επικάλυψη PDFs
home.overlay-pdfs.desc=Overlays PDFs on-top of another PDF home.overlay-pdfs.desc=Επικαλύπτει αρχεία PDF πάνω σε άλλο PDF
overlay-pdfs.tags=Overlay overlay-pdfs.tags=Overlay
home.split-by-sections.title=Split PDF by Sections home.split-by-sections.title=Διαχωρισμός PDF ανά ενότητες
home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections home.split-by-sections.desc=Διαχωρίστε κάθε σελίδα ενός PDF σε μικρότερες οριζόντιες και κάθετες ενότητες
split-by-sections.tags=Section Split, Divide, Customize split-by-sections.tags=Section Split, Divide, Customize
home.AddStampRequest.title=Add Stamp to PDF home.AddStampRequest.title=Προσθήκη σφραγίδας σε PDF
home.AddStampRequest.desc=Add text or add image stamps at set locations home.AddStampRequest.desc=Προσθέστε κείμενο ή προσθέστε σφραγίδες εικόνας σε καθορισμένες τοποθεσίες
AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize
home.PDFToBook.title=PDF to Book home.PDFToBook.title=PDF σε Book
home.PDFToBook.desc=Converts PDF to Book/Comic formats using calibre home.PDFToBook.desc=Μετατρέπει τις μορφές PDF σε Book/Comic χρησιμοποιώντας calibre
PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle
home.BookToPDF.title=Book to PDF home.BookToPDF.title=Book σε PDF
home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre home.BookToPDF.desc=Μετατρέπει τις μορφές Books/Comics σε PDF χρησιμοποιώντας calibre
BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle
@@ -466,7 +469,7 @@ pdfToSinglePage.submit=Μετατροπή σε Μονή Σελίδα
pageExtracter.title=Εξαγωγή Σελίδων pageExtracter.title=Εξαγωγή Σελίδων
pageExtracter.header=EΕξαγωγή Σελίδων pageExtracter.header=EΕξαγωγή Σελίδων
pageExtracter.submit=Εξαγωγή pageExtracter.submit=Εξαγωγή
pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1) pageExtracter.placeholder=(π.χ. 1,2,8 ή 4,7,12-16 ή 2n-1)
#getPdfInfo #getPdfInfo
@@ -498,37 +501,37 @@ HTMLToPDF.header=HTML σε PDF
HTMLToPDF.help=Δέχεται αρχεία τύπου HTML και τύπου ZIP που περιέχουν html/css/εικόνες κ.λπ. που απαιτούνται HTMLToPDF.help=Δέχεται αρχεία τύπου HTML και τύπου ZIP που περιέχουν html/css/εικόνες κ.λπ. που απαιτούνται
HTMLToPDF.submit=Μετατροπή HTMLToPDF.submit=Μετατροπή
HTMLToPDF.credit=Χρησιμοποιεί WeasyPrint HTMLToPDF.credit=Χρησιμοποιεί WeasyPrint
HTMLToPDF.zoom=Zoom level for displaying the website. HTMLToPDF.zoom=Επίπεδο ζουμ για την εμφάνιση του ιστότοπου.
HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) HTMLToPDF.pageWidth=Το πλάτος της σελίδας σε εκατοστά. (Κενό έως προεπιλογή)
HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) HTMLToPDF.pageHeight=Το ύψος της σελίδας σε εκατοστά. (Κενό έως προεπιλογή)
HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) HTMLToPDF.marginTop=Το επάνω περιθώριο της σελίδας σε χιλιοστά. (Κενό έως προεπιλογή)
HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) HTMLToPDF.marginBottom=Κάτω περιθώριο σελίδας σε χιλιοστά. (Κενό έως προεπιλογή)
HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) HTMLToPDF.marginLeft=Το αριστερό περιθώριο της σελίδας σε χιλιοστά. (Κενό έως προεπιλογή)
HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) HTMLToPDF.marginRight=Το δεξί περιθώριο της σελίδας σε χιλιοστά. (Κενό έως προεπιλογή)
HTMLToPDF.printBackground=Render the background of websites. HTMLToPDF.printBackground=Αποδώστε το φόντο των ιστοσελίδων.
HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) HTMLToPDF.defaultHeader=Ενεργοποίηση προεπιλεγμένης κεφαλίδας (Όνομα και αριθμός σελίδας)
HTMLToPDF.cssMediaType=Change the CSS media type of the page. HTMLToPDF.cssMediaType=Αλλάξτε τον τύπο μέσων (media type )CSS της σελίδας.
HTMLToPDF.none=None HTMLToPDF.none=Κανένα
HTMLToPDF.print=Print HTMLToPDF.print=Εκτύπωσε
HTMLToPDF.screen=Screen HTMLToPDF.screen=Screen
#AddStampRequest #AddStampRequest
AddStampRequest.header=Stamp PDF AddStampRequest.header=Σφραγίδα PDF
AddStampRequest.title=Stamp PDF AddStampRequest.title=Σφραγίδα PDF
AddStampRequest.stampType=Stamp Type AddStampRequest.stampType=Τύπος σφραγίδας
AddStampRequest.stampText=Stamp Text AddStampRequest.stampText=Κείμενο σφραγίδας
AddStampRequest.stampImage=Stamp Image AddStampRequest.stampImage=Εικόνα σφραγίδας
AddStampRequest.alphabet=Alphabet AddStampRequest.alphabet=Αλφάβητο
AddStampRequest.fontSize=Font/Image Size AddStampRequest.fontSize=Μέγεθος γραμματοσειράς/εικόνας
AddStampRequest.rotation=Rotation AddStampRequest.rotation=Περιστροφή
AddStampRequest.opacity=Opacity AddStampRequest.opacity=Αδιαφάνεια
AddStampRequest.position=Position AddStampRequest.position=Θέση
AddStampRequest.overrideX=Override X Coordinate AddStampRequest.overrideX=Override Συντεταγμένης X
AddStampRequest.overrideY=Override Y Coordinate AddStampRequest.overrideY=Override Συντεταγμένης Ψ
AddStampRequest.customMargin=Custom Margin AddStampRequest.customMargin=Προσαρμοσμένο Περιθώριο
AddStampRequest.customColor=Custom Text Color AddStampRequest.customColor=Προσαρμοσμένο χρώμα κειμένου
AddStampRequest.submit=Submit AddStampRequest.submit=Υποβολή
#sanitizePDF #sanitizePDF
@@ -617,11 +620,11 @@ scalePages.submit=Υποβολή
certSign.title=Υπογραφή Πιστοποιητικού certSign.title=Υπογραφή Πιστοποιητικού
certSign.header=Υπογράψτε ένα αρχείο PDF με το πιστοποιητικό σας (Εργασία σε εξέλιξη) certSign.header=Υπογράψτε ένα αρχείο PDF με το πιστοποιητικό σας (Εργασία σε εξέλιξη)
certSign.selectPDF=Επιλογή αρχείου PDF για υπογραφή: certSign.selectPDF=Επιλογή αρχείου PDF για υπογραφή:
certSign.jksNote=Note: If your certificate type is not listed below, please convert it to a Java Keystore (.jks) file using the keytool command line tool. Then, choose the .jks file option below. certSign.jksNote=Σημείωση: Εάν ο τύπος πιστοποιητικού σας δεν αναφέρεται παρακάτω, μετατρέψτε το σε αρχείο Java Keystore (.jks) χρησιμοποιώντας το εργαλείο γραμμής εντολών keytool. Στη συνέχεια, επιλέξτε την επιλογή αρχείου .jks παρακάτω.
certSign.selectKey=Επιλέξτε το αρχείο του ιδιωτικού κλειδιού σας (μορφή PKCS#8, μπορεί να είναι .pem ή .der): certSign.selectKey=Επιλέξτε το αρχείο του ιδιωτικού κλειδιού σας (μορφή PKCS#8, μπορεί να είναι .pem ή .der):
certSign.selectCert=Επιλέξτε το αρχείο πιστοποιητικού σας (μορφή X.509, μπορεί να είναι .pem ή .der): certSign.selectCert=Επιλέξτε το αρχείο πιστοποιητικού σας (μορφή X.509, μπορεί να είναι .pem ή .der):
certSign.selectP12=Επιλέξτε το αρχείο PKCS#12 Keystore (.p12 ή .pfx) (Προαιρετικό, εάν παρέχεται, θα πρέπει να περιέχει το ιδιωτικό κλειδί και το πιστοποιητικό σας): certSign.selectP12=Επιλέξτε το αρχείο PKCS#12 Keystore (.p12 ή .pfx) (Προαιρετικό, εάν παρέχεται, θα πρέπει να περιέχει το ιδιωτικό κλειδί και το πιστοποιητικό σας):
certSign.selectJKS=Select Your Java Keystore File (.jks or .keystore): certSign.selectJKS=Επιλέξτε το αρχείο Java Keystore (.jks ή .keystore):
certSign.certType=Τύπος Πιστοποιητικού certSign.certType=Τύπος Πιστοποιητικού
certSign.password=Εισαγάγετε τον κωδικό του Keystore ή του Ιδιωτικού Κλειδιού (εάν υπάρχει): certSign.password=Εισαγάγετε τον κωδικό του Keystore ή του Ιδιωτικού Κλειδιού (εάν υπάρχει):
certSign.showSig=Εμφάνιση Υπογραφής certSign.showSig=Εμφάνιση Υπογραφής
@@ -642,9 +645,9 @@ removeBlanks.submit=Αφαίρεση Κενών
#removeAnnotations #removeAnnotations
removeAnnotations.title=Remove Annotations removeAnnotations.title=Κατάργηση σχολιασμών
removeAnnotations.header=Remove Annotations removeAnnotations.header=Κατάργηση σχολιασμών
removeAnnotations.submit=Remove removeAnnotations.submit=Κατάργηση
#compare #compare
@@ -655,17 +658,17 @@ compare.document.2=Έγγραφο 2
compare.submit=Σύγκριση compare.submit=Σύγκριση
#BookToPDF #BookToPDF
BookToPDF.title=Books and Comics to PDF BookToPDF.title=Books και Comics σε PDF
BookToPDF.header=Book to PDF BookToPDF.header=Book σε PDF
BookToPDF.credit=Uses Calibre BookToPDF.credit=Χρησιμοποιεί Caliber
BookToPDF.submit=Convert BookToPDF.submit=Μετατροπή
#PDFToBook #PDFToBook
PDFToBook.title=PDF to Book PDFToBook.title=PDF σε Book
PDFToBook.header=PDF to Book PDFToBook.header=PDF σε Book
PDFToBook.selectText.1=Format PDFToBook.selectText.1=Μορφή
PDFToBook.credit=Uses Calibre PDFToBook.credit=Χρησιμοποιεί Caliber
PDFToBook.submit=Convert PDFToBook.submit=Μετατροπή
#sign #sign
sign.title=Υπογραφή sign.title=Υπογραφή
@@ -752,7 +755,7 @@ compress.submit=Συμπίεση
#Add image #Add image
addImage.title=Προσθήκη Εικόνας addImage.title=Προσθήκη Εικόνας
addImage.header=Προσθήκη Εικόνας σε PDF addImage.header=Προσθήκη Εικόνας σε PDF
addImage.everyPage=Κάθε Σελίδα? addImage.everyPage=Κάθε Σελίδα;
addImage.upload=Προσθήκη Εικόνας addImage.upload=Προσθήκη Εικόνας
addImage.submit=Προσθήκη Εικόνας addImage.submit=Προσθήκη Εικόνας
@@ -770,53 +773,53 @@ pdfOrganiser.title=Διοργανωτής σελίδας
pdfOrganiser.header=Διοργανωτής σελίδας PDF pdfOrganiser.header=Διοργανωτής σελίδας PDF
pdfOrganiser.submit=Αναδιάταξη σελίδων pdfOrganiser.submit=Αναδιάταξη σελίδων
pdfOrganiser.mode=Mode pdfOrganiser.mode=Mode
pdfOrganiser.mode.1=Custom Page Order pdfOrganiser.mode.1=Προσαρμοσμένη Σειρά Σελίδας
pdfOrganiser.mode.2=Reverse Order pdfOrganiser.mode.2=Αντίστροφη Σειρά
pdfOrganiser.mode.3=Duplex Sort pdfOrganiser.mode.3=Ταξινόμηση Διπλής Όψης (Duplex Sort)
pdfOrganiser.mode.4=Booklet Sort pdfOrganiser.mode.4=Ταξινόμηση Φυλλαδίου (Booklet Sort)
pdfOrganiser.mode.5=Side Stitch Booklet Sort pdfOrganiser.mode.5=Side Stitch Booklet Sort
pdfOrganiser.mode.6=Odd-Even Split pdfOrganiser.mode.6=Διαίρεση Μονού-Ζυγού
pdfOrganiser.mode.7=Remove First pdfOrganiser.mode.7=Αφαίρεση Πρώτου
pdfOrganiser.mode.8=Remove Last pdfOrganiser.mode.8=Αφαίρεση Τελευταίου
pdfOrganiser.mode.9=Remove First and Last pdfOrganiser.mode.9=Αφαίρεση Πρώτου και Τελευταίου
pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) pdfOrganiser.placeholder=(π.χ. 1,3,2 ή 4-8,2,10-12 ή 2n-1)
#multiTool #multiTool
multiTool.title=PDF Πολυεργαλείο multiTool.title=PDF Πολυεργαλείο
multiTool.header=PDF Πολυεργαλείο multiTool.header=PDF Πολυεργαλείο
multiTool.uploadPrompts=Please Upload PDF multiTool.uploadPrompts=Ανεβάστε το PDF
#view pdf #view pdf
viewPdf.title=View PDF viewPdf.title=Προβολή PDF
viewPdf.header=View PDF viewPdf.header=Προβολή PDF
#pageRemover #pageRemover
pageRemover.title=Αφαιρετής Σελίδων pageRemover.title=Αφαιρετής Σελίδων
pageRemover.header=Αφαιρετής Σελίδων PDF pageRemover.header=Αφαιρετής Σελίδων PDF
pageRemover.pagesToDelete=Σελίδες προς διαγραφή (Εισαγάγετε μια λίστα με αριθμούς σελίδων διαχωρισμένων με κόμματα): pageRemover.pagesToDelete=Σελίδες προς διαγραφή (Εισαγάγετε μια λίστα με αριθμούς σελίδων διαχωρισμένων με κόμματα):
pageRemover.submit=Αφαίρεση Σελίδων pageRemover.submit=Αφαίρεση Σελίδων
pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30) pageRemover.placeholder=(π.χ. 1,2,6 ή 1-10,15-30)
#rotate #rotate
rotate.title=Περιστροφή PDF rotate.title=Περιστροφή PDF
rotate.header=Περιστροφή PDF rotate.header=Περιστροφή PDF
rotate.selectAngle=Select rotation angle (in multiples of 90 degrees): rotate.selectAngle=Επιλέξτε γωνία περιστροφής (σε πολλαπλάσια των 90 μοιρών):
rotate.submit=Rotate rotate.submit=Περιστροφή
#merge #split-pdfs
split.title=Διαίρεση PDF split.title=Διαίρεση PDF
split.header=Διαίρεση PDF split.header=Διαίρεση PDF
split.desc.1=Οι αριθμοί που επιλέγετε είναι ο αριθμός σελίδας στον οποίο θέλετε να κάνετε διαχωρισμό split.desc.1=Οι αριθμοί που επιλέγετε είναι ο αριθμός σελίδας στον οποίο θέλετε να κάνετε διαχωρισμό
split.desc.2=Ως εκ τούτου, η επιλογή 1,3,7-8 θα χωρίσει ένα έγγραφο 10 σελίδων σε 6 ξεχωριστά αρχεία PDF με: split.desc.2=Ως εκ τούτου, η επιλογή 1,3,7-9 θα χωρίσει ένα έγγραφο 10 σελίδων σε 6 ξεχωριστά αρχεία PDF με:
split.desc.3=Έγγραφο #1: Σελίδα 1 split.desc.3=Έγγραφο #1: Σελίδα 1
split.desc.4=Έγγραφο #2: Σελίδα 2 και 3 split.desc.4=Έγγραφο #2: Σελίδα 2 και 3
split.desc.5=Έγγραφο #3: Σελίδα 4, 5 κσι 6 split.desc.5=Έγγραφο #3: Σελίδα 4, 5, 6 και 7
split.desc.6=Έγγραφο #4: Σελίδα 7 split.desc.6=Έγγραφο #4: Σελίδα 8
split.desc.7=Έγγραφο #5: Σελίδα 8 split.desc.7=Έγγραφο #5: Σελίδα 9
split.desc.8=Έγγραφο #6: Σελίδα 9 και 10 split.desc.8=Έγγραφο #6: Σελίδα 10
split.splitPages=Εισαγάγετε σελίδες για διαχωρισμό: split.splitPages=Εισαγάγετε σελίδες για διαχωρισμό:
split.submit=Διαίρεση split.submit=Διαίρεση
@@ -884,8 +887,8 @@ watermark.selectText.7=Αδιαφάνεια (Opacity) (0% - 100%):
watermark.selectText.8=Τύπος Υδατογραφήματος: watermark.selectText.8=Τύπος Υδατογραφήματος:
watermark.selectText.9=Εικόνα Υδατογραφήματος: watermark.selectText.9=Εικόνα Υδατογραφήματος:
watermark.submit=Προσθήκη Υδατογραφήματος watermark.submit=Προσθήκη Υδατογραφήματος
watermark.type.1=Text watermark.type.1=Κείμενο
watermark.type.2=Image watermark.type.2=Εικόνα
#Change permissions #Change permissions
@@ -937,7 +940,8 @@ pdfToPDFA.title=PDF σε PDF/A
pdfToPDFA.header=PDF σε PDF/A pdfToPDFA.header=PDF σε PDF/A
pdfToPDFA.credit=Αυτή η υπηρεσία χρησιμοποιεί OCRmyPDF για PDF/A μετατροπή pdfToPDFA.credit=Αυτή η υπηρεσία χρησιμοποιεί OCRmyPDF για PDF/A μετατροπή
pdfToPDFA.submit=Μετατροπή pdfToPDFA.submit=Μετατροπή
pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.tip=Προς το παρόν δεν λειτουργεί για πολλαπλές εισόδους ταυτόχρονα
pdfToPDFA.outputFormat=Output format
#PDFToWord #PDFToWord
@@ -978,68 +982,77 @@ PDFToXML.credit=Αυτή η υπηρεσία χρησιμοποιεί LibreOffic
PDFToXML.submit=Μετατροπή PDFToXML.submit=Μετατροπή
#PDFToCSV #PDFToCSV
PDFToCSV.title=PDF ?? CSV PDFToCSV.title=PDF σε CSV
PDFToCSV.header=PDF ?? CSV PDFToCSV.header=PDF σε CSV
PDFToCSV.prompt=Choose page to extract table PDFToCSV.prompt=Επιλέξτε σελίδα για εξαγωγή πίνακα
PDFToCSV.submit=????????? PDFToCSV.submit=Εξαξωγή
#split-by-size-or-count #split-by-size-or-count
split-by-size-or-count.title=Split PDF by Size or Count split-by-size-or-count.title=Διαχωρίστε το PDF Κατά Μέγεθος ή Μέτρηση
split-by-size-or-count.header=Split PDF by Size or Count split-by-size-or-count.header=Διαχωρίστε το PDF Κατά Μέγεθος ή Μέτρηση
split-by-size-or-count.type.label=Select Split Type split-by-size-or-count.type.label=Επιλέξτε Τύπος Διαχωρισμού
split-by-size-or-count.type.size=By Size split-by-size-or-count.type.size=Ανά Μέγεθος
split-by-size-or-count.type.pageCount=By Page Count split-by-size-or-count.type.pageCount=Ανά αριθμό σελίδων
split-by-size-or-count.type.docCount=By Document Count split-by-size-or-count.type.docCount=Ανά αριθμό εγγράφων
split-by-size-or-count.value.label=Enter Value split-by-size-or-count.value.label=Εισαγάγετε τιμή
split-by-size-or-count.value.placeholder=Enter size (e.g., 2MB or 3KB) or count (e.g., 5) split-by-size-or-count.value.placeholder=Εισαγάγετε μέγεθος (π.χ. 2MB ή 3KB) ή μέτρηση (π.χ. 5)
split-by-size-or-count.submit=Submit split-by-size-or-count.submit=Υποβολή
#overlay-pdfs #overlay-pdfs
overlay-pdfs.header=Overlay PDF Files overlay-pdfs.header=Επικάλυψη αρχείων PDF
overlay-pdfs.baseFile.label=Select Base PDF File overlay-pdfs.baseFile.label=Επιλέξτε Βασικό αρχείο PDF
overlay-pdfs.overlayFiles.label=Select Overlay PDF Files overlay-pdfs.overlayFiles.label=Επιλέξτε Επικάλυψη αρχείων PDF
overlay-pdfs.mode.label=Select Overlay Mode overlay-pdfs.mode.label=Επιλέξτε Λειτουργία Επικάλυψης
overlay-pdfs.mode.sequential=Sequential Overlay overlay-pdfs.mode.sequential=Διαδοχική Επικάλυψη
overlay-pdfs.mode.interleaved=Interleaved Overlay overlay-pdfs.mode.interleaved=Επικάλυψη με Παρεμβολή
overlay-pdfs.mode.fixedRepeat=Fixed Repeat Overlay overlay-pdfs.mode.fixedRepeat=Διορθώθηκε η Επικάλυψη Επανάληψης
overlay-pdfs.counts.label=Overlay Counts (for Fixed Repeat Mode) overlay-pdfs.counts.label=Μετρήσεις επικάλυψης (για σταθερή λειτουργία επανάληψης)
overlay-pdfs.counts.placeholder=Enter comma-separated counts (e.g., 2,3,1) overlay-pdfs.counts.placeholder=Εισαγάγετε μετρήσεις διαχωρισμένες με κόμματα (π.χ. 2,3,1)
overlay-pdfs.position.label=Select Overlay Position overlay-pdfs.position.label=Επιλέξτε Θέση Επικάλυψης
overlay-pdfs.position.foreground=Foreground overlay-pdfs.position.foreground=Foreground
overlay-pdfs.position.background=Background overlay-pdfs.position.background=Background
overlay-pdfs.submit=Submit overlay-pdfs.submit=Υποβολή
#split-by-sections #split-by-sections
split-by-sections.title=Split PDF by Sections split-by-sections.title=Διαχωρισμός PDF ανά ενότητες
split-by-sections.header=Split PDF into Sections split-by-sections.header=Διαχωρίστε το PDF σε Ενότητες
split-by-sections.horizontal.label=Horizontal Divisions split-by-sections.horizontal.label=Οριζόντιες Διαιρέσεις
split-by-sections.vertical.label=Vertical Divisions split-by-sections.vertical.label=Κάθετες Διαιρέσεις
split-by-sections.horizontal.placeholder=Enter number of horizontal divisions split-by-sections.horizontal.placeholder=Εισαγάγετε τον αριθμό των οριζόντιων διαιρέσεων
split-by-sections.vertical.placeholder=Enter number of vertical divisions split-by-sections.vertical.placeholder=Εισαγάγετε τον αριθμό των κάθετων διαιρέσεων
split-by-sections.submit=Split PDF split-by-sections.submit=Διαχωρισμός PDF
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Συγχώνευση σε ένα PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenses licenses.nav=Άδειες
licenses.title=3rd Party Licenses licenses.title=3rd Party Άδειες
licenses.header=3rd Party Licenses licenses.header=3rd Party Άδειες
licenses.module=Module licenses.module=Module
licenses.version=Version licenses.version=Εκδοχή
licenses.license=License licenses.license=Άδεια
# error # error
error.sorry=Sorry for the issue! error.sorry=Συγγνώμη για το ζήτημα!
error.needHelp=Need help / Found an issue? error.needHelp=Χρειάζεστε βοήθεια / Βρήκατε πρόβλημα;
error.contactTip=If you're still having trouble, don't hesitate to reach out to us for help. You can submit a ticket on our GitHub page or contact us through Discord: error.contactTip=Εάν εξακολουθείτε να αντιμετωπίζετε προβλήματα, μη διστάσετε να επικοινωνήσετε μαζί μας για βοήθεια. Μπορείτε να υποβάλετε ένα ticket στη σελίδα μας στο GitHub ή να επικοινωνήσετε μαζί μας μέσω του Discord:
error.404.head=404 - Page Not Found | Oops, we tripped in the code! error.404.head=404 - Η σελίδα δεν βρέθηκε | Oops, we tripped in the code!
error.404.1=We can't seem to find the page you're looking for. error.404.1=Δεν μπορούμε να βρούμε τη σελίδα που ψάχνετε.
error.404.2=Something went wrong error.404.2=Κάτι πήγε στραβά
error.github=Submit a ticket on GitHub error.github=Υποβάλετε ένα ticket στο GitHub
error.showStack=Show Stack Trace error.showStack=Εμφάνιση Stack Trace
error.copyStack=Copy Stack Trace error.copyStack=Αντιγραφή Stack Trace
error.githubSubmit=GitHub - Submit a ticket error.githubSubmit=GitHub - Υποβάλετε ένα ticket
error.discordSubmit=Discord - Submit Support post error.discordSubmit=Discord - Υποβάλετε ένα Support post

View File

@@ -66,6 +66,7 @@ seeDockerHub=See Docker Hub
visitGithub=Visit Github Repository visitGithub=Visit Github Repository
donate=Donate donate=Donate
color=Color color=Color
sponsor=Sponsor
@@ -111,6 +112,7 @@ navbar.settings=Settings
############# #############
settings.title=Settings settings.title=Settings
settings.update=Update available settings.update=Update available
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=App Version: settings.appVersion=App Version:
settings.downloadOption.title=Choose download option (For single file non zip downloads): settings.downloadOption.title=Choose download option (For single file non zip downloads):
settings.downloadOption.1=Open in same window settings.downloadOption.1=Open in same window
@@ -119,8 +121,9 @@ settings.downloadOption.3=Download file
settings.zipThreshold=Zip files when the number of downloaded files exceeds settings.zipThreshold=Zip files when the number of downloaded files exceeds
settings.signOut=Sign Out settings.signOut=Sign Out
settings.accountSettings=Account Settings settings.accountSettings=Account Settings
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Change Credentials changeCreds.title=Change Credentials
changeCreds.header=Update Your Account Details changeCreds.header=Update Your Account Details
@@ -806,17 +809,17 @@ rotate.selectAngle=Select rotation angle (in multiples of 90 degrees):
rotate.submit=Rotate rotate.submit=Rotate
#merge #split-pdfs
split.title=Split PDF split.title=Split PDF
split.header=Split PDF split.header=Split PDF
split.desc.1=The numbers you select are the page number you wish to do a split on split.desc.1=The numbers you select are the page number you wish to do a split on
split.desc.2=As such selecting 1,3,7-8 would split a 10 page document into 6 separate PDFS with: split.desc.2=As such selecting 1,3,7-9 would split a 10 page document into 6 separate PDFS with:
split.desc.3=Document #1: Page 1 split.desc.3=Document #1: Page 1
split.desc.4=Document #2: Page 2 and 3 split.desc.4=Document #2: Page 2 and 3
split.desc.5=Document #3: Page 4, 5 and 6 split.desc.5=Document #3: Page 4, 5, 6 and 7
split.desc.6=Document #4: Page 7 split.desc.6=Document #4: Page 8
split.desc.7=Document #5: Page 8 split.desc.7=Document #5: Page 9
split.desc.8=Document #6: Page 9 and 10 split.desc.8=Document #6: Page 10
split.splitPages=Enter pages to split on: split.splitPages=Enter pages to split on:
split.submit=Split split.submit=Split
@@ -938,6 +941,7 @@ pdfToPDFA.header=PDF To PDF/A
pdfToPDFA.credit=This service uses OCRmyPDF for PDF/A conversion pdfToPDFA.credit=This service uses OCRmyPDF 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
#PDFToWord #PDFToWord
@@ -1021,6 +1025,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions
split-by-sections.submit=Split PDF split-by-sections.submit=Split PDF
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Merge Into One PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenses licenses.nav=Licenses
licenses.title=3rd Party Licenses licenses.title=3rd Party Licenses

View File

@@ -66,6 +66,7 @@ seeDockerHub=See Docker Hub
visitGithub=Visit Github Repository visitGithub=Visit Github Repository
donate=Donate donate=Donate
color=Color color=Color
sponsor=Sponsor
@@ -111,6 +112,7 @@ navbar.settings=Settings
############# #############
settings.title=Settings settings.title=Settings
settings.update=Update available settings.update=Update available
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=App Version: settings.appVersion=App Version:
settings.downloadOption.title=Choose download option (For single file non zip downloads): settings.downloadOption.title=Choose download option (For single file non zip downloads):
settings.downloadOption.1=Open in same window settings.downloadOption.1=Open in same window
@@ -119,8 +121,9 @@ settings.downloadOption.3=Download file
settings.zipThreshold=Zip files when the number of downloaded files exceeds settings.zipThreshold=Zip files when the number of downloaded files exceeds
settings.signOut=Sign Out settings.signOut=Sign Out
settings.accountSettings=Account Settings settings.accountSettings=Account Settings
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Change Credentials changeCreds.title=Change Credentials
changeCreds.header=Update Your Account Details changeCreds.header=Update Your Account Details
@@ -806,17 +809,17 @@ rotate.selectAngle=Select rotation angle (in multiples of 90 degrees):
rotate.submit=Rotate rotate.submit=Rotate
#merge #split-pdfs
split.title=Split PDF split.title=Split PDF
split.header=Split PDF split.header=Split PDF
split.desc.1=The numbers you select are the page number you wish to do a split on split.desc.1=The numbers you select are the page number you wish to do a split on
split.desc.2=As such selecting 1,3,7-8 would split a 10 page document into 6 separate PDFS with: split.desc.2=As such selecting 1,3,7-9 would split a 10 page document into 6 separate PDFS with:
split.desc.3=Document #1: Page 1 split.desc.3=Document #1: Page 1
split.desc.4=Document #2: Page 2 and 3 split.desc.4=Document #2: Page 2 and 3
split.desc.5=Document #3: Page 4, 5 and 6 split.desc.5=Document #3: Page 4, 5, 6, 7
split.desc.6=Document #4: Page 7 split.desc.6=Document #4: Page 8
split.desc.7=Document #5: Page 8 split.desc.7=Document #5: Page 9
split.desc.8=Document #6: Page 9 and 10 split.desc.8=Document #6: Page 10
split.splitPages=Enter pages to split on: split.splitPages=Enter pages to split on:
split.submit=Split split.submit=Split
@@ -938,6 +941,7 @@ pdfToPDFA.header=PDF To PDF/A
pdfToPDFA.credit=This service uses OCRmyPDF for PDF/A conversion pdfToPDFA.credit=This service uses OCRmyPDF 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
#PDFToWord #PDFToWord
@@ -1021,6 +1025,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions
split-by-sections.submit=Split PDF split-by-sections.submit=Split PDF
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Merge Into One PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenses licenses.nav=Licenses
licenses.title=3rd Party Licenses licenses.title=3rd Party Licenses

View File

@@ -58,14 +58,15 @@ invalidUsernameMessage=Nombre de usuario no válido, El nombre de ususario debe
deleteCurrentUserMessage=No puede eliminar el usuario que tiene la sesión actualmente en uso. deleteCurrentUserMessage=No puede eliminar el usuario que tiene la sesión actualmente en uso.
deleteUsernameExistsMessage=El usuario no existe y no puede eliminarse. deleteUsernameExistsMessage=El usuario no existe y no puede eliminarse.
error=Error error=Error
oops=Oops! oops=Ups!
help=Help help=Help
goHomepage=Go to Homepage goHomepage=Ir a la página principal
joinDiscord=Join our Discord server joinDiscord=Únase a nuestro servidor Discord
seeDockerHub=See Docker Hub seeDockerHub=Ver Docker Hub
visitGithub=Visit Github Repository visitGithub=Visitar Repositorio de Github
donate=Donate donate=Donar
color=Color color=Color
sponsor=Patrocinador
@@ -77,8 +78,8 @@ pipeline.uploadButton=Cargar personalización
pipeline.configureButton=Configurar pipeline.configureButton=Configurar
pipeline.defaultOption=Personalizar pipeline.defaultOption=Personalizar
pipeline.submitButton=Enviar pipeline.submitButton=Enviar
pipeline.help=Pipeline Help pipeline.help=Ayuda de Canalización
pipeline.scanHelp=Folder Scanning Help pipeline.scanHelp=Ayuda de escaneado de carpetas
###################### ######################
# Pipeline Options # # Pipeline Options #
@@ -111,6 +112,7 @@ navbar.settings=Configuración
############# #############
settings.title=Configuración settings.title=Configuración
settings.update=Actualización disponible settings.update=Actualización disponible
settings.updateAvailable={0} es la versión instalada. Hay disponible una versión nueva ({1}).
settings.appVersion=Versión de la aplicación: settings.appVersion=Versión de la aplicación:
settings.downloadOption.title=Elegir la opción de descarga (para descargas de un solo archivo sin ZIP): settings.downloadOption.title=Elegir la opción de descarga (para descargas de un solo archivo sin ZIP):
settings.downloadOption.1=Abrir en la misma ventana settings.downloadOption.1=Abrir en la misma ventana
@@ -119,8 +121,9 @@ settings.downloadOption.3=Descargar el archivo
settings.zipThreshold=Archivos ZIP cuando excede el número de archivos descargados settings.zipThreshold=Archivos ZIP cuando excede el número de archivos descargados
settings.signOut=Desconectar settings.signOut=Desconectar
settings.accountSettings=Configuración de la cuenta settings.accountSettings=Configuración de la cuenta
settings.bored.help=Habilita el juego del huevo de pascua
settings.cacheInputs.name=Guardar entradas del formulario
settings.cacheInputs.help=Habilitar guardar entradas previamente utilizadas para futuras acciones
changeCreds.title=Cambiar Credenciales changeCreds.title=Cambiar Credenciales
changeCreds.header=Actualice los detalles de su cuenta changeCreds.header=Actualice los detalles de su cuenta
@@ -244,7 +247,7 @@ compressPdfs.tags=aplastar,pequeño,diminuto
home.changeMetadata.title=Cambiar metadatos home.changeMetadata.title=Cambiar metadatos
home.changeMetadata.desc=Cambiar/Eliminar/Añadir metadatos al documento PDF home.changeMetadata.desc=Cambiar/Eliminar/Añadir metadatos al documento PDF
changeMetadata.tags==Título,autor,fecha,creación,hora,editorial,productor,estadísticas changeMetadata.tags=título,autor,fecha,creación,hora,editorial,productor,estadísticas
home.fileToPDF.title=Convertir archivo a PDF home.fileToPDF.title=Convertir archivo a PDF
home.fileToPDF.desc=Convertir casi cualquier archivo a PDF (DOCX, PNG, XLS, PPT, TXT y más) home.fileToPDF.desc=Convertir casi cualquier archivo a PDF (DOCX, PNG, XLS, PPT, TXT y más)
@@ -769,23 +772,23 @@ merge.submit=Unir
pdfOrganiser.title=Organizador de páginas pdfOrganiser.title=Organizador de páginas
pdfOrganiser.header=Organizador de páginas PDF pdfOrganiser.header=Organizador de páginas PDF
pdfOrganiser.submit=Organizar páginas pdfOrganiser.submit=Organizar páginas
pdfOrganiser.mode=Mode pdfOrganiser.mode=Modo
pdfOrganiser.mode.1=Custom Page Order pdfOrganiser.mode.1=Orden de páginas personalizado
pdfOrganiser.mode.2=Reverse Order pdfOrganiser.mode.2=Orden inverso
pdfOrganiser.mode.3=Duplex Sort pdfOrganiser.mode.3=Ordenar dúplex
pdfOrganiser.mode.4=Booklet Sort pdfOrganiser.mode.4=Ordenar folleto
pdfOrganiser.mode.5=Side Stitch Booklet Sort pdfOrganiser.mode.5=Orden de folleto de encuadernado lateral
pdfOrganiser.mode.6=Odd-Even Split pdfOrganiser.mode.6=División par-impar
pdfOrganiser.mode.7=Remove First pdfOrganiser.mode.7=Quitar primera
pdfOrganiser.mode.8=Remove Last pdfOrganiser.mode.8=Quitar última
pdfOrganiser.mode.9=Remove First and Last pdfOrganiser.mode.9=Quitar primera y última
pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) pdfOrganiser.placeholder=(por ej., 1,3,2 o 4-8,2,10-12 o 2n-1)
#multiTool #multiTool
multiTool.title=Multi-herramienta PDF multiTool.title=Multi-herramienta PDF
multiTool.header=Multi-herramienta PDF multiTool.header=Multi-herramienta PDF
multiTool.uploadPrompts=Please Upload PDF multiTool.uploadPrompts=Por favor, cargue PDF
#view pdf #view pdf
viewPdf.title=Ver PDF viewPdf.title=Ver PDF
@@ -806,17 +809,17 @@ rotate.selectAngle=Seleccionar ángulo de rotación (en múltiplos de 90 grados)
rotate.submit=Rotar rotate.submit=Rotar
#merge #split-pdfs
split.title=Dividir PDF split.title=Dividir PDF
split.header=Dividir PDF split.header=Dividir PDF
split.desc.1=Los números que seleccione son el número de página en el que desea hacer una división split.desc.1=Los números que seleccione son el número de página en el que desea hacer una división
split.desc.2=Como tal, seleccionar 1,3,7-8 dividiría un documento de 10 páginas en 6 archivos PDF separados con: split.desc.2=Como tal, seleccionar 1,3,7-9 dividiría un documento de 10 páginas en 6 archivos PDF separados con:
split.desc.3=Documento #1: Página 1 split.desc.3=Documento #1: Página 1
split.desc.4=Documento #2: Páginas 2 y 3 split.desc.4=Documento #2: Páginas 2 y 3
split.desc.5=Documento #3: Páginas 4, 5 y 6 split.desc.5=Documento #3: Páginas 4, 5, 6 y 7
split.desc.6=Documento #4: Página 7 split.desc.6=Documento #4: Página 8
split.desc.7=Documento #5: Página 8 split.desc.7=Documento #5: Página 9
split.desc.8=Documento #6: Páginas 9 y 10 split.desc.8=Documento #6: Páginas 10
split.splitPages=Introducir las páginas para dividir: split.splitPages=Introducir las páginas para dividir:
split.submit=Dividir split.submit=Dividir
@@ -884,8 +887,8 @@ watermark.selectText.7=Opacidad (0% - 100%):
watermark.selectText.8=Tipo de marca de agua: watermark.selectText.8=Tipo de marca de agua:
watermark.selectText.9=Imagen de marca de agua: watermark.selectText.9=Imagen de marca de agua:
watermark.submit=Añadir marca de agua watermark.submit=Añadir marca de agua
watermark.type.1=Text watermark.type.1=Texto
watermark.type.2=Image watermark.type.2=Imagen
#Change permissions #Change permissions
@@ -937,7 +940,8 @@ pdfToPDFA.title=PDF a PDF/A
pdfToPDFA.header=PDF a PDF/A pdfToPDFA.header=PDF a PDF/A
pdfToPDFA.credit=Este servicio usa OCRmyPDF para la conversión a PDF/A pdfToPDFA.credit=Este servicio usa OCRmyPDF para la conversión a PDF/A
pdfToPDFA.submit=Convertir pdfToPDFA.submit=Convertir
pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.tip=Actualmente no funciona para múltiples entrada a la vez
pdfToPDFA.outputFormat=Output format
#PDFToWord #PDFToWord
@@ -1021,6 +1025,15 @@ split-by-sections.vertical.placeholder=Introduzca el número de divisiones verti
split-by-sections.submit=Dividir PDF split-by-sections.submit=Dividir PDF
split-by-sections.merge=Unir en Un PDF split-by-sections.merge=Unir en Un PDF
#printFile
printFile.title=Imprimir archivo
printFile.header=Imprimir archivo en la impresora
printFile.selectText.1=Seleccionar archivo para imprimir
printFile.selectText.2=Introducir nombre de la impresora
printFile.submit=Imprimir
#licenses #licenses
licenses.nav=Licencias licenses.nav=Licencias
licenses.title=Licencias de terceros licenses.title=Licencias de terceros
@@ -1031,15 +1044,15 @@ licenses.license=Licencia
# error # error
error.sorry=Sorry for the issue! error.sorry=¡Perdón por el fallo!
error.needHelp=Need help / Found an issue? error.needHelp=Necesita ayuda / Encontró un fallo?
error.contactTip=If you're still having trouble, don't hesitate to reach out to us for help. You can submit a ticket on our GitHub page or contact us through Discord: error.contactTip=Si sigue experimentando errores, no dude en contactarnos para solicitar soporte. Puede enviarnos un ticket en la página de GitHub o contactarnos mediante Discord:
error.404.head=404 - Page Not Found | Oops, we tripped in the code! error.404.head=404 - Página no encontrada | Ups, tropezamos con el código!
error.404.1=We can't seem to find the page you're looking for. error.404.1=Parece que no podemos encontrar la página que está buscando.
error.404.2=Something went wrong error.404.2=Algo salió mal
error.github=Submit a ticket on GitHub error.github=Envíe un ticket en GitHub
error.showStack=Show Stack Trace error.showStack=Mostrar seguimiento de pila
error.copyStack=Copy Stack Trace error.copyStack=Mostrar seguimiento de pila
error.githubSubmit=GitHub - Submit a ticket error.githubSubmit=GitHub - Enviar un ticket
error.discordSubmit=Discord - Submit Support post error.discordSubmit=Discord - Enviar mensaje de soporte

View File

@@ -66,6 +66,7 @@ seeDockerHub=See Docker Hub
visitGithub=Visit Github Repository visitGithub=Visit Github Repository
donate=Donate donate=Donate
color=Color color=Color
sponsor=Sponsor
@@ -111,6 +112,7 @@ navbar.settings=Ezarpenak
############# #############
settings.title=Ezarpenak settings.title=Ezarpenak
settings.update=Eguneratze eskuragarria settings.update=Eguneratze eskuragarria
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=Aplikazioaren bertsioa: settings.appVersion=Aplikazioaren bertsioa:
settings.downloadOption.title=Hautatu deskargatzeko aukera (fitxategi bakarra deskargatzeko ZIP gabe): settings.downloadOption.title=Hautatu deskargatzeko aukera (fitxategi bakarra deskargatzeko ZIP gabe):
settings.downloadOption.1=Ireki leiho berean settings.downloadOption.1=Ireki leiho berean
@@ -119,8 +121,9 @@ settings.downloadOption.3=Deskargatu fitxategia
settings.zipThreshold=ZIP fitxategiak deskargatutako fitxategi kopurua gainditzen denean settings.zipThreshold=ZIP fitxategiak deskargatutako fitxategi kopurua gainditzen denean
settings.signOut=Saioa itxi settings.signOut=Saioa itxi
settings.accountSettings=Kontuaren ezarpenak settings.accountSettings=Kontuaren ezarpenak
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Change Credentials changeCreds.title=Change Credentials
changeCreds.header=Update Your Account Details changeCreds.header=Update Your Account Details
@@ -806,17 +809,17 @@ rotate.selectAngle=Hautatu errotazio-angelua (90 graduko multiploetan):
rotate.submit=Biratu rotate.submit=Biratu
#merge #split-pdfs
split.title=Zatitu PDFa split.title=Zatitu PDFa
split.header=Zatitu PDFa split.header=Zatitu PDFa
split.desc.1=Hautatzen dituzun zenbakiak zatiketa egin nahi duzun orrialde-zenbakiak dira split.desc.1=Hautatzen dituzun zenbakiak zatiketa egin nahi duzun orrialde-zenbakiak dira
split.desc.2=Beraz, 1,3,7-8 hautatzean 10 orrialdeko dokumentua zatituko luke 6 PDF fitxategi bereizituetan split.desc.2=Beraz, 1,3,7-9 hautatzean 10 orrialdeko dokumentua zatituko luke 6 PDF fitxategi bereizituetan
split.desc.3=#1 Dokumentua: 1. orrialdea split.desc.3=#1 Dokumentua: 1. orrialdea
split.desc.4=#2 Dokumentua: 2. eta 3. orrialdeak split.desc.4=#2 Dokumentua: 2. eta 3. orrialdeak
split.desc.5=#3 Dokumentua: 4., 5. eta 6. orrialdeak split.desc.5=#3 Dokumentua: 4., 5., 6. eta 7. orrialdeak
split.desc.6=#4 Dokumentua: 7. orrialdea split.desc.6=#4 Dokumentua: 8. orrialdea
split.desc.7=#5 Dokumentua: 8. orrialdea split.desc.7=#5 Dokumentua: 9. orrialdea
split.desc.8=#6 Dokumentua: 9. eta 10. orrialdeak split.desc.8=#6 Dokumentua: 10. orrialdeak
split.splitPages=Sartu orrialdeak zatitzeko: split.splitPages=Sartu orrialdeak zatitzeko:
split.submit=Zatitu split.submit=Zatitu
@@ -938,6 +941,7 @@ pdfToPDFA.header=PDFa PDF/A bihurtu
pdfToPDFA.credit=Zerbitzu honek OCRmyPDF erabiltzen du PDFak PDF/A bihurtzeko pdfToPDFA.credit=Zerbitzu honek OCRmyPDF 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
#PDFToWord #PDFToWord
@@ -1021,6 +1025,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions
split-by-sections.submit=Split PDF split-by-sections.submit=Split PDF
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Merge Into One PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenses licenses.nav=Licenses
licenses.title=3rd Party Licenses licenses.title=3rd Party Licenses

View File

@@ -54,18 +54,19 @@ notAuthenticatedMessage=Utilisateur non authentifié.
userNotFoundMessage=Utilisateur non trouvé. userNotFoundMessage=Utilisateur non trouvé.
incorrectPasswordMessage=Le mot de passe actuel est incorrect. incorrectPasswordMessage=Le mot de passe actuel est incorrect.
usernameExistsMessage=Le nouveau nom dutilisateur existe déjà. usernameExistsMessage=Le nouveau nom dutilisateur existe déjà.
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers. invalidUsernameMessage=Nom dutilisateur invalide, le nom dutilisateur ne peut contenir que des chiffres et des lettres.
deleteCurrentUserMessage=Cannot delete currently logged in user. deleteCurrentUserMessage=Impossible de supprimer lutilisateur actuellement connecté.
deleteUsernameExistsMessage=The username does not exist and cannot be deleted. deleteUsernameExistsMessage=Le nom dutilisateur nexiste pas et ne peut pas être supprimé.
error=Error error=Erreur
oops=Oops! oops=Oups !
help=Help help=Aide
goHomepage=Go to Homepage goHomepage=Aller à la page daccueil
joinDiscord=Join our Discord server joinDiscord=Rejoignez notre serveur Discord
seeDockerHub=See Docker Hub seeDockerHub=Consulter le Docker Hub
visitGithub=Visit Github Repository visitGithub=Visiter le dépôt Github
donate=Donate donate=Faire un don
color=Color color=Couleur
sponsor=Sponsor
@@ -111,6 +112,7 @@ navbar.settings=Paramètres
############# #############
settings.title=Paramètres settings.title=Paramètres
settings.update=Mise à jour disponible settings.update=Mise à jour disponible
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=Version de lapplication : settings.appVersion=Version de lapplication :
settings.downloadOption.title=Choisissez loption de téléchargement (pour les téléchargements à fichier unique non ZIP) : settings.downloadOption.title=Choisissez loption de téléchargement (pour les téléchargements à fichier unique non ZIP) :
settings.downloadOption.1=Ouvrir dans la même fenêtre settings.downloadOption.1=Ouvrir dans la même fenêtre
@@ -119,12 +121,13 @@ settings.downloadOption.3=Télécharger le fichier
settings.zipThreshold=Compresser les fichiers en ZIP lorsque le nombre de fichiers téléchargés dépasse settings.zipThreshold=Compresser les fichiers en ZIP lorsque le nombre de fichiers téléchargés dépasse
settings.signOut=Déconnexion settings.signOut=Déconnexion
settings.accountSettings=Paramètres du compte settings.accountSettings=Paramètres du compte
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Modifiez vos identifiants changeCreds.title=Modifiez vos identifiants
changeCreds.header=Mettez à jour vos identifiants de connexion changeCreds.header=Mettez à jour vos identifiants de connexion
changeCreds.changePassword=You are using default login credentials. Please enter a new password changeCreds.changePassword=Vous utilisez les identifiants de connexion par défaut. Veuillez saisir un nouveau mot de passe
changeCreds.newUsername=Nouveau nom dutilisateur changeCreds.newUsername=Nouveau nom dutilisateur
changeCreds.oldPassword=Mot de passe actuel changeCreds.oldPassword=Mot de passe actuel
changeCreds.newPassword=Nouveau mot de passe changeCreds.newPassword=Nouveau mot de passe
@@ -159,12 +162,12 @@ adminUserSettings.header=Administration des paramètres des utilisateurs
adminUserSettings.admin=Administateur adminUserSettings.admin=Administateur
adminUserSettings.user=Utilisateur adminUserSettings.user=Utilisateur
adminUserSettings.addUser=Ajouter un utilisateur adminUserSettings.addUser=Ajouter un utilisateur
adminUserSettings.usernameInfo=Username must only contain letters and numbers, no spaces or special characters. adminUserSettings.usernameInfo=Le nom dutilisateur ne doit contenir que des lettres et des chiffres, sans espaces ni caractères spéciaux.
adminUserSettings.roles=Rôles adminUserSettings.roles=Rôles
adminUserSettings.role=Rôle adminUserSettings.role=Rôle
adminUserSettings.actions=Actions adminUserSettings.actions=Actions
adminUserSettings.apiUser=Utilisateur API limité adminUserSettings.apiUser=Utilisateur API limité
adminUserSettings.extraApiUser=Additional Limited API User adminUserSettings.extraApiUser=Utilisateur limité supplémentaire de lAPI
adminUserSettings.webOnlyUser=Utilisateur Web uniquement adminUserSettings.webOnlyUser=Utilisateur Web uniquement
adminUserSettings.demoUser=Demo User (Paramètres par défaut) adminUserSettings.demoUser=Demo User (Paramètres par défaut)
adminUserSettings.internalApiUser=Internal API User adminUserSettings.internalApiUser=Internal API User
@@ -806,17 +809,17 @@ rotate.selectAngle=Angle de rotation (par multiples de 90degrés)
rotate.submit=Pivoter rotate.submit=Pivoter
#merge #split-pdfs
split.title=Diviser split.title=Diviser
split.header=Diviser split.header=Diviser
split.desc.1=Les numéros que vous sélectionnez sont le numéro de page sur lequel vous souhaitez faire une division split.desc.1=Les numéros que vous sélectionnez sont le numéro de page sur lequel vous souhaitez faire une division
split.desc.2=Ainsi, la sélection de 1,3,7-8 diviserait un document de 10 pages en 6 PDF distincts avec : split.desc.2=Ainsi, la sélection de 1,3,7-9 diviserait un document de 10 pages en 6 PDF distincts avec :
split.desc.3=Document #1: Page 1 split.desc.3=Document #1: Page 1
split.desc.4=Document #2: Page 2 et 3 split.desc.4=Document #2: Page 2 et 3
split.desc.5=Document #3: Page 4, 5 et 6 split.desc.5=Document #3: Page 4, 5, 6 et 7
split.desc.6=Document #4: Page 7 split.desc.6=Document #4: Page 8
split.desc.7=Document #5: Page 8 split.desc.7=Document #5: Page 9
split.desc.8=Document #6: Page 9 et 10 split.desc.8=Document #6: Page 10
split.splitPages=Pages sur lesquelles diviser split.splitPages=Pages sur lesquelles diviser
split.submit=Diviser split.submit=Diviser
@@ -938,6 +941,7 @@ pdfToPDFA.header=PDF en PDF/A
pdfToPDFA.credit=Ce service utilise OCRmyPDF pour la conversion en PDF/A. pdfToPDFA.credit=Ce service utilise OCRmyPDF pour la conversion en PDF/A.
pdfToPDFA.submit=Convertir pdfToPDFA.submit=Convertir
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
#PDFToWord #PDFToWord
@@ -1019,7 +1023,16 @@ split-by-sections.vertical.label=Divisions verticales
split-by-sections.horizontal.placeholder=Saisir le nombre de divisions horizontales split-by-sections.horizontal.placeholder=Saisir le nombre de divisions horizontales
split-by-sections.vertical.placeholder=Entrer le nombre de divisions verticales split-by-sections.vertical.placeholder=Entrer le nombre de divisions verticales
split-by-sections.submit=Diviser le PDF split-by-sections.submit=Diviser le PDF
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Fusionner en un seul PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licences licenses.nav=Licences
@@ -1031,15 +1044,15 @@ licenses.license=Licence
# error # error
error.sorry=Sorry for the issue! error.sorry=Désolé pour ce problème !
error.needHelp=Need help / Found an issue? error.needHelp=Besoin daide / Vous avez trouvé un problème ?
error.contactTip=If you're still having trouble, don't hesitate to reach out to us for help. You can submit a ticket on our GitHub page or contact us through Discord: error.contactTip=Si vous avez encore des problèmes, nhésitez pas à nous contacter pour obtenir de laide. Vous pouvez soumettre un ticket sur notre page GitHub ou nous contacter via Discord :
error.404.head=404 - Page Not Found | Oops, we tripped in the code! error.404.head=404 - Page non trouvée | oups on sest foiré !
error.404.1=We can't seem to find the page you're looking for. error.404.1=Nous ne parvenons pas à trouver la page que vous recherchez.
error.404.2=Something went wrong error.404.2=Quelque chose na pas fonctionné
error.github=Submit a ticket on GitHub error.github=Créer un ticket sur GitHub
error.showStack=Show Stack Trace error.showStack=Afficher la Stack Trace
error.copyStack=Copy Stack Trace error.copyStack=Copier la Stack Trace
error.githubSubmit=GitHub - Submit a ticket error.githubSubmit=GitHub - Créer un ticket
error.discordSubmit=Discord - Submit Support post error.discordSubmit=Discord - Poster un message de demande dassistance

View File

@@ -66,6 +66,7 @@ seeDockerHub=See Docker Hub
visitGithub=Visit Github Repository visitGithub=Visit Github Repository
donate=Donate donate=Donate
color=Color color=Color
sponsor=Sponsor
@@ -111,6 +112,7 @@ navbar.settings=सेटिंग्स
############# #############
settings.title=सेटिंग्स settings.title=सेटिंग्स
settings.update=अपडेट उपलब्ध है settings.update=अपडेट उपलब्ध है
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=ऐप संस्करण: settings.appVersion=ऐप संस्करण:
settings.downloadOption.title=डाउनलोड विकल्प चुनें (एकल फ़ाइल गैर-ज़िप डाउनलोड के लिए): settings.downloadOption.title=डाउनलोड विकल्प चुनें (एकल फ़ाइल गैर-ज़िप डाउनलोड के लिए):
settings.downloadOption.1=एक ही विंडो में खोलें settings.downloadOption.1=एक ही विंडो में खोलें
@@ -119,8 +121,9 @@ settings.downloadOption.3=फ़ाइल डाउनलोड करें
settings.zipThreshold=जब डाउनलोड की गई फ़ाइलों की संख्या सीमा से अधिक हो settings.zipThreshold=जब डाउनलोड की गई फ़ाइलों की संख्या सीमा से अधिक हो
settings.signOut=साइन आउट settings.signOut=साइन आउट
settings.accountSettings=खाता सेटिंग्स settings.accountSettings=खाता सेटिंग्स
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=क्रेडेंशियल बदलें changeCreds.title=क्रेडेंशियल बदलें
changeCreds.header=अपना खाता विवरण अपडेट करें changeCreds.header=अपना खाता विवरण अपडेट करें
@@ -806,17 +809,17 @@ rotate.selectAngle=चुनें घुमाने का कोण (90 ड
rotate.submit=घुमाएं rotate.submit=घुमाएं
#merge #split-pdfs
split.title=पीडीएफ को विभाजित करें split.title=पीडीएफ को विभाजित करें
split.header=पीडीएफ को विभाजित करें split.header=पीडीएफ को विभाजित करें
split.desc.1=जिन नंबरों को आप चुनते हैं, वे पृष्ठ संख्या होती हैं जिन पर आप विभाजन करना चाहते हैं। split.desc.1=जिन नंबरों को आप चुनते हैं, वे पृष्ठ संख्या होती हैं जिन पर आप विभाजन करना चाहते हैं।
split.desc.2=इसलिए, 1,3,7-8 का चयन करना एक 10 पृष्ठों के दस्तावेज़ को 6 अलग-अलग पीडीएफ में विभाजित करेगा जैसे: split.desc.2=इसलिए, 1,3,7-9 का चयन करना एक 10 पृष्ठों के दस्तावेज़ को 6 अलग-अलग पीडीएफ में विभाजित करेगा जैसे:
split.desc.3=दस्तावेज़ #1: पृष्ठ 1 split.desc.3=दस्तावेज़ #1: पृष्ठ 1
split.desc.4=दस्तावेज़ #2: पृष्ठ 2 और 3 split.desc.4=दस्तावेज़ #2: पृष्ठ 2 और 3
split.desc.5=दस्तावेज़ #3: पृष्ठ 4, 5 और 6 split.desc.5=दस्तावेज़ #3: पृष्ठ 4, 5, 6 और 7
split.desc.6=दस्तावेज़ #4: पृष्ठ 7 split.desc.6=दस्तावेज़ #4: पृष्ठ 7
split.desc.7=दस्तावेज़ #5: पृष्ठ 8 split.desc.7=दस्तावेज़ #5: पृष्ठ 8
split.desc.8=दस्तावेज़ #6: पृष्ठ 9 और 10 split.desc.8=दस्तावेज़ #6: पृष्ठ 10
split.splitPages=विभाजन करने के लिए पृष्ठ दर्ज करें: split.splitPages=विभाजन करने के लिए पृष्ठ दर्ज करें:
split.submit=विभाजित करें split.submit=विभाजित करें
@@ -938,6 +941,7 @@ pdfToPDFA.header=PDF से PDF/A में
pdfToPDFA.credit=इस सेवा में PDF/A परिवर्तन के लिए OCRmyPDF का उपयोग किया जाता है। pdfToPDFA.credit=इस सेवा में PDF/A परिवर्तन के लिए OCRmyPDF का उपयोग किया जाता है।
pdfToPDFA.submit=परिवर्तित करें pdfToPDFA.submit=परिवर्तित करें
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
#PDFToWord #PDFToWord
@@ -1021,6 +1025,15 @@ split-by-sections.vertical.placeholder=लंबवत विभाजन की
split-by-sections.submit=PDF को विभाजित करें split-by-sections.submit=PDF को विभाजित करें
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Merge Into One PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenses licenses.nav=Licenses
licenses.title=3rd Party Licenses licenses.title=3rd Party Licenses

View File

@@ -66,6 +66,7 @@ seeDockerHub=See Docker Hub
visitGithub=Visit Github Repository visitGithub=Visit Github Repository
donate=Donate donate=Donate
color=Color color=Color
sponsor=Sponsor
@@ -111,6 +112,7 @@ navbar.settings=Beállítások
############# #############
settings.title=Beállítások settings.title=Beállítások
settings.update=Frisítés elérhető settings.update=Frisítés elérhető
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=App Verzió: settings.appVersion=App Verzió:
settings.downloadOption.title=Válassza ki a letöltési lehetőséget (Egyetlen fájl esetén a nem tömörített letöltésekhez): settings.downloadOption.title=Válassza ki a letöltési lehetőséget (Egyetlen fájl esetén a nem tömörített letöltésekhez):
settings.downloadOption.1=Nyissa meg ugyanabban az ablakban settings.downloadOption.1=Nyissa meg ugyanabban az ablakban
@@ -119,8 +121,9 @@ settings.downloadOption.3=Töltse le a fájlt
settings.zipThreshold=Fájlok tömörítése, ha a letöltött fájlok száma meghaladja settings.zipThreshold=Fájlok tömörítése, ha a letöltött fájlok száma meghaladja
settings.signOut=Kijelentkezés settings.signOut=Kijelentkezés
settings.accountSettings=Fiókbeállítások settings.accountSettings=Fiókbeállítások
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Hitelesítés megváltoztatása changeCreds.title=Hitelesítés megváltoztatása
changeCreds.header=Frissítse fiókadatait changeCreds.header=Frissítse fiókadatait
@@ -806,17 +809,17 @@ rotate.selectAngle=Válassza ki a forgatási szöget (90 fok egész számú töb
rotate.submit=Forgatás rotate.submit=Forgatás
#merge #split-pdfs
split.title=PDF szétválasztás split.title=PDF szétválasztás
split.header=PDF szétválasztás split.header=PDF szétválasztás
split.desc.1=A kiválasztott számok a szétválasztani kívánt oldalszámok split.desc.1=A kiválasztott számok a szétválasztani kívánt oldalszámok
split.desc.2=Például az 1,3,7-8 kiválasztása egy 10 oldalas dokumentumot 6 különálló PDF-fé szétválaszt split.desc.2=Például az 1,3,7-9 kiválasztása egy 10 oldalas dokumentumot 6 különálló PDF-fé szétválaszt
split.desc.3=Dokumentum #1: Oldal 1 split.desc.3=Dokumentum #1: Oldal 1
split.desc.4=Dokumentum #2: Oldal 2 és 3 split.desc.4=Dokumentum #2: Oldal 2 és 3
split.desc.5=Dokumentum #3: Oldal 4, 5 és 6 split.desc.5=Dokumentum #3: Oldal 4, 5, 6 és 7
split.desc.6=Dokumentum #4: Oldal 7 split.desc.6=Dokumentum #4: Oldal 8
split.desc.7=Dokumentum #5: Oldal 8 split.desc.7=Dokumentum #5: Oldal 9
split.desc.8=Dokumentum #6: Oldal 9 és 10 split.desc.8=Dokumentum #6: Oldal 10
split.splitPages=Adja meg az oldalakat, amelyekre szét akarja választani: split.splitPages=Adja meg az oldalakat, amelyekre szét akarja választani:
split.submit=Szétválasztás split.submit=Szétválasztás
@@ -938,6 +941,7 @@ pdfToPDFA.header=PDF >> PDF/A
pdfToPDFA.credit=Ez a szolgáltatás az OCRmyPDF-t használja a PDF/A konverzióhoz pdfToPDFA.credit=Ez a szolgáltatás az OCRmyPDF-t használja a PDF/A konverzióhoz
pdfToPDFA.submit=Konvertálás pdfToPDFA.submit=Konvertálás
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
#PDFToWord #PDFToWord
@@ -1021,6 +1025,15 @@ split-by-sections.vertical.placeholder=Adja meg a függőleges szakaszok számá
split-by-sections.submit=Felosztás split-by-sections.submit=Felosztás
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Merge Into One PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenses licenses.nav=Licenses
licenses.title=3rd Party Licenses licenses.title=3rd Party Licenses

View File

@@ -66,6 +66,7 @@ seeDockerHub=See Docker Hub
visitGithub=Visit Github Repository visitGithub=Visit Github Repository
donate=Donate donate=Donate
color=Color color=Color
sponsor=Sponsor
@@ -111,6 +112,7 @@ navbar.settings=Pengaturan
############# #############
settings.title=Pengaturan settings.title=Pengaturan
settings.update=Pembaruan tersedia settings.update=Pembaruan tersedia
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=Versi Aplikasi: settings.appVersion=Versi Aplikasi:
settings.downloadOption.title=Pilih opsi unduhan (Untuk unduhan berkas tunggal non zip): settings.downloadOption.title=Pilih opsi unduhan (Untuk unduhan berkas tunggal non zip):
settings.downloadOption.1=Buka di jendela yang sama settings.downloadOption.1=Buka di jendela yang sama
@@ -119,8 +121,9 @@ settings.downloadOption.3=Unduh berkas
settings.zipThreshold=Berkas zip ketika jumlah berkas yang diunduh melebihi settings.zipThreshold=Berkas zip ketika jumlah berkas yang diunduh melebihi
settings.signOut=Keluar settings.signOut=Keluar
settings.accountSettings=Pengaturan Akun settings.accountSettings=Pengaturan Akun
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Ubah Kredensial changeCreds.title=Ubah Kredensial
changeCreds.header=Perbarui Detail Akun Anda changeCreds.header=Perbarui Detail Akun Anda
@@ -806,17 +809,17 @@ rotate.selectAngle=Pilih sudut rotasi (dalam kelipatan 90 derajat):
rotate.submit=Rotasi rotate.submit=Rotasi
#merge #split-pdfs
split.title=Membagi PDF split.title=Membagi PDF
split.header=Membagi PDF split.header=Membagi PDF
split.desc.1=Angka yang Anda pilih adalah nomor halaman yang ingin Anda pisahkan split.desc.1=Angka yang Anda pilih adalah nomor halaman yang ingin Anda pisahkan
split.desc.2=Dengan demikian, memilih 1,3,7-8 akan membagi dokumen 10 halaman menjadi 6 PDF terpisah: split.desc.2=Dengan demikian, memilih 1,3,7-9 akan membagi dokumen 10 halaman menjadi 6 PDF terpisah:
split.desc.3=Dokumen #1: Halaman 1 split.desc.3=Dokumen #1: Halaman 1
split.desc.4=Dokumen #2: Halaman 2 dan 3 split.desc.4=Dokumen #2: Halaman 2 dan 3
split.desc.5=Dokumen #3: Halaman 4, 5 dan 6 split.desc.5=Dokumen #3: Halaman 4, 5, 6 dan 7
split.desc.6=Dokumen #4: Halaman 7 split.desc.6=Dokumen #4: Halaman 8
split.desc.7=Dokumen #5: Halaman 8 split.desc.7=Dokumen #5: Halaman 9
split.desc.8=Dokumen #6: Halaman 9 dan 10 split.desc.8=Dokumen #6: Halaman 10
split.splitPages=Masukkan halaman yang akan dipisah: split.splitPages=Masukkan halaman yang akan dipisah:
split.submit=Pisahkan split.submit=Pisahkan
@@ -938,6 +941,7 @@ pdfToPDFA.header=PDF ke PDF/A
pdfToPDFA.credit=Layanan ini menggunakan OCRmyPDF untuk konversi PDF/A. pdfToPDFA.credit=Layanan ini menggunakan OCRmyPDF untuk konversi PDF/A.
pdfToPDFA.submit=Konversi pdfToPDFA.submit=Konversi
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
#PDFToWord #PDFToWord
@@ -1021,6 +1025,15 @@ split-by-sections.vertical.placeholder=Input angka untuk pembagian vertikal
split-by-sections.submit=Pisahkan PDF split-by-sections.submit=Pisahkan PDF
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Merge Into One PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenses licenses.nav=Licenses
licenses.title=3rd Party Licenses licenses.title=3rd Party Licenses

View File

@@ -66,6 +66,7 @@ seeDockerHub=Vedi DockerHub
visitGithub=Visita il repository Github visitGithub=Visita il repository Github
donate=Donazione donate=Donazione
color=Colore color=Colore
sponsor=Sponsor
@@ -79,6 +80,7 @@ pipeline.defaultOption=Personalizzato
pipeline.submitButton=Invia pipeline.submitButton=Invia
pipeline.help=Aiuto sulla pipeline pipeline.help=Aiuto sulla pipeline
pipeline.scanHelp=Aiuto per la scansione delle cartelle pipeline.scanHelp=Aiuto per la scansione delle cartelle
###################### ######################
# Pipeline Options # # Pipeline Options #
###################### ######################
@@ -110,6 +112,7 @@ navbar.settings=Impostazioni
############# #############
settings.title=Impostazioni settings.title=Impostazioni
settings.update=Aggiornamento disponibile settings.update=Aggiornamento disponibile
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=Versione App: settings.appVersion=Versione App:
settings.downloadOption.title=Scegli opzione di download (Per file singoli non compressi): settings.downloadOption.title=Scegli opzione di download (Per file singoli non compressi):
settings.downloadOption.1=Apri in questa finestra settings.downloadOption.1=Apri in questa finestra
@@ -118,8 +121,9 @@ settings.downloadOption.3=Scarica file
settings.zipThreshold=Comprimi file in .zip quando il numero di download supera settings.zipThreshold=Comprimi file in .zip quando il numero di download supera
settings.signOut=Logout settings.signOut=Logout
settings.accountSettings=Impostazioni Account settings.accountSettings=Impostazioni Account
settings.bored.help=Abilita easter egg game
settings.cacheInputs.name=Salva gli input del modulo
settings.cacheInputs.help=Abilitare per memorizzare gli input utilizzati in precedenza per esecuzioni future
changeCreds.title=Cambia credenziali changeCreds.title=Cambia credenziali
changeCreds.header=Aggiorna i dettagli del tuo account changeCreds.header=Aggiorna i dettagli del tuo account
@@ -127,7 +131,7 @@ changeCreds.changePassword=Stai utilizzando le credenziali di accesso predefinit
changeCreds.newUsername=Nuovo nome utente changeCreds.newUsername=Nuovo nome utente
changeCreds.oldPassword=Password attuale changeCreds.oldPassword=Password attuale
changeCreds.newPassword=Nuova Password changeCreds.newPassword=Nuova Password
changeCreds.confirmNewPassword=Conferma Nuova Password changeCreds.confirmNewPassword=Conferma nuova Password
changeCreds.submit=Invia modifiche changeCreds.submit=Invia modifiche
@@ -187,7 +191,7 @@ multiTool.tags=Strumento multiplo,operazione multipla,interfaccia utente,trascin
home.merge.title=Unisci home.merge.title=Unisci
home.merge.desc=Unisci facilmente più PDF in uno. home.merge.desc=Unisci facilmente più PDF in uno.
merge.tags=unione,operazioni sulla pagina,back end,lato server merge.tags=unione,operazioni sulla pagina,back-end,lato server
home.split.title=Dividi home.split.title=Dividi
home.split.desc=Dividi un singolo PDF in più documenti. home.split.desc=Dividi un singolo PDF in più documenti.
@@ -465,7 +469,7 @@ pdfToSinglePage.submit=Converti in pagina singola
pageExtracter.title=Estrai pagine pageExtracter.title=Estrai pagine
pageExtracter.header=Estrai pagine pageExtracter.header=Estrai pagine
pageExtracter.submit=Estrai pageExtracter.submit=Estrai
pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1) pageExtracter.placeholder=(es. 1,2,8 o 4,7,12-16 o 2n-1)
#getPdfInfo #getPdfInfo
@@ -642,7 +646,7 @@ removeBlanks.submit=Rimuovi
#removeAnnotations #removeAnnotations
removeAnnotations.title=Rimuovi Annotazioni removeAnnotations.title=Rimuovi Annotazioni
removeAnnotations.header=Remuovi Annotazioni removeAnnotations.header=Rimuovi Annotazioni
removeAnnotations.submit=Rimuovi removeAnnotations.submit=Rimuovi
@@ -795,7 +799,7 @@ pageRemover.title=Rimuovi pagine
pageRemover.header=Rimuovi pagine da un PDF pageRemover.header=Rimuovi pagine da un PDF
pageRemover.pagesToDelete=Pagine da eliminare (inserisci una lista di numeri separati da virgola): pageRemover.pagesToDelete=Pagine da eliminare (inserisci una lista di numeri separati da virgola):
pageRemover.submit=Rimuovi pagine pageRemover.submit=Rimuovi pagine
pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30) pageRemover.placeholder=(es. 1,2,6 o 1-10,15-30)
#rotate #rotate
@@ -805,17 +809,17 @@ rotate.selectAngle=Scegli angolo di rotazione (in multipli di 90 gradi):
rotate.submit=Ruota rotate.submit=Ruota
#merge #split-pdfs
split.title=Dividi PDF split.title=Dividi PDF
split.header=Dividi PDF split.header=Dividi PDF
split.desc.1=I numeri che scegli sono le pagine a cui desideri dividere il documento split.desc.1=I numeri che scegli sono le pagine a cui desideri dividere il documento
split.desc.2=Per esempio inserendo 1,3,7-8 separeresti un documento di 10 pagine in 6 diversi PDF con: split.desc.2=Per esempio inserendo 1,3,7-9 separeresti un documento di 10 pagine in 6 diversi PDF con:
split.desc.3=Documento #1: Pagina 1 split.desc.3=Documento #1: Pagina 1
split.desc.4=Documento #2: Pagine 2 e 3 split.desc.4=Documento #2: Pagine 2 e 3
split.desc.5=Documento #3: Pagine 4, 5 e 6 split.desc.5=Documento #3: Pagine 4, 5, 6 e 7
split.desc.6=Documento #4: Pagina 7 split.desc.6=Documento #4: Pagina 8
split.desc.7=Documento #5: Pagina 8 split.desc.7=Documento #5: Pagina 9
split.desc.8=Documento #6: Pagine 9 e 10 split.desc.8=Documento #6: Pagine 10
split.splitPages=Inserisci pagine a cui dividere: split.splitPages=Inserisci pagine a cui dividere:
split.submit=Dividi split.submit=Dividi
@@ -937,6 +941,7 @@ pdfToPDFA.header=Da PDF a PDF/A
pdfToPDFA.credit=Questo servizio utilizza OCRmyPDF per la conversione in PDF/A. pdfToPDFA.credit=Questo servizio utilizza OCRmyPDF 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=Output format
#PDFToWord #PDFToWord
@@ -1020,6 +1025,15 @@ split-by-sections.vertical.placeholder=Inserire il numero di divisioni verticali
split-by-sections.submit=Dividi PDF split-by-sections.submit=Dividi PDF
split-by-sections.merge=Unisci in un unico PDF split-by-sections.merge=Unisci in un unico PDF
#printFile
printFile.title=Stampa file
printFile.header=Stampa file su stampante
printFile.selectText.1=Seleziona file da stampare
printFile.selectText.2=Inserire il nome della stampante
printFile.submit=Stampare
#licenses #licenses
licenses.nav=Licenze licenses.nav=Licenze
licenses.title=Licenze di terze parti licenses.title=Licenze di terze parti

View File

@@ -57,15 +57,16 @@ usernameExistsMessage=新しいユーザー名はすでに存在します。
invalidUsernameMessage=ユーザー名が無効です。ユーザー名にはアルファベットと数字のみを使用してください。 invalidUsernameMessage=ユーザー名が無効です。ユーザー名にはアルファベットと数字のみを使用してください。
deleteCurrentUserMessage=現在ログインしているユーザーは削除できません。 deleteCurrentUserMessage=現在ログインしているユーザーは削除できません。
deleteUsernameExistsMessage=そのユーザー名は存在しないため削除できません。 deleteUsernameExistsMessage=そのユーザー名は存在しないため削除できません。
error=Error error=エラー
oops=Oops! oops=おっと!
help=Help help=ヘルプ
goHomepage=Go to Homepage goHomepage=ホームページへ移動
joinDiscord=Join our Discord server joinDiscord=Discordサーバーに参加する
seeDockerHub=See Docker Hub seeDockerHub=Docker Hubを見る
visitGithub=Visit Github Repository visitGithub=Githubリポジトリを訪問する
donate=Donate donate=寄付する
color=Color color=
sponsor=スポンサー
@@ -111,6 +112,7 @@ navbar.settings=設定
############# #############
settings.title=設定 settings.title=設定
settings.update=利用可能なアップデート settings.update=利用可能なアップデート
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=Appバージョン: settings.appVersion=Appバージョン:
settings.downloadOption.title=ダウンロードオプション (zip以外の単一ファイル): settings.downloadOption.title=ダウンロードオプション (zip以外の単一ファイル):
settings.downloadOption.1=同じウィンドウで開く settings.downloadOption.1=同じウィンドウで開く
@@ -119,8 +121,9 @@ settings.downloadOption.3=ファイルをダウンロード
settings.zipThreshold=このファイル数を超えたときにファイルを圧縮する settings.zipThreshold=このファイル数を超えたときにファイルを圧縮する
settings.signOut=サインアウト settings.signOut=サインアウト
settings.accountSettings=アカウント設定 settings.accountSettings=アカウント設定
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=資格情報の変更 changeCreds.title=資格情報の変更
changeCreds.header=アカウントの詳細を更新する changeCreds.header=アカウントの詳細を更新する
@@ -806,17 +809,17 @@ rotate.selectAngle=回転角度を選択 (90度の倍数):
rotate.submit=回転 rotate.submit=回転
#merge #split-pdfs
split.title=PDFの分割 split.title=PDFの分割
split.header=PDFの分割 split.header=PDFの分割
split.desc.1=選択する番号は分割するページ番号です。 split.desc.1=選択する番号は分割するページ番号です。
split.desc.2=したがって、1,3,7-8を選択すると、10ページのドキュメントが以下のように6つのPDFに分割されることになります。 split.desc.2=したがって、1,3,7-9を選択すると、10ページのドキュメントが以下のように6つのPDFに分割されることになります。
split.desc.3=ドキュメント #1: ページ 1 split.desc.3=ドキュメント #1: ページ 1
split.desc.4=ドキュメント #2: ページ 2, 3 split.desc.4=ドキュメント #2: ページ 2, 3
split.desc.5=ドキュメント #3: ページ 4, 5, 6 split.desc.5=ドキュメント #3: ページ 4, 5, 6, 7
split.desc.6=ドキュメント #4: ページ 7 split.desc.6=ドキュメント #4: ページ 8
split.desc.7=ドキュメント #5: ページ 8 split.desc.7=ドキュメント #5: ページ 9
split.desc.8=ドキュメント #6: ページ 9, 10 split.desc.8=ドキュメント #6: ページ 10
split.splitPages=分割するページ番号を入力: split.splitPages=分割するページ番号を入力:
split.submit=分割 split.submit=分割
@@ -938,6 +941,7 @@ pdfToPDFA.header=PDFをPDF/Aに変換
pdfToPDFA.credit=本サービスはPDF/Aの変換にOCRmyPDFを使用しています。 pdfToPDFA.credit=本サービスはPDF/Aの変換にOCRmyPDFを使用しています。
pdfToPDFA.submit=変換 pdfToPDFA.submit=変換
pdfToPDFA.tip=現在、一度に複数の入力に対して機能しません pdfToPDFA.tip=現在、一度に複数の入力に対して機能しません
pdfToPDFA.outputFormat=Output format
#PDFToWord #PDFToWord
@@ -1021,6 +1025,15 @@ split-by-sections.vertical.placeholder=垂直方向の分割数を選択
split-by-sections.submit=分割 split-by-sections.submit=分割
split-by-sections.merge=1 つの PDF に結合するかどうか split-by-sections.merge=1 つの PDF に結合するかどうか
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=ライセンス licenses.nav=ライセンス
licenses.title=サードパーティライセンス licenses.title=サードパーティライセンス
@@ -1031,15 +1044,15 @@ licenses.license=ライセンス
# error # error
error.sorry=Sorry for the issue! error.sorry=問題が発生したことをお詫び申し上げます!
error.needHelp=Need help / Found an issue? error.needHelp=助けが必要/問題が見つかりましたか?
error.contactTip=If you're still having trouble, don't hesitate to reach out to us for help. You can submit a ticket on our GitHub page or contact us through Discord: error.contactTip=まだ問題が解決していない場合は、お手数ですが、GitHubページでチケットを提出するか、Discordで私たちに連絡してください
error.404.head=404 - Page Not Found | Oops, we tripped in the code! error.404.head=404 - ページが見つかりません | おっと、コードでつまずきました!
error.404.1=We can't seem to find the page you're looking for. error.404.1=あなたが探しているページが見つかりません。
error.404.2=Something went wrong error.404.2=何か問題が発生しました
error.github=Submit a ticket on GitHub error.github=GitHubでチケットを提出
error.showStack=Show Stack Trace error.showStack=スタックトレースを表示
error.copyStack=Copy Stack Trace error.copyStack=スタックトレースをコピー
error.githubSubmit=GitHub - Submit a ticket error.githubSubmit=GitHub - チケットを提出
error.discordSubmit=Discord - Submit Support post error.discordSubmit=Discord - サポート投稿を提出

View File

@@ -57,15 +57,16 @@ usernameExistsMessage=새 사용자명이 이미 존재합니다.
invalidUsernameMessage=사용자 이름이 잘못되었습니다. 사용자 이름에는 알파벳 문자와 숫자만 포함되어야 합니다. invalidUsernameMessage=사용자 이름이 잘못되었습니다. 사용자 이름에는 알파벳 문자와 숫자만 포함되어야 합니다.
deleteCurrentUserMessage=현재 로그인한 사용자를 삭제할 수 없습니다. deleteCurrentUserMessage=현재 로그인한 사용자를 삭제할 수 없습니다.
deleteUsernameExistsMessage=사용자 이름이 존재하지 않으며 삭제할 수 없습니다. deleteUsernameExistsMessage=사용자 이름이 존재하지 않으며 삭제할 수 없습니다.
error=Error error=오류
oops=Oops! oops=어머나!
help=Help help=도움말
goHomepage=Go to Homepage goHomepage=홈페이지로 이동
joinDiscord=Join our Discord server joinDiscord=Discord 서버에 참여하기
seeDockerHub=See Docker Hub seeDockerHub=Docker Hub에서 확인하기
visitGithub=Visit Github Repository visitGithub=GitHub 저장소 방문하기
donate=Donate donate=기부하기
color=Color color=색상
sponsor=스폰서
@@ -111,6 +112,7 @@ navbar.settings=설정
############# #############
settings.title=설정 settings.title=설정
settings.update=업데이트 가능 settings.update=업데이트 가능
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=앱 버전: settings.appVersion=앱 버전:
settings.downloadOption.title=다운로드 옵션 선택 (zip 파일이 아닌 단일 파일 다운로드 시): settings.downloadOption.title=다운로드 옵션 선택 (zip 파일이 아닌 단일 파일 다운로드 시):
settings.downloadOption.1=현재 창에서 열기 settings.downloadOption.1=현재 창에서 열기
@@ -119,8 +121,9 @@ settings.downloadOption.3=다운로드
settings.zipThreshold=다운로드한 파일 수가 초과된 경우 파일 압축하기 settings.zipThreshold=다운로드한 파일 수가 초과된 경우 파일 압축하기
settings.signOut=로그아웃 settings.signOut=로그아웃
settings.accountSettings=계정 설정 settings.accountSettings=계정 설정
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=계정 정보 변경 changeCreds.title=계정 정보 변경
changeCreds.header=계정 정보 업데이트 changeCreds.header=계정 정보 업데이트
@@ -806,17 +809,17 @@ rotate.selectAngle=회전 각도 선택 (90도의 배수로):
rotate.submit=회전 rotate.submit=회전
#merge #split-pdfs
split.title=PDF 분할 split.title=PDF 분할
split.header=PDF 분할 split.header=PDF 분할
split.desc.1=입력한 번호는 분할할 페이지의 번호입니다. split.desc.1=입력한 번호는 분할할 페이지의 번호입니다.
split.desc.2=예를 들어, 1,3,7-8을 입력하면 10페이지 문서를 아래와 같이 6개의 별도의 PDF 문서로 분할하게 됩니다. split.desc.2=예를 들어, 1,3,7-9을 입력하면 10페이지 문서를 아래와 같이 6개의 별도의 PDF 문서로 분할하게 됩니다.
split.desc.3=문서 #1: 페이지 1 split.desc.3=문서 #1: 페이지 1
split.desc.4=문서 #2: 페이지 2, 3 split.desc.4=문서 #2: 페이지 2, 3
split.desc.5=문서 #3: 페이지 4, 5, 6 split.desc.5=문서 #3: 페이지 4, 5, 6, 7
split.desc.6=문서 #4: 페이지 7 split.desc.6=문서 #4: 페이지 8
split.desc.7=문서 #5: 페이지 8 split.desc.7=문서 #5: 페이지 9
split.desc.8=문서 #6: 페이지 9, 10 split.desc.8=문서 #6: 페이지 10
split.splitPages=분할할 페이지 입력: split.splitPages=분할할 페이지 입력:
split.submit=분할 split.submit=분할
@@ -938,6 +941,7 @@ pdfToPDFA.header=PDF 문서를 PDF/A로 변환
pdfToPDFA.credit=이 서비스는 PDF/A 변환을 위해 OCRmyPDF 문서를 사용합니다. pdfToPDFA.credit=이 서비스는 PDF/A 변환을 위해 OCRmyPDF 문서를 사용합니다.
pdfToPDFA.submit=변환 pdfToPDFA.submit=변환
pdfToPDFA.tip=현재 한 번에 여러 입력에 대해 작동하지 않습니다. pdfToPDFA.tip=현재 한 번에 여러 입력에 대해 작동하지 않습니다.
pdfToPDFA.outputFormat=Output format
#PDFToWord #PDFToWord
@@ -1021,6 +1025,15 @@ split-by-sections.vertical.placeholder=수직 분할 수를 입력합니다
split-by-sections.submit=PDF 분할 split-by-sections.submit=PDF 분할
split-by-sections.merge=하나의 PDF로 병합 split-by-sections.merge=하나의 PDF로 병합
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=라이센스 licenses.nav=라이센스
licenses.title=제3자 라이선스 licenses.title=제3자 라이선스
@@ -1031,15 +1044,15 @@ licenses.license=라이센스
# error # error
error.sorry=Sorry for the issue! error.sorry=문제를 끼친 점 죄송합니다!
error.needHelp=Need help / Found an issue? error.needHelp=도움이 필요하신가요 / 문제가 있으신가요?
error.contactTip=If you're still having trouble, don't hesitate to reach out to us for help. You can submit a ticket on our GitHub page or contact us through Discord: error.contactTip=여전히 문제가 해결되지 않는다면 망설이지 마시고 도움을 요청하십시오. GitHub 페이지에서 티켓을 제출하거나 Discord를 통해 우리에게 연락하실 수 있습니다:
error.404.head=404 - Page Not Found | Oops, we tripped in the code! error.404.head=404 - 페이지를 찾을 수 없습니다 | 이런, 코드에 걸려 넘어졌어요!
error.404.1=We can't seem to find the page you're looking for. error.404.1=원하시는 페이지를 찾을 수가 없네요.
error.404.2=Something went wrong error.404.2=문제가 발생했습니다
error.github=Submit a ticket on GitHub error.github=GitHub에서 티켓 제출
error.showStack=Show Stack Trace error.showStack=스택 추적 보기
error.copyStack=Copy Stack Trace error.copyStack=스택 추적 복사
error.githubSubmit=GitHub - Submit a ticket error.githubSubmit=GitHub - 티켓 제출
error.discordSubmit=Discord - Submit Support post error.discordSubmit=Discord - 문의 게시

View File

@@ -66,6 +66,7 @@ seeDockerHub=See Docker Hub
visitGithub=Visit Github Repository visitGithub=Visit Github Repository
donate=Donate donate=Donate
color=Color color=Color
sponsor=Sponsor
@@ -111,6 +112,7 @@ navbar.settings=Instellingen
############# #############
settings.title=Instellingen settings.title=Instellingen
settings.update=Update beschikbaar settings.update=Update beschikbaar
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=App versie: settings.appVersion=App versie:
settings.downloadOption.title=Kies download optie (Voor enkelvoudige bestanddownloads zonder zip): settings.downloadOption.title=Kies download optie (Voor enkelvoudige bestanddownloads zonder zip):
settings.downloadOption.1=Open in hetzelfde venster settings.downloadOption.1=Open in hetzelfde venster
@@ -119,8 +121,9 @@ settings.downloadOption.3=Download bestand
settings.zipThreshold=Bestanden zippen wanneer het aantal gedownloade bestanden meer is dan settings.zipThreshold=Bestanden zippen wanneer het aantal gedownloade bestanden meer is dan
settings.signOut=Uitloggen settings.signOut=Uitloggen
settings.accountSettings=Account instellingen settings.accountSettings=Account instellingen
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Inloggegevens wijzigen changeCreds.title=Inloggegevens wijzigen
changeCreds.header=Werk je accountgegevens bij changeCreds.header=Werk je accountgegevens bij
@@ -806,17 +809,17 @@ rotate.selectAngle=Selecteer rotatiehoek (in veelvouden van 90 graden):
rotate.submit=Roteren rotate.submit=Roteren
#merge #split-pdfs
split.title=PDF splitsen split.title=PDF splitsen
split.header=PDF splitsen split.header=PDF splitsen
split.desc.1=De nummers die je kiest zijn de paginanummers waarop je een splitsing wilt uitvoeren split.desc.1=De nummers die je kiest zijn de paginanummers waarop je een splitsing wilt uitvoeren
split.desc.2=Als zodanig selecteren van 1,3,7-8 zou een 10 pagina's tellend document splitsen in 6 aparte PDF's met: split.desc.2=Als zodanig selecteren van 1,3,7-9 zou een 10 pagina's tellend document splitsen in 6 aparte PDF's met:
split.desc.3=Document #1: Pagina 1 split.desc.3=Document #1: Pagina 1
split.desc.4=Document #2: Pagina 2 en 3 split.desc.4=Document #2: Pagina 2 en 3
split.desc.5=Document #3: Pagina 4, 5 en 6 split.desc.5=Document #3: Pagina 4, 5, 6 en 7
split.desc.6=Document #4: Pagina 7 split.desc.6=Document #4: Pagina 8
split.desc.7=Document #5: Pagina 8 split.desc.7=Document #5: Pagina 9
split.desc.8=Document #6: Pagina 9 en 10 split.desc.8=Document #6: Pagina 10
split.splitPages=Voer pagina's in om op te splitsen: split.splitPages=Voer pagina's in om op te splitsen:
split.submit=Splitsen split.submit=Splitsen
@@ -938,6 +941,7 @@ pdfToPDFA.header=PDF naar PDF/A
pdfToPDFA.credit=Deze service gebruikt OCRmyPDF voor PDF/A-conversie pdfToPDFA.credit=Deze service gebruikt OCRmyPDF voor PDF/A-conversie
pdfToPDFA.submit=Converteren pdfToPDFA.submit=Converteren
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
#PDFToWord #PDFToWord
@@ -1021,6 +1025,15 @@ split-by-sections.vertical.placeholder=Voer het aantal verticale secties in
split-by-sections.submit=PDF splitsen split-by-sections.submit=PDF splitsen
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Merge Into One PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenties licenses.nav=Licenties
licenses.title=Licenties van derden licenses.title=Licenties van derden

View File

@@ -66,6 +66,7 @@ seeDockerHub=See Docker Hub
visitGithub=Visit Github Repository visitGithub=Visit Github Repository
donate=Donate donate=Donate
color=Color color=Color
sponsor=Sponsor
@@ -111,6 +112,7 @@ navbar.settings=Ustawienia
############# #############
settings.title=Ustawienia settings.title=Ustawienia
settings.update=Dostępna aktualizacja settings.update=Dostępna aktualizacja
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=Wersia aplikacji: settings.appVersion=Wersia aplikacji:
settings.downloadOption.title=Wybierz opcję pobierania (w przypadku pobierania pojedynczych plików innych niż ZIP): settings.downloadOption.title=Wybierz opcję pobierania (w przypadku pobierania pojedynczych plików innych niż ZIP):
settings.downloadOption.1=Otwórz w tym samym oknie settings.downloadOption.1=Otwórz w tym samym oknie
@@ -119,8 +121,9 @@ settings.downloadOption.3=Pobierz plik
settings.zipThreshold=Spakuj pliki, gdy liczba pobranych plików przekroczy settings.zipThreshold=Spakuj pliki, gdy liczba pobranych plików przekroczy
settings.signOut=Sign Out settings.signOut=Sign Out
settings.accountSettings=Account Settings settings.accountSettings=Account Settings
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Change Credentials changeCreds.title=Change Credentials
changeCreds.header=Update Your Account Details changeCreds.header=Update Your Account Details
@@ -806,17 +809,17 @@ rotate.selectAngle=Wybierz kąt obrotu (domyślnie 90 stopni):
rotate.submit=Obróć rotate.submit=Obróć
#merge #split-pdfs
split.title=Podziel dokument PDF split.title=Podziel dokument PDF
split.header=Podziel dokument PDF split.header=Podziel dokument PDF
split.desc.1=Wybrane numery to numery stron, na których chcesz dokonać podziału split.desc.1=Wybrane numery to numery stron, na których chcesz dokonać podziału
split.desc.2=Np. taki wybór 1,3,7-8 podzieliłby 10-stronicowy dokument na 6 oddzielnych plików PDF z: split.desc.2=Np. taki wybór 1,3,7-9 podzieliłby 10-stronicowy dokument na 6 oddzielnych plików PDF z:
split.desc.3=Dokument #1: Strona 1 split.desc.3=Dokument #1: Strona 1
split.desc.4=Dokument #2: Strona 2 i 3 split.desc.4=Dokument #2: Strona 2 i 3
split.desc.5=Dokument #3: Strona 4, 5 i 6 split.desc.5=Dokument #3: Strona 4, 5, 6 i 7
split.desc.6=Dokument #4: Strona 7 split.desc.6=Dokument #4: Strona 8
split.desc.7=Dokument #5: Strona 8 split.desc.7=Dokument #5: Strona 9
split.desc.8=Dokument #6: Strona 9 i 10 split.desc.8=Dokument #6: Strona 10
split.splitPages=Wprowadź strony do podziału na: split.splitPages=Wprowadź strony do podziału na:
split.submit=Podziel split.submit=Podziel
@@ -938,6 +941,7 @@ pdfToPDFA.header=PDF na PDF/A
pdfToPDFA.credit=Ta usługa używa OCRmyPDF do konwersji PDF/A pdfToPDFA.credit=Ta usługa używa OCRmyPDF do konwersji PDF/A
pdfToPDFA.submit=Konwertuj pdfToPDFA.submit=Konwertuj
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
#PDFToWord #PDFToWord
@@ -1021,6 +1025,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions
split-by-sections.submit=Split PDF split-by-sections.submit=Split PDF
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Merge Into One PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenses licenses.nav=Licenses
licenses.title=3rd Party Licenses licenses.title=3rd Party Licenses

View File

@@ -66,6 +66,7 @@ seeDockerHub=See Docker Hub
visitGithub=Visit Github Repository visitGithub=Visit Github Repository
donate=Donate donate=Donate
color=Color color=Color
sponsor=Sponsor
@@ -111,6 +112,7 @@ navbar.settings=Configurações
############# #############
settings.title=Configurações settings.title=Configurações
settings.update=Atualização disponível settings.update=Atualização disponível
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=Versão do aplicativo: settings.appVersion=Versão do aplicativo:
settings.downloadOption.title=Escolha a opção de download (para downloads não compactados de arquivo único): settings.downloadOption.title=Escolha a opção de download (para downloads não compactados de arquivo único):
settings.downloadOption.1=Abrir na mesma janela settings.downloadOption.1=Abrir na mesma janela
@@ -119,8 +121,9 @@ settings.downloadOption.3=⇬ Fazer download do arquivo
settings.zipThreshold=Compactar arquivos quando o número de arquivos baixados exceder settings.zipThreshold=Compactar arquivos quando o número de arquivos baixados exceder
settings.signOut=Sign Out settings.signOut=Sign Out
settings.accountSettings=Account Settings settings.accountSettings=Account Settings
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Change Credentials changeCreds.title=Change Credentials
changeCreds.header=Update Your Account Details changeCreds.header=Update Your Account Details
@@ -806,17 +809,17 @@ rotate.selectAngle=Selecione o ângulo de rotação (múltiplos de 90 graus):
rotate.submit=Girar rotate.submit=Girar
#merge #split-pdfs
split.title=Dividir PDF split.title=Dividir PDF
split.header=Dividir PDF split.header=Dividir PDF
split.desc.1=Os números selecionados correspondem às páginas onde você deseja fazer a divisão. split.desc.1=Os números selecionados correspondem às páginas onde você deseja fazer a divisão.
split.desc.2=Por exemplo, selecionar 1,3,7-8 dividirá um documento de 10 páginas em 6 PDFs separados da seguinte forma: split.desc.2=Por exemplo, selecionar 1,3,7-9 dividirá um documento de 10 páginas em 6 PDFs separados da seguinte forma:
split.desc.3=Documento Nº1: Página 1 split.desc.3=Documento Nº1: Página 1
split.desc.4=Documento Nº2: Páginas 2 e 3 split.desc.4=Documento Nº2: Páginas 2 e 3
split.desc.5=Documento Nº3: Páginas 4, 5 e 6 split.desc.5=Documento Nº3: Páginas 4, 5, 6 e 7
split.desc.6=Documento Nº4: Página 7 split.desc.6=Documento Nº4: Página 8
split.desc.7=Documento Nº5: Página 8 split.desc.7=Documento Nº5: Página 9
split.desc.8=Documento Nº6: Páginas 9 e 10 split.desc.8=Documento Nº6: Páginas 10
split.splitPages=Digite as páginas para a divisão: split.splitPages=Digite as páginas para a divisão:
split.submit=Dividir split.submit=Dividir
@@ -938,6 +941,7 @@ pdfToPDFA.header=PDF para PDF/A
pdfToPDFA.credit=Este serviço usa OCRmyPDF para Conversão de PDF/A pdfToPDFA.credit=Este serviço usa OCRmyPDF para Conversão de PDF/A
pdfToPDFA.submit=Converter pdfToPDFA.submit=Converter
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
#PDFToWord #PDFToWord
@@ -1021,6 +1025,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions
split-by-sections.submit=Split PDF split-by-sections.submit=Split PDF
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Merge Into One PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenses licenses.nav=Licenses
licenses.title=3rd Party Licenses licenses.title=3rd Party Licenses

View File

@@ -66,6 +66,7 @@ seeDockerHub=See Docker Hub
visitGithub=Visit Github Repository visitGithub=Visit Github Repository
donate=Donate donate=Donate
color=Color color=Color
sponsor=Sponsor
@@ -111,6 +112,7 @@ navbar.settings=Configurações
############# #############
settings.title=Configurações settings.title=Configurações
settings.update=Atualização disponível settings.update=Atualização disponível
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=Versão da aplicação: settings.appVersion=Versão da aplicação:
settings.downloadOption.title=Escolha a opção de download (para downloads não compactados de ficheiro único): settings.downloadOption.title=Escolha a opção de download (para downloads não compactados de ficheiro único):
settings.downloadOption.1=Abrir na mesma janela settings.downloadOption.1=Abrir na mesma janela
@@ -119,8 +121,9 @@ settings.downloadOption.3=⇬ Fazer download do ficheiro
settings.zipThreshold=Compactar ficheiros quando o número de ficheiros baixados exceder settings.zipThreshold=Compactar ficheiros quando o número de ficheiros baixados exceder
settings.signOut=Terminar Sessão settings.signOut=Terminar Sessão
settings.accountSettings=Configuração de Conta settings.accountSettings=Configuração de Conta
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Alterar senha changeCreds.title=Alterar senha
changeCreds.header=Alterar dados da sua conta changeCreds.header=Alterar dados da sua conta
@@ -806,17 +809,17 @@ rotate.selectAngle=Seleccione o ângulo de rotação (múltiplos de 90 graus):
rotate.submit=Girar rotate.submit=Girar
#merge #split-pdfs
split.title=Dividir PDF split.title=Dividir PDF
split.header=Dividir PDF split.header=Dividir PDF
split.desc.1=Os números seleccionados correspondem às páginas onde você deseja fazer a divisão. split.desc.1=Os números seleccionados correspondem às páginas onde você deseja fazer a divisão.
split.desc.2=Por exemplo, seleccionar 1,3,7-8 dividirá um documento de 10 páginas em 6 PDFs separados da seguinte forma: split.desc.2=Por exemplo, seleccionar 1,3,7-9 dividirá um documento de 10 páginas em 6 PDFs separados da seguinte forma:
split.desc.3=Documento Nº1: Página 1 split.desc.3=Documento Nº1: Página 1
split.desc.4=Documento Nº2: Páginas 2 e 3 split.desc.4=Documento Nº2: Páginas 2 e 3
split.desc.5=Documento Nº3: Páginas 4, 5 e 6 split.desc.5=Documento Nº3: Páginas 4, 5, 6 e 7
split.desc.6=Documento Nº4: Página 7 split.desc.6=Documento Nº4: Página 8
split.desc.7=Documento Nº5: Página 8 split.desc.7=Documento Nº5: Página 9
split.desc.8=Documento Nº6: Páginas 9 e 10 split.desc.8=Documento Nº6: Páginas 10
split.splitPages=Digite as páginas para a divisão: split.splitPages=Digite as páginas para a divisão:
split.submit=Dividir split.submit=Dividir
@@ -938,6 +941,7 @@ pdfToPDFA.header=PDF para PDF/A
pdfToPDFA.credit=Este serviço usa OCRmyPDF para Conversão de PDF/A pdfToPDFA.credit=Este serviço usa OCRmyPDF para Conversão de PDF/A
pdfToPDFA.submit=Converter pdfToPDFA.submit=Converter
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
#PDFToWord #PDFToWord
@@ -1021,6 +1025,15 @@ split-by-sections.vertical.placeholder=Introduza o número de divisões verticai
split-by-sections.submit=Dividir PDF split-by-sections.submit=Dividir PDF
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Merge Into One PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenças licenses.nav=Licenças
licenses.title=Licenças de terceiros licenses.title=Licenças de terceiros

View File

@@ -66,6 +66,7 @@ seeDockerHub=See Docker Hub
visitGithub=Visit Github Repository visitGithub=Visit Github Repository
donate=Donate donate=Donate
color=Color color=Color
sponsor=Sponsor
@@ -111,6 +112,7 @@ navbar.settings=Setări
############# #############
settings.title=Setări settings.title=Setări
settings.update=Actualizare disponibilă settings.update=Actualizare disponibilă
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=Versiune aplicație: settings.appVersion=Versiune aplicație:
settings.downloadOption.title=Alege opțiunea de descărcare (pentru descărcarea unui singur fișier non-zip): settings.downloadOption.title=Alege opțiunea de descărcare (pentru descărcarea unui singur fișier non-zip):
settings.downloadOption.1=Deschide în aceeași fereastră settings.downloadOption.1=Deschide în aceeași fereastră
@@ -119,8 +121,9 @@ settings.downloadOption.3=Descarcă fișierul
settings.zipThreshold=Împachetează fișierele când numărul de fișiere descărcate depășește settings.zipThreshold=Împachetează fișierele când numărul de fișiere descărcate depășește
settings.signOut=Sign Out settings.signOut=Sign Out
settings.accountSettings=Account Settings settings.accountSettings=Account Settings
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Change Credentials changeCreds.title=Change Credentials
changeCreds.header=Update Your Account Details changeCreds.header=Update Your Account Details
@@ -806,17 +809,17 @@ rotate.selectAngle=Selectați un unghi de rotație (în multiplicate de 90 de gr
rotate.submit=Rotește rotate.submit=Rotește
#merge #split-pdfs
split.title=Împarte PDF split.title=Împarte PDF
split.header=Împarte PDF split.header=Împarte PDF
split.desc.1=Numerele pe care le selectați reprezintă numărul paginii pe care doriți să o împărțiți split.desc.1=Numerele pe care le selectați reprezintă numărul paginii pe care doriți să o împărțiți
split.desc.2=Prin urmare, selectând 1,3,7-8, un document cu 10 pagini va fi împărțit în 6 PDF-uri separate, astfel: split.desc.2=Prin urmare, selectând 1,3,7-9, un document cu 10 pagini va fi împărțit în 6 PDF-uri separate, astfel:
split.desc.3=Documentul #1: Pagina 1 split.desc.3=Documentul #1: Pagina 1
split.desc.4=Documentul #2: Paginile 2 și 3 split.desc.4=Documentul #2: Paginile 2 și 3
split.desc.5=Documentul #3: Paginile 4, 5 și 6 split.desc.5=Documentul #3: Paginile 4, 5, 6 și 7
split.desc.6=Documentul #4: Pagina 7 split.desc.6=Documentul #4: Pagina 8
split.desc.7=Documentul #5: Pagina 8 split.desc.7=Documentul #5: Pagina 9
split.desc.8=Documentul #6: Paginile 9 și 10 split.desc.8=Documentul #6: Pagina 10
split.splitPages=Introduceți paginile pe care să le împărțiți: split.splitPages=Introduceți paginile pe care să le împărțiți:
split.submit=Împarte split.submit=Împarte
@@ -938,6 +941,7 @@ pdfToPDFA.header=PDF către PDF/A
pdfToPDFA.credit=Acest serviciu utilizează OCRmyPDF pentru conversia în PDF/A pdfToPDFA.credit=Acest serviciu utilizează OCRmyPDF pentru conversia în PDF/A
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
#PDFToWord #PDFToWord
@@ -1021,6 +1025,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions
split-by-sections.submit=Split PDF split-by-sections.submit=Split PDF
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Merge Into One PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenses licenses.nav=Licenses
licenses.title=3rd Party Licenses licenses.title=3rd Party Licenses

View File

@@ -57,15 +57,16 @@ usernameExistsMessage=Новое имя пользователя уже суще
invalidUsernameMessage=Недопустимое имя пользователя, Имя пользователя должно содержать только буквы алфавита и цифры. invalidUsernameMessage=Недопустимое имя пользователя, Имя пользователя должно содержать только буквы алфавита и цифры.
deleteCurrentUserMessage=Невозможно удалить пользователя, вошедшего в систему. deleteCurrentUserMessage=Невозможно удалить пользователя, вошедшего в систему.
deleteUsernameExistsMessage=Имя пользователя не существует и не может быть удалено. deleteUsernameExistsMessage=Имя пользователя не существует и не может быть удалено.
error=Error error=Ошибка
oops=Oops! oops=Ой!
help=Help help=Помощь
goHomepage=Go to Homepage goHomepage=Перейти на главную страницу
joinDiscord=Join our Discord server joinDiscord=Присоединиться к нашему серверу Discord
seeDockerHub=See Docker Hub seeDockerHub=Посмотреть в Docker Hub
visitGithub=Visit Github Repository visitGithub=Посетить репозиторий на GitHub
donate=Donate donate=Пожертвовать
color=Color color=Цвет
sponsor=Спонсор
@@ -111,6 +112,7 @@ navbar.settings=Настройки
############# #############
settings.title=Настройки settings.title=Настройки
settings.update=Доступно обновление settings.update=Доступно обновление
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=Версия приложения: settings.appVersion=Версия приложения:
settings.downloadOption.title=Выберите вариант загрузки (для загрузки одного файла без zip): settings.downloadOption.title=Выберите вариант загрузки (для загрузки одного файла без zip):
settings.downloadOption.1=Открыть в том же окне settings.downloadOption.1=Открыть в том же окне
@@ -119,8 +121,9 @@ settings.downloadOption.3=Загрузить файл
settings.zipThreshold=Zip-файлы, когда количество загруженных файлов превышает settings.zipThreshold=Zip-файлы, когда количество загруженных файлов превышает
settings.signOut=Выйти settings.signOut=Выйти
settings.accountSettings=Настройки аккаунта settings.accountSettings=Настройки аккаунта
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Изменить учетные данные changeCreds.title=Изменить учетные данные
changeCreds.header=Обновите данные вашей учетной записи changeCreds.header=Обновите данные вашей учетной записи
@@ -806,17 +809,17 @@ rotate.selectAngle=Выберите угол поворота (кратный 90
rotate.submit=Повернуть rotate.submit=Повернуть
#merge #split-pdfs
split.title=Разделить PDF split.title=Разделить PDF
split.header=Разделить PDF split.header=Разделить PDF
split.desc.1=Выбранные вами числа — это номера страниц, на которых вы хотите сделать разделение. split.desc.1=Выбранные вами числа — это номера страниц, на которых вы хотите сделать разделение.
split.desc.2=Таким образом, выбор 1,3,7-8 разделит 10-страничный документ на 6 отдельных PDF-файлов с: split.desc.2=Таким образом, выбор 1,3,7-9 разделит 10-страничный документ на 6 отдельных PDF-файлов с:
split.desc.3=Документ #1: Page 1 split.desc.3=Документ #1: Страница 1
split.desc.4=Документ #2: Page 2 and 3 split.desc.4=Документ #2: Страница 2 и 3
split.desc.5=Документ #3: Page 4, 5 and 6 split.desc.5=Документ #3: Страница 4, 5, 6 aиnd 7
split.desc.6=Документ #4: Page 7 split.desc.6=Документ #4: Страница 8
split.desc.7=Документ #5: Page 8 split.desc.7=Документ #5: Страница 9
split.desc.8=Документ #6: Page 9 and 10 split.desc.8=Документ #6: Страница 10
split.splitPages=Введите страницы для разделения: split.splitPages=Введите страницы для разделения:
split.submit=Разделить split.submit=Разделить
@@ -938,6 +941,7 @@ pdfToPDFA.header=PDF в PDF/A
pdfToPDFA.credit=Этот сервис использует OCRmyPDF для преобразования PDF/A pdfToPDFA.credit=Этот сервис использует OCRmyPDF для преобразования PDF/A
pdfToPDFA.submit=Конвертировать pdfToPDFA.submit=Конвертировать
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
#PDFToWord #PDFToWord
@@ -1021,6 +1025,15 @@ split-by-sections.vertical.placeholder=Введите количество ве
split-by-sections.submit=Разделить PDF split-by-sections.submit=Разделить PDF
split-by-sections.merge=Объединить в один PDF split-by-sections.merge=Объединить в один PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Лицензии licenses.nav=Лицензии
licenses.title=Лицензии от третьих сторон licenses.title=Лицензии от третьих сторон
@@ -1031,15 +1044,15 @@ licenses.license=Лицензия
# error # error
error.sorry=Sorry for the issue! error.sorry=Извините за проблему!
error.needHelp=Need help / Found an issue? error.needHelp=Нужна помощь / Нашли проблему?
error.contactTip=If you're still having trouble, don't hesitate to reach out to us for help. You can submit a ticket on our GitHub page or contact us through Discord: error.contactTip=Если у вас все еще есть проблемы, не стесняйтесь обращаться к нам за помощью. Вы можете отправить заявку на нашей странице GitHub или связаться с нами через Discord:
error.404.head=404 - Page Not Found | Oops, we tripped in the code! error.404.head=404 - Страница не найдена | Ой, мы запутались в коде!
error.404.1=We can't seem to find the page you're looking for. error.404.1=Мы не можем найти страницу, которую вы ищете.
error.404.2=Something went wrong error.404.2=Произошла ошибка
error.github=Submit a ticket on GitHub error.github=Отправить заявку на GitHub
error.showStack=Show Stack Trace error.showStack=Показать стек вызовов
error.copyStack=Copy Stack Trace error.copyStack=Скопировать стек вызовов
error.githubSubmit=GitHub - Submit a ticket error.githubSubmit=GitHub - Отправить заявку
error.discordSubmit=Discord - Submit Support post error.discordSubmit=Discord - Отправить запрос в поддержку

View File

@@ -66,6 +66,7 @@ seeDockerHub=See Docker Hub
visitGithub=Visit Github Repository visitGithub=Visit Github Repository
donate=Donate donate=Donate
color=Color color=Color
sponsor=Sponsor
@@ -111,6 +112,7 @@ navbar.settings=Podešavanja
############# #############
settings.title=Podešavanja settings.title=Podešavanja
settings.update=Dostupno ažuriranje settings.update=Dostupno ažuriranje
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=Verzija aplikacije: settings.appVersion=Verzija aplikacije:
settings.downloadOption.title=Odaberite opciju preuzimanja (Za preuzimanje pojedinačnih fajlova bez zip formata): settings.downloadOption.title=Odaberite opciju preuzimanja (Za preuzimanje pojedinačnih fajlova bez zip formata):
settings.downloadOption.1=Otvori u istom prozoru settings.downloadOption.1=Otvori u istom prozoru
@@ -119,8 +121,9 @@ settings.downloadOption.3=Preuzmi fajl
settings.zipThreshold=Zipuj fajlove kada pređe broj preuzetih fajlova settings.zipThreshold=Zipuj fajlove kada pređe broj preuzetih fajlova
settings.signOut=Odjava settings.signOut=Odjava
settings.accountSettings=Podešavanja naloga settings.accountSettings=Podešavanja naloga
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Promeni pristupne podatke changeCreds.title=Promeni pristupne podatke
changeCreds.header=Ažurirajte detalje svog naloga changeCreds.header=Ažurirajte detalje svog naloga
@@ -806,17 +809,17 @@ rotate.selectAngle=Izaberite ugao rotacije (u višestrukim od 90 stepeni):
rotate.submit=Rotiraj rotate.submit=Rotiraj
#merge #split-pdfs
split.title=Razdvajanje PDF-a split.title=Razdvajanje PDF-a
split.header=Razdvajanje PDF-a split.header=Razdvajanje PDF-a
split.desc.1=Brojevi koje izaberete predstavljaju brojeve stranica na kojima želite napraviti razdvajanje split.desc.1=Brojevi koje izaberete predstavljaju brojeve stranica na kojima želite napraviti razdvajanje
split.desc.2=Na primer, izbor 1,3,7-8 bi razdvojio dokument od 10 stranica u 6 odvojenih PDF-a sa: split.desc.2=Na primer, izbor 1,3,7-9 bi razdvojio dokument od 10 stranica u 6 odvojenih PDF-a sa:
split.desc.3=Dokument #1: Stranica 1 split.desc.3=Dokument #1: Stranica 1
split.desc.4=Dokument #2: Stranice 2 i 3 split.desc.4=Dokument #2: Stranice 2 i 3
split.desc.5=Dokument #3: Stranice 4, 5 i 6 split.desc.5=Dokument #3: Stranice 4, 5, 6 i 7
split.desc.6=Dokument #4: Stranica 7 split.desc.6=Dokument #4: Stranica 8
split.desc.7=Dokument #5: Stranica 8 split.desc.7=Dokument #5: Stranica 9
split.desc.8=Dokument #6: Stranice 9 i 10 split.desc.8=Dokument #6: Stranice 10
split.splitPages=Unesite stranice za razdvajanje: split.splitPages=Unesite stranice za razdvajanje:
split.submit=Razdvoji split.submit=Razdvoji
@@ -938,6 +941,7 @@ pdfToPDFA.header=PDF u PDF/A
pdfToPDFA.credit=Ova usluga koristi OCRmyPDF za konverziju u PDF/A format pdfToPDFA.credit=Ova usluga koristi OCRmyPDF 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
#PDFToWord #PDFToWord
@@ -1021,6 +1025,15 @@ split-by-sections.vertical.placeholder=Unesite broj vertikalnih podele
split-by-sections.submit=Razdvoji PDF split-by-sections.submit=Razdvoji PDF
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Merge Into One PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenses licenses.nav=Licenses
licenses.title=3rd Party Licenses licenses.title=3rd Party Licenses

View File

@@ -66,6 +66,7 @@ seeDockerHub=See Docker Hub
visitGithub=Visit Github Repository visitGithub=Visit Github Repository
donate=Donate donate=Donate
color=Color color=Color
sponsor=Sponsor
@@ -111,6 +112,7 @@ navbar.settings=Inställningar
############# #############
settings.title=Inställningar settings.title=Inställningar
settings.update=Uppdatering tillgänglig settings.update=Uppdatering tillgänglig
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=Appversion: settings.appVersion=Appversion:
settings.downloadOption.title=Välj nedladdningsalternativ (för nedladdning av en fil utan zip): settings.downloadOption.title=Välj nedladdningsalternativ (för nedladdning av en fil utan zip):
settings.downloadOption.1=Öppnas i samma fönster settings.downloadOption.1=Öppnas i samma fönster
@@ -119,8 +121,9 @@ settings.downloadOption.3=Ladda ner fil
settings.zipThreshold=Zip-filer när antalet nedladdade filer överskrider settings.zipThreshold=Zip-filer när antalet nedladdade filer överskrider
settings.signOut=Sign Out settings.signOut=Sign Out
settings.accountSettings=Account Settings settings.accountSettings=Account Settings
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=Change Credentials changeCreds.title=Change Credentials
changeCreds.header=Update Your Account Details changeCreds.header=Update Your Account Details
@@ -806,17 +809,17 @@ rotate.selectAngle=Välj rotationsvinkel (i multipler av 90 grader):
rotate.submit=Rotera rotate.submit=Rotera
#merge #split-pdfs
split.title=Dela upp PDF split.title=Dela upp PDF
split.header=Dela upp PDF split.header=Dela upp PDF
split.desc.1=Siffrorna du väljer är sidnumret du vill göra en split på split.desc.1=Siffrorna du väljer är sidnumret du vill göra en split på
split.desc.2=Som sådan skulle ett val av 1,3,7-8 dela upp ett 10-sidigt dokument i 6 separata PDF-filer med: split.desc.2=Som sådan skulle ett val av 1,3,7-9 dela upp ett 10-sidigt dokument i 6 separata PDF-filer med:
split.desc.3=Dokument #1: Sida 1 split.desc.3=Dokument #1: Sida 1
split.desc.4=Dokument #2: Sida 2 och 3 split.desc.4=Dokument #2: Sida 2 och 3
split.desc.5=Dokument #3: Sida 4, 5 och 6 split.desc.5=Dokument #3: Sida 4, 5, 6 och 7
split.desc.6=Dokument #4: Sida 7 split.desc.6=Dokument #4: Sida 8
split.desc.7=Dokument #5: Sida 8 split.desc.7=Dokument #5: Sida 9
split.desc.8=Dokument #6: Sida 9 och 10 split.desc.8=Dokument #6: Sida 10
split.splitPages=Ange sidor att dela på: split.splitPages=Ange sidor att dela på:
split.submit=Dela split.submit=Dela
@@ -938,6 +941,7 @@ pdfToPDFA.header=PDF till PDF/A
pdfToPDFA.credit=Denna tjänst använder OCRmyPDF för PDF/A-konvertering pdfToPDFA.credit=Denna tjänst använder OCRmyPDF för PDF/A-konvertering
pdfToPDFA.submit=Konvertera pdfToPDFA.submit=Konvertera
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
#PDFToWord #PDFToWord
@@ -1021,6 +1025,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions
split-by-sections.submit=Split PDF split-by-sections.submit=Split PDF
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Merge Into One PDF
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=Licenses licenses.nav=Licenses
licenses.title=3rd Party Licenses licenses.title=3rd Party Licenses

View File

@@ -11,17 +11,17 @@ imgPrompt=Resim(leri) seçin
genericSubmit=Gönder genericSubmit=Gönder
processTimeWarning=Uyarı: Bu işlem, dosya boyutuna bağlı olarak bir dakikaya kadar sürebilir. processTimeWarning=Uyarı: Bu işlem, dosya boyutuna bağlı olarak bir dakikaya kadar sürebilir.
pageOrderPrompt=Özel Sayfa Sırası (Virgülle ayrılmış sayfa numaraları veya 2n+1 gibi bir fonksiyon girin) : pageOrderPrompt=Özel Sayfa Sırası (Virgülle ayrılmış sayfa numaraları veya 2n+1 gibi bir fonksiyon girin) :
pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) : pageSelectionPrompt=Özel Sayfa Seçimi (1,5,6 sayfa numaralarının virgülle ayrılmış bir listesini veya 2n+1 gibi bir fonksiyon girin) :
goToPage=Git goToPage=Git
true=Doğru true=Doğru
false=Yanlış false=Yanlış
unknown=Bilinmeyen unknown=Bilinmeyen
save=Kaydet save=Kaydet
saveToBrowser=Save to Browser saveToBrowser=Tarayıcıya Kaydet
close=Kapat close=Kapat
filesSelected=dosya seçildi filesSelected=dosya seçildi
noFavourites=Favori eklenmedi noFavourites=Favori eklenmedi
downloadComplete=Download Complete downloadComplete=İndirme Tamamlandı
bored=Sıkıldınız mı? bored=Sıkıldınız mı?
alphabet=Alfabe alphabet=Alfabe
downloadPdf=PDF İndir downloadPdf=PDF İndir
@@ -45,53 +45,54 @@ red=Kırmızı
green=Yeşil green=Yeşil
blue=Mavi blue=Mavi
custom=Özel custom=Özel
WorkInProgess=Work in progress, May not work or be buggy, Please report any problems! WorkInProgess=Çalışmalar devam ediyor, Çalışmayabilir veya hatalı olabilir, Lütfen herhangi bir sorunu bildirin!
poweredBy=Powered by poweredBy=Tarafından desteklenmektedir
yes=Yes yes=Evet
no=No no=Hayır
changedCredsMessage=Bilgiler değiştirildi! changedCredsMessage=Bilgiler değiştirildi!
notAuthenticatedMessage=Kullanıcı doğrulanmadı. notAuthenticatedMessage=Kullanıcı doğrulanmadı.
userNotFoundMessage=Kullanıcı bulunamadı. userNotFoundMessage=Kullanıcı bulunamadı.
incorrectPasswordMessage=Mevcut şifre yanlış. incorrectPasswordMessage=Mevcut şifre yanlış.
usernameExistsMessage=Yeni Kullanıcı Adı zaten var. usernameExistsMessage=Yeni Kullanıcı Adı zaten var.
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers. invalidUsernameMessage=Geçersiz kullanıcı adı, Kullanıcı adı yalnızca alfabe karakterleri ve sayılar içermelidir.
deleteCurrentUserMessage=Cannot delete currently logged in user. deleteCurrentUserMessage=Şu anda oturum açmış olan kullanıcı silinemiyor.
deleteUsernameExistsMessage=The username does not exist and cannot be deleted. deleteUsernameExistsMessage=Kullanıcı adı mevcut değil ve silinemez.
error=Error error=Hata
oops=Oops! oops=Tüh!
help=Help help=Yardım
goHomepage=Go to Homepage goHomepage=Anasayfa'ya git
joinDiscord=Join our Discord server joinDiscord=Discord sunucumuza katılın
seeDockerHub=See Docker Hub seeDockerHub=Docker Hub'a bakın
visitGithub=Visit Github Repository visitGithub=Github Deposunu Ziyaret Edin
donate=Donate donate=Bağış Yapın
color=Color color=Renk
sponsor=Bağış
############### ###############
# Pipeline # # Pipeline #
############### ###############
pipeline.header=Pipeline Menu (Beta) pipeline.header=Çoklu İşlemler Menü (Beta)
pipeline.uploadButton=Upload Custom pipeline.uploadButton=Upload edin
pipeline.configureButton=Configure pipeline.configureButton=Yapılandır
pipeline.defaultOption=Custom pipeline.defaultOption=Özel
pipeline.submitButton=Submit pipeline.submitButton=Gönder
pipeline.help=Pipeline Help pipeline.help=Çoklu İşlemler Yardım
pipeline.scanHelp=Folder Scanning Help pipeline.scanHelp=Klasör Tarama Yardımı
###################### ######################
# Pipeline Options # # Pipeline Options #
###################### ######################
pipelineOptions.header=Pipeline Configuration pipelineOptions.header=Çoklu İşlemler Yapılandırma
pipelineOptions.pipelineNameLabel=Pipeline Name pipelineOptions.pipelineNameLabel=Çoklu İşlemler İsim
pipelineOptions.saveSettings=Save Operation Settings pipelineOptions.saveSettings=Ayarları Kaydet
pipelineOptions.pipelineNamePrompt=Enter pipeline name here pipelineOptions.pipelineNamePrompt=Buraya isim girin
pipelineOptions.selectOperation=Select Operation pipelineOptions.selectOperation=İşlem Seçin
pipelineOptions.addOperationButton=Add operation pipelineOptions.addOperationButton=İşlem ekle
pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.pipelineHeader=Çoklu İşlemler:
pipelineOptions.saveButton=Download pipelineOptions.saveButton=İndir
pipelineOptions.validateButton=Validate pipelineOptions.validateButton=Doğrula
@@ -111,6 +112,7 @@ navbar.settings=Ayarlar
############# #############
settings.title=Ayarlar settings.title=Ayarlar
settings.update=Güncelleme mevcut settings.update=Güncelleme mevcut
settings.updateAvailable={0} mevcut kurulu sürümdür. Yeni bir sürüm ({1}) mevcuttur.
settings.appVersion=Uygulama Sürümü: settings.appVersion=Uygulama Sürümü:
settings.downloadOption.title=İndirme seçeneği seçin (Zip olmayan tek dosya indirmeler için): settings.downloadOption.title=İndirme seçeneği seçin (Zip olmayan tek dosya indirmeler için):
settings.downloadOption.1=Aynı pencerede aç settings.downloadOption.1=Aynı pencerede aç
@@ -119,8 +121,9 @@ settings.downloadOption.3=Dosyayı indir
settings.zipThreshold=İndirilen dosya sayısı şu değeri aştığında zip dosyası oluştur: settings.zipThreshold=İndirilen dosya sayısı şu değeri aştığında zip dosyası oluştur:
settings.signOut=Oturumu Kapat settings.signOut=Oturumu Kapat
settings.accountSettings=Hesap Ayarları settings.accountSettings=Hesap Ayarları
settings.bored.help=Paskalya yumurtası oyunu etkinleştirir
settings.cacheInputs.name=Form girdilerini kaydet
settings.cacheInputs.help=Gelecekteki çalıştırmalar için önceden kullanılan girdileri saklamayı etkinleştirin
changeCreds.title=Giriş Bilgilerini Değiştir changeCreds.title=Giriş Bilgilerini Değiştir
changeCreds.header=Hesap Detaylarınızı Güncelleyin changeCreds.header=Hesap Detaylarınızı Güncelleyin
@@ -159,15 +162,15 @@ adminUserSettings.header=Yönetici Kullanıcı Kontrol Ayarları
adminUserSettings.admin=Yönetici adminUserSettings.admin=Yönetici
adminUserSettings.user=Kullanıcı adminUserSettings.user=Kullanıcı
adminUserSettings.addUser=Yeni Kullanıcı Ekle adminUserSettings.addUser=Yeni Kullanıcı Ekle
adminUserSettings.usernameInfo=Username must only contain letters and numbers, no spaces or special characters. adminUserSettings.usernameInfo=Kullanıcı adı yalnızca harf ve rakamlardan oluşmalı, boşluk veya özel karakter içermemelidir.
adminUserSettings.roles=Roller adminUserSettings.roles=Roller
adminUserSettings.role=Rol adminUserSettings.role=Rol
adminUserSettings.actions=Eylemler adminUserSettings.actions=Eylemler
adminUserSettings.apiUser=Sınırlı API Kullanıcısı adminUserSettings.apiUser=Sınırlı API Kullanıcısı
adminUserSettings.extraApiUser=Additional Limited API User adminUserSettings.extraApiUser=Ek Sınırlı API Kullanıcısı
adminUserSettings.webOnlyUser=Sadece Web Kullanıcısı adminUserSettings.webOnlyUser=Sadece Web Kullanıcısı
adminUserSettings.demoUser=Demo User (No custom settings) adminUserSettings.demoUser=Demo Kullanıcısı (Özel ayar yok)
adminUserSettings.internalApiUser=Internal API User adminUserSettings.internalApiUser=Dahili API Kullanıcısı
adminUserSettings.forceChange=Kullanıcının girişte kullanıcı adı/şifre değiştirmesini zorla adminUserSettings.forceChange=Kullanıcının girişte kullanıcı adı/şifre değiştirmesini zorla
adminUserSettings.submit=Kullanıcıyı Kaydet adminUserSettings.submit=Kullanıcıyı Kaydet
@@ -175,12 +178,12 @@ adminUserSettings.submit=Kullanıcıyı Kaydet
# HOME-PAGE # # HOME-PAGE #
############# #############
home.desc=Yerel olarak barındırılan tüm PDF ihtiyaçlarınız için tek durak noktanız. home.desc=Yerel olarak barındırılan tüm PDF ihtiyaçlarınız için tek durak noktanız.
home.searchBar=Search for features... home.searchBar=Özellikleri arayın...
home.viewPdf.title=View PDF home.viewPdf.title=PDF Görüntüle
home.viewPdf.desc=View, annotate, add text or images home.viewPdf.desc=Görüntüleyin, açıklama ekleyin, metin veya resim ekleyin
viewPdf.tags=view,read,annotate,text,image viewPdf.tags=görüntüle,oku,açıklama ekle,metin,görüntü
home.multiTool.title=PDF Çoklu Araç home.multiTool.title=PDF Çoklu Araç
home.multiTool.desc=Birleştir, Döndür, Yeniden Düzenle ve Sayfaları Kaldır home.multiTool.desc=Birleştir, Döndür, Yeniden Düzenle ve Sayfaları Kaldır
@@ -304,9 +307,9 @@ home.removeBlanks.title=Boş Sayfaları Kaldır
home.removeBlanks.desc=Bir belgeden boş sayfaları tespit eder ve kaldırır home.removeBlanks.desc=Bir belgeden boş sayfaları tespit eder ve kaldırır
removeBlanks.tags=temizle,sadeleştir,içeriksiz,düzenle removeBlanks.tags=temizle,sadeleştir,içeriksiz,düzenle
home.removeAnnotations.title=Remove Annotations home.removeAnnotations.title=Ek Açıklamaları Kaldır
home.removeAnnotations.desc=Removes all comments/annotations from a PDF home.removeAnnotations.desc=PDF'deki tüm yorumları/açıklamaları kaldırır
removeAnnotations.tags=comments,highlight,notes,markup,remove removeAnnotations.tags=yorumlar,vurgulama,notlar,işaretleme,kaldırma
home.compare.title=Karşılaştır home.compare.title=Karşılaştır
home.compare.desc=2 PDF Belgesi arasındaki farkları karşılaştırır ve gösterir home.compare.desc=2 PDF Belgesi arasındaki farkları karşılaştırır ve gösterir
@@ -324,8 +327,8 @@ home.scalePages.title=Sayfa boyutunu/ölçeğini ayarla
home.scalePages.desc=Bir sayfanın ve/veya içeriğinin boyutunu/ölçeğini değiştirir home.scalePages.desc=Bir sayfanın ve/veya içeriğinin boyutunu/ölçeğini değiştirir
scalePages.tags=boyutlandır,değiştir,boyut,uyarla scalePages.tags=boyutlandır,değiştir,boyut,uyarla
home.pipeline.title=Hattı (İleri Seviye) home.pipeline.title=Çoklu İşlemler (İleri Seviye)
home.pipeline.desc=Hattı betikleri tanımlayarak PDF'lere birden fazla işlemi çalıştır home.pipeline.desc=Çoklu İşlemler tanımlayarak PDF'lere birden fazla işlemi çalıştır
pipeline.tags=otomatikleştir,sıralı,betikli,toplu-işlem pipeline.tags=otomatikleştir,sıralı,betikli,toplu-işlem
home.add-page-numbers.title=Sayfa Numaraları Ekle home.add-page-numbers.title=Sayfa Numaraları Ekle
@@ -389,36 +392,36 @@ home.autoRedact.title=Otomatik Karartma
home.autoRedact.desc=Giriş metnine dayanarak bir PDF'teki metni Otomatik Karartır (Redakte) home.autoRedact.desc=Giriş metnine dayanarak bir PDF'teki metni Otomatik Karartır (Redakte)
autoRedact.tags=Karart,Gizle,karartma,siyah,markör,gizli autoRedact.tags=Karart,Gizle,karartma,siyah,markör,gizli
home.tableExtraxt.title=PDF to CSV home.tableExtraxt.title=PDF'den CSV'ye
home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV home.tableExtraxt.desc=PDF'den Tabloları çıkarır ve CSV'ye dönüştürür
tableExtraxt.tags=CSV,Table Extraction,extract,convert tableExtraxt.tags=CSV, Tablo Çıkarma, ayıklama, dönüştürme
home.autoSizeSplitPDF.title=Auto Split by Size/Count home.autoSizeSplitPDF.title=Boyut/Sayıya Göre Otomatik Bölme
home.autoSizeSplitPDF.desc=Split a single PDF into multiple documents based on size, page count, or document count home.autoSizeSplitPDF.desc=Tek bir PDF'yi boyut, sayfa sayısı veya belge sayısına göre birden fazla belgeye bölün
autoSizeSplitPDF.tags=pdf,split,document,organization autoSizeSplitPDF.tags=pdf,bölme,belge,organizasyon
home.overlay-pdfs.title=Overlay PDFs home.overlay-pdfs.title=PDF'leri Bindirme
home.overlay-pdfs.desc=Overlays PDFs on-top of another PDF home.overlay-pdfs.desc=PDF'leri başka bir PDF'nin üzerine bindirir
overlay-pdfs.tags=Overlay overlay-pdfs.tags=Bindirme
home.split-by-sections.title=Split PDF by Sections home.split-by-sections.title=PDF'yi Bölümlere Ayırma
home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections home.split-by-sections.desc=PDF'nin her sayfasını daha küçük yatay ve dikey bölümlere ayırın
split-by-sections.tags=Section Split, Divide, Customize split-by-sections.tags=Bölümlere Ayırma, Bölme, Özelleştirme
home.AddStampRequest.title=Add Stamp to PDF home.AddStampRequest.title=PDF'ye Damga Ekleme
home.AddStampRequest.desc=Add text or add image stamps at set locations home.AddStampRequest.desc=Belirlenen konumlara metin veya resim damgaları ekleyin
AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize AddStampRequest.tags=Damga, Görüntü ekle, Görüntüyü ortala, Filigran, PDF, Göm, Özelleştir
home.PDFToBook.title=PDF to Book home.PDFToBook.title=PDF'den Kitaba
home.PDFToBook.desc=Converts PDF to Book/Comic formats using calibre home.PDFToBook.desc=Calibre kullanarak PDF'yi Kitap/Komik formatlarına dönüştürür
PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle PDFToBook.tags=Kitap,Çizgi Roman,Calibre,Dönüştür,manga,amazon,kindle,epub,mobi,azw3,docx,rtf,txt,html,lit,fb2,pdb,lrf
home.BookToPDF.title=Book to PDF home.BookToPDF.title=Kitaptan PDF'ye
home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre home.BookToPDF.desc=calibre kullanarak Kitap/Karikatür formatlarını PDF'ye dönüştürür
BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle BookToPDF.tags=Kitap,Çizgi Roman,Calibre,Dönüştür,manga,amazon,kindle,epub,mobi,azw3,docx,rtf,txt,html,lit,fb2,pdb,lrf
########################### ###########################
@@ -466,7 +469,7 @@ pdfToSinglePage.submit=Tek Sayfaya Dönüştür
pageExtracter.title=Sayfaları Çıkar pageExtracter.title=Sayfaları Çıkar
pageExtracter.header=Sayfaları Çıkar pageExtracter.header=Sayfaları Çıkar
pageExtracter.submit=Çıkar pageExtracter.submit=Çıkar
pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1) pageExtracter.placeholder=(örneğin 1,2,8 veya 4,7,12-16 ya da 2n-1)
#getPdfInfo #getPdfInfo
@@ -498,37 +501,37 @@ HTMLToPDF.header=HTML'den PDF'e
HTMLToPDF.help=HTML dosyalarını ve html/css/görsel vb. içeren ZIP'leri kabul eder HTMLToPDF.help=HTML dosyalarını ve html/css/görsel vb. içeren ZIP'leri kabul eder
HTMLToPDF.submit=Dönüştür HTMLToPDF.submit=Dönüştür
HTMLToPDF.credit=WeasyPrint Kullanıyor HTMLToPDF.credit=WeasyPrint Kullanıyor
HTMLToPDF.zoom=Zoom level for displaying the website. HTMLToPDF.zoom=Web sitesini görüntülemek için yakınlaştırma düzeyi.
HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) HTMLToPDF.pageWidth=Sayfanın santimetre cinsinden genişliği. (Varsayılan olarak boş)
HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) HTMLToPDF.pageHeight=Sayfanın santimetre cinsinden yüksekliği. (Varsayılan olarak boş)
HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) HTMLToPDF.marginTop=Sayfanın milimetre cinsinden üst kenar boşluğu. (Varsayılan olarak boş)
HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) HTMLToPDF.marginBottom=Sayfanın milimetre cinsinden alt kenar boşluğu. (Varsayılan olarak boş)
HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) HTMLToPDF.marginLeft=Sayfanın milimetre cinsinden sol kenar boşluğu. (Varsayılan olarak boş)
HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) HTMLToPDF.marginRight=Sayfanın milimetre cinsinden sağ kenar boşluğu. (Varsayılan olarak boş)
HTMLToPDF.printBackground=Render the background of websites. HTMLToPDF.printBackground=Web sitelerinin arka planını oluşturun.
HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) HTMLToPDF.defaultHeader=Varsayılan Üstbilgiyi Etkinleştir (Ad ve sayfa numarası)
HTMLToPDF.cssMediaType=Change the CSS media type of the page. HTMLToPDF.cssMediaType=Sayfanın CSS ortam türünü değiştirin.
HTMLToPDF.none=None HTMLToPDF.none=Hiçbiri
HTMLToPDF.print=Print HTMLToPDF.print=Yazdır
HTMLToPDF.screen=Screen HTMLToPDF.screen=Ekran
#AddStampRequest #AddStampRequest
AddStampRequest.header=Stamp PDF AddStampRequest.header=Damga PDF
AddStampRequest.title=Stamp PDF AddStampRequest.title=Damga PDF
AddStampRequest.stampType=Stamp Type AddStampRequest.stampType=Damga Türü
AddStampRequest.stampText=Stamp Text AddStampRequest.stampText=Damga Metni
AddStampRequest.stampImage=Stamp Image AddStampRequest.stampImage=Damga Resmi
AddStampRequest.alphabet=Alphabet AddStampRequest.alphabet=Alfabe
AddStampRequest.fontSize=Font/Image Size AddStampRequest.fontSize=Yazı Tipi/Görüntü Boyutu
AddStampRequest.rotation=Rotation AddStampRequest.rotation=Döndürme
AddStampRequest.opacity=Opacity AddStampRequest.opacity=Opaklık
AddStampRequest.position=Position AddStampRequest.position=Konum
AddStampRequest.overrideX=Override X Coordinate AddStampRequest.overrideX=X Koordinatını geçersiz kıl
AddStampRequest.overrideY=Override Y Coordinate AddStampRequest.overrideY=Y Koordinatını Geçersiz Kıl
AddStampRequest.customMargin=Custom Margin AddStampRequest.customMargin=Özel Kenar Boşluğu
AddStampRequest.customColor=Custom Text Color AddStampRequest.customColor=Özel Metin Rengi
AddStampRequest.submit=Submit AddStampRequest.submit=Gönder
#sanitizePDF #sanitizePDF
@@ -594,7 +597,7 @@ autoSplitPDF.submit=Gönder
#pipeline #pipeline
pipeline.title=Pipeline pipeline.title=Çoklu İşlemler
#pageLayout #pageLayout
@@ -617,11 +620,11 @@ scalePages.submit=Gönder
certSign.title=Sertifika İmzalama certSign.title=Sertifika İmzalama
certSign.header=Sertifikanızla bir PDF imzalayın (Devam eden iş) certSign.header=Sertifikanızla bir PDF imzalayın (Devam eden iş)
certSign.selectPDF=İmzalamak için bir PDF Dosyası seçin: certSign.selectPDF=İmzalamak için bir PDF Dosyası seçin:
certSign.jksNote=Note: If your certificate type is not listed below, please convert it to a Java Keystore (.jks) file using the keytool command line tool. Then, choose the .jks file option below. certSign.jksNote=Note: Sertifika türünüz aşağıda listelenmemişse, lütfen keytool komut satırı aracını kullanarak sertifikanızı bir Java Keystore (.jks) dosyasına dönüştürün. Ardından, aşağıdaki .jks dosyası seçeneğini seçin.
certSign.selectKey=Özel Anahtar Dosyanızı Seçin (PKCS#8 formatında, .pem veya .der olabilir): certSign.selectKey=Özel Anahtar Dosyanızı Seçin (PKCS#8 formatında, .pem veya .der olabilir):
certSign.selectCert=Sertifika Dosyanızı Seçin (X.509 formatında, .pem veya .der olabilir): certSign.selectCert=Sertifika Dosyanızı Seçin (X.509 formatında, .pem veya .der olabilir):
certSign.selectP12=PKCS#12 Anahtar Deposu Dosyanızı Seçin (.p12 veya .pfx) (İsteğe bağlı, sağlanırsa, özel anahtarınızı ve sertifikanızı içermelidir): certSign.selectP12=PKCS#12 Anahtar Deposu Dosyanızı Seçin (.p12 veya .pfx) (İsteğe bağlı, sağlanırsa, özel anahtarınızı ve sertifikanızı içermelidir):
certSign.selectJKS=Select Your Java Keystore File (.jks or .keystore): certSign.selectJKS=Java Keystore Dosyanızı (.jks veya .keystore) seçin:
certSign.certType=Sertifika Türü certSign.certType=Sertifika Türü
certSign.password=Anahtar Deposu veya Özel Anahtar Şifrenizi Girin (Varsa): certSign.password=Anahtar Deposu veya Özel Anahtar Şifrenizi Girin (Varsa):
certSign.showSig=İmzayı Göster certSign.showSig=İmzayı Göster
@@ -642,9 +645,9 @@ removeBlanks.submit=Boşları Kaldır
#removeAnnotations #removeAnnotations
removeAnnotations.title=Remove Annotations removeAnnotations.title=Ek Açıklamaları Kaldır
removeAnnotations.header=Remove Annotations removeAnnotations.header=Ek Açıklamaları Kaldır
removeAnnotations.submit=Remove removeAnnotations.submit=Kaldır
#compare #compare
@@ -655,17 +658,17 @@ compare.document.2=Belge 2
compare.submit=Karşılaştır compare.submit=Karşılaştır
#BookToPDF #BookToPDF
BookToPDF.title=Books and Comics to PDF BookToPDF.title=Kitapları ve Çizgi Romanları PDF'e Dönüştürme
BookToPDF.header=Book to PDF BookToPDF.header=Kitaptan PDF'ye
BookToPDF.credit=Uses Calibre BookToPDF.credit=Kalibre Kullanır
BookToPDF.submit=Convert BookToPDF.submit=Dönüştür
#PDFToBook #PDFToBook
PDFToBook.title=PDF to Book PDFToBook.title=PDF'den Kitaba
PDFToBook.header=PDF to Book PDFToBook.header=PDF'den Kitaba
PDFToBook.selectText.1=Format PDFToBook.selectText.1=Format biçimi
PDFToBook.credit=Uses Calibre PDFToBook.credit=Kalibre Kullanır
PDFToBook.submit=Convert PDFToBook.submit=Dönüştür
#sign #sign
sign.title=İmzala sign.title=İmzala
@@ -769,34 +772,34 @@ merge.submit=Birleştir
pdfOrganiser.title=Sayfa Organizatörü pdfOrganiser.title=Sayfa Organizatörü
pdfOrganiser.header=PDF Sayfa Organizatörü pdfOrganiser.header=PDF Sayfa Organizatörü
pdfOrganiser.submit=Sayfaları Yeniden Düzenle pdfOrganiser.submit=Sayfaları Yeniden Düzenle
pdfOrganiser.mode=Mode pdfOrganiser.mode=Mod
pdfOrganiser.mode.1=Custom Page Order pdfOrganiser.mode.1=Özel Sayfa Düzeni
pdfOrganiser.mode.2=Reverse Order pdfOrganiser.mode.2=Ters Sıralama
pdfOrganiser.mode.3=Duplex Sort pdfOrganiser.mode.3=Çift Taraflı Sıralama
pdfOrganiser.mode.4=Booklet Sort pdfOrganiser.mode.4=Kitapçık Sıralama
pdfOrganiser.mode.5=Side Stitch Booklet Sort pdfOrganiser.mode.5=Yandan Dikişli Kitapçık Sıralama
pdfOrganiser.mode.6=Odd-Even Split pdfOrganiser.mode.6=Tek-Çift Ayrımı
pdfOrganiser.mode.7=Remove First pdfOrganiser.mode.7=İlk Önce Kaldır
pdfOrganiser.mode.8=Remove Last pdfOrganiser.mode.8=Sonuncuyu Kaldır
pdfOrganiser.mode.9=Remove First and Last pdfOrganiser.mode.9=İlk ve Sonu Kaldır
pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1) pdfOrganiser.placeholder=(örn. 1,3,2 veya 4-8,2,10-12 veya 2n-1)
#multiTool #multiTool
multiTool.title=PDF Çoklu Araç multiTool.title=PDF Çoklu Araç
multiTool.header=PDF Çoklu Araç multiTool.header=PDF Çoklu Araç
multiTool.uploadPrompts=Please Upload PDF multiTool.uploadPrompts=Lütfen PDF Yükleyin
#view pdf #view pdf
viewPdf.title=View PDF viewPdf.title=PDF Görüntüle
viewPdf.header=View PDF viewPdf.header=PDF Görüntüle
#pageRemover #pageRemover
pageRemover.title=Sayfa Silici pageRemover.title=Sayfa Silici
pageRemover.header=PDF Sayfa silici pageRemover.header=PDF Sayfa silici
pageRemover.pagesToDelete=Silinmesi gereken sayfalar (Virgülle ayrılmış sayfa numaraları listesi girin): pageRemover.pagesToDelete=Silinmesi gereken sayfalar (Virgülle ayrılmış sayfa numaraları listesi girin):
pageRemover.submit=Sayfaları Sil pageRemover.submit=Sayfaları Sil
pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30) pageRemover.placeholder=(örn. 1,2,6 veya 1-10,15-30)
#rotate #rotate
@@ -806,17 +809,17 @@ rotate.selectAngle=Döndürme açısını seçin (90 derecenin katları olarak):
rotate.submit=Döndür rotate.submit=Döndür
#merge #split-pdfs
split.title=PDF Ayır split.title=PDF Ayır
split.header=PDF Ayır split.header=PDF Ayır
split.desc.1=Seçtiğiniz numaralar, bir ayrım yapmak istediğiniz sayfa numarasıdır split.desc.1=Seçtiğiniz numaralar, bir ayrım yapmak istediğiniz sayfa numarasıdır
split.desc.2=Bu nedenle, 1,3,7-8 seçmek 10 sayfalı bir belgeyi şunlarla 6 ayrı PDF'e böler: split.desc.2=Bu nedenle, 1,3,7-9 seçmek 10 sayfalı bir belgeyi şunlarla 6 ayrı PDF'e böler:
split.desc.3=Belge #1: Sayfa 1 split.desc.3=Belge #1: Sayfa 1
split.desc.4=Belge #2: Sayfa 2 ve 3 split.desc.4=Belge #2: Sayfa 2 ve 3
split.desc.5=Belge #3: Sayfa 4, 5 ve 6 split.desc.5=Belge #3: Sayfa 4, 5, 6 ve 7
split.desc.6=Belge #4: Sayfa 7 split.desc.6=Belge #4: Sayfa 8
split.desc.7=Belge #5: Sayfa 8 split.desc.7=Belge #5: Sayfa 9
split.desc.8=Belge #6: Sayfa 9 ve 10 split.desc.8=Belge #6: Sayfa 10
split.splitPages=Ayrılacak sayfaları girin: split.splitPages=Ayrılacak sayfaları girin:
split.submit=Ayır split.submit=Ayır
@@ -884,8 +887,8 @@ watermark.selectText.7=Opaklık (0% - 100%):
watermark.selectText.8=Filigran Türü: watermark.selectText.8=Filigran Türü:
watermark.selectText.9=Filigran Resmi: watermark.selectText.9=Filigran Resmi:
watermark.submit=Filigran Ekle watermark.submit=Filigran Ekle
watermark.type.1=Text watermark.type.1=Metin
watermark.type.2=Image watermark.type.2=Resim
#Change permissions #Change permissions
@@ -937,7 +940,8 @@ 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 OCRmyPDF kullanır pdfToPDFA.credit=Bu hizmet PDF/A dönüşümü için OCRmyPDF kullanır
pdfToPDFA.submit=Dönüştür pdfToPDFA.submit=Dönüştür
pdfToPDFA.tip=Currently does not work for multiple inputs at once pdfToPDFA.tip=Şu anda aynı anda birden fazla giriş için çalışmıyor
pdfToPDFA.outputFormat=Çıkış formatı
#PDFToWord #PDFToWord
@@ -978,68 +982,77 @@ PDFToXML.credit=Bu hizmet dosya dönüşümü için LibreOffice kullanır.
PDFToXML.submit=Dönüştür PDFToXML.submit=Dönüştür
#PDFToCSV #PDFToCSV
PDFToCSV.title=PDF to CSV PDFToCSV.title=PDF'den CSV'ye
PDFToCSV.header=PDF to CSV PDFToCSV.header=PDF'den CSV'ye
PDFToCSV.prompt=Choose page to extract table PDFToCSV.prompt=Tabloyu çıkarmak için sayfa seçin
PDFToCSV.submit=Extract PDFToCSV.submit=Çıkart
#split-by-size-or-count #split-by-size-or-count
split-by-size-or-count.title=Split PDF by Size or Count split-by-size-or-count.title=PDF'yi Boyuta veya Sayıya Göre Bölme
split-by-size-or-count.header=Split PDF by Size or Count split-by-size-or-count.header=PDF'yi Boyuta veya Sayıya Göre Bölme
split-by-size-or-count.type.label=Select Split Type split-by-size-or-count.type.label=Bölme Türünü Seçin
split-by-size-or-count.type.size=By Size split-by-size-or-count.type.size=Boyuta Göre
split-by-size-or-count.type.pageCount=By Page Count split-by-size-or-count.type.pageCount=Sayfa Sayısına Göre
split-by-size-or-count.type.docCount=By Document Count split-by-size-or-count.type.docCount=Belge Sayısına Göre
split-by-size-or-count.value.label=Enter Value split-by-size-or-count.value.label=Değer Girin
split-by-size-or-count.value.placeholder=Enter size (e.g., 2MB or 3KB) or count (e.g., 5) split-by-size-or-count.value.placeholder=Boyutu (örn. 2MB veya 3KB) veya sayıyı (örn. 5) girin
split-by-size-or-count.submit=Submit split-by-size-or-count.submit=Gönder
#overlay-pdfs #overlay-pdfs
overlay-pdfs.header=Overlay PDF Files overlay-pdfs.header=PDF Dosyalarını Bindirme
overlay-pdfs.baseFile.label=Select Base PDF File overlay-pdfs.baseFile.label=Temel PDF Dosyasını Seçin
overlay-pdfs.overlayFiles.label=Select Overlay PDF Files overlay-pdfs.overlayFiles.label=İkinci PDF Dosyalarını Seçin
overlay-pdfs.mode.label=Select Overlay Mode overlay-pdfs.mode.label=Bindirme Modunu Seçin
overlay-pdfs.mode.sequential=Sequential Overlay overlay-pdfs.mode.sequential=Sıralı Bindirme
overlay-pdfs.mode.interleaved=Interleaved Overlay overlay-pdfs.mode.interleaved=Serpiştirilmiş Bindirme
overlay-pdfs.mode.fixedRepeat=Fixed Repeat Overlay overlay-pdfs.mode.fixedRepeat=Sabit Tekrar Bindirme
overlay-pdfs.counts.label=Overlay Counts (for Fixed Repeat Mode) overlay-pdfs.counts.label=Bindirme Sayıları (Sabit Tekrar Modu için)
overlay-pdfs.counts.placeholder=Enter comma-separated counts (e.g., 2,3,1) overlay-pdfs.counts.placeholder=Virgülle ayrılmış sayıları girin (örn. 2,3,1)
overlay-pdfs.position.label=Select Overlay Position overlay-pdfs.position.label=Bindirme Konumunu Seçin
overlay-pdfs.position.foreground=Foreground overlay-pdfs.position.foreground=Ön plan
overlay-pdfs.position.background=Background overlay-pdfs.position.background=Arka plan
overlay-pdfs.submit=Submit overlay-pdfs.submit=Gönder
#split-by-sections #split-by-sections
split-by-sections.title=Split PDF by Sections split-by-sections.title=PDF'yi Bölümlere Ayırma
split-by-sections.header=Split PDF into Sections split-by-sections.header=PDF'yi Bölümlere Ayırma
split-by-sections.horizontal.label=Horizontal Divisions split-by-sections.horizontal.label=Yatay Bölümler
split-by-sections.vertical.label=Vertical Divisions split-by-sections.vertical.label=Dikey Bölümler
split-by-sections.horizontal.placeholder=Enter number of horizontal divisions split-by-sections.horizontal.placeholder=Yatay bölme sayısını girin
split-by-sections.vertical.placeholder=Enter number of vertical divisions split-by-sections.vertical.placeholder=Dikey bölme sayısını girin
split-by-sections.submit=Split PDF split-by-sections.submit=PDF'yi Böl
split-by-sections.merge=Merge Into One PDF split-by-sections.merge=Bir PDF'de Birleştirin
#printFile
printFile.title=Dosya Yazdır
printFile.header=Dosyayı Yazıcıya Yazdır
printFile.selectText.1=Yazdırılacak Dosyayı Seçin
printFile.selectText.2=Yazıcı Adını Girin
printFile.submit=Yazdır
#licenses #licenses
licenses.nav=Licenses licenses.nav=Lisanslar
licenses.title=3rd Party Licenses licenses.title=3. Taraf Lisansları
licenses.header=3rd Party Licenses licenses.header=3. Taraf Lisansları
licenses.module=Module licenses.module=Modül
licenses.version=Version licenses.version=Versiyon
licenses.license=License licenses.license=Lisans
# error # error
error.sorry=Sorry for the issue! error.sorry=Sorun için özür dileriz!
error.needHelp=Need help / Found an issue? error.needHelp=Yardıma mı ihtiyacınız var / Bir sorun mu buldunuz?
error.contactTip=If you're still having trouble, don't hesitate to reach out to us for help. You can submit a ticket on our GitHub page or contact us through Discord: error.contactTip=Hala sorun yaşıyorsanız, yardım için bize ulaşmaktan çekinmeyin. GitHub sayfamızdan bir bilet gönderebilir veya Discord üzerinden bizimle iletişime geçebilirsiniz:
error.404.head=404 - Page Not Found | Oops, we tripped in the code! error.404.head=404 - Sayfa Bulunamadı | Tüh, kodda takıldık!
error.404.1=We can't seem to find the page you're looking for. error.404.1=Aradığınız sayfayı bulamıyoruz.
error.404.2=Something went wrong error.404.2=Bir şeyler ters gitti
error.github=Submit a ticket on GitHub error.github=GitHub üzerinden bir hata bildirin
error.showStack=Show Stack Trace error.showStack=Yığın İzlemesini Göster
error.copyStack=Copy Stack Trace error.copyStack=Yığın İzini Kopyala
error.githubSubmit=GitHub - Submit a ticket error.githubSubmit=GitHub - Hata gönderin
error.discordSubmit=Discord - Submit Support post error.discordSubmit=Discord - Destek gönderisi gönderin

File diff suppressed because it is too large Load Diff

View File

@@ -66,6 +66,7 @@ seeDockerHub=查看Docker Hub
visitGithub=访问Github仓库 visitGithub=访问Github仓库
donate=捐款 donate=捐款
color=颜色 color=颜色
sponsor=赞助
@@ -111,6 +112,7 @@ navbar.settings=设置
############# #############
settings.title=设置 settings.title=设置
settings.update=可更新 settings.update=可更新
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=应用程序版本: settings.appVersion=应用程序版本:
settings.downloadOption.title=选择下载选项(单个文件非压缩文件): settings.downloadOption.title=选择下载选项(单个文件非压缩文件):
settings.downloadOption.1=在同一窗口打开 settings.downloadOption.1=在同一窗口打开
@@ -119,8 +121,9 @@ settings.downloadOption.3=下载文件
settings.zipThreshold=当下载的文件数量超过限制时,将文件压缩。 settings.zipThreshold=当下载的文件数量超过限制时,将文件压缩。
settings.signOut=登出 settings.signOut=登出
settings.accountSettings=帐号设定 settings.accountSettings=帐号设定
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=更改凭证 changeCreds.title=更改凭证
changeCreds.header=更新您的账户详情 changeCreds.header=更新您的账户详情
@@ -806,14 +809,14 @@ rotate.selectAngle=选择旋转角度以90度的倍数
rotate.submit=旋转 rotate.submit=旋转
#merge #split-pdfs
split.title=拆分PDF split.title=拆分PDF
split.header=拆分PDF split.header=拆分PDF
split.desc.1=选择希望进行分割的页数 split.desc.1=选择希望进行分割的页数
split.desc.2=如选择1,3,7-8将把一个10页的文件分割成6个独立的PDF split.desc.2=如选择1,3,7-9将把一个10页的文件分割成6个独立的PDF
split.desc.3=文档 #1第1页 split.desc.3=文档 #1第1页
split.desc.4=文档 #2第2页和第3页 split.desc.4=文档 #2第2页和第3页
split.desc.5=文档 #3第4页、第5页第6页 split.desc.5=文档 #3第4页、第5页第6页和第7页
split.desc.6=文档 #4第7页 split.desc.6=文档 #4第7页
split.desc.7=文档 #5第8页 split.desc.7=文档 #5第8页
split.desc.8=文档 #6第9页和第10页 split.desc.8=文档 #6第9页和第10页
@@ -938,6 +941,7 @@ pdfToPDFA.header=PDF转换为PDF/A
pdfToPDFA.credit=此服务使用OCRmyPDF进行PDF/A转换 pdfToPDFA.credit=此服务使用OCRmyPDF进行PDF/A转换
pdfToPDFA.submit=转换 pdfToPDFA.submit=转换
pdfToPDFA.tip=目前不支持上传多个 pdfToPDFA.tip=目前不支持上传多个
pdfToPDFA.outputFormat=Output format
#PDFToWord #PDFToWord
@@ -1021,6 +1025,15 @@ split-by-sections.vertical.placeholder=输入垂直分割数
split-by-sections.submit=分割PDF split-by-sections.submit=分割PDF
split-by-sections.merge=是否合并为一个pdf split-by-sections.merge=是否合并为一个pdf
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=许可证 licenses.nav=许可证
licenses.title=第三方许可证 licenses.title=第三方许可证

View File

@@ -57,15 +57,16 @@ usernameExistsMessage=新使用者名稱已存在。
invalidUsernameMessage=使用者名無效,使用者名只能包含字母字元和數位。 invalidUsernameMessage=使用者名無效,使用者名只能包含字母字元和數位。
deleteCurrentUserMessage=無法刪除目前登錄的使用者。 deleteCurrentUserMessage=無法刪除目前登錄的使用者。
deleteUsernameExistsMessage=使用者名不存在,無法刪除。 deleteUsernameExistsMessage=使用者名不存在,無法刪除。
error=Error error=錯誤
oops=Oops! oops=哎呀!
help=Help help=幫助
goHomepage=Go to Homepage goHomepage=前往首頁
joinDiscord=Join our Discord server joinDiscord=加入我們的Discord服務器
seeDockerHub=See Docker Hub seeDockerHub=查看Docker Hub
visitGithub=Visit Github Repository visitGithub=訪問Github存儲庫
donate=Donate donate=捐贈
color=Color color=顏色
sponsor=贊助
@@ -111,6 +112,7 @@ navbar.settings=設定
############# #############
settings.title=設定 settings.title=設定
settings.update=有更新可用 settings.update=有更新可用
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
settings.appVersion=應用版本: settings.appVersion=應用版本:
settings.downloadOption.title=選擇下載選項(對於單一檔案非壓縮下載): settings.downloadOption.title=選擇下載選項(對於單一檔案非壓縮下載):
settings.downloadOption.1=在同一視窗中開啟 settings.downloadOption.1=在同一視窗中開啟
@@ -119,8 +121,9 @@ settings.downloadOption.3=下載檔案
settings.zipThreshold=當下載的檔案數量超過時,壓縮檔案 settings.zipThreshold=當下載的檔案數量超過時,壓縮檔案
settings.signOut=登出 settings.signOut=登出
settings.accountSettings=帳戶設定 settings.accountSettings=帳戶設定
settings.bored.help=Enables easter egg game
settings.cacheInputs.name=Save form inputs
settings.cacheInputs.help=Enable to store previously used inputs for future runs
changeCreds.title=變更憑證 changeCreds.title=變更憑證
changeCreds.header=更新您的帳戶詳細資訊 changeCreds.header=更新您的帳戶詳細資訊
@@ -806,17 +809,17 @@ rotate.selectAngle=選擇旋轉角度(以 90 度的倍數):
rotate.submit=旋轉 rotate.submit=旋轉
#merge #split-pdfs
split.title=分割 PDF split.title=分割 PDF
split.header=分割 PDF split.header=分割 PDF
split.desc.1=您選擇的數字是您希望進行分割的頁碼 split.desc.1=您選擇的數字是您希望進行分割的頁碼
split.desc.2=因此,選擇 1,3,7-8 將會將一個 10 頁的文件分割為 6 個單獨的 PDF包括 split.desc.2=因此,選擇 1,3,7-9 將會將一個 10 頁的文件分割為 6 個單獨的 PDF包括
split.desc.3=文件 #1頁面 1 split.desc.3=文件 #1頁面 1
split.desc.4=文件 #2頁面 2 和 3 split.desc.4=文件 #2頁面 2 和 3
split.desc.5=文件 #3頁面 4、5 和 6 split.desc.5=文件 #3頁面 4、5、67
split.desc.6=文件 #4頁面 7 split.desc.6=文件 #4頁面 8
split.desc.7=文件 #5頁面 8 split.desc.7=文件 #5頁面 9
split.desc.8=文件 #6頁面 9 和 10 split.desc.8=文件 #6頁面 10
split.splitPages=輸入要分割的頁面: split.splitPages=輸入要分割的頁面:
split.submit=分割 split.submit=分割
@@ -938,6 +941,7 @@ pdfToPDFA.header=PDF 轉 PDF/A
pdfToPDFA.credit=此服務使用 OCRmyPDF 進行 PDF/A 轉換 pdfToPDFA.credit=此服務使用 OCRmyPDF 進行 PDF/A 轉換
pdfToPDFA.submit=轉換 pdfToPDFA.submit=轉換
pdfToPDFA.tip=目前不支援上傳多個 pdfToPDFA.tip=目前不支援上傳多個
pdfToPDFA.outputFormat=Output format
#PDFToWord #PDFToWord
@@ -1021,6 +1025,15 @@ split-by-sections.vertical.placeholder=輸入垂直劃分的數量
split-by-sections.submit=分割 PDF split-by-sections.submit=分割 PDF
split-by-sections.merge=是否合併為一個pdf split-by-sections.merge=是否合併為一個pdf
#printFile
printFile.title=Print File
printFile.header=Print File to Printer
printFile.selectText.1=Select File to Print
printFile.selectText.2=Enter Printer Name
printFile.submit=Print
#licenses #licenses
licenses.nav=許可證 licenses.nav=許可證
licenses.title=第三方許可證 licenses.title=第三方許可證
@@ -1031,15 +1044,15 @@ licenses.license=許可證
# error # error
error.sorry=Sorry for the issue! error.sorry=對於這個問題,我們感到抱歉!
error.needHelp=Need help / Found an issue? error.needHelp=需要幫助/發現了一個問題?
error.contactTip=If you're still having trouble, don't hesitate to reach out to us for help. You can submit a ticket on our GitHub page or contact us through Discord: error.contactTip=如果你仍然遇到問題請不要猶豫隨時向我們尋求幫助。你可以在我們的GitHub頁面提交工單或通過Discord與我們聯繋:
error.404.head=404 - Page Not Found | Oops, we tripped in the code! error.404.head=404 - 找不到頁面 | 哎呀,我們在代碼中走錯了路!
error.404.1=We can't seem to find the page you're looking for. error.404.1=我們好像找不到你正在尋找的頁面。
error.404.2=Something went wrong error.404.2=出了點錯誤
error.github=Submit a ticket on GitHub error.github=GitHub上提交工單
error.showStack=Show Stack Trace error.showStack=顯示堆疊追蹤
error.copyStack=Copy Stack Trace error.copyStack=複製堆疊追蹤
error.githubSubmit=GitHub - Submit a ticket error.githubSubmit=GitHub - 提交工單
error.discordSubmit=Discord - Submit Support post error.discordSubmit=Discord - 提交支援帖子

View File

@@ -12,6 +12,9 @@ system:
defaultLocale: 'en-US' # Set the default language (e.g. 'de-DE', 'fr-FR', etc) defaultLocale: 'en-US' # Set the default language (e.g. 'de-DE', 'fr-FR', etc)
googlevisibility: false # 'true' to allow Google visibility (via robots.txt), 'false' to disallow googlevisibility: false # 'true' to allow Google visibility (via robots.txt), 'false' to disallow
enableAlphaFunctionality: false # Set to enable functionality which might need more testing before it fully goes live (This feature might make no changes) enableAlphaFunctionality: false # Set to enable functionality which might need more testing before it fully goes live (This feature might make no changes)
showUpdate: true # see when a new update is available
showUpdateOnlyAdmin: false # Only admins can see when a new update is available, depending on showUpdate it must be set to 'true'
customHTMLFiles: false # Enable to have files placed in /customFiles/templates override the existing template html files
#ui: #ui:
# appName: exampleAppName # Application's visible name # appName: exampleAppName # Application's visible name

View File

@@ -89,3 +89,38 @@
.jumbotron { .jumbotron {
padding: 3rem 3rem; /* Reduce vertical padding */ padding: 3rem 3rem; /* Reduce vertical padding */
} }
.lookatme {
opacity: 1;
position: relative;
display: inline-block;
}
.lookatme::after {
color: #e33100;
text-shadow: 0 0 5px #e33100;
/* in the html, the data-lookatme-text attribute must */
/* contain the same text as the .lookatme element */
content: attr(data-lookatme-text);
padding: inherit;
position: absolute;
inset: 0 0 0 0;
z-index: 1;
/* 20 steps / 2 seconds = 10fps */
-webkit-animation: 2s infinite Pulse steps(20);
animation: 2s infinite Pulse steps(20);
}
@keyframes Pulse {
from {
opacity: 0;
}
50% {
opacity: 1;
}
to {
opacity: 0;
}
}

View File

@@ -0,0 +1,6 @@
<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-ua" viewBox="0 0 640 480">
<g fill-rule="evenodd" stroke-width="1pt">
<path fill="gold" d="M0 0h640v480H0z"/>
<path fill="#0057b8" d="M0 0h640v240H0z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 232 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M21,10.12H14.22L16.96,7.3C14.23,4.6 9.81,4.5 7.08,7.2C4.35,9.91 4.35,14.28 7.08,17C9.81,19.7 14.23,19.7 16.96,17C18.32,15.65 19,14.08 19,12.1H21C21,14.08 20.12,16.65 18.36,18.39C14.85,21.87 9.15,21.87 5.64,18.39C2.14,14.92 2.11,9.28 5.62,5.81C9.13,2.34 14.76,2.34 18.27,5.81L21,3V10.12M12.5,8V12.25L16,14.33L15.28,15.54L11,13V8H12.5Z" /></svg>

After

Width:  |  Height:  |  Size: 412 B

View File

@@ -0,0 +1,82 @@
document.addEventListener("DOMContentLoaded", function() {
var cacheInputs = localStorage.getItem("cacheInputs") || "disabled";
if (cacheInputs !== "enabled") {
return; // Stop execution if caching is not enabled
}
// Function to generate a key based on the form's action attribute
function generateStorageKey(form) {
const action = form.getAttribute('action');
if (!action || action.length < 3) {
return null; // Not a valid action, return null to skip processing
}
return 'formData_' + encodeURIComponent(action);
}
// Function to save form data to localStorage
function saveFormData(form) {
const formKey = generateStorageKey(form);
if (!formKey) return; // Skip if no valid key
const formData = {};
const elements = form.elements;
for (let i = 0; i < elements.length; i++) {
const element = elements[i];
// Skip elements without names, passwords, files, hidden fields, and submit/reset buttons
if (!element.name ||
element.type === 'password' ||
element.type === 'file' ||
//element.type === 'hidden' ||
element.type === 'submit' ||
element.type === 'reset') {
continue;
}
// Handle checkboxes: store only if checked
if (element.type === 'checkbox') {
if (element.checked) {
formData[element.name] = element.value;
} else {
continue; // Skip unchecked boxes
}
} else {
// Skip saving empty values
if (element.value === "" || element.value == null) {
continue;
}
formData[element.name] = element.value;
}
}
localStorage.setItem(formKey, JSON.stringify(formData));
}
// Function to load form data from localStorage
function loadFormData(form) {
const formKey = generateStorageKey(form);
if (!formKey) return; // Skip if no valid key
const savedData = localStorage.getItem(formKey);
if (savedData) {
const formData = JSON.parse(savedData);
for (const key in formData) {
if (formData.hasOwnProperty(key) && form.elements[key]) {
const element = form.elements[key];
if (element.type === 'checkbox') {
element.checked = true;
} else {
element.value = formData[key];
}
}
}
}
}
// Attach event listeners and load data for all forms
const forms = document.querySelectorAll('form');
forms.forEach(form => {
form.addEventListener('submit', function(event) {
saveFormData(form);
});
loadFormData(form);
});
});

View File

@@ -30,19 +30,39 @@ async function getLatestReleaseVersion() {
async function checkForUpdate() { async function checkForUpdate() {
// Initialize the update button as hidden // Initialize the update button as hidden
var updateBtn = document.getElementById("update-btn"); var updateBtn = document.getElementById("update-btn") || null;
var updateLink = document.getElementById("update-link") || null;
if (updateBtn !== null) { if (updateBtn !== null) {
updateBtn.style.display = "none"; updateBtn.style.display = "none";
} }
if (updateLink !== null) {
console.log("hidden!");
if (!updateLink.classList.contains("visually-hidden")) {
updateLink.classList.add("visually-hidden");
}
}
const latestVersion = await getLatestReleaseVersion(); const latestVersion = await getLatestReleaseVersion();
console.log("latestVersion=" + latestVersion); console.log("latestVersion=" + latestVersion);
console.log("currentVersion=" + currentVersion); console.log("currentVersion=" + currentVersion);
console.log("compareVersions(latestVersion, currentVersion) > 0)=" + compareVersions(latestVersion, currentVersion)); console.log("compareVersions(latestVersion, currentVersion) > 0)=" + compareVersions(latestVersion, currentVersion));
if (latestVersion && compareVersions(latestVersion, currentVersion) > 0) { if (latestVersion && compareVersions(latestVersion, currentVersion) > 0) {
document.getElementById("update-btn").style.display = "block"; if (updateBtn != null) {
document.getElementById("update-btn").style.display = "block";
}
if (updateLink !== null) {
document.getElementById("app-update").innerHTML = updateAvailable.replace("{0}", '<b>' + currentVersion + '</b>').replace("{1}", '<b>' + latestVersion + '</b>');
if (updateLink.classList.contains("visually-hidden")) {
updateLink.classList.remove("visually-hidden");
}
}
console.log("visible"); console.log("visible");
} else { } else {
if (updateLink !== null) {
if (!updateLink.classList.contains("visually-hidden")) {
updateLink.classList.add("visually-hidden");
}
}
console.log("hidden"); console.log("hidden");
} }
} }

View File

@@ -46,6 +46,12 @@ function reorderCards() {
cards.sort(function (a, b) { cards.sort(function (a, b) {
var aIsFavorite = localStorage.getItem(a.id) === "favorite"; var aIsFavorite = localStorage.getItem(a.id) === "favorite";
var bIsFavorite = localStorage.getItem(b.id) === "favorite"; var bIsFavorite = localStorage.getItem(b.id) === "favorite";
if (a.id === "update-link") {
return -1;
}
if (b.id === "update-link") {
return 1;
}
if (aIsFavorite && !bIsFavorite) { if (aIsFavorite && !bIsFavorite) {
return -1; return -1;
} }

View File

@@ -31,3 +31,12 @@ document.getElementById("boredWaiting").addEventListener("change", function () {
boredWaiting = this.checked ? "enabled" : "disabled"; boredWaiting = this.checked ? "enabled" : "disabled";
localStorage.setItem("boredWaiting", boredWaiting); localStorage.setItem("boredWaiting", boredWaiting);
}); });
var cacheInputs = localStorage.getItem("cacheInputs") || "disabled";
document.getElementById("cacheInputs").checked = cacheInputs === "enabled";
document.getElementById("cacheInputs").addEventListener("change", function () {
cacheInputs = this.checked ? "enabled" : "disabled";
localStorage.setItem("cacheInputs", cacheInputs);
});

View File

@@ -17,6 +17,13 @@
<p th:text="#{pdfToPDFA.tip}"></p> <p th:text="#{pdfToPDFA.tip}"></p>
<form method="post" enctype="multipart/form-data" th:action="@{api/v1/convert/pdf/pdfa}"> <form method="post" enctype="multipart/form-data" th:action="@{api/v1/convert/pdf/pdfa}">
<div th:replace="~{fragments/common :: fileSelector(name='fileInput', multiple=false, accept='application/pdf')}"></div> <div th:replace="~{fragments/common :: fileSelector(name='fileInput', multiple=false, accept='application/pdf')}"></div>
<div class="mb-3">
<label th:text="#{pdfToPDFA.outputFormat}"></label>
<select class="form-control" name="outputFormat">
<option value="pdfa-1">PDF/A-1b</option>
<option value="pdfa">PDF/A-2b</option>
</select>
</div>
<br> <br>
<button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{pdfToPDFA.submit}"></button> <button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{pdfToPDFA.submit}"></button>
</form> </form>
@@ -28,4 +35,4 @@
<th:block th:insert="~{fragments/footer.html :: footer}"></th:block> <th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
</div> </div>
</body> </body>
</html> </html>

View File

@@ -19,14 +19,13 @@
<div class="mb-3"> <div class="mb-3">
<label th:text="#{PDFToText.selectText.1}"></label> <label th:text="#{PDFToText.selectText.1}"></label>
<select class="form-control" name="outputFormat"> <select class="form-control" name="outputFormat">
<option value="rtf">RTF</option> <option th:if="${@endpointConfiguration.isEndpointEnabled('pdf-to-rtf')}" value="rtf">RTF</option>
<option value="txt">TXT</option> <option value="txt">TXT</option>
</select> </select>
</div> </div>
<br>
<button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{PDFToText.submit}"></button> <button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{PDFToText.submit}"></button>
</form> </form>
<p class="mt-3" th:text="#{PDFToText.credit}"></p> <p th:if="${@endpointConfiguration.isEndpointEnabled('pdf-to-rtf')}" class="mt-3" th:text="#{PDFToText.credit}"></p>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -60,7 +60,7 @@
<!-- Help Modal --> <!-- Help Modal -->
<link rel="stylesheet" href="css/errorBanner.css"> <link rel="stylesheet" href="css/errorBanner.css">
<script src="js/cacheFormInputs.js"></script>
<script src="js/tab-container.js"></script> <script src="js/tab-container.js"></script>
<script src="js/darkmode.js"></script> <script src="js/darkmode.js"></script>
</th:block> </th:block>

View File

@@ -26,4 +26,5 @@
<a class="dropdown-item lang_dropdown-item" href="" data-bs-language-code="hu_HU"> <img src="images/flags/hu.svg" alt="icon" width="20" height="15"> Hungarian</a> <a class="dropdown-item lang_dropdown-item" href="" data-bs-language-code="hu_HU"> <img src="images/flags/hu.svg" alt="icon" width="20" height="15"> Hungarian</a>
<a class="dropdown-item lang_dropdown-item" href="" data-bs-language-code="hi_IN"> <img src="images/flags/in.svg" alt="icon" width="20" height="15"> हिन्दी</a> <a class="dropdown-item lang_dropdown-item" href="" data-bs-language-code="hi_IN"> <img src="images/flags/in.svg" alt="icon" width="20" height="15"> हिन्दी</a>
<a class="dropdown-item lang_dropdown-item" href="" data-bs-language-code="sr_LATN_RS"> <img src="images/flags/rs.svg" alt="icon" width="20" height="15"> Srpski</a> <a class="dropdown-item lang_dropdown-item" href="" data-bs-language-code="sr_LATN_RS"> <img src="images/flags/rs.svg" alt="icon" width="20" height="15"> Srpski</a>
<a class="dropdown-item lang_dropdown-item" href="" data-bs-language-code="uk_UA"> <img src="images/flags/ua.svg" alt="icon" width="20" height="15"> Українська</a>
</th:block> </th:block>

View File

@@ -3,6 +3,7 @@
<script th:inline="javascript"> <script th:inline="javascript">
const currentVersion = /*[[${@appVersion}]]*/ ''; const currentVersion = /*[[${@appVersion}]]*/ '';
const noFavourites = /*[[#{noFavourites}]]*/ ''; const noFavourites = /*[[#{noFavourites}]]*/ '';
const updateAvailable = /*[[#{settings.updateAvailable}]]*/ '';
</script> </script>
<script th:src="@{js/githubVersion.js}"></script> <script th:src="@{js/githubVersion.js}"></script>
<nav class="navbar navbar-expand-lg navbar-light bg-light"> <nav class="navbar navbar-expand-lg navbar-light bg-light">
@@ -16,20 +17,20 @@
</button> </button>
<div class="collapse navbar-collapse" id="navbarNav"> <div class="collapse navbar-collapse" id="navbarNav">
<ul class="navbar-nav me-auto flex-nowrap"> <ul class="navbar-nav me-auto flex-nowrap">
<li class="nav-item"> <li class="nav-item" th:if="${@endpointConfiguration.isEndpointEnabled('multi-tool')}">
<a class="nav-link" href="#" th:href="@{multi-tool}" th:classappend="${currentPage}=='multi-tool' ? 'active' : ''" th:title="#{home.multiTool.desc}"> <a class="nav-link" href="#" th:href="@{multi-tool}" th:classappend="${currentPage}=='multi-tool' ? 'active' : ''" th:title="#{home.multiTool.desc}">
<img class="icon" src="images/tools.svg" alt="icon"> <img class="icon" src="images/tools.svg" alt="icon">
<span class="icon-text" th:text="#{home.multiTool.title}"></span> <span class="icon-text" th:text="#{home.multiTool.title}"></span>
</a> </a>
</li> </li>
<li class="nav-item nav-item-separator"></li> <li th:if="${@endpointConfiguration.isEndpointEnabled('multi-tool')}" class="nav-item nav-item-separator"></li>
<li class="nav-item"> <li th:if="${@endpointConfiguration.isEndpointEnabled('pipeline')}" class="nav-item">
<a class="nav-link" href="#" th:href="@{pipeline}" th:classappend="${currentPage}=='pipeline' ? 'active' : ''" th:title="#{home.pipeline.desc}"> <a class="nav-link" href="#" th:href="@{pipeline}" th:classappend="${currentPage}=='pipeline' ? 'active' : ''" th:title="#{home.pipeline.desc}">
<img class="icon" src="images/pipeline.svg" alt="icon"> <img class="icon" src="images/pipeline.svg" alt="icon">
<span class="icon-text" th:text="#{home.pipeline.title}"></span> <span class="icon-text" th:text="#{home.pipeline.title}"></span>
</a> </a>
</li> </li>
<li class="nav-item nav-item-separator"></li> <li th:if="${@endpointConfiguration.isEndpointEnabled('pipeline')}" class="nav-item nav-item-separator"></li>
<li class="nav-item dropdown" th:classappend="${currentPage}=='remove-pages' OR ${currentPage}=='merge-pdfs' OR ${currentPage}=='split-pdfs' OR ${currentPage}=='crop' OR ${currentPage}=='adjust-contrast' OR ${currentPage}=='pdf-organizer' OR ${currentPage}=='rotate-pdf' OR ${currentPage}=='multi-page-layout' OR ${currentPage}=='scale-pages' OR ${currentPage}=='auto-split-pdf' OR ${currentPage}=='extract-page' OR ${currentPage}=='pdf-to-single-page' ? 'active' : ''"> <li class="nav-item dropdown" th:classappend="${currentPage}=='remove-pages' OR ${currentPage}=='merge-pdfs' OR ${currentPage}=='split-pdfs' OR ${currentPage}=='crop' OR ${currentPage}=='adjust-contrast' OR ${currentPage}=='pdf-organizer' OR ${currentPage}=='rotate-pdf' OR ${currentPage}=='multi-page-layout' OR ${currentPage}=='scale-pages' OR ${currentPage}=='auto-split-pdf' OR ${currentPage}=='extract-page' OR ${currentPage}=='pdf-to-single-page' ? 'active' : ''">
<a class="nav-link dropdown-toggle" id="navbarDropdown-1" href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <a class="nav-link dropdown-toggle" id="navbarDropdown-1" href="#" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<img class="icon" src="images/file-earmark-pdf.svg" alt="icon"> <img class="icon" src="images/file-earmark-pdf.svg" alt="icon">
@@ -192,9 +193,9 @@
<div class="modal-body"> <div class="modal-body">
<div class="d-flex justify-content-between align-items-center mb-3"> <div class="d-flex justify-content-between align-items-center mb-3">
<p class="mb-0" th:utext="#{settings.appVersion} + ' ' + ${@appVersion}"></p> <p class="mb-0" th:utext="#{settings.appVersion} + ' ' + ${@appVersion}"></p>
<a href="https://github.com/sponsors/Frooodle" class="btn btn-sm btn-outline-primary" role="button" target="_blank">Sponsor Stirling-PDF</a> <a href="https://github.com/sponsors/Frooodle" class="btn btn-sm btn-outline-primary" role="button" target="_blank" th:text="#{sponsor}+' Stirling-PDF'"></a>
<a href="swagger-ui/index.html" class="btn btn-sm btn-outline-primary" role="button" target="_blank">API</a> <a href="swagger-ui/index.html" class="btn btn-sm btn-outline-primary" role="button" target="_blank">API</a>
<a href="https://github.com/Stirling-Tools/Stirling-PDF/releases" class="btn btn-sm btn-outline-primary" id="update-btn" th:utext="#{settings.update}" role="button" target="_blank"></a> <a th:if="${@shouldShow}" href="https://github.com/Stirling-Tools/Stirling-PDF/releases" class="btn btn-sm btn-outline-primary" id="update-btn" th:utext="#{settings.update}" role="button" target="_blank" rel="noopener"></a>
</div> </div>
<div class="mb-3"> <div class="mb-3">
<label for="downloadOption" th:utext="#{settings.downloadOption.title}"></label> <label for="downloadOption" th:utext="#{settings.downloadOption.title}"></label>
@@ -210,13 +211,17 @@
<span id="zipThresholdValue" class="ms-2"></span> <span id="zipThresholdValue" class="ms-2"></span>
</div> </div>
<div class="mb-3 form-check"> <div class="mb-3 form-check">
<input type="checkbox" class="form-check-input" id="boredWaiting"> <input type="checkbox" class="form-check-input" id="boredWaiting" th:title="#{settings.bored.help}">
<label class="form-check-label" for="boredWaiting" th:text="#{bored}"></label> <label class="form-check-label" for="boredWaiting" th:text="#{bored}"></label>
</div> </div>
<a th:if="${@loginEnabled}" href="account" class="btn btn-sm btn-outline-primary" role="button" th:text="#{settings.accountSettings}" target="_blank">Account Settings</a> <div class="mb-3 form-check">
<input type="checkbox" class="form-check-input" id="cacheInputs" th:title="#{settings.cacheInputs.help}">
<label class="form-check-label" for="cacheInputs" th:text="#{settings.cacheInputs.name}"></label>
</div>
<a th:if="${@loginEnabled and @activSecurity}" href="account" class="btn btn-sm btn-outline-primary" role="button" th:text="#{settings.accountSettings}" target="_blank">Account Settings</a>
</div> </div>
<div class="modal-footer"> <div class="modal-footer">
<a th:if="${@loginEnabled}" class="btn btn-danger" role="button" th:text="#{settings.signOut}" href="logout">Sign Out</a> <a th:if="${@loginEnabled and @activSecurity}" class="btn btn-danger" role="button" th:text="#{settings.signOut}" href="logout">Sign Out</a>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal" th:text="#{close}"></button> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal" th:text="#{close}"></button>
</div> </div>
</div> </div>

View File

@@ -23,6 +23,15 @@
<br> <br>
<input type="text" id="searchBar" onkeyup="filterCards()" th:placeholder="#{home.searchBar}" autofocus> <input type="text" id="searchBar" onkeyup="filterCards()" th:placeholder="#{home.searchBar}" autofocus>
<div class="features-container"> <div class="features-container">
<div th:if="${@shouldShow}" class="feature-card favorite" id="update-link" style="display: none;">
<a href="https://github.com/Stirling-Tools/Stirling-PDF/releases" target="_blank" class="nav-link text-body-secondary px-2" rel="noopener">
<div class="d-flex align-items-center">
<img class="card-icon home-card-icon home-card-icon-colour" src="images/update.svg" alt="Icon" width="30" height="30">
<h5 class="card-title lookatme ms-2" th:text="#{settings.update}" th:data-lookatme-text="#{settings.update}"></h5>
</div>
<p class="card-text" id="app-update"></p>
</a>
</div>
<div th:replace="~{fragments/card :: card(id='pipeline', cardTitle=#{home.pipeline.title}, cardText=#{home.pipeline.desc}, cardLink='pipeline', svgPath='images/pipeline.svg', tags=#{pipeline.tags})}"></div> <div th:replace="~{fragments/card :: card(id='pipeline', cardTitle=#{home.pipeline.title}, cardText=#{home.pipeline.desc}, cardLink='pipeline', svgPath='images/pipeline.svg', tags=#{pipeline.tags})}"></div>
<div th:replace="~{fragments/card :: card(id='view-pdf', cardTitle=#{home.viewPdf.title}, cardText=#{home.viewPdf.desc}, cardLink='view-pdf', svgPath='images/book-opened.svg', tags=#{viewPdf.tags})}"></div> <div th:replace="~{fragments/card :: card(id='view-pdf', cardTitle=#{home.viewPdf.title}, cardText=#{home.viewPdf.desc}, cardLink='view-pdf', svgPath='images/book-opened.svg', tags=#{viewPdf.tags})}"></div>

View File

@@ -52,7 +52,7 @@
document.addEventListener('DOMContentLoaded', function() { document.addEventListener('DOMContentLoaded', function() {
const defaultLocale = document.documentElement.getAttribute('language') || 'en_GB'; const defaultLocale = document.documentElement.getAttribute('data-language') || 'en_GB';
const storedLocale = localStorage.getItem('languageCode') || defaultLocale; const storedLocale = localStorage.getItem('languageCode') || defaultLocale;
const currentURL = new URL(window.location.href); const currentURL = new URL(window.location.href);

View File

@@ -0,0 +1,29 @@
<!DOCTYPE html>
<html th:lang="${#locale.language}" th:dir="#{language.direction}" th:data-language="${#locale.toString()}" xmlns:th="http://www.thymeleaf.org">
<head>
<th:block th:insert="~{fragments/common :: head(title=#{fakeScan.title}, header=#{fakeScan.header})}"></th:block>
</head>
<body>
<th:block th:insert="~{fragments/common :: game}"></th:block>
<div id="page-container">
<div id="content-wrap">
<th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
<br><br>
<div class="container">
<div class="row justify-content-center">
<div class="col-md-6">
<h2 th:text="#{fakeScan.header}"></h2>
<form method="post" enctype="multipart/form-data" th:action="@{api/v1/misc/fake-scan}">
<div th:replace="~{fragments/common :: fileSelector(name='fileInput', multiple=false, accept='application/pdf')}"></div>
<br>
<button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{fakeScan.submit}"></button>
</form>
</div>
</div>
</div>
</div>
<th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
</div>
</body>
</html>

View File

@@ -0,0 +1,35 @@
<!DOCTYPE html>
<html th:lang="${#locale.language}" th:dir="#{language.direction}" th:data-language="${#locale.toString()}" xmlns:th="http://www.thymeleaf.org">
<head>
<th:block th:insert="~{fragments/common :: head(title=#{printFile.title}, header=#{printFile.header})}"></th:block>
</head>
<body>
<th:block th:insert="~{fragments/common :: game}"></th:block>
<div id="page-container">
<div id="content-wrap">
<th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
<br><br>
<div class="container">
<div class="row justify-content-center">
<div class="col-md-6">
<h2 th:text="#{printFile.header}"></h2>
<form action="#" th:action="@{api/v1/misc/print-file}" method="post" enctype="multipart/form-data">
<div th:replace="~{fragments/common :: fileSelector(name='fileInput', multiple=false, accept='application/pdf,image/*')}"></div>
<div class="card mb-3">
<div class="card-body">
<h4 th:text="#{printFile.selectText.1}">Select Printer</h4> <!-- Assuming the message code printFile.selectText.3 corresponds to "Select Printer" -->
<label for="printerName" th:text="#{printFile.selectText.2}">Printer Name:</label> <!-- Assuming the message code printFile.selectText.4 corresponds to "Printer Name:" -->
<input type="text" name="printerName" id="printerName" class="form-control">
</div>
</div>
<button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{printFile.submit}"></button>
</form>
</div>
</div>
</div>
</div>
<th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
</div>
</body>
</html>

View File

@@ -78,8 +78,8 @@ main() {
# Building Docker images # Building Docker images
docker build --build-arg VERSION_TAG=alpha -t frooodle/s-pdf:latest -f ./Dockerfile . docker build --no-cache --build-arg VERSION_TAG=alpha -t frooodle/s-pdf:latest -f ./Dockerfile .
docker build --build-arg VERSION_TAG=alpha -t frooodle/s-pdf:latest-ultra-lite -f ./Dockerfile-ultra-lite . docker build --no-cache --build-arg VERSION_TAG=alpha -t frooodle/s-pdf:latest-ultra-lite -f ./Dockerfile-ultra-lite .
# Test each configuration # Test each configuration
run_tests "Stirling-PDF-Ultra-Lite" "./exampleYmlFiles/docker-compose-latest-ultra-lite.yml" run_tests "Stirling-PDF-Ultra-Lite" "./exampleYmlFiles/docker-compose-latest-ultra-lite.yml"
@@ -94,8 +94,8 @@ main() {
# Building Docker images with security enabled # Building Docker images with security enabled
docker build --build-arg VERSION_TAG=alpha -t frooodle/s-pdf:latest -f ./Dockerfile . docker build --no-cache --build-arg VERSION_TAG=alpha -t frooodle/s-pdf:latest -f ./Dockerfile .
docker build --build-arg VERSION_TAG=alpha -t frooodle/s-pdf:latest-ultra-lite -f ./Dockerfile-ultra-lite . docker build --no-cache --build-arg VERSION_TAG=alpha -t frooodle/s-pdf:latest-ultra-lite -f ./Dockerfile-ultra-lite .
# Test each configuration with security # Test each configuration with security
run_tests "Stirling-PDF-Ultra-Lite-Security" "./exampleYmlFiles/docker-compose-latest-ultra-lite-security.yml" run_tests "Stirling-PDF-Ultra-Lite-Security" "./exampleYmlFiles/docker-compose-latest-ultra-lite-security.yml"