Compare commits
57 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4c8f582c56 | ||
|
|
71e93e3cb5 | ||
|
|
6c052a7b25 | ||
|
|
1e0ec8345a | ||
|
|
eddcc11fe4 | ||
|
|
3189d9dda8 | ||
|
|
5185fd13b8 | ||
|
|
a5000fbbc5 | ||
|
|
e74a8e434b | ||
|
|
b702f5772d | ||
|
|
214e23fd93 | ||
|
|
943071ebb7 | ||
|
|
c575ed2036 | ||
|
|
06a178cc03 | ||
|
|
73f90885b4 | ||
|
|
ace4e200b1 | ||
|
|
032388a8e3 | ||
|
|
276b6e521a | ||
|
|
35a4462a86 | ||
|
|
5564f378e5 | ||
|
|
66d5f3e4b5 | ||
|
|
0f367c23aa | ||
|
|
7dd1679588 | ||
|
|
6b186d5d8e | ||
|
|
d53be3aa14 | ||
|
|
3dbfde534e | ||
|
|
9a57842ece | ||
|
|
ec83b9a17d | ||
|
|
59a19b0091 | ||
|
|
471865e4a3 | ||
|
|
3868b4eca2 | ||
|
|
64f8765115 | ||
|
|
3804656218 | ||
|
|
a5d824213c | ||
|
|
160a4e9f8d | ||
|
|
74a0574462 | ||
|
|
1cf23b3542 | ||
|
|
2ef1242cd8 | ||
|
|
54c3bee205 | ||
|
|
a63c0a3625 | ||
|
|
3103a0bffc | ||
|
|
5d71ffbfaa | ||
|
|
c0c137d1b0 | ||
|
|
8625db2885 | ||
|
|
a2a969a0a0 | ||
|
|
8a6386ca73 | ||
|
|
255c018415 | ||
|
|
df27ed6907 | ||
|
|
989491b903 | ||
|
|
664dd62d8b | ||
|
|
3d6b145db5 | ||
|
|
37a63242a6 | ||
|
|
dfb8c64f5a | ||
|
|
27bbf7a513 | ||
|
|
ca890e4b32 | ||
|
|
4834d01223 | ||
|
|
84b3bb1aed |
28
.github/workflows/build.yml
vendored
28
.github/workflows/build.yml
vendored
@@ -2,12 +2,12 @@ name: "Build repo"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ "main" ]
|
||||
branches: ["main"]
|
||||
paths-ignore:
|
||||
- ".github/**"
|
||||
- "**/*.md"
|
||||
pull_request:
|
||||
branches: [ "main" ]
|
||||
branches: ["main"]
|
||||
paths-ignore:
|
||||
- ".github/**"
|
||||
- "**/*.md"
|
||||
@@ -25,16 +25,18 @@ jobs:
|
||||
fail-fast: false
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v3
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v3
|
||||
with:
|
||||
java-version: '17'
|
||||
distribution: 'temurin'
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: "17"
|
||||
distribution: "temurin"
|
||||
|
||||
- uses: gradle/gradle-build-action@v2.4.2
|
||||
with:
|
||||
gradle-version: 7.6
|
||||
arguments: build --no-build-cache
|
||||
- uses: gradle/actions/setup-gradle@v3
|
||||
with:
|
||||
gradle-version: 7.6
|
||||
|
||||
- name: Build with Gradle
|
||||
run: ./gradlew build --no-build-cache
|
||||
|
||||
15
.github/workflows/licenses-update.yml
vendored
15
.github/workflows/licenses-update.yml
vendored
@@ -5,7 +5,7 @@ on:
|
||||
branches:
|
||||
- main
|
||||
paths:
|
||||
- 'build.gradle'
|
||||
- "build.gradle"
|
||||
|
||||
permissions:
|
||||
contents: write
|
||||
@@ -17,13 +17,15 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Check out code
|
||||
uses: actions/checkout@v3
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v3
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: '17'
|
||||
distribution: 'adopt'
|
||||
java-version: "17"
|
||||
distribution: "adopt"
|
||||
|
||||
- uses: gradle/actions/setup-gradle@v3
|
||||
|
||||
- name: Run Gradle Command
|
||||
run: ./gradlew clean generateLicenseReport
|
||||
@@ -44,7 +46,7 @@ jobs:
|
||||
|
||||
- name: Create Pull Request
|
||||
if: env.CHANGES_DETECTED == 'true'
|
||||
uses: peter-evans/create-pull-request@v3
|
||||
uses: peter-evans/create-pull-request@v6
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
commit-message: "Update 3rd Party Licenses"
|
||||
@@ -58,4 +60,3 @@ jobs:
|
||||
[1]: https://github.com/peter-evans/create-pull-request
|
||||
draft: false
|
||||
delete-branch: true
|
||||
|
||||
|
||||
206
.github/workflows/push-docker.yml
vendored
206
.github/workflows/push-docker.yml
vendored
@@ -14,139 +14,99 @@ jobs:
|
||||
push:
|
||||
runs-on: ubuntu-latest
|
||||
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: actions/setup-java@v3.11.0
|
||||
with:
|
||||
java-version: '17'
|
||||
distribution: 'temurin'
|
||||
- uses: gradle/actions/setup-gradle@v3
|
||||
with:
|
||||
gradle-version: 7.6
|
||||
|
||||
- name: Run Gradle Command
|
||||
run: ./gradlew clean build
|
||||
env:
|
||||
DOCKER_ENABLE_SECURITY: false
|
||||
|
||||
- uses: gradle/gradle-build-action@v2.4.2
|
||||
env:
|
||||
DOCKER_ENABLE_SECURITY: false
|
||||
with:
|
||||
gradle-version: 7.6
|
||||
arguments: clean build
|
||||
- name: Set up Docker Buildx
|
||||
id: buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Make Gradle wrapper executable
|
||||
run: chmod +x gradlew
|
||||
- name: Get version number
|
||||
id: versionNumber
|
||||
run: echo "versionNumber=$(./gradlew printVersion --quiet | tail -1)" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Get version number
|
||||
id: versionNumber
|
||||
run: echo "::set-output name=versionNumber::$(./gradlew printVersion --quiet | tail -1)"
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_HUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_HUB_API }}
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v2.1.0
|
||||
with:
|
||||
username: ${{ secrets.DOCKER_HUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKER_HUB_API }}
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ github.token }}
|
||||
|
||||
- name: Login to GitHub Container Registry
|
||||
uses: docker/login-action@v2.1.0
|
||||
with:
|
||||
registry: ghcr.io
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ github.token }}
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v3
|
||||
|
||||
- name: Convert repository owner to lowercase
|
||||
id: repoowner
|
||||
run: echo "::set-output name=lowercase::$(echo ${{ github.repository_owner }} | awk '{print tolower($0)}')"
|
||||
- name: Convert repository owner to lowercase
|
||||
id: repoowner
|
||||
run: echo "lowercase=$(echo ${{ github.repository_owner }} | awk '{print tolower($0)}')" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Generate tags
|
||||
id: meta
|
||||
uses: docker/metadata-action@v4.4.0
|
||||
with:
|
||||
images: |
|
||||
${{ secrets.DOCKER_HUB_USERNAME }}/s-pdf
|
||||
ghcr.io/${{ steps.repoowner.outputs.lowercase }}/s-pdf
|
||||
tags: |
|
||||
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=alpha,enable=${{ github.ref == 'refs/heads/main' }}
|
||||
- name: Generate tags
|
||||
id: meta
|
||||
uses: docker/metadata-action@v5
|
||||
with:
|
||||
images: |
|
||||
${{ secrets.DOCKER_HUB_USERNAME }}/s-pdf
|
||||
ghcr.io/${{ steps.repoowner.outputs.lowercase }}/s-pdf
|
||||
tags: |
|
||||
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=alpha,enable=${{ github.ref == 'refs/heads/main' }}
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v2.1.0
|
||||
- name: Build and push main Dockerfile
|
||||
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
|
||||
uses: docker/setup-buildx-action@v2.5.0
|
||||
- name: Generate tags ultra-lite
|
||||
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
|
||||
uses: docker/build-push-action@v4.0.0
|
||||
with:
|
||||
context: .
|
||||
dockerfile: ./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: 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
|
||||
|
||||
|
||||
|
||||
- name: Generate tags lite
|
||||
id: meta3
|
||||
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 }}-lite,enable=${{ github.ref == 'refs/heads/master' }}
|
||||
type=raw,value=latest-lite,enable=${{ github.ref == 'refs/heads/master' }}
|
||||
|
||||
|
||||
- name: Build and push Dockerfile-lite
|
||||
uses: docker/build-push-action@v4.0.0
|
||||
if: github.ref != 'refs/heads/main'
|
||||
with:
|
||||
context: .
|
||||
file: ./Dockerfile-lite
|
||||
push: true
|
||||
cache-from: type=gha
|
||||
cache-to: type=gha,mode=max
|
||||
tags: ${{ steps.meta3.outputs.tags }}
|
||||
labels: ${{ steps.meta3.outputs.labels }}
|
||||
build-args:
|
||||
VERSION_TAG=${{ steps.versionNumber.outputs.versionNumber }}
|
||||
platforms: linux/amd64,linux/arm64/v8
|
||||
- name: Build and Push Helm Chart
|
||||
run: |
|
||||
helm package chart/stirling-pdf
|
||||
helm push stirling-pdf-chart-1.0.0.tgz oci://registry-1.docker.io/frooodle
|
||||
- name: Build and push Dockerfile-ultra-lite
|
||||
uses: docker/build-push-action@v5
|
||||
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
|
||||
|
||||
84
.github/workflows/releaseArtifacts.yml
vendored
84
.github/workflows/releaseArtifacts.yml
vendored
@@ -1,6 +1,7 @@
|
||||
name: Release Artifacts
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
release:
|
||||
types: [created]
|
||||
permissions:
|
||||
@@ -14,44 +15,61 @@ jobs:
|
||||
enable_security: [true, false]
|
||||
include:
|
||||
- enable_security: true
|
||||
file_suffix: '-with-login'
|
||||
file_suffix: "-with-login"
|
||||
- enable_security: false
|
||||
file_suffix: ''
|
||||
file_suffix: ""
|
||||
steps:
|
||||
- uses: actions/checkout@v3.5.2
|
||||
- uses: actions/checkout@v4
|
||||
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v3.11.0
|
||||
with:
|
||||
java-version: '17'
|
||||
distribution: 'temurin'
|
||||
- name: Set up JDK 17
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: "17"
|
||||
distribution: "temurin"
|
||||
|
||||
- name: Grant execute permission for gradlew
|
||||
run: chmod +x gradlew
|
||||
- uses: gradle/actions/setup-gradle@v3
|
||||
with:
|
||||
gradle-version: 7.6
|
||||
|
||||
- name: Generate jar (With Security=${{ matrix.enable_security }})
|
||||
run: ./gradlew clean createExe
|
||||
env:
|
||||
DOCKER_ENABLE_SECURITY: ${{ matrix.enable_security }}
|
||||
- name: Generate jar (With Security=${{ matrix.enable_security }})
|
||||
run: ./gradlew clean createExe
|
||||
env:
|
||||
DOCKER_ENABLE_SECURITY: ${{ matrix.enable_security }}
|
||||
|
||||
- name: Upload binaries to release
|
||||
uses: svenstaro/upload-release-action@v2
|
||||
with:
|
||||
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
|
||||
id: versionNumber
|
||||
run: echo "versionNumber=$(./gradlew printVersion --quiet | tail -1)" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Get version number
|
||||
id: versionNumber
|
||||
run: echo "::set-output name=versionNumber::$(./gradlew printVersion --quiet | tail -1)"
|
||||
- name: Rename binarie
|
||||
if: matrix.file_suffix != ''
|
||||
run: cp ./build/launch4j/Stirling-PDF.exe ./build/launch4j/Stirling-PDF${{ matrix.file_suffix }}.exe
|
||||
|
||||
- name: Upload jar binaries to release
|
||||
uses: svenstaro/upload-release-action@v2
|
||||
with:
|
||||
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
file: ./build/libs/Stirling-PDF-${{ steps.versionNumber.outputs.versionNumber }}.jar
|
||||
asset_name: Stirling-PDF${{ matrix.file_suffix }}.jar
|
||||
tag: ${{ github.ref }}
|
||||
overwrite: true
|
||||
- name: Upload Assets binarie
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
path: ./build/launch4j/Stirling-PDF${{ matrix.file_suffix }}.exe
|
||||
name: Stirling-PDF${{ matrix.file_suffix }}.exe
|
||||
overwrite: true
|
||||
retention-days: 1
|
||||
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
|
||||
|
||||
41
.github/workflows/swagger.yml
vendored
41
.github/workflows/swagger.yml
vendored
@@ -8,31 +8,32 @@ on:
|
||||
|
||||
jobs:
|
||||
push:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
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: actions/setup-java@v3.11.0
|
||||
with:
|
||||
java-version: '17'
|
||||
distribution: 'temurin'
|
||||
- uses: gradle/actions/setup-gradle@v3
|
||||
|
||||
- name: Grant execute permission for gradlew
|
||||
run: chmod +x gradlew
|
||||
- name: Generate Swagger documentation
|
||||
run: ./gradlew generateOpenApiDocs
|
||||
|
||||
- name: Generate Swagger documentation
|
||||
run: ./gradlew generateOpenApiDocs
|
||||
- name: Upload Swagger Documentation to SwaggerHub
|
||||
run: ./gradlew swaggerhubUpload
|
||||
env:
|
||||
SWAGGERHUB_API_KEY: ${{ secrets.SWAGGERHUB_API_KEY }}
|
||||
|
||||
- name: Upload Swagger Documentation to SwaggerHub
|
||||
run: ./gradlew swaggerhubUpload
|
||||
env:
|
||||
SWAGGERHUB_API_KEY: ${{ secrets.SWAGGERHUB_API_KEY }}
|
||||
- name: Get version number
|
||||
id: versionNumber
|
||||
run: echo "versionNumber=$(./gradlew printVersion --quiet | tail -1)" >> $GITHUB_OUTPUT
|
||||
|
||||
- name: Set API version as published and default on SwaggerHub
|
||||
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}"
|
||||
env:
|
||||
SWAGGERHUB_API_KEY: ${{ secrets.SWAGGERHUB_API_KEY }}
|
||||
- name: Set API version as published and default on SwaggerHub
|
||||
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}"
|
||||
env:
|
||||
SWAGGERHUB_API_KEY: ${{ secrets.SWAGGERHUB_API_KEY }}
|
||||
|
||||
87
.github/workflows/sync_files.yml
vendored
Normal file
87
.github/workflows/sync_files.yml
vendored
Normal 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
|
||||
51
.github/workflows/sync_versions.yml
vendored
51
.github/workflows/sync_versions.yml
vendored
@@ -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
|
||||
64
.github/workflows/test.yml
vendored
64
.github/workflows/test.yml
vendored
@@ -3,54 +3,36 @@ name: Docker Compose Tests
|
||||
on:
|
||||
pull_request:
|
||||
paths:
|
||||
- 'src/**'
|
||||
- '**.gradle'
|
||||
- '!src/main/java/resources/messages*'
|
||||
- 'exampleYmlFiles/**'
|
||||
- 'Dockerfile'
|
||||
- 'Dockerfile**'
|
||||
- "src/**"
|
||||
- "**.gradle"
|
||||
- "!src/main/java/resources/messages*"
|
||||
- "exampleYmlFiles/**"
|
||||
- "Dockerfile"
|
||||
- "Dockerfile**"
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v2
|
||||
- name: Checkout Repository
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Set up Java 17
|
||||
uses: actions/setup-java@v2
|
||||
with:
|
||||
java-version: '17'
|
||||
distribution: 'adopt'
|
||||
- name: Set up Java 17
|
||||
uses: actions/setup-java@v4
|
||||
with:
|
||||
java-version: "17"
|
||||
distribution: "adopt"
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v1
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Run Docker Compose Tests
|
||||
run: |
|
||||
chmod +x ./gradlew
|
||||
- name: Install Docker Compose
|
||||
run: |
|
||||
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
|
||||
id: versionNumber
|
||||
run: echo "::set-output name=versionNumber::$(./gradlew printVersion --quiet | tail -1)"
|
||||
|
||||
|
||||
- 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
|
||||
- name: Run Docker Compose Tests
|
||||
run: |
|
||||
chmod +x ./test.sh
|
||||
./test.sh
|
||||
|
||||
11
Dockerfile
11
Dockerfile
@@ -1,5 +1,5 @@
|
||||
# Main stage
|
||||
FROM alpine:3.19.1
|
||||
FROM alpine:20240329
|
||||
|
||||
# Copy necessary files
|
||||
COPY scripts /scripts
|
||||
@@ -25,10 +25,13 @@ ENV DOCKER_ENABLE_SECURITY=false \
|
||||
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/testing" | tee -a /etc/apk/repositories && \
|
||||
apk update && \
|
||||
apk add --no-cache \
|
||||
ca-certificates \
|
||||
tzdata \
|
||||
tini \
|
||||
openssl \
|
||||
openssl-dev \
|
||||
bash \
|
||||
curl \
|
||||
openjdk17-jre \
|
||||
@@ -36,6 +39,8 @@ RUN echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /et
|
||||
shadow \
|
||||
# Doc conversion
|
||||
libreoffice@testing \
|
||||
# pdftohtml
|
||||
poppler-utils \
|
||||
# OCR MY PDF (unpaper for descew and other advanced featues)
|
||||
ocrmypdf \
|
||||
tesseract-ocr-data-eng \
|
||||
@@ -54,7 +59,9 @@ RUN echo "@testing https://dl-cdn.alpinelinux.org/alpine/edge/main" | tee -a /et
|
||||
# User permissions
|
||||
addgroup -S stirlingpdfgroup && adduser -S stirlingpdfuser -G stirlingpdfgroup && \
|
||||
chown -R stirlingpdfuser:stirlingpdfgroup $HOME /scripts /usr/share/fonts/opentype/noto /configs /customFiles /pipeline && \
|
||||
chown stirlingpdfuser:stirlingpdfgroup /app.jar
|
||||
chown stirlingpdfuser:stirlingpdfgroup /app.jar && \
|
||||
tesseract --list-langs && \
|
||||
rm -rf /var/cache/apk/*
|
||||
|
||||
EXPOSE 8080
|
||||
|
||||
|
||||
@@ -1,63 +0,0 @@
|
||||
# use alpine
|
||||
FROM alpine:3.19.1
|
||||
|
||||
ARG VERSION_TAG
|
||||
|
||||
# Set Environment Variables
|
||||
ENV DOCKER_ENABLE_SECURITY=false \
|
||||
HOME=/home/stirlingpdfuser \
|
||||
VERSION_TAG=$VERSION_TAG \
|
||||
JAVA_TOOL_OPTIONS="$JAVA_TOOL_OPTIONS -XX:MaxRAMPercentage=75" \
|
||||
PUID=1000 \
|
||||
PGID=1000 \
|
||||
UMASK=022
|
||||
|
||||
# Copy necessary files
|
||||
COPY scripts/download-security-jar.sh /scripts/download-security-jar.sh
|
||||
COPY scripts/init-without-ocr.sh /scripts/init-without-ocr.sh
|
||||
COPY pipeline /pipeline
|
||||
COPY src/main/resources/static/fonts/*.ttf /usr/share/fonts/opentype/noto
|
||||
COPY src/main/resources/static/fonts/*.otf /usr/share/fonts/opentype/noto
|
||||
COPY build/libs/*.jar app.jar
|
||||
|
||||
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/testing" | tee -a /etc/apk/repositories && \
|
||||
apk add --no-cache \
|
||||
ca-certificates \
|
||||
tzdata \
|
||||
tini \
|
||||
bash \
|
||||
curl \
|
||||
gcc \
|
||||
openjdk17-jre \
|
||||
su-exec \
|
||||
shadow \
|
||||
# Doc conversion
|
||||
libreoffice@testing \
|
||||
# python and pip
|
||||
python3 && \
|
||||
wget https://bootstrap.pypa.io/get-pip.py -qO - | python3 - --break-system-packages --no-cache-dir --upgrade && \
|
||||
# uno unoconv and HTML
|
||||
pip install --break-system-packages --no-cache-dir --upgrade unoconv WeasyPrint && \
|
||||
# Set up necessary directories and permissions
|
||||
mkdir -p /configs /logs /customFiles /pipeline/watchedFolders /pipeline/finishedFolders && \
|
||||
# Set font cache and permissions
|
||||
fc-cache -f -v && \
|
||||
chmod +x /scripts/*.sh && \
|
||||
# User permissions
|
||||
addgroup -S stirlingpdfgroup && adduser -S stirlingpdfuser -G stirlingpdfgroup && \
|
||||
chown -R stirlingpdfuser:stirlingpdfgroup $HOME /scripts /usr/share/fonts/opentype/noto /configs /customFiles /pipeline && \
|
||||
chown stirlingpdfuser:stirlingpdfgroup /app.jar
|
||||
|
||||
|
||||
# Set environment variables
|
||||
ENV ENDPOINTS_GROUPS_TO_REMOVE=OpenCV,OCRmyPDF
|
||||
ENV DOCKER_ENABLE_SECURITY=false
|
||||
|
||||
EXPOSE 8080
|
||||
|
||||
# Run the application
|
||||
|
||||
ENTRYPOINT ["tini", "--", "/scripts/init-without-ocr.sh"]
|
||||
CMD ["java", "-Dfile.encoding=UTF-8", "-jar", "/app.jar"]
|
||||
@@ -95,7 +95,7 @@ For Debian-based systems, you can use the following command:
|
||||
|
||||
```bash
|
||||
sudo apt-get install -y libreoffice-writer libreoffice-calc libreoffice-impress unpaper ocrmypdf
|
||||
pip3 install uno opencv-python-headless unoconv pngquant WeasyPrint
|
||||
pip3 install uno opencv-python-headless unoconv pngquant WeasyPrint --break-system-packages
|
||||
```
|
||||
|
||||
For Fedora:
|
||||
|
||||
106
README.md
106
README.md
@@ -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>
|
||||
<p align="center"><img src="https://raw.githubusercontent.com/Stirling-Tools/Stirling-PDF/main/docs/stirling.png" width="80" ></p>
|
||||
<h1 align="center">Stirling-PDF</h1>
|
||||
|
||||
[](https://hub.docker.com/r/frooodle/s-pdf)
|
||||
[](https://discord.gg/Cn8pWhQRxZ)
|
||||
@@ -10,25 +10,26 @@
|
||||
|
||||
[](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.
|
||||
|
||||

|
||||

|
||||
|
||||
## Features
|
||||
|
||||
- Dark mode support.
|
||||
- Custom download options (see [here](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/images/settings.png) for example)
|
||||
- Parallel file processing and downloads
|
||||
- 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)
|
||||
|
||||
|
||||
## **PDF Features**
|
||||
|
||||
### **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)
|
||||
- Full interactive GUI for merging/splitting/rotating/moving PDFs and their pages.
|
||||
- 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.
|
||||
|
||||
### **Conversion Operations**
|
||||
|
||||
- Convert PDFs to and from images.
|
||||
- Convert any common file to PDF (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.
|
||||
|
||||
### **Security & Permissions**
|
||||
|
||||
- Add and remove passwords.
|
||||
- Change/set PDF Permissions.
|
||||
- Add watermark(s).
|
||||
@@ -61,6 +64,7 @@ All files and PDFs exist either exclusively on the client side, reside in server
|
||||
- Auto-redact text.
|
||||
|
||||
### **Other Operations**
|
||||
|
||||
- Add/Generate/Write signatures.
|
||||
- Repair PDFs.
|
||||
- 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.
|
||||
- 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)
|
||||
Demo of the app is available [here](https://stirlingpdf.io). username: demo, password: demo
|
||||
|
||||
## Technologies used
|
||||
|
||||
- Spring Boot + Thymeleaf
|
||||
- [PDFBox](https://github.com/apache/pdfbox/tree/trunk)
|
||||
- [LibreOffice](https://www.libreoffice.org/discover/libreoffice/) for advanced conversions
|
||||
@@ -94,19 +98,21 @@ Demo of the app is available [here](https://stirlingpdf.io). username: demo, pas
|
||||
## How to use
|
||||
|
||||
### Locally
|
||||
|
||||
Please view https://github.com/Stirling-Tools/Stirling-PDF/blob/main/LocalRunGuide.md
|
||||
|
||||
### Docker / Podman
|
||||
|
||||
https://hub.docker.com/r/frooodle/s-pdf
|
||||
|
||||
Stirling PDF has 3 different versions, a Full version, Lite, and ultra-Lite. 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.
|
||||
To see what the different versions offer please look at our [version mapping](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/Version-groups.md)
|
||||
For people that don't mind about space optimization just use the latest tag.
|
||||

|
||||

|
||||

|
||||
|
||||
Docker Run
|
||||
|
||||
```bash
|
||||
docker run -d \
|
||||
-p 8080:8080 \
|
||||
@@ -115,6 +121,7 @@ docker run -d \
|
||||
-v /location/of/logs:/logs \
|
||||
-e DOCKER_ENABLE_SECURITY=false \
|
||||
-e INSTALL_BOOK_AND_ADVANCED_HTML_OPS=false \
|
||||
-e LANGS=en_GB \
|
||||
--name stirling-pdf \
|
||||
frooodle/s-pdf:latest
|
||||
|
||||
@@ -123,7 +130,9 @@ docker run -d \
|
||||
|
||||
-v /location/of/customFiles:/customFiles \
|
||||
```
|
||||
|
||||
Docker Compose
|
||||
|
||||
```yaml
|
||||
version: '3.3'
|
||||
services:
|
||||
@@ -139,59 +148,67 @@ services:
|
||||
environment:
|
||||
- DOCKER_ENABLE_SECURITY=false
|
||||
- INSTALL_BOOK_AND_ADVANCED_HTML_OPS=false
|
||||
- LANGS=en_GB
|
||||
```
|
||||
|
||||
Note: Podman is CLI-compatible with Docker, so simply replace "docker" with "podman".
|
||||
|
||||
## Enable OCR/Compression feature
|
||||
|
||||
Please view https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToUseOCR.md
|
||||
|
||||
## Supported Languages
|
||||
|
||||
Stirling PDF currently supports 26!
|
||||
- English (English) (en_GB)
|
||||
- English (US) (en_US)
|
||||
- Arabic (العربية) (ar_AR)
|
||||
- German (Deutsch) (de_DE)
|
||||
- French (Français) (fr_FR)
|
||||
- Spanish (Español) (es_ES)
|
||||
- Simplified Chinese (简体中文) (zh_CN)
|
||||
- Traditional Chinese (繁體中文) (zh_TW)
|
||||
- Catalan (Català) (ca_CA)
|
||||
- Italian (Italiano) (it_IT)
|
||||
- Swedish (Svenska) (sv_SE)
|
||||
- Polish (Polski) (pl_PL)
|
||||
- Romanian (Română) (ro_RO)
|
||||
- Korean (한국어) (ko_KR)
|
||||
- Portuguese Brazilian (Português) (pt_BR)
|
||||
- Russian (Русский) (ru_RU)
|
||||
- Basque (Euskara) (eu_ES)
|
||||
- Japanese (日本語) (ja_JP)
|
||||
- Dutch (Nederlands) (nl_NL)
|
||||
- Greek (el_GR)
|
||||
- Turkish (Türkçe) (tr_TR)
|
||||
- Indonesia (Bahasa Indonesia) (id_ID)
|
||||
- Hindi (हिंदी) (hi_IN)
|
||||
- Hungarian (Magyar) (hu_HU)
|
||||
- Bulgarian (Български) (bg_BG)
|
||||
- Sebian Latin alphabet (Srpski) (sr_LATN_RS)
|
||||
Stirling PDF currently supports 27!
|
||||
|
||||
| Language | Progress |
|
||||
| ------------------------------------------- | -------------------------------------- |
|
||||
| English (English) (en_GB) |  |
|
||||
| English (US) (en_US) |  |
|
||||
| Arabic (العربية) (ar_AR) |  |
|
||||
| German (Deutsch) (de_DE) |  |
|
||||
| French (Français) (fr_FR) |  |
|
||||
| Spanish (Español) (es_ES) |  |
|
||||
| Simplified Chinese (简体中文) (zh_CN) |  |
|
||||
| Traditional Chinese (繁體中文) (zh_TW) |  |
|
||||
| Catalan (Català) (ca_CA) |  |
|
||||
| Italian (Italiano) (it_IT) |  |
|
||||
| Swedish (Svenska) (sv_SE) |  |
|
||||
| Polish (Polski) (pl_PL) |  |
|
||||
| Romanian (Română) (ro_RO) |  |
|
||||
| Korean (한국어) (ko_KR) |  |
|
||||
| Portuguese Brazilian (Português) (pt_BR) |  |
|
||||
| Russian (Русский) (ru_RU) |  |
|
||||
| Basque (Euskara) (eu_ES) |  |
|
||||
| Japanese (日本語) (ja_JP) |  |
|
||||
| Dutch (Nederlands) (nl_NL) |  |
|
||||
| Greek (Ελληνικά) (el_GR) |  |
|
||||
| Turkish (Türkçe) (tr_TR) |  |
|
||||
| Indonesia (Bahasa Indonesia) (id_ID) |  |
|
||||
| Hindi (हिंदी) (hi_IN) |  |
|
||||
| Hungarian (Magyar) (hu_HU) |  |
|
||||
| Bulgarian (Български) (bg_BG) |  |
|
||||
| Sebian Latin alphabet (Srpski) (sr_LATN_RS) |  |
|
||||
| Ukrainian (Українська) (uk_UA) |  |
|
||||
|
||||
## Contributing (creating issues, translations, fixing bugs, etc.)
|
||||
|
||||
Please see our [Contributing Guide](CONTRIBUTING.md)!
|
||||
|
||||
## Customisation
|
||||
|
||||
Stirling PDF allows easy customization of the app.
|
||||
Includes things like
|
||||
|
||||
- Custom application name
|
||||
- Custom slogans, icons, images, and even custom HTML (via file overrides)
|
||||
|
||||
|
||||
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
|
||||
|
||||
Environment variables are also supported and would override the settings file
|
||||
For example in the settings.yml you have
|
||||
|
||||
```yaml
|
||||
system:
|
||||
defaultLocale: 'en-US'
|
||||
@@ -200,6 +217,7 @@ system:
|
||||
To have this via an environment variable you would have ``SYSTEM_DEFAULTLOCALE``
|
||||
|
||||
The Current list of settings is
|
||||
|
||||
```yaml
|
||||
security:
|
||||
enableLogin: false # set to 'true' to enable login
|
||||
@@ -209,6 +227,8 @@ system:
|
||||
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
|
||||
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'
|
||||
|
||||
#ui:
|
||||
# appName: exampleAppName # Application's visible name
|
||||
@@ -222,24 +242,31 @@ endpoints:
|
||||
metrics:
|
||||
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
|
||||
|
||||
- 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
|
||||
|
||||
### Environment only parameters
|
||||
|
||||
- ``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
|
||||
- ``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
|
||||
- ``LANGS`` to define custom font libraries to install for use for document conversions
|
||||
|
||||
## 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
|
||||
[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
|
||||
|
||||

|
||||
|
||||
### Prerequisites:
|
||||
|
||||
- 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.
|
||||
- Then either enable login via the settings.yml file or via setting ``SECURITY_ENABLE_LOGIN`` to ``true``
|
||||
@@ -258,6 +285,7 @@ For API usage you must provide a header with 'X-API-Key' and the associated API
|
||||
## FAQ
|
||||
|
||||
### Q1: What are your planned features?
|
||||
|
||||
- Progress bar/Tracking
|
||||
- Full custom logic pipelines to combine multiple operations together.
|
||||
- Folder support with auto scanning to perform operations on
|
||||
@@ -267,7 +295,9 @@ For API usage you must provide a header with 'X-API-Key' and the associated API
|
||||
- Fill forms manually or automatically
|
||||
|
||||
### 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.
|
||||
|
||||
### 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;``
|
||||
|
||||
@@ -1,64 +1,52 @@
|
||||
|Technology | Ultra-Lite | Lite | Full |
|
||||
|----------------|:----------:|:----:|:----:|
|
||||
| Java | ✔️ | ✔️ | ✔️ |
|
||||
| JavaScript | ✔️ | ✔️ | ✔️ |
|
||||
| Libre | | ✔️ | ✔️ |
|
||||
| Python | | | ✔️ |
|
||||
| OpenCV | | | ✔️ |
|
||||
| OCRmyPDF | | | ✔️ |
|
||||
| Technology | Ultra-Lite | Full |
|
||||
|----------------|:----------:|:----:|
|
||||
| Java | ✔️ | ✔️ |
|
||||
| JavaScript | ✔️ | ✔️ |
|
||||
| Libre | | ✔️ |
|
||||
| Python | | ✔️ |
|
||||
| OpenCV | | ✔️ |
|
||||
| OCRmyPDF | | ✔️ |
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Operation | Ultra-Lite | Lite | Full
|
||||
--------------------|------------|------|-----
|
||||
add-page-numbers | ✔️ | ✔️ | ✔️
|
||||
add-password | ✔️ | ✔️ | ✔️
|
||||
add-image | ✔️ | ✔️ | ✔️
|
||||
add-watermark | ✔️ | ✔️ | ✔️
|
||||
adjust-contrast | ✔️ | ✔️ | ✔️
|
||||
auto-split-pdf | ✔️ | ✔️ | ✔️
|
||||
auto-redact | ✔️ | ✔️ | ✔️
|
||||
auto-rename | ✔️ | ✔️ | ✔️
|
||||
cert-sign | ✔️ | ✔️ | ✔️
|
||||
crop | ✔️ | ✔️ | ✔️
|
||||
change-metadata | ✔️ | ✔️ | ✔️
|
||||
change-permissions | ✔️ | ✔️ | ✔️
|
||||
compare | ✔️ | ✔️ | ✔️
|
||||
extract-page | ✔️ | ✔️ | ✔️
|
||||
extract-images | ✔️ | ✔️ | ✔️
|
||||
flatten | ✔️ | ✔️ | ✔️
|
||||
get-info-on-pdf | ✔️ | ✔️ | ✔️
|
||||
img-to-pdf | ✔️ | ✔️ | ✔️
|
||||
markdown-to-pdf | ✔️ | ✔️ | ✔️
|
||||
merge-pdfs | ✔️ | ✔️ | ✔️
|
||||
multi-page-layout | ✔️ | ✔️ | ✔️
|
||||
overlay-pdf | ✔️ | ✔️ | ✔️
|
||||
pdf-organizer | ✔️ | ✔️ | ✔️
|
||||
pdf-to-csv | ✔️ | ✔️ | ✔️
|
||||
pdf-to-img | ✔️ | ✔️ | ✔️
|
||||
pdf-to-single-page | ✔️ | ✔️ | ✔️
|
||||
remove-pages | ✔️ | ✔️ | ✔️
|
||||
remove-password | ✔️ | ✔️ | ✔️
|
||||
rotate-pdf | ✔️ | ✔️ | ✔️
|
||||
sanitize-pdf | ✔️ | ✔️ | ✔️
|
||||
scale-pages | ✔️ | ✔️ | ✔️
|
||||
sign | ✔️ | ✔️ | ✔️
|
||||
show-javascript | ✔️ | ✔️ | ✔️
|
||||
split-by-size-or-count | ✔️ | ✔️ | ✔️
|
||||
split-pdf-by-sections | ✔️ | ✔️ | ✔️
|
||||
split-pdfs | ✔️ | ✔️ | ✔️
|
||||
file-to-pdf | | ✔️ | ✔️
|
||||
pdf-to-html | | ✔️ | ✔️
|
||||
pdf-to-presentation | | ✔️ | ✔️
|
||||
pdf-to-text | | ✔️ | ✔️
|
||||
pdf-to-word | | ✔️ | ✔️
|
||||
pdf-to-xml | | ✔️ | ✔️
|
||||
repair | | ✔️ | ✔️
|
||||
xlsx-to-pdf | | ✔️ | ✔️
|
||||
compress-pdf | | | ✔️
|
||||
extract-image-scans | | | ✔️
|
||||
ocr-pdf | | | ✔️
|
||||
pdf-to-pdfa | | | ✔️
|
||||
remove-blanks | | | ✔️
|
||||
Operation | Ultra-Lite | Full
|
||||
-------------------------|------------|-----
|
||||
add-page-numbers | ✔️ | ✔️
|
||||
add-password | ✔️ | ✔️
|
||||
add-image | ✔️ | ✔️
|
||||
add-watermark | ✔️ | ✔️
|
||||
adjust-contrast | ✔️ | ✔️
|
||||
auto-split-pdf | ✔️ | ✔️
|
||||
auto-redact | ✔️ | ✔️
|
||||
auto-rename | ✔️ | ✔️
|
||||
cert-sign | ✔️ | ✔️
|
||||
crop | ✔️ | ✔️
|
||||
change-metadata | ✔️ | ✔️
|
||||
change-permissions | ✔️ | ✔️
|
||||
compare | ✔️ | ✔️
|
||||
extract-page | ✔️ | ✔️
|
||||
extract-images | ✔️ | ✔️
|
||||
flatten | ✔️ | ✔️
|
||||
get-info-on-pdf | ✔️ | ✔️
|
||||
img-to-pdf | ✔️ | ✔️
|
||||
markdown-to-pdf | ✔️ | ✔️
|
||||
merge-pdfs | ✔️ | ✔️
|
||||
multi-page-layout | ✔️ | ✔️
|
||||
overlay-pdf | ✔️ | ✔️
|
||||
pdf-organizer | ✔️ | ✔️
|
||||
pdf-to-csv | ✔️ | ✔️
|
||||
pdf-to-img | ✔️ | ✔️
|
||||
pdf-to-single-page | ✔️ | ✔️
|
||||
remove-pages | ✔️ | ✔️
|
||||
remove-password | ✔️ | ✔️
|
||||
rotate-pdf | ✔️ | ✔️
|
||||
sanitize-pdf | ✔️ | ✔️
|
||||
scale-pages | ✔️ | ✔️
|
||||
sign | ✔️ | ✔️
|
||||
show-javascript | ✔️ | ✔️
|
||||
split-by-size-or-count | ✔️ | ✔️
|
||||
split-pdf-by-sections | ✔️ | ✔️
|
||||
split-pdfs | ✔️ | ✔️
|
||||
compress-pdf | | ✔️
|
||||
extract-image-scans | | ✔️
|
||||
ocr-pdf | | ✔️
|
||||
pdf-to-pdfa | | ✔️
|
||||
remove-blanks | | ✔️
|
||||
|
||||
@@ -12,7 +12,7 @@ plugins {
|
||||
import com.github.jk1.license.render.*
|
||||
|
||||
group = 'stirling.software'
|
||||
version = '0.22.5'
|
||||
version = '0.23.0'
|
||||
sourceCompatibility = '17'
|
||||
|
||||
repositories {
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
apiVersion: v2
|
||||
appVersion: 0.22.5
|
||||
appVersion: 0.23.0
|
||||
description: locally hosted web application that allows you to perform various operations
|
||||
on PDF files
|
||||
home: https://github.com/Stirling-Tools/Stirling-PDF
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
version: '3.3'
|
||||
services:
|
||||
stirling-pdf:
|
||||
container_name: Stirling-PDF-Lite-Security
|
||||
image: frooodle/s-pdf:latest-lite
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 2G
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "curl -f http://localhost:8080/api/v1/info/status | grep -q 'UP' && curl -fL http://localhost:8080/ | grep -q 'Please sign in'"]
|
||||
interval: 5s
|
||||
timeout: 10s
|
||||
retries: 16
|
||||
ports:
|
||||
- 8080:8080
|
||||
volumes:
|
||||
- /stirling/latest/data:/usr/share/tessdata:rw
|
||||
- /stirling/latest/config:/configs:rw
|
||||
- /stirling/latest/logs:/logs:rw
|
||||
environment:
|
||||
DOCKER_ENABLE_SECURITY: "true"
|
||||
SECURITY_ENABLELOGIN: "true"
|
||||
SYSTEM_DEFAULTLOCALE: en-US
|
||||
UI_APPNAME: Stirling-PDF-Lite
|
||||
UI_HOMEDESCRIPTION: Demo site for Stirling-PDF-Lite Latest with Security
|
||||
UI_APPNAMENAVBAR: Stirling-PDF-Lite Latest
|
||||
SYSTEM_MAXFILESIZE: "100"
|
||||
METRICS_ENABLED: "true"
|
||||
SYSTEM_GOOGLEVISIBILITY: "true"
|
||||
restart: on-failure:5
|
||||
@@ -1,30 +0,0 @@
|
||||
version: '3.3'
|
||||
services:
|
||||
stirling-pdf:
|
||||
container_name: Stirling-PDF-Lite
|
||||
image: frooodle/s-pdf:latest-lite
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 2G
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "curl -f http://localhost:8080/api/v1/info/status | grep -q 'UP' && curl -fL http://localhost:8080/ | grep -qv 'Please sign in'"]
|
||||
interval: 5s
|
||||
timeout: 10s
|
||||
retries: 16
|
||||
ports:
|
||||
- 8080:8080
|
||||
volumes:
|
||||
- /stirling/latest/config:/configs:rw
|
||||
- /stirling/latest/logs:/logs:rw
|
||||
environment:
|
||||
DOCKER_ENABLE_SECURITY: "false"
|
||||
SECURITY_ENABLELOGIN: "false"
|
||||
SYSTEM_DEFAULTLOCALE: en-US
|
||||
UI_APPNAME: Stirling-PDF-Lite
|
||||
UI_HOMEDESCRIPTION: Demo site for Stirling-PDF-Lite Latest
|
||||
UI_APPNAMENAVBAR: Stirling-PDF-Lite Latest
|
||||
SYSTEM_MAXFILESIZE: "100"
|
||||
METRICS_ENABLED: "true"
|
||||
SYSTEM_GOOGLEVISIBILITY: "true"
|
||||
restart: on-failure:5
|
||||
@@ -21,6 +21,8 @@ services:
|
||||
environment:
|
||||
DOCKER_ENABLE_SECURITY: "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
|
||||
UI_APPNAME: Stirling-PDF
|
||||
UI_HOMEDESCRIPTION: Demo site for Stirling-PDF Latest
|
||||
|
||||
BIN
images/stirling-home.jpg
Normal file
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 |
122
scripts/counter_translation.py
Normal file
122
scripts/counter_translation.py
Normal 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"",
|
||||
)
|
||||
|
||||
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))
|
||||
@@ -1,26 +1,31 @@
|
||||
#!/bin/sh
|
||||
#!/bin/bash
|
||||
|
||||
# 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
|
||||
|
||||
|
||||
if [[ "$INSTALL_BOOK_AND_ADVANCED_HTML_OPS" == "true" ]]; then
|
||||
apk add --no-cache calibre@testing
|
||||
fi
|
||||
|
||||
/scripts/download-security-jar.sh
|
||||
|
||||
if [[ -n "$LANGS" ]]; then
|
||||
/scripts/installFonts.sh $LANGS
|
||||
fi
|
||||
|
||||
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
|
||||
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
|
||||
# Attempt to change ownership of directories and files
|
||||
if chown -R stirlingpdfuser:stirlingpdfgroup $HOME /logs /scripts /usr/share/fonts/opentype/noto /configs /customFiles /pipeline /app.jar; then
|
||||
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 "$@"
|
||||
else
|
||||
# If chown fails, execute the command without changing the user context
|
||||
|
||||
@@ -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;
|
||||
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
|
||||
if [[ -n "$TESSERACT_LANGS" ]]; then
|
||||
# Convert comma-separated values to a space-separated list
|
||||
@@ -40,20 +28,4 @@ if [[ -n "$TESSERACT_LANGS" ]]; then
|
||||
done
|
||||
fi
|
||||
|
||||
if [[ "$INSTALL_BOOK_AND_ADVANCED_HTML_OPS" == "true" ]]; then
|
||||
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
|
||||
/scripts/init-without-ocr.sh "$@"
|
||||
67
scripts/installFonts.sh
Normal file
67
scripts/installFonts.sh
Normal 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
|
||||
@@ -62,6 +62,7 @@ public class SPdfApplication {
|
||||
}
|
||||
|
||||
public static void main(String[] args) throws IOException, InterruptedException {
|
||||
|
||||
SpringApplication app = new SpringApplication(SPdfApplication.class);
|
||||
app.addInitializers(new ConfigInitializer());
|
||||
if (Files.exists(Paths.get("configs/settings.yml"))) {
|
||||
|
||||
@@ -6,6 +6,7 @@ import java.nio.file.Paths;
|
||||
import java.util.Properties;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.core.io.ClassPathResource;
|
||||
@@ -85,4 +86,10 @@ public class AppConfig {
|
||||
}
|
||||
return "true".equalsIgnoreCase(installOps);
|
||||
}
|
||||
|
||||
@ConditionalOnMissingClass("stirling.software.SPDF.config.security.SecurityConfiguration")
|
||||
@Bean(name = "activSecurity")
|
||||
public boolean missingActivSecurity() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -146,7 +146,6 @@ public class EndpointConfiguration {
|
||||
addEndpointToGroup("CLI", "xlsx-to-pdf");
|
||||
addEndpointToGroup("CLI", "pdf-to-word");
|
||||
addEndpointToGroup("CLI", "pdf-to-presentation");
|
||||
addEndpointToGroup("CLI", "pdf-to-text");
|
||||
addEndpointToGroup("CLI", "pdf-to-html");
|
||||
addEndpointToGroup("CLI", "pdf-to-xml");
|
||||
addEndpointToGroup("CLI", "ocr-pdf");
|
||||
@@ -154,6 +153,7 @@ public class EndpointConfiguration {
|
||||
addEndpointToGroup("CLI", "url-to-pdf");
|
||||
addEndpointToGroup("CLI", "book-to-pdf");
|
||||
addEndpointToGroup("CLI", "pdf-to-book");
|
||||
addEndpointToGroup("CLI", "pdf-to-rtf");
|
||||
|
||||
// Calibre
|
||||
addEndpointToGroup("Calibre", "book-to-pdf");
|
||||
@@ -175,7 +175,7 @@ public class EndpointConfiguration {
|
||||
addEndpointToGroup("LibreOffice", "xlsx-to-pdf");
|
||||
addEndpointToGroup("LibreOffice", "pdf-to-word");
|
||||
addEndpointToGroup("LibreOffice", "pdf-to-presentation");
|
||||
addEndpointToGroup("LibreOffice", "pdf-to-text");
|
||||
addEndpointToGroup("LibreOffice", "pdf-to-rtf");
|
||||
addEndpointToGroup("LibreOffice", "pdf-to-html");
|
||||
addEndpointToGroup("LibreOffice", "pdf-to-xml");
|
||||
|
||||
@@ -218,6 +218,7 @@ public class EndpointConfiguration {
|
||||
addEndpointToGroup("Java", "overlay-pdf");
|
||||
addEndpointToGroup("Java", "split-pdf-by-sections");
|
||||
addEndpointToGroup("Java", REMOVE_BLANKS);
|
||||
addEndpointToGroup("Java", "pdf-to-text");
|
||||
|
||||
// Javascript
|
||||
addEndpointToGroup("Javascript", "pdf-organizer");
|
||||
@@ -244,6 +245,6 @@ public class EndpointConfiguration {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static final String REMOVE_BLANKS = "remove-blanks";
|
||||
}
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
package stirling.software.SPDF.config;
|
||||
|
||||
public interface ShowAdminInterface {
|
||||
default boolean getShowUpdateOnlyAdmins() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -56,7 +56,7 @@ public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationF
|
||||
}
|
||||
|
||||
private boolean isDemoUser(String username) {
|
||||
Optional<User> user = userService.findByUsername(username);
|
||||
Optional<User> user = userService.findByUsernameIgnoreCase(username);
|
||||
return user.isPresent()
|
||||
&& user.get().getAuthorities().stream()
|
||||
.anyMatch(authority -> "ROLE_DEMO_USER".equals(authority.getAuthority()));
|
||||
|
||||
@@ -39,7 +39,7 @@ public class FirstLoginFilter extends OncePerRequestFilter {
|
||||
|
||||
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
|
||||
if (authentication != null && authentication.isAuthenticated()) {
|
||||
Optional<User> user = userService.findByUsername(authentication.getName());
|
||||
Optional<User> user = userService.findByUsernameIgnoreCase(authentication.getName());
|
||||
if ("GET".equalsIgnoreCase(method)
|
||||
&& user.isPresent()
|
||||
&& user.get().isFirstLogin()
|
||||
|
||||
@@ -38,7 +38,7 @@ public class InitialSecuritySetup {
|
||||
initialUsername, initialPassword, Role.ADMIN.getRoleId(), true);
|
||||
}
|
||||
}
|
||||
if (!userService.usernameExists(Role.INTERNAL_API_USER.getRoleId())) {
|
||||
if (!userService.usernameExistsIgnoreCase(Role.INTERNAL_API_USER.getRoleId())) {
|
||||
userService.saveUser(
|
||||
Role.INTERNAL_API_USER.getRoleId(),
|
||||
UUID.randomUUID().toString(),
|
||||
|
||||
@@ -166,4 +166,9 @@ public class SecurityConfiguration {
|
||||
public PersistentTokenRepository persistentTokenRepository() {
|
||||
return new JPATokenRepositoryImpl();
|
||||
}
|
||||
|
||||
@Bean
|
||||
public boolean activSecurity() {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -62,7 +62,7 @@ public class UserService implements UserServiceInterface {
|
||||
public User addApiKeyToUser(String username) {
|
||||
User user =
|
||||
userRepository
|
||||
.findByUsername(username)
|
||||
.findByUsernameIgnoreCase(username)
|
||||
.orElseThrow(() -> new UsernameNotFoundException("User not found"));
|
||||
|
||||
user.setApiKey(generateApiKey());
|
||||
@@ -76,7 +76,7 @@ public class UserService implements UserServiceInterface {
|
||||
public String getApiKeyForUser(String username) {
|
||||
User user =
|
||||
userRepository
|
||||
.findByUsername(username)
|
||||
.findByUsernameIgnoreCase(username)
|
||||
.orElseThrow(() -> new UsernameNotFoundException("User not found"));
|
||||
return user.getApiKey();
|
||||
}
|
||||
@@ -103,7 +103,7 @@ public class UserService implements UserServiceInterface {
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -136,7 +136,7 @@ public class UserService implements UserServiceInterface {
|
||||
}
|
||||
|
||||
public void deleteUser(String username) {
|
||||
Optional<User> userOpt = userRepository.findByUsername(username);
|
||||
Optional<User> userOpt = userRepository.findByUsernameIgnoreCase(username);
|
||||
if (userOpt.isPresent()) {
|
||||
for (Authority authority : userOpt.get().getAuthorities()) {
|
||||
if (authority.getAuthority().equals(Role.INTERNAL_API_USER.getRoleId())) {
|
||||
@@ -151,12 +151,16 @@ public class UserService implements UserServiceInterface {
|
||||
return userRepository.findByUsername(username).isPresent();
|
||||
}
|
||||
|
||||
public boolean usernameExistsIgnoreCase(String username) {
|
||||
return userRepository.findByUsernameIgnoreCase(username).isPresent();
|
||||
}
|
||||
|
||||
public boolean hasUsers() {
|
||||
return userRepository.count() > 0;
|
||||
}
|
||||
|
||||
public void updateUserSettings(String username, Map<String, String> updates) {
|
||||
Optional<User> userOpt = userRepository.findByUsername(username);
|
||||
Optional<User> userOpt = userRepository.findByUsernameIgnoreCase(username);
|
||||
if (userOpt.isPresent()) {
|
||||
User user = userOpt.get();
|
||||
Map<String, String> settingsMap = user.getSettings();
|
||||
|
||||
@@ -27,7 +27,9 @@ import io.github.pixee.security.Filenames;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
|
||||
import stirling.software.SPDF.model.PdfMetadata;
|
||||
import stirling.software.SPDF.model.api.PDFWithPageNums;
|
||||
import stirling.software.SPDF.utils.PdfUtils;
|
||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||
|
||||
@RestController
|
||||
@@ -49,6 +51,7 @@ public class SplitPDFController {
|
||||
// open the pdf document
|
||||
|
||||
PDDocument document = Loader.loadPDF(file.getBytes());
|
||||
PdfMetadata metadata = PdfUtils.extractMetadataFromPdf(document);
|
||||
int totalPages = document.getNumberOfPages();
|
||||
List<Integer> pageNumbers = request.getPageNumbersList(document, false);
|
||||
System.out.println(
|
||||
@@ -75,6 +78,9 @@ public class SplitPDFController {
|
||||
}
|
||||
previousPageNumber = splitPoint + 1;
|
||||
|
||||
// Transfer metadata to split pdf
|
||||
PdfUtils.setMetadataToPdf(splitDocument, metadata);
|
||||
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
splitDocument.save(baos);
|
||||
|
||||
|
||||
@@ -4,8 +4,6 @@ import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.nio.file.Files;
|
||||
import java.nio.file.Path;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.zip.ZipEntry;
|
||||
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")
|
||||
public ResponseEntity<byte[]> autoSplitPdf(@ModelAttribute SplitPdfBySizeOrCountRequest request)
|
||||
throws Exception {
|
||||
List<ByteArrayOutputStream> splitDocumentsBoas = new ArrayList<ByteArrayOutputStream>();
|
||||
|
||||
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");
|
||||
String filename =
|
||||
Filenames.toSimpleFileName(file.getOriginalFilename())
|
||||
.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))) {
|
||||
for (int i = 0; i < splitDocumentsBoas.size(); i++) {
|
||||
String fileName = filename + "_" + (i + 1) + ".pdf";
|
||||
ByteArrayOutputStream baos = splitDocumentsBoas.get(i);
|
||||
byte[] pdf = baos.toByteArray();
|
||||
int type = request.getSplitType();
|
||||
String value = request.getSplitValue();
|
||||
|
||||
ZipEntry pdfEntry = new ZipEntry(fileName);
|
||||
zipOut.putNextEntry(pdfEntry);
|
||||
zipOut.write(pdf);
|
||||
zipOut.closeEntry();
|
||||
if (type == 0) {
|
||||
long maxBytes = GeneralUtils.convertSizeToBytes(value);
|
||||
handleSplitBySize(sourceDocument, maxBytes, zipOut, filename);
|
||||
} 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) {
|
||||
e.printStackTrace();
|
||||
} finally {
|
||||
data = Files.readAllBytes(zipFile);
|
||||
Files.delete(zipFile);
|
||||
Files.deleteIfExists(zipFile);
|
||||
}
|
||||
|
||||
return WebResponseUtils.bytesToWebResponse(
|
||||
data, filename + ".zip", MediaType.APPLICATION_OCTET_STREAM);
|
||||
}
|
||||
|
||||
private ByteArrayOutputStream currentDocToByteArray(PDDocument document) throws IOException {
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
document.save(baos);
|
||||
document.close();
|
||||
return baos;
|
||||
private void handleSplitBySize(
|
||||
PDDocument sourceDocument, long maxBytes, ZipOutputStream zipOut, String baseFilename)
|
||||
throws IOException {
|
||||
long currentSize = 0;
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,7 +43,7 @@ public class UserController {
|
||||
@PreAuthorize("!hasAuthority('ROLE_DEMO_USER')")
|
||||
@PostMapping("/register")
|
||||
public String register(@ModelAttribute UsernameAndPass requestModel, Model model) {
|
||||
if (userService.usernameExists(requestModel.getUsername())) {
|
||||
if (userService.usernameExistsIgnoreCase(requestModel.getUsername())) {
|
||||
model.addAttribute("error", "Username already exists");
|
||||
return "register";
|
||||
}
|
||||
@@ -70,7 +70,8 @@ public class UserController {
|
||||
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()) {
|
||||
return new RedirectView("/account?messageType=userNotFound");
|
||||
@@ -113,7 +114,7 @@ public class UserController {
|
||||
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()) {
|
||||
return new RedirectView("/change-creds?messageType=userNotFound");
|
||||
@@ -146,7 +147,7 @@ public class UserController {
|
||||
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()) {
|
||||
return new RedirectView("/account?messageType=userNotFound");
|
||||
@@ -207,7 +208,7 @@ public class UserController {
|
||||
return new RedirectView("/addUsers?messageType=usernameExists");
|
||||
}
|
||||
}
|
||||
if (userService.usernameExists(username)) {
|
||||
if (userService.usernameExistsIgnoreCase(username)) {
|
||||
return new RedirectView("/addUsers?messageType=usernameExists");
|
||||
}
|
||||
try {
|
||||
@@ -231,7 +232,7 @@ public class UserController {
|
||||
public RedirectView deleteUser(
|
||||
@PathVariable(name = "username") String username, Authentication authentication) {
|
||||
|
||||
if (!userService.usernameExists(username)) {
|
||||
if (!userService.usernameExistsIgnoreCase(username)) {
|
||||
return new RedirectView("/addUsers?messageType=deleteUsernameExists");
|
||||
}
|
||||
|
||||
@@ -239,7 +240,7 @@ public class UserController {
|
||||
String currentUsername = authentication.getName();
|
||||
|
||||
// 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");
|
||||
}
|
||||
invalidateUserSessions(username);
|
||||
@@ -291,6 +292,6 @@ public class UserController {
|
||||
}
|
||||
return ResponseEntity.ok(apiKey);
|
||||
}
|
||||
|
||||
|
||||
private static final String LOGIN_MESSAGETYPE_CREDSUPDATED = "/login?messageType=credsUpdated";
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -29,18 +29,6 @@ import stirling.software.SPDF.utils.WebResponseUtils;
|
||||
@Tag(name = "Convert", description = "Convert APIs")
|
||||
public class ConvertPDFToOffice {
|
||||
|
||||
@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.processPdfToOfficeFormat(inputFile, "html", "writer_pdf_import");
|
||||
}
|
||||
|
||||
@PostMapping(consumes = "multipart/form-data", value = "/pdf/presentation")
|
||||
@Operation(
|
||||
summary = "Convert PDF to Presentation format",
|
||||
|
||||
@@ -16,7 +16,7 @@ import io.github.pixee.security.Filenames;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
|
||||
import stirling.software.SPDF.model.api.PDFFile;
|
||||
import stirling.software.SPDF.model.api.converters.PdfToPdfARequest;
|
||||
import stirling.software.SPDF.utils.ProcessExecutor;
|
||||
import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult;
|
||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||
@@ -31,8 +31,10 @@ public class ConvertPDFToPDFA {
|
||||
summary = "Convert a PDF to a PDF/A",
|
||||
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")
|
||||
public ResponseEntity<byte[]> pdfToPdfA(@ModelAttribute PDFFile request) throws Exception {
|
||||
public ResponseEntity<byte[]> pdfToPdfA(@ModelAttribute PdfToPdfARequest request)
|
||||
throws Exception {
|
||||
MultipartFile inputFile = request.getFileInput();
|
||||
String outputFormat = request.getOutputFormat();
|
||||
|
||||
// Save the uploaded file to a temporary location
|
||||
Path tempInputFile = Files.createTempFile("input_", ".pdf");
|
||||
@@ -47,7 +49,7 @@ public class ConvertPDFToPDFA {
|
||||
command.add("--skip-text");
|
||||
command.add("--tesseract-timeout=0");
|
||||
command.add("--output-type");
|
||||
command.add("pdfa");
|
||||
command.add(outputFormat.toString());
|
||||
command.add(tempInputFile.toString());
|
||||
command.add(tempOutputFile.toString());
|
||||
|
||||
|
||||
@@ -6,8 +6,6 @@ import java.nio.file.Path;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Qualifier;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
|
||||
@@ -9,7 +9,6 @@ import java.nio.file.StandardCopyOption;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
|
||||
@@ -143,8 +142,7 @@ public class ExtractImageScansController {
|
||||
.runCommandWithOutputHandling(command);
|
||||
|
||||
// Read the output photos in temp directory
|
||||
List<Path> tempOutputFiles =
|
||||
Files.list(tempDir).sorted().collect(Collectors.toList());
|
||||
List<Path> tempOutputFiles = Files.list(tempDir).sorted().toList();
|
||||
for (Path tempOutputFile : tempOutputFiles) {
|
||||
byte[] imageBytes = Files.readAllBytes(tempOutputFile);
|
||||
processedImageBytes.add(imageBytes);
|
||||
@@ -219,6 +217,6 @@ public class ExtractImageScansController {
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static final String REPLACEFIRST = "[.][^.]+$";
|
||||
}
|
||||
|
||||
@@ -1,27 +1,25 @@
|
||||
package stirling.software.SPDF.controller.api.misc;
|
||||
|
||||
import java.awt.AlphaComposite;
|
||||
import java.awt.Color;
|
||||
import java.awt.GradientPaint;
|
||||
import java.awt.Graphics2D;
|
||||
import java.awt.geom.AffineTransform;
|
||||
import java.awt.image.AffineTransformOp;
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.awt.image.BufferedImageOp;
|
||||
import java.awt.image.ConvolveOp;
|
||||
import java.awt.image.Kernel;
|
||||
import java.awt.image.RescaleOp;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.security.SecureRandom;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Random;
|
||||
|
||||
import javax.imageio.ImageIO;
|
||||
|
||||
import org.apache.pdfbox.Loader;
|
||||
import org.apache.pdfbox.pdmodel.PDDocument;
|
||||
import org.apache.pdfbox.pdmodel.PDPage;
|
||||
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.JPEGFactory;
|
||||
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
|
||||
import org.apache.pdfbox.rendering.ImageType;
|
||||
import org.apache.pdfbox.rendering.PDFRenderer;
|
||||
@@ -29,16 +27,17 @@ import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
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.github.pixee.security.Filenames;
|
||||
import io.swagger.v3.oas.annotations.Hidden;
|
||||
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.PdfUtils;
|
||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||
|
||||
@RestController
|
||||
@@ -48,98 +47,38 @@ public class FakeScanControllerWIP {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(FakeScanControllerWIP.class);
|
||||
|
||||
// TODO
|
||||
@Hidden
|
||||
// @PostMapping(consumes = "multipart/form-data", value = "/fakeScan")
|
||||
@Operation(
|
||||
summary = "Repair a PDF file",
|
||||
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.")
|
||||
public ResponseEntity<byte[]> repairPdf(@ModelAttribute PDFFile request) throws IOException {
|
||||
//TODO
|
||||
//@PostMapping(consumes = "multipart/form-data", value = "/fake-scan")
|
||||
//@Operation(
|
||||
// summary = "Repair a PDF file",
|
||||
// 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.")
|
||||
public ResponseEntity<byte[]> fakeScan(@ModelAttribute PDFFile request) throws IOException {
|
||||
MultipartFile inputFile = request.getFileInput();
|
||||
|
||||
// Load the PDF document
|
||||
PDDocument document = Loader.loadPDF(inputFile.getBytes());
|
||||
PDFRenderer pdfRenderer = new PDFRenderer(document);
|
||||
pdfRenderer.setSubsamplingAllowed(true);
|
||||
for (int page = 0; page < document.getNumberOfPages(); ++page) {
|
||||
BufferedImage image = pdfRenderer.renderImageWithDPI(page, 300, ImageType.RGB);
|
||||
ImageIO.write(image, "png", new File("scanned-" + (page + 1) + ".png"));
|
||||
PDFRenderer renderer = new PDFRenderer(document);
|
||||
List<BufferedImage> images = new ArrayList<>();
|
||||
// Convert each page to an image
|
||||
for (int i = 0; i < document.getNumberOfPages(); i++) {
|
||||
BufferedImage image = renderer.renderImageWithDPI(i, 150, ImageType.GRAY);
|
||||
images.add(processImage(image));
|
||||
}
|
||||
document.close();
|
||||
|
||||
// Constants
|
||||
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();
|
||||
}
|
||||
// Create a new PDF document with the processed images
|
||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||
documentOut.save(baos);
|
||||
documentOut.close();
|
||||
PDDocument newDocument = new PDDocument();
|
||||
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
|
||||
String outputFilename =
|
||||
@@ -148,4 +87,164 @@ public class FakeScanControllerWIP {
|
||||
+ "_scanned.pdf";
|
||||
return WebResponseUtils.boasToWebResponse(baos, outputFilename);
|
||||
}
|
||||
|
||||
public BufferedImage processImage(BufferedImage image) {
|
||||
// Rotation
|
||||
|
||||
image = rotate(image);
|
||||
// image = softenEdges(image, 5);
|
||||
image = applyGaussianBlur(image, 0.5);
|
||||
addGaussianNoise(image, 0.25);
|
||||
image = linearStretch(image);
|
||||
|
||||
return image;
|
||||
}
|
||||
|
||||
private BufferedImage rotate(BufferedImage image) {
|
||||
|
||||
double rotationRequired = Math.toRadians(1.0);
|
||||
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.drawImage(image, 0, 0, null);
|
||||
g2.setComposite(AlphaComposite.DstIn);
|
||||
g2.setPaint(
|
||||
new GradientPaint(
|
||||
0, 0, new Color(0, 0, 0, 1f), 0, featherRadius, new Color(0, 0, 0, 0f)));
|
||||
g2.fillRect(0, 0, width, featherRadius); // top edge
|
||||
g2.setPaint(
|
||||
new GradientPaint(
|
||||
0,
|
||||
height - featherRadius,
|
||||
new Color(0, 0, 0, 0f),
|
||||
0,
|
||||
height,
|
||||
new Color(0, 0, 0, 1f)));
|
||||
g2.fillRect(0, height - featherRadius, width, featherRadius); // bottom edge
|
||||
g2.setPaint(
|
||||
new GradientPaint(
|
||||
0, 0, new Color(0, 0, 0, 1f), featherRadius, 0, new Color(0, 0, 0, 0f)));
|
||||
g2.fillRect(0, 0, featherRadius, height); // left edge
|
||||
g2.setPaint(
|
||||
new GradientPaint(
|
||||
width - featherRadius,
|
||||
0,
|
||||
new Color(0, 0, 0, 0f),
|
||||
width,
|
||||
0,
|
||||
new Color(0, 0, 0, 1f)));
|
||||
g2.fillRect(width - featherRadius, 0, featherRadius, height); // right edge
|
||||
g2.dispose();
|
||||
|
||||
return output;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,106 @@
|
||||
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.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.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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -26,7 +26,6 @@ import org.springframework.stereotype.Service;
|
||||
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
|
||||
import stirling.software.SPDF.model.ApplicationProperties;
|
||||
import stirling.software.SPDF.model.PipelineConfig;
|
||||
import stirling.software.SPDF.model.PipelineOperation;
|
||||
|
||||
@@ -36,7 +35,6 @@ public class PipelineDirectoryProcessor {
|
||||
private static final Logger logger = LoggerFactory.getLogger(PipelineDirectoryProcessor.class);
|
||||
@Autowired private ObjectMapper objectMapper;
|
||||
@Autowired private ApiDocService apiDocService;
|
||||
@Autowired private ApplicationProperties applicationProperties;
|
||||
|
||||
final String watchedFoldersDir = "./pipeline/watchedFolders/";
|
||||
final String finishedFoldersDir = "./pipeline/finishedFolders/";
|
||||
@@ -45,9 +43,6 @@ public class PipelineDirectoryProcessor {
|
||||
|
||||
@Scheduled(fixedRate = 60000)
|
||||
public void scanFolders() {
|
||||
if (!Boolean.TRUE.equals(applicationProperties.getSystem().getEnableAlphaFunctionality())) {
|
||||
return;
|
||||
}
|
||||
Path watchedFolderPath = Paths.get(watchedFoldersDir);
|
||||
if (!Files.exists(watchedFolderPath)) {
|
||||
try {
|
||||
|
||||
@@ -139,25 +139,29 @@ public class SanitizeController {
|
||||
|
||||
for (PDPage page : allPages) {
|
||||
PDResources res = page.getResources();
|
||||
|
||||
// Remove embedded files from the PDF
|
||||
res.getCOSObject().removeItem(COSName.getPDFName("EmbeddedFiles"));
|
||||
if (res != null && res.getCOSObject() != null) {
|
||||
res.getCOSObject().removeItem(COSName.getPDFName("EmbeddedFiles"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void sanitizeMetadata(PDDocument document) {
|
||||
PDMetadata metadata = document.getDocumentCatalog().getMetadata();
|
||||
if (metadata != null) {
|
||||
document.getDocumentCatalog().setMetadata(null);
|
||||
if (document.getDocumentCatalog() != null) {
|
||||
PDMetadata metadata = document.getDocumentCatalog().getMetadata();
|
||||
if (metadata != null) {
|
||||
document.getDocumentCatalog().setMetadata(null);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void sanitizeLinks(PDDocument document) throws IOException {
|
||||
for (PDPage page : document.getPages()) {
|
||||
for (PDAnnotation annotation : page.getAnnotations()) {
|
||||
if (annotation instanceof PDAnnotationLink) {
|
||||
if (annotation != null && annotation instanceof PDAnnotationLink) {
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -167,7 +171,11 @@ public class SanitizeController {
|
||||
|
||||
private void sanitizeFonts(PDDocument document) {
|
||||
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"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -95,7 +95,7 @@ public class AccountWebController {
|
||||
|
||||
// Fetch user details from the database
|
||||
Optional<User> user =
|
||||
userRepository.findByUsername(
|
||||
userRepository.findByUsernameIgnoreCase(
|
||||
username); // Assuming findByUsername method exists
|
||||
if (!user.isPresent()) {
|
||||
// Handle error appropriately
|
||||
@@ -145,7 +145,7 @@ public class AccountWebController {
|
||||
|
||||
// Fetch user details from the database
|
||||
Optional<User> user =
|
||||
userRepository.findByUsername(
|
||||
userRepository.findByUsernameIgnoreCase(
|
||||
username); // Assuming findByUsername method exists
|
||||
if (!user.isPresent()) {
|
||||
// Handle error appropriately
|
||||
|
||||
@@ -17,6 +17,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
@Controller
|
||||
@Tag(name = "Misc", description = "Miscellaneous APIs")
|
||||
public class OtherWebController {
|
||||
|
||||
@GetMapping("/compress-pdf")
|
||||
@Hidden
|
||||
public String compressPdfForm(Model model) {
|
||||
@@ -53,6 +54,13 @@ public class OtherWebController {
|
||||
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")
|
||||
@Hidden
|
||||
public String extractImagesForm(Model model) {
|
||||
@@ -81,6 +89,13 @@ public class OtherWebController {
|
||||
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() {
|
||||
String tessdataDir = "/usr/share/tessdata";
|
||||
File[] files = new File(tessdataDir).listFiles();
|
||||
|
||||
@@ -210,6 +210,24 @@ public class ApplicationProperties {
|
||||
private String rootURIPath;
|
||||
private String customStaticFilePath;
|
||||
private Integer maxFileSize;
|
||||
private boolean showUpdate;
|
||||
private Boolean showUpdateOnlyAdmin;
|
||||
|
||||
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;
|
||||
|
||||
@@ -275,6 +293,10 @@ public class ApplicationProperties {
|
||||
+ maxFileSize
|
||||
+ ", enableAlphaFunctionality="
|
||||
+ enableAlphaFunctionality
|
||||
+ ", showUpdate="
|
||||
+ showUpdate
|
||||
+ ", showUpdateOnlyAdmin="
|
||||
+ showUpdateOnlyAdmin
|
||||
+ "]";
|
||||
}
|
||||
}
|
||||
|
||||
19
src/main/java/stirling/software/SPDF/model/PdfMetadata.java
Normal file
19
src/main/java/stirling/software/SPDF/model/PdfMetadata.java
Normal 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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -3,8 +3,6 @@ package stirling.software.SPDF.repository;
|
||||
import java.util.Optional;
|
||||
|
||||
import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.data.jpa.repository.Query;
|
||||
import org.springframework.data.repository.query.Param;
|
||||
|
||||
import stirling.software.SPDF.model.User;
|
||||
|
||||
|
||||
@@ -88,6 +88,7 @@ public class GeneralUtils {
|
||||
}
|
||||
|
||||
sizeStr = sizeStr.trim().toUpperCase();
|
||||
sizeStr = sizeStr.replace(",", ".").replace(" ", "");
|
||||
try {
|
||||
if (sizeStr.endsWith("KB")) {
|
||||
return (long)
|
||||
@@ -185,7 +186,7 @@ public class GeneralUtils {
|
||||
// Insert multiplication between a number and 'n' (e.g., "4n" becomes "4*n")
|
||||
String withMultiplication = expression.replaceAll("(\\d)n", "$1*n");
|
||||
// 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) {
|
||||
|
||||
@@ -25,6 +25,71 @@ import io.github.pixee.security.Filenames;
|
||||
import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult;
|
||||
|
||||
public class PDFToFile {
|
||||
|
||||
public ResponseEntity<byte[]> processPdfToHtml(MultipartFile inputFile)
|
||||
throws IOException, InterruptedException {
|
||||
if (!"application/pdf".equals(inputFile.getContentType())) {
|
||||
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
|
||||
// Get the original PDF file name without the extension
|
||||
String originalPdfFileName = Filenames.toSimpleFileName(inputFile.getOriginalFilename());
|
||||
String pdfBaseName = originalPdfFileName.substring(0, originalPdfFileName.lastIndexOf('.'));
|
||||
|
||||
Path tempInputFile = null;
|
||||
Path tempOutputDir = null;
|
||||
byte[] fileBytes;
|
||||
String fileName = "temp.file";
|
||||
|
||||
try {
|
||||
// Save the uploaded file to a temporary location
|
||||
tempInputFile = Files.createTempFile("input_", ".pdf");
|
||||
Files.copy(
|
||||
inputFile.getInputStream(), tempInputFile, StandardCopyOption.REPLACE_EXISTING);
|
||||
|
||||
// Prepare the output directory
|
||||
tempOutputDir = Files.createTempDirectory("output_");
|
||||
|
||||
// Run the pdftohtml command with complex output
|
||||
List<String> command =
|
||||
new ArrayList<>(
|
||||
Arrays.asList(
|
||||
"pdftohtml", "-c", tempInputFile.toString(), pdfBaseName));
|
||||
|
||||
ProcessExecutorResult returnCode =
|
||||
ProcessExecutor.getInstance(ProcessExecutor.Processes.PDFTOHTML)
|
||||
.runCommandWithOutputHandling(command, tempOutputDir.toFile());
|
||||
|
||||
// Get output files
|
||||
List<File> outputFiles = Arrays.asList(tempOutputDir.toFile().listFiles());
|
||||
|
||||
// Return output files in a ZIP archive
|
||||
fileName = pdfBaseName + "ToHtml.zip";
|
||||
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
|
||||
ZipOutputStream zipOutputStream = new ZipOutputStream(byteArrayOutputStream);
|
||||
|
||||
for (File outputFile : outputFiles) {
|
||||
ZipEntry entry = new ZipEntry(outputFile.getName());
|
||||
zipOutputStream.putNextEntry(entry);
|
||||
FileInputStream fis = new FileInputStream(outputFile);
|
||||
IOUtils.copy(fis, zipOutputStream);
|
||||
fis.close();
|
||||
zipOutputStream.closeEntry();
|
||||
}
|
||||
|
||||
zipOutputStream.close();
|
||||
fileBytes = byteArrayOutputStream.toByteArray();
|
||||
|
||||
} finally {
|
||||
// Clean up the temporary files
|
||||
if (tempInputFile != null) Files.delete(tempInputFile);
|
||||
if (tempOutputDir != null) FileUtils.deleteDirectory(tempOutputDir.toFile());
|
||||
}
|
||||
|
||||
return WebResponseUtils.bytesToWebResponse(
|
||||
fileBytes, fileName, MediaType.APPLICATION_OCTET_STREAM);
|
||||
}
|
||||
|
||||
public ResponseEntity<byte[]> processPdfToOfficeFormat(
|
||||
MultipartFile inputFile, String outputFormat, String libreOfficeFilter)
|
||||
throws IOException, InterruptedException {
|
||||
@@ -39,17 +104,7 @@ public class PDFToFile {
|
||||
|
||||
// Validate output format
|
||||
List<String> allowedFormats =
|
||||
Arrays.asList(
|
||||
"doc",
|
||||
"docx",
|
||||
"odt",
|
||||
"ppt",
|
||||
"pptx",
|
||||
"odp",
|
||||
"rtf",
|
||||
"html",
|
||||
"xml",
|
||||
"txt:Text");
|
||||
Arrays.asList("doc", "docx", "odt", "ppt", "pptx", "odp", "rtf", "xml", "txt:Text");
|
||||
if (!allowedFormats.contains(outputFormat)) {
|
||||
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import java.awt.image.RenderedImage;
|
||||
import java.io.ByteArrayOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Calendar;
|
||||
import java.util.List;
|
||||
import java.util.zip.ZipEntry;
|
||||
import java.util.zip.ZipOutputStream;
|
||||
@@ -19,11 +20,8 @@ import javax.imageio.stream.ImageOutputStream;
|
||||
|
||||
import org.apache.pdfbox.Loader;
|
||||
import org.apache.pdfbox.cos.COSName;
|
||||
import org.apache.pdfbox.pdmodel.PDDocument;
|
||||
import org.apache.pdfbox.pdmodel.PDPage;
|
||||
import org.apache.pdfbox.pdmodel.PDPageContentStream;
|
||||
import org.apache.pdfbox.pdmodel.*;
|
||||
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.graphics.PDXObject;
|
||||
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 stirling.software.SPDF.model.PdfMetadata;
|
||||
|
||||
public class PdfUtils {
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger(PdfUtils.class);
|
||||
@@ -336,7 +336,7 @@ public class PdfUtils {
|
||||
}
|
||||
}
|
||||
|
||||
private static void addImageToDocument(
|
||||
public static void addImageToDocument(
|
||||
PDDocument doc, PDImageXObject image, String fitOption, boolean autoRotate)
|
||||
throws IOException {
|
||||
boolean imageIsLandscape = image.getWidth() > image.getHeight();
|
||||
@@ -421,4 +421,28 @@ public class PdfUtils {
|
||||
logger.info("PDF successfully saved to byte array");
|
||||
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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,6 +24,7 @@ public class ProcessExecutor {
|
||||
|
||||
public enum Processes {
|
||||
LIBRE_OFFICE,
|
||||
PDFTOHTML,
|
||||
OCR_MY_PDF,
|
||||
PYTHON_OPENCV,
|
||||
GHOSTSCRIPT,
|
||||
@@ -45,6 +46,7 @@ public class ProcessExecutor {
|
||||
int semaphoreLimit =
|
||||
switch (key) {
|
||||
case LIBRE_OFFICE -> 1;
|
||||
case PDFTOHTML -> 1;
|
||||
case OCR_MY_PDF -> 2;
|
||||
case PYTHON_OPENCV -> 8;
|
||||
case GHOSTSCRIPT -> 16;
|
||||
@@ -56,6 +58,7 @@ public class ProcessExecutor {
|
||||
long timeoutMinutes =
|
||||
switch (key) {
|
||||
case LIBRE_OFFICE -> 30;
|
||||
case PDFTOHTML -> 5;
|
||||
case OCR_MY_PDF -> 30;
|
||||
case PYTHON_OPENCV -> 30;
|
||||
case GHOSTSCRIPT -> 5;
|
||||
|
||||
@@ -57,6 +57,17 @@ usernameExistsMessage=New Username already exists.
|
||||
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
|
||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||
error=Error
|
||||
oops=Oops!
|
||||
help=Help
|
||||
goHomepage=Go to Homepage
|
||||
joinDiscord=Join our Discord server
|
||||
seeDockerHub=See Docker Hub
|
||||
visitGithub=Visit Github Repository
|
||||
donate=Donate
|
||||
color=Color
|
||||
sponsor=Sponsor
|
||||
|
||||
|
||||
|
||||
###############
|
||||
@@ -101,6 +112,7 @@ navbar.settings=إعدادات
|
||||
#############
|
||||
settings.title=الإعدادات
|
||||
settings.update=التحديث متاح
|
||||
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
|
||||
settings.appVersion=إصدار التطبيق:
|
||||
settings.downloadOption.title=تحديد خيار التنزيل (للتنزيلات ذات الملف الواحد غير المضغوط):
|
||||
settings.downloadOption.1=فتح في نفس النافذة
|
||||
@@ -109,8 +121,9 @@ settings.downloadOption.3=تنزيل الملف
|
||||
settings.zipThreshold=ملفات مضغوطة عند تجاوز عدد الملفات التي تم تنزيلها
|
||||
settings.signOut=Sign Out
|
||||
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.header=Update Your Account Details
|
||||
@@ -796,17 +809,17 @@ rotate.selectAngle=حدد زاوية الدوران (بمضاعفات 90 درج
|
||||
rotate.submit=استدارة
|
||||
|
||||
|
||||
#merge
|
||||
#split-pdfs
|
||||
split.title=انقسام PDF
|
||||
split.header=تقسيم PDF
|
||||
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.4=المستند رقم 2: الصفحتان 2 و 3
|
||||
split.desc.5=المستند رقم 3: الصفحة 4 و 5 و 6
|
||||
split.desc.6=المستند رقم 4: الصفحة 7
|
||||
split.desc.7=المستند رقم 5: الصفحة 8
|
||||
split.desc.8=المستند رقم 6: الصفحتان 9 و 10
|
||||
split.desc.5=المستند رقم 3: الصفحة 4 و 5 و 6 و 7
|
||||
split.desc.6=المستند رقم 4: الصفحة 8
|
||||
split.desc.7=المستند رقم 5: الصفحة 9
|
||||
split.desc.8=المستند رقم 6: الصفحة 10
|
||||
split.splitPages=أدخل الصفحات المراد تقسيمها:
|
||||
split.submit=Split
|
||||
|
||||
@@ -957,7 +970,7 @@ PDFToText.submit=تحويل
|
||||
#PDFToHTML
|
||||
PDFToHTML.title=PDF إلى HTML
|
||||
PDFToHTML.header=PDF إلى HTML
|
||||
PDFToHTML.credit=تستخدم هذه الخدمة LibreOffice لتحويل الملفات.
|
||||
PDFToHTML.credit=تستخدم هذه الخدمة pdftohtml لتحويل الملفات.
|
||||
PDFToHTML.submit=تحويل
|
||||
|
||||
|
||||
@@ -1011,6 +1024,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions
|
||||
split-by-sections.submit=Split 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.nav=Licenses
|
||||
licenses.title=3rd Party Licenses
|
||||
@@ -1020,3 +1042,16 @@ licenses.version=Version
|
||||
licenses.license=License
|
||||
|
||||
|
||||
# error
|
||||
error.sorry=Sorry for the issue!
|
||||
error.needHelp=Need help / Found an issue?
|
||||
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.404.head=404 - Page Not Found | Oops, we tripped in the code!
|
||||
error.404.1=We can't seem to find the page you're looking for.
|
||||
error.404.2=Something went wrong
|
||||
error.github=Submit a ticket on GitHub
|
||||
error.showStack=Show Stack Trace
|
||||
error.copyStack=Copy Stack Trace
|
||||
error.githubSubmit=GitHub - Submit a ticket
|
||||
error.discordSubmit=Discord - Submit Support post
|
||||
|
||||
|
||||
@@ -57,6 +57,17 @@ usernameExistsMessage=Новият потребител вече съществ
|
||||
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
|
||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||
error=Error
|
||||
oops=Oops!
|
||||
help=Help
|
||||
goHomepage=Go to Homepage
|
||||
joinDiscord=Join our Discord server
|
||||
seeDockerHub=See Docker Hub
|
||||
visitGithub=Visit Github Repository
|
||||
donate=Donate
|
||||
color=Color
|
||||
sponsor=Sponsor
|
||||
|
||||
|
||||
|
||||
###############
|
||||
@@ -101,6 +112,7 @@ navbar.settings=Настройки
|
||||
#############
|
||||
settings.title=Настройки
|
||||
settings.update=Налична актуализация
|
||||
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
|
||||
settings.appVersion=Версия на приложението:
|
||||
settings.downloadOption.title=Изберете опция за изтегляне (за изтегляния на един файл без да е архивиран):
|
||||
settings.downloadOption.1=Отваряне в същия прозорец
|
||||
@@ -109,8 +121,9 @@ settings.downloadOption.3=Изтегли файл
|
||||
settings.zipThreshold=Архивирайте файловете, когато броят на изтеглените файлове надвишава
|
||||
settings.signOut=Изход
|
||||
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.header=Актуализирайте данните за акаунта си
|
||||
@@ -796,17 +809,17 @@ rotate.selectAngle=Изберете ъгъл на въртене (кратно
|
||||
rotate.submit=Завъртане
|
||||
|
||||
|
||||
#merge
|
||||
#split-pdfs
|
||||
split.title=Разделяне на PDF
|
||||
split.header=Разделяне на PDF
|
||||
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.4=Документ #2: Страница 2 и 3
|
||||
split.desc.5=Документ #3: Страница 4, 5 и 6
|
||||
split.desc.6=Документ #4: Страница 7
|
||||
split.desc.7=Документ #5: Страница 8
|
||||
split.desc.8=Документ #6: Страница 9 и 10
|
||||
split.desc.5=Документ #3: Страница 4, 5, 6 и 7
|
||||
split.desc.6=Документ #4: Страница 8
|
||||
split.desc.7=Документ #5: Страница 9
|
||||
split.desc.8=Документ #6: Страница 10
|
||||
split.splitPages=Въведете страници за разделяне:
|
||||
split.submit=Разделяне
|
||||
|
||||
@@ -957,7 +970,7 @@ PDFToText.submit=Преобразуване
|
||||
#PDFToHTML
|
||||
PDFToHTML.title=PDF към HTML
|
||||
PDFToHTML.header=PDF към HTML
|
||||
PDFToHTML.credit=Тази услуга използва LibreOffice за преобразуване на файлове.
|
||||
PDFToHTML.credit=Тази услуга използва pdftohtml за преобразуване на файлове.
|
||||
PDFToHTML.submit=Преобразуване
|
||||
|
||||
|
||||
@@ -1011,6 +1024,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions
|
||||
split-by-sections.submit=Split 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.nav=Licenses
|
||||
licenses.title=3rd Party Licenses
|
||||
@@ -1020,3 +1042,16 @@ licenses.version=Version
|
||||
licenses.license=License
|
||||
|
||||
|
||||
# error
|
||||
error.sorry=Sorry for the issue!
|
||||
error.needHelp=Need help / Found an issue?
|
||||
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.404.head=404 - Page Not Found | Oops, we tripped in the code!
|
||||
error.404.1=We can't seem to find the page you're looking for.
|
||||
error.404.2=Something went wrong
|
||||
error.github=Submit a ticket on GitHub
|
||||
error.showStack=Show Stack Trace
|
||||
error.copyStack=Copy Stack Trace
|
||||
error.githubSubmit=GitHub - Submit a ticket
|
||||
error.discordSubmit=Discord - Submit Support post
|
||||
|
||||
|
||||
@@ -57,6 +57,17 @@ usernameExistsMessage=New Username already exists.
|
||||
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
|
||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||
error=Error
|
||||
oops=Oops!
|
||||
help=Help
|
||||
goHomepage=Go to Homepage
|
||||
joinDiscord=Join our Discord server
|
||||
seeDockerHub=See Docker Hub
|
||||
visitGithub=Visit Github Repository
|
||||
donate=Donate
|
||||
color=Color
|
||||
sponsor=Sponsor
|
||||
|
||||
|
||||
|
||||
###############
|
||||
@@ -101,6 +112,7 @@ navbar.settings=Opcions
|
||||
#############
|
||||
settings.title=Opcions
|
||||
settings.update=Actualització Disponible
|
||||
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
|
||||
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.1=Obre mateixa finestra
|
||||
@@ -109,8 +121,9 @@ settings.downloadOption.3=Descarrega Arxiu
|
||||
settings.zipThreshold=Comprimiu els fitxers quan el nombre de fitxers baixats superi
|
||||
settings.signOut=Sortir
|
||||
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.header=Update Your Account Details
|
||||
@@ -796,17 +809,17 @@ rotate.selectAngle=Selecciona l'angle de gir (en múltiples de 90 graus):
|
||||
rotate.submit=Rota
|
||||
|
||||
|
||||
#merge
|
||||
#split-pdfs
|
||||
split.title=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.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.4=Document #2: Pàgina 2 i 3
|
||||
split.desc.5=Document #3: Pàgina 4, 5 i 6
|
||||
split.desc.6=Document #4: Pàgina 7
|
||||
split.desc.7=Document #5: Pàgina 8
|
||||
split.desc.8=Document #6: Pàgina 9 i 10
|
||||
split.desc.5=Document #3: Pàgina 4, 5, 6 i 7
|
||||
split.desc.6=Document #4: Pàgina 8
|
||||
split.desc.7=Document #5: Pàgina 9
|
||||
split.desc.8=Document #6: Pàgina 10
|
||||
split.splitPages=Introdueix pàgines per dividir-les:
|
||||
split.submit=Divideix
|
||||
|
||||
@@ -957,7 +970,7 @@ PDFToText.submit=Converteix
|
||||
#PDFToHTML
|
||||
PDFToHTML.title=PDF a HTML
|
||||
PDFToHTML.header=PDF a HTML
|
||||
PDFToHTML.credit=Utilitza LibreOffice per a la conversió d'Arxius.
|
||||
PDFToHTML.credit=Utilitza pdftohtml per a la conversió d'Arxius.
|
||||
PDFToHTML.submit=Converteix
|
||||
|
||||
|
||||
@@ -1011,6 +1024,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions
|
||||
split-by-sections.submit=Split 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.nav=Licenses
|
||||
licenses.title=3rd Party Licenses
|
||||
@@ -1020,3 +1042,16 @@ licenses.version=Version
|
||||
licenses.license=License
|
||||
|
||||
|
||||
# error
|
||||
error.sorry=Sorry for the issue!
|
||||
error.needHelp=Need help / Found an issue?
|
||||
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.404.head=404 - Page Not Found | Oops, we tripped in the code!
|
||||
error.404.1=We can't seem to find the page you're looking for.
|
||||
error.404.2=Something went wrong
|
||||
error.github=Submit a ticket on GitHub
|
||||
error.showStack=Show Stack Trace
|
||||
error.copyStack=Copy Stack Trace
|
||||
error.githubSubmit=GitHub - Submit a ticket
|
||||
error.discordSubmit=Discord - Submit Support post
|
||||
|
||||
|
||||
@@ -57,6 +57,17 @@ usernameExistsMessage=Neuer Benutzername existiert bereits.
|
||||
invalidUsernameMessage=Ungültiger Benutzername. Der Benutzername darf nur Buchstaben und Zahlen enthalten.
|
||||
deleteCurrentUserMessage=Der aktuell angemeldete Benutzer kann nicht gelöscht werden.
|
||||
deleteUsernameExistsMessage=Der Benutzername existiert nicht und kann nicht gelöscht werden.
|
||||
error=Fehler
|
||||
oops=Hoppla!
|
||||
help=Hilfe
|
||||
goHomepage=Zur Startseite gehen
|
||||
joinDiscord=Unserem Discord-Server beitreten
|
||||
seeDockerHub=Docker Hub ansehen
|
||||
visitGithub=GitHub-Repository besuchen
|
||||
donate=Spenden
|
||||
color=Farbe
|
||||
sponsor=Sponsor
|
||||
|
||||
|
||||
|
||||
###############
|
||||
@@ -67,8 +78,8 @@ pipeline.uploadButton=Benutzerdefinierter Upload
|
||||
pipeline.configureButton=Konfigurieren
|
||||
pipeline.defaultOption=Benutzerdefiniert
|
||||
pipeline.submitButton=Speichern
|
||||
pipeline.help=Pipeline Help
|
||||
pipeline.scanHelp=Folder Scanning Help
|
||||
pipeline.help=Hilfe für Pipeline
|
||||
pipeline.scanHelp=Hilfe zum Ordnerscan
|
||||
|
||||
######################
|
||||
# Pipeline Options #
|
||||
@@ -101,6 +112,7 @@ navbar.settings=Einstellungen
|
||||
#############
|
||||
settings.title=Einstellungen
|
||||
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.downloadOption.title=Download-Option wählen (für einzelne Dateien, die keine Zip-Downloads sind):
|
||||
settings.downloadOption.1=Im selben Fenster öffnen
|
||||
@@ -109,8 +121,9 @@ settings.downloadOption.3=Datei herunterladen
|
||||
settings.zipThreshold=Dateien komprimieren, wenn die Anzahl der heruntergeladenen Dateien überschritten wird
|
||||
settings.signOut=Abmelden
|
||||
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.header=Aktualisieren Sie Ihre Kontodaten
|
||||
@@ -177,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
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
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
|
||||
|
||||
|
||||
@@ -241,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
|
||||
|
||||
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
|
||||
|
||||
|
||||
@@ -363,17 +376,17 @@ getPdfInfo.tags=infomation,daten,statistik
|
||||
|
||||
home.extractPage.title=Seite(n) extrahieren
|
||||
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.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.desc=Alle Javascript Funktionen in einer PDF anzeigen
|
||||
showJS.tags=js
|
||||
showJS.tags=js,javascript
|
||||
|
||||
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
|
||||
@@ -381,7 +394,7 @@ autoRedact.tags=zensieren,schwärzen
|
||||
|
||||
home.tableExtraxt.title=Tabelle 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
|
||||
@@ -404,11 +417,11 @@ AddStampRequest.tags=stempeln,bild hinzufügen,bild zentrieren,wasserzeichen,pdf
|
||||
|
||||
home.PDFToBook.title=PDF zum Buch
|
||||
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.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
|
||||
|
||||
|
||||
###########################
|
||||
@@ -434,7 +447,7 @@ autoRedact.textsToRedactLabel=Zu zensierender Text (einer pro Zeile)
|
||||
autoRedact.textsToRedactPlaceholder=z.B. \nVertraulich \nStreng geheim
|
||||
autoRedact.useRegexLabel=Regex verwenden
|
||||
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.submitButton=Zensieren
|
||||
|
||||
@@ -456,7 +469,7 @@ pdfToSinglePage.submit=Zusammenfassen
|
||||
pageExtracter.title=Seiten extrahieren
|
||||
pageExtracter.header=Seiten 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
|
||||
@@ -488,16 +501,16 @@ HTMLToPDF.header=HTML zu PDF
|
||||
HTMLToPDF.help=Akzeptiert HTML-Dateien und ZIPs mit html/css/images etc.
|
||||
HTMLToPDF.submit=Konvertieren
|
||||
HTMLToPDF.credit=Verwendet WeasyPrint
|
||||
HTMLToPDF.zoom=Zoomstufe zur Darstellung der Website.
|
||||
HTMLToPDF.pageWidth=Breite 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.marginBottom=Unterer 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.printBackground=Den Hintergrund der Website rendern.
|
||||
HTMLToPDF.zoom=Zoomstufe zur Darstellung der Website
|
||||
HTMLToPDF.pageWidth=Breite 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.marginBottom=Unterer 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.printBackground=Den Hintergrund der Website rendern
|
||||
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.print=Drucken
|
||||
HTMLToPDF.screen=Bildschirm
|
||||
@@ -598,8 +611,8 @@ pageLayout.submit=Abschicken
|
||||
#scalePages
|
||||
scalePages.title=Seitengröße anpassen
|
||||
scalePages.header=Seitengröße anpassen
|
||||
scalePages.pageSize=Format der Seiten des Dokuments.
|
||||
scalePages.scaleFactor=Zoomstufe (Ausschnitt) einer Seite.
|
||||
scalePages.pageSize=Format der Seiten des Dokuments
|
||||
scalePages.scaleFactor=Zoomstufe (Ausschnitt) einer Seite
|
||||
scalePages.submit=Abschicken
|
||||
|
||||
|
||||
@@ -742,7 +755,7 @@ compress.submit=Komprimieren
|
||||
#Add image
|
||||
addImage.title=Bild hinzufügen
|
||||
addImage.header=Ein Bild einfügen
|
||||
addImage.everyPage=Jede Seite?
|
||||
addImage.everyPage=In jede Seite einfügen?
|
||||
addImage.upload=Bild hinzufügen
|
||||
addImage.submit=Bild hinzufügen
|
||||
|
||||
@@ -759,23 +772,23 @@ merge.submit=Zusammenführen
|
||||
pdfOrganiser.title=Seiten anordnen
|
||||
pdfOrganiser.header=PDF Seitenorganisation
|
||||
pdfOrganiser.submit=Seiten anordnen
|
||||
pdfOrganiser.mode=Mode
|
||||
pdfOrganiser.mode.1=Custom Page Order
|
||||
pdfOrganiser.mode.2=Reverse Order
|
||||
pdfOrganiser.mode.3=Duplex Sort
|
||||
pdfOrganiser.mode.4=Booklet Sort
|
||||
pdfOrganiser.mode.5=Side Stitch Booklet Sort
|
||||
pdfOrganiser.mode.6=Odd-Even Split
|
||||
pdfOrganiser.mode.7=Remove First
|
||||
pdfOrganiser.mode.8=Remove Last
|
||||
pdfOrganiser.mode.9=Remove First and Last
|
||||
pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
||||
pdfOrganiser.mode=Modus
|
||||
pdfOrganiser.mode.1=Benutzerdefinierte Seitenreihenfolge
|
||||
pdfOrganiser.mode.2=Umgekehrte Reihenfolge
|
||||
pdfOrganiser.mode.3=Duplex-Sortierung
|
||||
pdfOrganiser.mode.4=Heftsortierung
|
||||
pdfOrganiser.mode.5=Seitenheftungs-Heftsortierung
|
||||
pdfOrganiser.mode.6=Ungerade-Gerade-Teilung
|
||||
pdfOrganiser.mode.7=Erste entfernen
|
||||
pdfOrganiser.mode.8=Letzte entfernen
|
||||
pdfOrganiser.mode.9=Erste und letzte entfernen
|
||||
pdfOrganiser.placeholder=(z.B. 1,3,2 oder 4-8,2,10-12 oder 2n-1)
|
||||
|
||||
|
||||
#multiTool
|
||||
multiTool.title=PDF-Multitool
|
||||
multiTool.header=PDF-Multitool
|
||||
multiTool.uploadPrompts=Please Upload PDF
|
||||
multiTool.uploadPrompts=Bitte PDF hochladen
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=PDF anzeigen
|
||||
@@ -786,7 +799,7 @@ pageRemover.title=Seiten entfernen
|
||||
pageRemover.header=PDF Seiten entfernen
|
||||
pageRemover.pagesToDelete=Seiten zu entfernen (geben Sie eine Kommagetrennte Liste der Seitenzahlen an):
|
||||
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
|
||||
@@ -796,17 +809,17 @@ rotate.selectAngle=Wählen Sie den Winkel (in Vielfachen von 90 Grad):
|
||||
rotate.submit=Herunterladen
|
||||
|
||||
|
||||
#merge
|
||||
#split-pdfs
|
||||
split.title=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.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.4=Dokument #2: Seite 2 und 3
|
||||
split.desc.5=Dokument #3: Seite 4, 5 und 6
|
||||
split.desc.6=Dokument #4: Seite 7
|
||||
split.desc.7=Dokument #5: Seite 8
|
||||
split.desc.8=Dokument #6: Seite 9 und 10
|
||||
split.desc.5=Dokument #3: Seite 4, 5, 6 und 7
|
||||
split.desc.6=Dokument #4: Seite 8
|
||||
split.desc.7=Dokument #5: Seite 9
|
||||
split.desc.8=Dokument #6: Seite 10
|
||||
split.splitPages=Geben Sie die Seiten an, an denen aufgeteilt werden soll:
|
||||
split.submit=Aufteilen
|
||||
|
||||
@@ -875,7 +888,7 @@ watermark.selectText.8=Wasserzeichen Typ:
|
||||
watermark.selectText.9=Wasserzeichen-Bild:
|
||||
watermark.submit=Wasserzeichen hinzufügen
|
||||
watermark.type.1=Text
|
||||
watermark.type.2=Image
|
||||
watermark.type.2=Bild
|
||||
|
||||
|
||||
#Change permissions
|
||||
@@ -927,7 +940,7 @@ pdfToPDFA.title=PDF zu PDF/A
|
||||
pdfToPDFA.header=PDF zu PDF/A
|
||||
pdfToPDFA.credit=Dieser Dienst verwendet OCRmyPDF für die PDF/A-Konvertierung
|
||||
pdfToPDFA.submit=Konvertieren
|
||||
pdfToPDFA.tip=Currently does not work for multiple inputs at once
|
||||
pdfToPDFA.tip=Dieser Dienst kann nur einzelne Eingangsdateien verarbeiten.
|
||||
|
||||
|
||||
#PDFToWord
|
||||
@@ -957,7 +970,7 @@ PDFToText.submit=Konvertieren
|
||||
#PDFToHTML
|
||||
PDFToHTML.title=PDF zu HTML
|
||||
PDFToHTML.header=PDF zu HTML
|
||||
PDFToHTML.credit=Dieser Dienst verwendet LibreOffice für die Dateikonvertierung.
|
||||
PDFToHTML.credit=Dieser Dienst verwendet pdftohtml für die Dateikonvertierung.
|
||||
PDFToHTML.submit=Konvertieren
|
||||
|
||||
|
||||
@@ -1011,6 +1024,15 @@ split-by-sections.vertical.placeholder=Anzahl vertikaler Teiler eingeben
|
||||
split-by-sections.submit=PDF teilen
|
||||
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.nav=Lizenzen
|
||||
licenses.title=Lizenzen von Drittanbietern
|
||||
@@ -1020,3 +1042,16 @@ licenses.version=Version
|
||||
licenses.license=Lizenz
|
||||
|
||||
|
||||
# error
|
||||
error.sorry=Entschuldigung für das Problem!
|
||||
error.needHelp=Brauchst du Hilfe / Ein Problem gefunden?
|
||||
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 - Seite nicht gefunden | Ups, wir sind im Code gestolpert!
|
||||
error.404.1=Wir können die gesuchte Seite nicht finden.
|
||||
error.404.2=Etwas ist schiefgelaufen
|
||||
error.github=Ein Ticket auf GitHub einreichen
|
||||
error.showStack=Stack-Trace anzeigen
|
||||
error.copyStack=Stack-Trace kopieren
|
||||
error.githubSubmit=GitHub - Ein Ticket einreichen
|
||||
error.discordSubmit=Discord - Unterstützungsbeitrag einreichen
|
||||
|
||||
|
||||
@@ -10,18 +10,18 @@ multiPdfDropPrompt=Επιλογή (ή τράβηγμα αρχείου και α
|
||||
imgPrompt=Επιλογή Εικόνας(Εικόνων)
|
||||
genericSubmit=Υποβολή
|
||||
processTimeWarning=Προσοχή: Αυτή η διαδικασία μπορεί να διαρκέσει έως και ένα λεπτό ανάλογα με το μέγεθος του αρχείου
|
||||
pageOrderPrompt=Προσαρμοσμένη Σειρά Σελίδας (Προσθέστε μία λίστε απο αριθμούς σελιδών, χωρισμένες με κόμμα ή συναρτήσεις όπως 2n+1) :
|
||||
pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) :
|
||||
goToPage=Go
|
||||
pageOrderPrompt=Προσαρμοσμένη Σειρά Σελίδας (Προσθέστε μία λίστα απο αριθμούς σελιδών, χωρισμένες με κόμμα ή συναρτήσεις όπως 2n+1) :
|
||||
pageSelectionPrompt=Προσαρμοσμένη Επιλογή Σελίδας (Προσθέστε μία λίστα απο αριθμούς σελιδών, χωρισμένες με κόμμα 1,5,6 ή συναρτήσεις όπως 2n+1):
|
||||
goToPage=Πήγαινε
|
||||
true=Αληθές
|
||||
false=Λανθασμένο
|
||||
unknown=Άγνωστο
|
||||
save=Αποθήκευση
|
||||
saveToBrowser=Save to Browser
|
||||
saveToBrowser=Αποθήκευση στο Browser
|
||||
close=Κλείσιμο
|
||||
filesSelected=αρχεία που επιλέχθηκαν
|
||||
noFavourites=Κανένα αγαπήμενο δεν έχει προστεθεί
|
||||
downloadComplete=Download Complete
|
||||
downloadComplete=Η Λήψη Ολοκληρώθηκε
|
||||
bored=Βαριέστε να περιμένετε;
|
||||
alphabet=Αλφάβητο
|
||||
downloadPdf=Κατέβασμα του PDF
|
||||
@@ -45,43 +45,54 @@ red=Κόκκινο
|
||||
green=Πράσινο
|
||||
blue=Μπλέ
|
||||
custom=Προσαρμογή...
|
||||
WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
|
||||
poweredBy=Powered by
|
||||
yes=Yes
|
||||
no=No
|
||||
WorkInProgess=Εργασία σε εξέλιξη, Ενδέχεται να μην λειτουργεί ή να έχει λάθη, Παρακαλώ αναφέρετε τυχόν προβλήματα!
|
||||
poweredBy=Τροφοδοτείται από
|
||||
yes=Ναι
|
||||
no=Όχι
|
||||
changedCredsMessage=Τα διαπιστευτήρια έχουν αλλάξει!
|
||||
notAuthenticatedMessage=Ο χρήστης δεν έχει αυθεντικοποιηθεί.
|
||||
userNotFoundMessage=Ο χρήστης δεν βρέθηκε.
|
||||
incorrectPasswordMessage=Ο τρέχων κωδικός πρόσβασης είναι λανθασμένος.
|
||||
usernameExistsMessage=Το νέο όνομα χρήστη υπάρχει ήδη.
|
||||
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
|
||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||
invalidUsernameMessage=Μη έγκυρο όνομα χρήστη, το όνομα χρήστη πρέπει να περιέχει μόνο αλφαβητικούς χαρακτήρες και αριθμούς.
|
||||
deleteCurrentUserMessage=Δεν είναι δυνατή η διαγραφή του τρέχοντος συνδεδεμένου χρήστη.
|
||||
deleteUsernameExistsMessage=Το όνομα χρήστη δεν υπάρχει και δεν μπορεί να διαγραφεί.
|
||||
error=Σφάλμα
|
||||
oops=Ωχ!
|
||||
help=Βοήθεια
|
||||
goHomepage=Πήγαινε στην Αρχική Σελίδα
|
||||
joinDiscord=Εγγραφείτε στο Server του Discord μας
|
||||
seeDockerHub=Βλέπε το Docker Hub
|
||||
visitGithub=Επισκεφθείτε το Αποθετήριο του Github
|
||||
donate=Δωρισε
|
||||
color=Χρώμα
|
||||
sponsor=Yποστηρικτής
|
||||
|
||||
|
||||
|
||||
###############
|
||||
# Pipeline #
|
||||
###############
|
||||
pipeline.header=Pipeline Menu (Beta)
|
||||
pipeline.header=Μενού Pipeline (Beta)
|
||||
pipeline.uploadButton=Upload Custom
|
||||
pipeline.configureButton=Configure
|
||||
pipeline.configureButton=Διαμόρφωσε
|
||||
pipeline.defaultOption=Custom
|
||||
pipeline.submitButton=Submit
|
||||
pipeline.help=Pipeline Help
|
||||
pipeline.scanHelp=Folder Scanning Help
|
||||
pipeline.submitButton=Υποβολή
|
||||
pipeline.help=Βοήθεια για το Pipeline
|
||||
pipeline.scanHelp=Βοήθεια για Σάρωση Φακέλων
|
||||
|
||||
######################
|
||||
# Pipeline Options #
|
||||
######################
|
||||
pipelineOptions.header=Pipeline Configuration
|
||||
pipelineOptions.pipelineNameLabel=Pipeline Name
|
||||
pipelineOptions.saveSettings=Save Operation Settings
|
||||
pipelineOptions.pipelineNamePrompt=Enter pipeline name here
|
||||
pipelineOptions.selectOperation=Select Operation
|
||||
pipelineOptions.addOperationButton=Add operation
|
||||
pipelineOptions.header=Διαμόρφωση Pipeline
|
||||
pipelineOptions.pipelineNameLabel=Όνομα Pipeline
|
||||
pipelineOptions.saveSettings=Αποθήκευση Ρυθμίσεων Λειτουργίας
|
||||
pipelineOptions.pipelineNamePrompt=Εισαγάγετε το όνομα του pipeline εδώ
|
||||
pipelineOptions.selectOperation=Επιλέξτε Λειτουργία
|
||||
pipelineOptions.addOperationButton=Προσθήκη λειτουργίας
|
||||
pipelineOptions.pipelineHeader=Pipeline:
|
||||
pipelineOptions.saveButton=Download
|
||||
pipelineOptions.validateButton=Validate
|
||||
pipelineOptions.saveButton=Λήψη
|
||||
pipelineOptions.validateButton=Επικυρώνω
|
||||
|
||||
|
||||
|
||||
@@ -101,20 +112,22 @@ navbar.settings=Ρυθμίσεις
|
||||
#############
|
||||
settings.title=Ρυθμίσεις
|
||||
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.1=Άνοιγμα στο ίδιο παράθυρο
|
||||
settings.downloadOption.2=Άνοιγμα σε νέο παράθυρο
|
||||
settings.downloadOption.3=Λήψη αρχείου
|
||||
settings.zipThreshold=Zip αρχεία όταν ο αριθμός των ληφθέντων αρχείων είναι πολύ μεγάλος
|
||||
settings.zipThreshold=Αρχεία Zip όταν ο αριθμός των ληφθέντων αρχείων είναι πολύ μεγάλος
|
||||
settings.signOut=Αποσύνδεση
|
||||
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.header=Ενημέρωση των λεπτομερειών του Λογαριασμού σας
|
||||
changeCreds.changePassword=You are using default login credentials. Please enter a new password
|
||||
changeCreds.changePassword=Χρησιμοποιείτε προεπιλεγμένα διαπιστευτήρια σύνδεσης. Εισαγάγετε έναν νέο κωδικό πρόσβασης
|
||||
changeCreds.newUsername=Νέο Όνομα Χρήστη
|
||||
changeCreds.oldPassword=Τρέχων Κωδικός Πρόσβασης
|
||||
changeCreds.newPassword=Νέος Κωδικός Πρόσβασης
|
||||
@@ -154,10 +167,10 @@ adminUserSettings.roles=Ρόλοι
|
||||
adminUserSettings.role=Ρόλος
|
||||
adminUserSettings.actions=Ενέργειες
|
||||
adminUserSettings.apiUser=Περιορισμένος Χρήστης για διεπαφή προγραμματισμού εφαρμογών (API User)
|
||||
adminUserSettings.extraApiUser=Additional Limited API User
|
||||
adminUserSettings.extraApiUser=Πρόσθετος Περιορισμένος Χρήστης για Διεπαφή Προγραμματισμού Εφαρμογών (API User)
|
||||
adminUserSettings.webOnlyUser=Χρήστης μόνο Ιστού
|
||||
adminUserSettings.demoUser=Demo User (No custom settings)
|
||||
adminUserSettings.internalApiUser=Internal API User
|
||||
adminUserSettings.demoUser=Demo χρήστης (Χωρίς προσαρμοσμένες ρυθμίσεις)
|
||||
adminUserSettings.internalApiUser=Εσωτερικός API χρήστης
|
||||
adminUserSettings.forceChange=Αναγκάστε τον χρήστη να αλλάξει το όνομα χρήστη/κωδικό πρόσβασης κατά τη σύνδεση
|
||||
adminUserSettings.submit=Αποθήκευση Χρήστη
|
||||
|
||||
@@ -165,7 +178,7 @@ adminUserSettings.submit=Αποθήκευση Χρήστη
|
||||
# HOME-PAGE #
|
||||
#############
|
||||
home.desc=Η τοπικά φιλοξενούμενη one-stop-shop σας για όλες τις ανάγκες σας σε PDF.
|
||||
home.searchBar=Search for features...
|
||||
home.searchBar=Αναζήτηση για χαρακτηριστικά...
|
||||
|
||||
|
||||
home.viewPdf.title=Εμφάνιση PDF
|
||||
@@ -186,7 +199,7 @@ split.tags=Page operations,divide,Multi Page,cut,server side
|
||||
|
||||
home.rotate.title=Περιστροφή
|
||||
home.rotate.desc=Περιστροφή των PDF σας με εύκολο τρόπο.
|
||||
rotate.tags=server side
|
||||
rotate.tags=από την πλευρά του server
|
||||
|
||||
|
||||
home.imageToPdf.title=Εικόνα σε PDF
|
||||
@@ -379,35 +392,35 @@ home.autoRedact.title=Αυτόματο Μαύρισμα Κειμένου
|
||||
home.autoRedact.desc=Αυτόματη επεξεργασία (Μαύρισμα) κείμενου σε PDF με βάση το κείμενο εισαγωγής
|
||||
autoRedact.tags=Redact,Hide,black out,black,marker,hidden
|
||||
|
||||
home.tableExtraxt.title=PDF to CSV
|
||||
home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV
|
||||
home.tableExtraxt.title=PDF σε CSV
|
||||
home.tableExtraxt.desc=Εξάγει πίνακες από PDF μετατρέποντάς το σε CSV
|
||||
tableExtraxt.tags=CSV,Table Extraction,extract,convert
|
||||
|
||||
|
||||
home.autoSizeSplitPDF.title=Auto Split by Size/Count
|
||||
home.autoSizeSplitPDF.desc=Split a single PDF into multiple documents based on size, page count, or document count
|
||||
home.autoSizeSplitPDF.title=Αυτόματη διαίρεση κατά μέγεθος/πλήθος
|
||||
home.autoSizeSplitPDF.desc=Διαχωρίστε ένα μόνο PDF σε πολλά έγγραφα με βάση το μέγεθος, τον αριθμό σελίδων ή τον αριθμό εγγράφων
|
||||
autoSizeSplitPDF.tags=pdf,split,document,organization
|
||||
|
||||
|
||||
home.overlay-pdfs.title=Overlay PDFs
|
||||
home.overlay-pdfs.desc=Overlays PDFs on-top of another PDF
|
||||
home.overlay-pdfs.title=Επικάλυψη PDFs
|
||||
home.overlay-pdfs.desc=Επικαλύπτει αρχεία PDF πάνω σε άλλο PDF
|
||||
overlay-pdfs.tags=Overlay
|
||||
|
||||
home.split-by-sections.title=Split PDF by Sections
|
||||
home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections
|
||||
home.split-by-sections.title=Διαχωρισμός PDF ανά ενότητες
|
||||
home.split-by-sections.desc=Διαχωρίστε κάθε σελίδα ενός PDF σε μικρότερες οριζόντιες και κάθετες ενότητες
|
||||
split-by-sections.tags=Section Split, Divide, Customize
|
||||
|
||||
home.AddStampRequest.title=Add Stamp to PDF
|
||||
home.AddStampRequest.desc=Add text or add image stamps at set locations
|
||||
home.AddStampRequest.title=Προσθήκη σφραγίδας σε PDF
|
||||
home.AddStampRequest.desc=Προσθέστε κείμενο ή προσθέστε σφραγίδες εικόνας σε καθορισμένες τοποθεσίες
|
||||
AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize
|
||||
|
||||
|
||||
home.PDFToBook.title=PDF to Book
|
||||
home.PDFToBook.desc=Converts PDF to Book/Comic formats using calibre
|
||||
home.PDFToBook.title=PDF σε Book
|
||||
home.PDFToBook.desc=Μετατρέπει τις μορφές PDF σε Book/Comic χρησιμοποιώντας calibre
|
||||
PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle
|
||||
|
||||
home.BookToPDF.title=Book to PDF
|
||||
home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre
|
||||
home.BookToPDF.title=Book σε PDF
|
||||
home.BookToPDF.desc=Μετατρέπει τις μορφές Books/Comics σε PDF χρησιμοποιώντας calibre
|
||||
BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle
|
||||
|
||||
|
||||
@@ -456,7 +469,7 @@ pdfToSinglePage.submit=Μετατροπή σε Μονή Σελίδα
|
||||
pageExtracter.title=Εξαγωγή Σελίδων
|
||||
pageExtracter.header=EΕξαγωγή Σελίδων
|
||||
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
|
||||
@@ -488,37 +501,37 @@ HTMLToPDF.header=HTML σε PDF
|
||||
HTMLToPDF.help=Δέχεται αρχεία τύπου HTML και τύπου ZIP που περιέχουν html/css/εικόνες κ.λπ. που απαιτούνται
|
||||
HTMLToPDF.submit=Μετατροπή
|
||||
HTMLToPDF.credit=Χρησιμοποιεί WeasyPrint
|
||||
HTMLToPDF.zoom=Zoom level for displaying the website.
|
||||
HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default)
|
||||
HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default)
|
||||
HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default)
|
||||
HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default)
|
||||
HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default)
|
||||
HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default)
|
||||
HTMLToPDF.printBackground=Render the background of websites.
|
||||
HTMLToPDF.defaultHeader=Enable Default Header (Name and page number)
|
||||
HTMLToPDF.cssMediaType=Change the CSS media type of the page.
|
||||
HTMLToPDF.none=None
|
||||
HTMLToPDF.print=Print
|
||||
HTMLToPDF.zoom=Επίπεδο ζουμ για την εμφάνιση του ιστότοπου.
|
||||
HTMLToPDF.pageWidth=Το πλάτος της σελίδας σε εκατοστά. (Κενό έως προεπιλογή)
|
||||
HTMLToPDF.pageHeight=Το ύψος της σελίδας σε εκατοστά. (Κενό έως προεπιλογή)
|
||||
HTMLToPDF.marginTop=Το επάνω περιθώριο της σελίδας σε χιλιοστά. (Κενό έως προεπιλογή)
|
||||
HTMLToPDF.marginBottom=Κάτω περιθώριο σελίδας σε χιλιοστά. (Κενό έως προεπιλογή)
|
||||
HTMLToPDF.marginLeft=Το αριστερό περιθώριο της σελίδας σε χιλιοστά. (Κενό έως προεπιλογή)
|
||||
HTMLToPDF.marginRight=Το δεξί περιθώριο της σελίδας σε χιλιοστά. (Κενό έως προεπιλογή)
|
||||
HTMLToPDF.printBackground=Αποδώστε το φόντο των ιστοσελίδων.
|
||||
HTMLToPDF.defaultHeader=Ενεργοποίηση προεπιλεγμένης κεφαλίδας (Όνομα και αριθμός σελίδας)
|
||||
HTMLToPDF.cssMediaType=Αλλάξτε τον τύπο μέσων (media type )CSS της σελίδας.
|
||||
HTMLToPDF.none=Κανένα
|
||||
HTMLToPDF.print=Εκτύπωσε
|
||||
HTMLToPDF.screen=Screen
|
||||
|
||||
|
||||
#AddStampRequest
|
||||
AddStampRequest.header=Stamp PDF
|
||||
AddStampRequest.title=Stamp PDF
|
||||
AddStampRequest.stampType=Stamp Type
|
||||
AddStampRequest.stampText=Stamp Text
|
||||
AddStampRequest.stampImage=Stamp Image
|
||||
AddStampRequest.alphabet=Alphabet
|
||||
AddStampRequest.fontSize=Font/Image Size
|
||||
AddStampRequest.rotation=Rotation
|
||||
AddStampRequest.opacity=Opacity
|
||||
AddStampRequest.position=Position
|
||||
AddStampRequest.overrideX=Override X Coordinate
|
||||
AddStampRequest.overrideY=Override Y Coordinate
|
||||
AddStampRequest.customMargin=Custom Margin
|
||||
AddStampRequest.customColor=Custom Text Color
|
||||
AddStampRequest.submit=Submit
|
||||
AddStampRequest.header=Σφραγίδα PDF
|
||||
AddStampRequest.title=Σφραγίδα PDF
|
||||
AddStampRequest.stampType=Τύπος σφραγίδας
|
||||
AddStampRequest.stampText=Κείμενο σφραγίδας
|
||||
AddStampRequest.stampImage=Εικόνα σφραγίδας
|
||||
AddStampRequest.alphabet=Αλφάβητο
|
||||
AddStampRequest.fontSize=Μέγεθος γραμματοσειράς/εικόνας
|
||||
AddStampRequest.rotation=Περιστροφή
|
||||
AddStampRequest.opacity=Αδιαφάνεια
|
||||
AddStampRequest.position=Θέση
|
||||
AddStampRequest.overrideX=Override Συντεταγμένης X
|
||||
AddStampRequest.overrideY=Override Συντεταγμένης Ψ
|
||||
AddStampRequest.customMargin=Προσαρμοσμένο Περιθώριο
|
||||
AddStampRequest.customColor=Προσαρμοσμένο χρώμα κειμένου
|
||||
AddStampRequest.submit=Υποβολή
|
||||
|
||||
|
||||
#sanitizePDF
|
||||
@@ -607,11 +620,11 @@ scalePages.submit=Υποβολή
|
||||
certSign.title=Υπογραφή Πιστοποιητικού
|
||||
certSign.header=Υπογράψτε ένα αρχείο 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.selectCert=Επιλέξτε το αρχείο πιστοποιητικού σας (μορφή X.509, μπορεί να είναι .pem ή .der):
|
||||
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.password=Εισαγάγετε τον κωδικό του Keystore ή του Ιδιωτικού Κλειδιού (εάν υπάρχει):
|
||||
certSign.showSig=Εμφάνιση Υπογραφής
|
||||
@@ -632,9 +645,9 @@ removeBlanks.submit=Αφαίρεση Κενών
|
||||
|
||||
|
||||
#removeAnnotations
|
||||
removeAnnotations.title=Remove Annotations
|
||||
removeAnnotations.header=Remove Annotations
|
||||
removeAnnotations.submit=Remove
|
||||
removeAnnotations.title=Κατάργηση σχολιασμών
|
||||
removeAnnotations.header=Κατάργηση σχολιασμών
|
||||
removeAnnotations.submit=Κατάργηση
|
||||
|
||||
|
||||
#compare
|
||||
@@ -645,17 +658,17 @@ compare.document.2=Έγγραφο 2
|
||||
compare.submit=Σύγκριση
|
||||
|
||||
#BookToPDF
|
||||
BookToPDF.title=Books and Comics to PDF
|
||||
BookToPDF.header=Book to PDF
|
||||
BookToPDF.credit=Uses Calibre
|
||||
BookToPDF.submit=Convert
|
||||
BookToPDF.title=Books και Comics σε PDF
|
||||
BookToPDF.header=Book σε PDF
|
||||
BookToPDF.credit=Χρησιμοποιεί Caliber
|
||||
BookToPDF.submit=Μετατροπή
|
||||
|
||||
#PDFToBook
|
||||
PDFToBook.title=PDF to Book
|
||||
PDFToBook.header=PDF to Book
|
||||
PDFToBook.selectText.1=Format
|
||||
PDFToBook.credit=Uses Calibre
|
||||
PDFToBook.submit=Convert
|
||||
PDFToBook.title=PDF σε Book
|
||||
PDFToBook.header=PDF σε Book
|
||||
PDFToBook.selectText.1=Μορφή
|
||||
PDFToBook.credit=Χρησιμοποιεί Caliber
|
||||
PDFToBook.submit=Μετατροπή
|
||||
|
||||
#sign
|
||||
sign.title=Υπογραφή
|
||||
@@ -742,7 +755,7 @@ compress.submit=Συμπίεση
|
||||
#Add image
|
||||
addImage.title=Προσθήκη Εικόνας
|
||||
addImage.header=Προσθήκη Εικόνας σε PDF
|
||||
addImage.everyPage=Κάθε Σελίδα?
|
||||
addImage.everyPage=Κάθε Σελίδα;
|
||||
addImage.upload=Προσθήκη Εικόνας
|
||||
addImage.submit=Προσθήκη Εικόνας
|
||||
|
||||
@@ -760,53 +773,53 @@ pdfOrganiser.title=Διοργανωτής σελίδας
|
||||
pdfOrganiser.header=Διοργανωτής σελίδας PDF
|
||||
pdfOrganiser.submit=Αναδιάταξη σελίδων
|
||||
pdfOrganiser.mode=Mode
|
||||
pdfOrganiser.mode.1=Custom Page Order
|
||||
pdfOrganiser.mode.2=Reverse Order
|
||||
pdfOrganiser.mode.3=Duplex Sort
|
||||
pdfOrganiser.mode.4=Booklet Sort
|
||||
pdfOrganiser.mode.1=Προσαρμοσμένη Σειρά Σελίδας
|
||||
pdfOrganiser.mode.2=Αντίστροφη Σειρά
|
||||
pdfOrganiser.mode.3=Ταξινόμηση Διπλής Όψης (Duplex Sort)
|
||||
pdfOrganiser.mode.4=Ταξινόμηση Φυλλαδίου (Booklet Sort)
|
||||
pdfOrganiser.mode.5=Side Stitch Booklet Sort
|
||||
pdfOrganiser.mode.6=Odd-Even Split
|
||||
pdfOrganiser.mode.7=Remove First
|
||||
pdfOrganiser.mode.8=Remove Last
|
||||
pdfOrganiser.mode.9=Remove First and Last
|
||||
pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
||||
pdfOrganiser.mode.6=Διαίρεση Μονού-Ζυγού
|
||||
pdfOrganiser.mode.7=Αφαίρεση Πρώτου
|
||||
pdfOrganiser.mode.8=Αφαίρεση Τελευταίου
|
||||
pdfOrganiser.mode.9=Αφαίρεση Πρώτου και Τελευταίου
|
||||
pdfOrganiser.placeholder=(π.χ. 1,3,2 ή 4-8,2,10-12 ή 2n-1)
|
||||
|
||||
|
||||
#multiTool
|
||||
multiTool.title=PDF Πολυεργαλείο
|
||||
multiTool.header=PDF Πολυεργαλείο
|
||||
multiTool.uploadPrompts=Please Upload PDF
|
||||
multiTool.uploadPrompts=Ανεβάστε το PDF
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=View PDF
|
||||
viewPdf.header=View PDF
|
||||
viewPdf.title=Προβολή PDF
|
||||
viewPdf.header=Προβολή PDF
|
||||
|
||||
#pageRemover
|
||||
pageRemover.title=Αφαιρετής Σελίδων
|
||||
pageRemover.header=Αφαιρετής Σελίδων PDF
|
||||
pageRemover.pagesToDelete=Σελίδες προς διαγραφή (Εισαγάγετε μια λίστα με αριθμούς σελίδων διαχωρισμένων με κόμματα):
|
||||
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.title=Περιστροφή PDF
|
||||
rotate.header=Περιστροφή PDF
|
||||
rotate.selectAngle=Select rotation angle (in multiples of 90 degrees):
|
||||
rotate.submit=Rotate
|
||||
rotate.selectAngle=Επιλέξτε γωνία περιστροφής (σε πολλαπλάσια των 90 μοιρών):
|
||||
rotate.submit=Περιστροφή
|
||||
|
||||
|
||||
#merge
|
||||
#split-pdfs
|
||||
split.title=Διαίρεση PDF
|
||||
split.header=Διαίρεση PDF
|
||||
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.4=Έγγραφο #2: Σελίδα 2 και 3
|
||||
split.desc.5=Έγγραφο #3: Σελίδα 4, 5 κσι 6
|
||||
split.desc.6=Έγγραφο #4: Σελίδα 7
|
||||
split.desc.7=Έγγραφο #5: Σελίδα 8
|
||||
split.desc.8=Έγγραφο #6: Σελίδα 9 και 10
|
||||
split.desc.5=Έγγραφο #3: Σελίδα 4, 5, 6 και 7
|
||||
split.desc.6=Έγγραφο #4: Σελίδα 8
|
||||
split.desc.7=Έγγραφο #5: Σελίδα 9
|
||||
split.desc.8=Έγγραφο #6: Σελίδα 10
|
||||
split.splitPages=Εισαγάγετε σελίδες για διαχωρισμό:
|
||||
split.submit=Διαίρεση
|
||||
|
||||
@@ -874,8 +887,8 @@ watermark.selectText.7=Αδιαφάνεια (Opacity) (0% - 100%):
|
||||
watermark.selectText.8=Τύπος Υδατογραφήματος:
|
||||
watermark.selectText.9=Εικόνα Υδατογραφήματος:
|
||||
watermark.submit=Προσθήκη Υδατογραφήματος
|
||||
watermark.type.1=Text
|
||||
watermark.type.2=Image
|
||||
watermark.type.1=Κείμενο
|
||||
watermark.type.2=Εικόνα
|
||||
|
||||
|
||||
#Change permissions
|
||||
@@ -927,7 +940,7 @@ pdfToPDFA.title=PDF σε PDF/A
|
||||
pdfToPDFA.header=PDF σε PDF/A
|
||||
pdfToPDFA.credit=Αυτή η υπηρεσία χρησιμοποιεί OCRmyPDF για PDF/A μετατροπή
|
||||
pdfToPDFA.submit=Μετατροπή
|
||||
pdfToPDFA.tip=Currently does not work for multiple inputs at once
|
||||
pdfToPDFA.tip=Προς το παρόν δεν λειτουργεί για πολλαπλές εισόδους ταυτόχρονα
|
||||
|
||||
|
||||
#PDFToWord
|
||||
@@ -957,7 +970,7 @@ PDFToText.submit=Μετατροπή
|
||||
#PDFToHTML
|
||||
PDFToHTML.title=PDF σε HTML
|
||||
PDFToHTML.header=PDF σε HTML
|
||||
PDFToHTML.credit=Αυτή η υπηρεσία χρησιμοποιεί LibreOffice για τη μετατροπή των αρχείων.
|
||||
PDFToHTML.credit=Αυτή η υπηρεσία χρησιμοποιεί pdftohtml για τη μετατροπή των αρχείων.
|
||||
PDFToHTML.submit=Μετατροπή
|
||||
|
||||
|
||||
@@ -968,55 +981,77 @@ PDFToXML.credit=Αυτή η υπηρεσία χρησιμοποιεί LibreOffic
|
||||
PDFToXML.submit=Μετατροπή
|
||||
|
||||
#PDFToCSV
|
||||
PDFToCSV.title=PDF ?? CSV
|
||||
PDFToCSV.header=PDF ?? CSV
|
||||
PDFToCSV.prompt=Choose page to extract table
|
||||
PDFToCSV.submit=?????????
|
||||
PDFToCSV.title=PDF σε CSV
|
||||
PDFToCSV.header=PDF σε CSV
|
||||
PDFToCSV.prompt=Επιλέξτε σελίδα για εξαγωγή πίνακα
|
||||
PDFToCSV.submit=Εξαξωγή
|
||||
|
||||
#split-by-size-or-count
|
||||
split-by-size-or-count.title=Split PDF by Size or Count
|
||||
split-by-size-or-count.header=Split PDF by Size or Count
|
||||
split-by-size-or-count.type.label=Select Split Type
|
||||
split-by-size-or-count.type.size=By Size
|
||||
split-by-size-or-count.type.pageCount=By Page Count
|
||||
split-by-size-or-count.type.docCount=By Document Count
|
||||
split-by-size-or-count.value.label=Enter Value
|
||||
split-by-size-or-count.value.placeholder=Enter size (e.g., 2MB or 3KB) or count (e.g., 5)
|
||||
split-by-size-or-count.submit=Submit
|
||||
split-by-size-or-count.title=Διαχωρίστε το PDF Κατά Μέγεθος ή Μέτρηση
|
||||
split-by-size-or-count.header=Διαχωρίστε το PDF Κατά Μέγεθος ή Μέτρηση
|
||||
split-by-size-or-count.type.label=Επιλέξτε Τύπος Διαχωρισμού
|
||||
split-by-size-or-count.type.size=Ανά Μέγεθος
|
||||
split-by-size-or-count.type.pageCount=Ανά αριθμό σελίδων
|
||||
split-by-size-or-count.type.docCount=Ανά αριθμό εγγράφων
|
||||
split-by-size-or-count.value.label=Εισαγάγετε τιμή
|
||||
split-by-size-or-count.value.placeholder=Εισαγάγετε μέγεθος (π.χ. 2MB ή 3KB) ή μέτρηση (π.χ. 5)
|
||||
split-by-size-or-count.submit=Υποβολή
|
||||
|
||||
|
||||
#overlay-pdfs
|
||||
overlay-pdfs.header=Overlay PDF Files
|
||||
overlay-pdfs.baseFile.label=Select Base PDF File
|
||||
overlay-pdfs.overlayFiles.label=Select Overlay PDF Files
|
||||
overlay-pdfs.mode.label=Select Overlay Mode
|
||||
overlay-pdfs.mode.sequential=Sequential Overlay
|
||||
overlay-pdfs.mode.interleaved=Interleaved Overlay
|
||||
overlay-pdfs.mode.fixedRepeat=Fixed Repeat Overlay
|
||||
overlay-pdfs.counts.label=Overlay Counts (for Fixed Repeat Mode)
|
||||
overlay-pdfs.counts.placeholder=Enter comma-separated counts (e.g., 2,3,1)
|
||||
overlay-pdfs.position.label=Select Overlay Position
|
||||
overlay-pdfs.header=Επικάλυψη αρχείων PDF
|
||||
overlay-pdfs.baseFile.label=Επιλέξτε Βασικό αρχείο PDF
|
||||
overlay-pdfs.overlayFiles.label=Επιλέξτε Επικάλυψη αρχείων PDF
|
||||
overlay-pdfs.mode.label=Επιλέξτε Λειτουργία Επικάλυψης
|
||||
overlay-pdfs.mode.sequential=Διαδοχική Επικάλυψη
|
||||
overlay-pdfs.mode.interleaved=Επικάλυψη με Παρεμβολή
|
||||
overlay-pdfs.mode.fixedRepeat=Διορθώθηκε η Επικάλυψη Επανάληψης
|
||||
overlay-pdfs.counts.label=Μετρήσεις επικάλυψης (για σταθερή λειτουργία επανάληψης)
|
||||
overlay-pdfs.counts.placeholder=Εισαγάγετε μετρήσεις διαχωρισμένες με κόμματα (π.χ. 2,3,1)
|
||||
overlay-pdfs.position.label=Επιλέξτε Θέση Επικάλυψης
|
||||
overlay-pdfs.position.foreground=Foreground
|
||||
overlay-pdfs.position.background=Background
|
||||
overlay-pdfs.submit=Submit
|
||||
overlay-pdfs.submit=Υποβολή
|
||||
|
||||
|
||||
#split-by-sections
|
||||
split-by-sections.title=Split PDF by Sections
|
||||
split-by-sections.header=Split PDF into Sections
|
||||
split-by-sections.horizontal.label=Horizontal Divisions
|
||||
split-by-sections.vertical.label=Vertical Divisions
|
||||
split-by-sections.horizontal.placeholder=Enter number of horizontal divisions
|
||||
split-by-sections.vertical.placeholder=Enter number of vertical divisions
|
||||
split-by-sections.submit=Split PDF
|
||||
split-by-sections.merge=Merge Into One PDF
|
||||
split-by-sections.title=Διαχωρισμός PDF ανά ενότητες
|
||||
split-by-sections.header=Διαχωρίστε το PDF σε Ενότητες
|
||||
split-by-sections.horizontal.label=Οριζόντιες Διαιρέσεις
|
||||
split-by-sections.vertical.label=Κάθετες Διαιρέσεις
|
||||
split-by-sections.horizontal.placeholder=Εισαγάγετε τον αριθμό των οριζόντιων διαιρέσεων
|
||||
split-by-sections.vertical.placeholder=Εισαγάγετε τον αριθμό των κάθετων διαιρέσεων
|
||||
split-by-sections.submit=Διαχωρισμός 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.nav=Licenses
|
||||
licenses.title=3rd Party Licenses
|
||||
licenses.header=3rd Party Licenses
|
||||
licenses.nav=Άδειες
|
||||
licenses.title=3rd Party Άδειες
|
||||
licenses.header=3rd Party Άδειες
|
||||
licenses.module=Module
|
||||
licenses.version=Version
|
||||
licenses.license=License
|
||||
licenses.version=Εκδοχή
|
||||
licenses.license=Άδεια
|
||||
|
||||
|
||||
# error
|
||||
error.sorry=Συγγνώμη για το ζήτημα!
|
||||
error.needHelp=Χρειάζεστε βοήθεια / Βρήκατε πρόβλημα;
|
||||
error.contactTip=Εάν εξακολουθείτε να αντιμετωπίζετε προβλήματα, μη διστάσετε να επικοινωνήσετε μαζί μας για βοήθεια. Μπορείτε να υποβάλετε ένα ticket στη σελίδα μας στο GitHub ή να επικοινωνήσετε μαζί μας μέσω του Discord:
|
||||
error.404.head=404 - Η σελίδα δεν βρέθηκε | Oops, we tripped in the code!
|
||||
error.404.1=Δεν μπορούμε να βρούμε τη σελίδα που ψάχνετε.
|
||||
error.404.2=Κάτι πήγε στραβά
|
||||
error.github=Υποβάλετε ένα ticket στο GitHub
|
||||
error.showStack=Εμφάνιση Stack Trace
|
||||
error.copyStack=Αντιγραφή Stack Trace
|
||||
error.githubSubmit=GitHub - Υποβάλετε ένα ticket
|
||||
error.discordSubmit=Discord - Υποβάλετε ένα Support post
|
||||
|
||||
|
||||
@@ -57,6 +57,17 @@ usernameExistsMessage=New Username already exists.
|
||||
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
|
||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||
error=Error
|
||||
oops=Oops!
|
||||
help=Help
|
||||
goHomepage=Go to Homepage
|
||||
joinDiscord=Join our Discord server
|
||||
seeDockerHub=See Docker Hub
|
||||
visitGithub=Visit Github Repository
|
||||
donate=Donate
|
||||
color=Color
|
||||
sponsor=Sponsor
|
||||
|
||||
|
||||
|
||||
###############
|
||||
@@ -101,6 +112,7 @@ navbar.settings=Settings
|
||||
#############
|
||||
settings.title=Settings
|
||||
settings.update=Update available
|
||||
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
|
||||
settings.appVersion=App Version:
|
||||
settings.downloadOption.title=Choose download option (For single file non zip downloads):
|
||||
settings.downloadOption.1=Open in same window
|
||||
@@ -109,8 +121,9 @@ settings.downloadOption.3=Download file
|
||||
settings.zipThreshold=Zip files when the number of downloaded files exceeds
|
||||
settings.signOut=Sign Out
|
||||
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.header=Update Your Account Details
|
||||
@@ -796,17 +809,17 @@ rotate.selectAngle=Select rotation angle (in multiples of 90 degrees):
|
||||
rotate.submit=Rotate
|
||||
|
||||
|
||||
#merge
|
||||
#split-pdfs
|
||||
split.title=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.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.4=Document #2: Page 2 and 3
|
||||
split.desc.5=Document #3: Page 4, 5 and 6
|
||||
split.desc.6=Document #4: Page 7
|
||||
split.desc.7=Document #5: Page 8
|
||||
split.desc.8=Document #6: Page 9 and 10
|
||||
split.desc.5=Document #3: Page 4, 5, 6 and 7
|
||||
split.desc.6=Document #4: Page 8
|
||||
split.desc.7=Document #5: Page 9
|
||||
split.desc.8=Document #6: Page 10
|
||||
split.splitPages=Enter pages to split on:
|
||||
split.submit=Split
|
||||
|
||||
@@ -957,7 +970,7 @@ PDFToText.submit=Convert
|
||||
#PDFToHTML
|
||||
PDFToHTML.title=PDF to HTML
|
||||
PDFToHTML.header=PDF to HTML
|
||||
PDFToHTML.credit=This service uses LibreOffice for file conversion.
|
||||
PDFToHTML.credit=This service uses pdftohtml for file conversion.
|
||||
PDFToHTML.submit=Convert
|
||||
|
||||
|
||||
@@ -1011,6 +1024,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions
|
||||
split-by-sections.submit=Split 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.nav=Licenses
|
||||
licenses.title=3rd Party Licenses
|
||||
@@ -1020,3 +1042,16 @@ licenses.version=Version
|
||||
licenses.license=License
|
||||
|
||||
|
||||
# error
|
||||
error.sorry=Sorry for the issue!
|
||||
error.needHelp=Need help / Found an issue?
|
||||
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.404.head=404 - Page Not Found | Oops, we tripped in the code!
|
||||
error.404.1=We can't seem to find the page you're looking for.
|
||||
error.404.2=Something went wrong
|
||||
error.github=Submit a ticket on GitHub
|
||||
error.showStack=Show Stack Trace
|
||||
error.copyStack=Copy Stack Trace
|
||||
error.githubSubmit=GitHub - Submit a ticket
|
||||
error.discordSubmit=Discord - Submit Support post
|
||||
|
||||
|
||||
@@ -57,6 +57,17 @@ usernameExistsMessage=New Username already exists.
|
||||
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
|
||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||
error=Error
|
||||
oops=Oops!
|
||||
help=Help
|
||||
goHomepage=Go to Homepage
|
||||
joinDiscord=Join our Discord server
|
||||
seeDockerHub=See Docker Hub
|
||||
visitGithub=Visit Github Repository
|
||||
donate=Donate
|
||||
color=Color
|
||||
sponsor=Sponsor
|
||||
|
||||
|
||||
|
||||
###############
|
||||
@@ -101,6 +112,7 @@ navbar.settings=Settings
|
||||
#############
|
||||
settings.title=Settings
|
||||
settings.update=Update available
|
||||
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
|
||||
settings.appVersion=App Version:
|
||||
settings.downloadOption.title=Choose download option (For single file non zip downloads):
|
||||
settings.downloadOption.1=Open in same window
|
||||
@@ -109,8 +121,9 @@ settings.downloadOption.3=Download file
|
||||
settings.zipThreshold=Zip files when the number of downloaded files exceeds
|
||||
settings.signOut=Sign Out
|
||||
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.header=Update Your Account Details
|
||||
@@ -796,17 +809,17 @@ rotate.selectAngle=Select rotation angle (in multiples of 90 degrees):
|
||||
rotate.submit=Rotate
|
||||
|
||||
|
||||
#merge
|
||||
#split-pdfs
|
||||
split.title=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.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.4=Document #2: Page 2 and 3
|
||||
split.desc.5=Document #3: Page 4, 5 and 6
|
||||
split.desc.6=Document #4: Page 7
|
||||
split.desc.7=Document #5: Page 8
|
||||
split.desc.8=Document #6: Page 9 and 10
|
||||
split.desc.5=Document #3: Page 4, 5, 6, 7
|
||||
split.desc.6=Document #4: Page 8
|
||||
split.desc.7=Document #5: Page 9
|
||||
split.desc.8=Document #6: Page 10
|
||||
split.splitPages=Enter pages to split on:
|
||||
split.submit=Split
|
||||
|
||||
@@ -957,7 +970,7 @@ PDFToText.submit=Convert
|
||||
#PDFToHTML
|
||||
PDFToHTML.title=PDF to HTML
|
||||
PDFToHTML.header=PDF to HTML
|
||||
PDFToHTML.credit=This service uses LibreOffice for file conversion.
|
||||
PDFToHTML.credit=This service uses pdftohtml for file conversion.
|
||||
PDFToHTML.submit=Convert
|
||||
|
||||
|
||||
@@ -1011,6 +1024,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions
|
||||
split-by-sections.submit=Split 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.nav=Licenses
|
||||
licenses.title=3rd Party Licenses
|
||||
@@ -1020,3 +1042,16 @@ licenses.version=Version
|
||||
licenses.license=License
|
||||
|
||||
|
||||
# error
|
||||
error.sorry=Sorry for the issue!
|
||||
error.needHelp=Need help / Found an issue?
|
||||
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.404.head=404 - Page Not Found | Oops, we tripped in the code!
|
||||
error.404.1=We can't seem to find the page you're looking for.
|
||||
error.404.2=Something went wrong
|
||||
error.github=Submit a ticket on GitHub
|
||||
error.showStack=Show Stack Trace
|
||||
error.copyStack=Copy Stack Trace
|
||||
error.githubSubmit=GitHub - Submit a ticket
|
||||
error.discordSubmit=Discord - Submit Support post
|
||||
|
||||
|
||||
@@ -57,6 +57,17 @@ usernameExistsMessage=El nuevo nombre de usuario está en uso.
|
||||
invalidUsernameMessage=Nombre de usuario no válido, El nombre de ususario debe contener únicamente números y caracteres alfabéticos.
|
||||
deleteCurrentUserMessage=No puede eliminar el usuario que tiene la sesión actualmente en uso.
|
||||
deleteUsernameExistsMessage=El usuario no existe y no puede eliminarse.
|
||||
error=Error
|
||||
oops=Ups!
|
||||
help=Help
|
||||
goHomepage=Ir a la página principal
|
||||
joinDiscord=Únase a nuestro servidor Discord
|
||||
seeDockerHub=Ver Docker Hub
|
||||
visitGithub=Visitar Repositorio de Github
|
||||
donate=Donar
|
||||
color=Color
|
||||
sponsor=Patrocinador
|
||||
|
||||
|
||||
|
||||
###############
|
||||
@@ -67,8 +78,8 @@ pipeline.uploadButton=Cargar personalización
|
||||
pipeline.configureButton=Configurar
|
||||
pipeline.defaultOption=Personalizar
|
||||
pipeline.submitButton=Enviar
|
||||
pipeline.help=Pipeline Help
|
||||
pipeline.scanHelp=Folder Scanning Help
|
||||
pipeline.help=Ayuda de Canalización
|
||||
pipeline.scanHelp=Ayuda de escaneado de carpetas
|
||||
|
||||
######################
|
||||
# Pipeline Options #
|
||||
@@ -101,6 +112,7 @@ navbar.settings=Configuración
|
||||
#############
|
||||
settings.title=Configuración
|
||||
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.downloadOption.title=Elegir la opción de descarga (para descargas de un solo archivo sin ZIP):
|
||||
settings.downloadOption.1=Abrir en la misma ventana
|
||||
@@ -109,8 +121,9 @@ settings.downloadOption.3=Descargar el archivo
|
||||
settings.zipThreshold=Archivos ZIP cuando excede el número de archivos descargados
|
||||
settings.signOut=Desconectar
|
||||
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.header=Actualice los detalles de su cuenta
|
||||
@@ -234,7 +247,7 @@ compressPdfs.tags=aplastar,pequeño,diminuto
|
||||
|
||||
home.changeMetadata.title=Cambiar metadatos
|
||||
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.desc=Convertir casi cualquier archivo a PDF (DOCX, PNG, XLS, PPT, TXT y más)
|
||||
@@ -759,23 +772,23 @@ merge.submit=Unir
|
||||
pdfOrganiser.title=Organizador de páginas
|
||||
pdfOrganiser.header=Organizador de páginas PDF
|
||||
pdfOrganiser.submit=Organizar páginas
|
||||
pdfOrganiser.mode=Mode
|
||||
pdfOrganiser.mode.1=Custom Page Order
|
||||
pdfOrganiser.mode.2=Reverse Order
|
||||
pdfOrganiser.mode.3=Duplex Sort
|
||||
pdfOrganiser.mode.4=Booklet Sort
|
||||
pdfOrganiser.mode.5=Side Stitch Booklet Sort
|
||||
pdfOrganiser.mode.6=Odd-Even Split
|
||||
pdfOrganiser.mode.7=Remove First
|
||||
pdfOrganiser.mode.8=Remove Last
|
||||
pdfOrganiser.mode.9=Remove First and Last
|
||||
pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
||||
pdfOrganiser.mode=Modo
|
||||
pdfOrganiser.mode.1=Orden de páginas personalizado
|
||||
pdfOrganiser.mode.2=Orden inverso
|
||||
pdfOrganiser.mode.3=Ordenar dúplex
|
||||
pdfOrganiser.mode.4=Ordenar folleto
|
||||
pdfOrganiser.mode.5=Orden de folleto de encuadernado lateral
|
||||
pdfOrganiser.mode.6=División par-impar
|
||||
pdfOrganiser.mode.7=Quitar primera
|
||||
pdfOrganiser.mode.8=Quitar última
|
||||
pdfOrganiser.mode.9=Quitar primera y última
|
||||
pdfOrganiser.placeholder=(por ej., 1,3,2 o 4-8,2,10-12 o 2n-1)
|
||||
|
||||
|
||||
#multiTool
|
||||
multiTool.title=Multi-herramienta PDF
|
||||
multiTool.header=Multi-herramienta PDF
|
||||
multiTool.uploadPrompts=Please Upload PDF
|
||||
multiTool.uploadPrompts=Por favor, cargue PDF
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=Ver PDF
|
||||
@@ -796,17 +809,17 @@ rotate.selectAngle=Seleccionar ángulo de rotación (en múltiplos de 90 grados)
|
||||
rotate.submit=Rotar
|
||||
|
||||
|
||||
#merge
|
||||
#split-pdfs
|
||||
split.title=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.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.4=Documento #2: Páginas 2 y 3
|
||||
split.desc.5=Documento #3: Páginas 4, 5 y 6
|
||||
split.desc.6=Documento #4: Página 7
|
||||
split.desc.7=Documento #5: Página 8
|
||||
split.desc.8=Documento #6: Páginas 9 y 10
|
||||
split.desc.5=Documento #3: Páginas 4, 5, 6 y 7
|
||||
split.desc.6=Documento #4: Página 8
|
||||
split.desc.7=Documento #5: Página 9
|
||||
split.desc.8=Documento #6: Páginas 10
|
||||
split.splitPages=Introducir las páginas para dividir:
|
||||
split.submit=Dividir
|
||||
|
||||
@@ -874,8 +887,8 @@ watermark.selectText.7=Opacidad (0% - 100%):
|
||||
watermark.selectText.8=Tipo de marca de agua:
|
||||
watermark.selectText.9=Imagen de marca de agua:
|
||||
watermark.submit=Añadir marca de agua
|
||||
watermark.type.1=Text
|
||||
watermark.type.2=Image
|
||||
watermark.type.1=Texto
|
||||
watermark.type.2=Imagen
|
||||
|
||||
|
||||
#Change permissions
|
||||
@@ -927,7 +940,7 @@ pdfToPDFA.title=PDF a PDF/A
|
||||
pdfToPDFA.header=PDF a PDF/A
|
||||
pdfToPDFA.credit=Este servicio usa OCRmyPDF para la conversión a PDF/A
|
||||
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
|
||||
|
||||
|
||||
#PDFToWord
|
||||
@@ -957,7 +970,7 @@ PDFToText.submit=Convertir
|
||||
#PDFToHTML
|
||||
PDFToHTML.title=PDF a HTML
|
||||
PDFToHTML.header=PDF a HTML
|
||||
PDFToHTML.credit=Este servicio utiliza LibreOffice para la conversión de archivos
|
||||
PDFToHTML.credit=Este servicio utiliza pdftohtml para la conversión de archivos
|
||||
PDFToHTML.submit=Convertir
|
||||
|
||||
|
||||
@@ -1011,6 +1024,15 @@ split-by-sections.vertical.placeholder=Introduzca el número de divisiones verti
|
||||
split-by-sections.submit=Dividir 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.nav=Licencias
|
||||
licenses.title=Licencias de terceros
|
||||
@@ -1020,3 +1042,16 @@ licenses.version=Versión
|
||||
licenses.license=Licencia
|
||||
|
||||
|
||||
# error
|
||||
error.sorry=¡Perdón por el fallo!
|
||||
error.needHelp=Necesita ayuda / Encontró un fallo?
|
||||
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 - Página no encontrada | Ups, tropezamos con el código!
|
||||
error.404.1=Parece que no podemos encontrar la página que está buscando.
|
||||
error.404.2=Algo salió mal
|
||||
error.github=Envíe un ticket en GitHub
|
||||
error.showStack=Mostrar seguimiento de pila
|
||||
error.copyStack=Mostrar seguimiento de pila
|
||||
error.githubSubmit=GitHub - Enviar un ticket
|
||||
error.discordSubmit=Discord - Enviar mensaje de soporte
|
||||
|
||||
|
||||
@@ -57,6 +57,17 @@ usernameExistsMessage=New Username already exists.
|
||||
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
|
||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||
error=Error
|
||||
oops=Oops!
|
||||
help=Help
|
||||
goHomepage=Go to Homepage
|
||||
joinDiscord=Join our Discord server
|
||||
seeDockerHub=See Docker Hub
|
||||
visitGithub=Visit Github Repository
|
||||
donate=Donate
|
||||
color=Color
|
||||
sponsor=Sponsor
|
||||
|
||||
|
||||
|
||||
###############
|
||||
@@ -101,6 +112,7 @@ navbar.settings=Ezarpenak
|
||||
#############
|
||||
settings.title=Ezarpenak
|
||||
settings.update=Eguneratze eskuragarria
|
||||
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
|
||||
settings.appVersion=Aplikazioaren bertsioa:
|
||||
settings.downloadOption.title=Hautatu deskargatzeko aukera (fitxategi bakarra deskargatzeko ZIP gabe):
|
||||
settings.downloadOption.1=Ireki leiho berean
|
||||
@@ -109,8 +121,9 @@ settings.downloadOption.3=Deskargatu fitxategia
|
||||
settings.zipThreshold=ZIP fitxategiak deskargatutako fitxategi kopurua gainditzen denean
|
||||
settings.signOut=Saioa itxi
|
||||
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.header=Update Your Account Details
|
||||
@@ -796,17 +809,17 @@ rotate.selectAngle=Hautatu errotazio-angelua (90 graduko multiploetan):
|
||||
rotate.submit=Biratu
|
||||
|
||||
|
||||
#merge
|
||||
#split-pdfs
|
||||
split.title=Zatitu PDFa
|
||||
split.header=Zatitu PDFa
|
||||
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.4=#2 Dokumentua: 2. eta 3. orrialdeak
|
||||
split.desc.5=#3 Dokumentua: 4., 5. eta 6. orrialdeak
|
||||
split.desc.6=#4 Dokumentua: 7. orrialdea
|
||||
split.desc.7=#5 Dokumentua: 8. orrialdea
|
||||
split.desc.8=#6 Dokumentua: 9. eta 10. orrialdeak
|
||||
split.desc.5=#3 Dokumentua: 4., 5., 6. eta 7. orrialdeak
|
||||
split.desc.6=#4 Dokumentua: 8. orrialdea
|
||||
split.desc.7=#5 Dokumentua: 9. orrialdea
|
||||
split.desc.8=#6 Dokumentua: 10. orrialdeak
|
||||
split.splitPages=Sartu orrialdeak zatitzeko:
|
||||
split.submit=Zatitu
|
||||
|
||||
@@ -957,7 +970,7 @@ PDFToText.submit=Bihurtu
|
||||
#PDFToHTML
|
||||
PDFToHTML.title=PDFa HTML bihurtu
|
||||
PDFToHTML.header=PDFa HTML bihurtu
|
||||
PDFToHTML.credit=Zerbitzu honek LibreOffice erabiltzen du fitxategiak bihurtzeko
|
||||
PDFToHTML.credit=Zerbitzu honek pdftohtml erabiltzen du fitxategiak bihurtzeko
|
||||
PDFToHTML.submit=Bihurtu
|
||||
|
||||
|
||||
@@ -1011,6 +1024,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions
|
||||
split-by-sections.submit=Split 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.nav=Licenses
|
||||
licenses.title=3rd Party Licenses
|
||||
@@ -1020,3 +1042,16 @@ licenses.version=Version
|
||||
licenses.license=License
|
||||
|
||||
|
||||
# error
|
||||
error.sorry=Sorry for the issue!
|
||||
error.needHelp=Need help / Found an issue?
|
||||
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.404.head=404 - Page Not Found | Oops, we tripped in the code!
|
||||
error.404.1=We can't seem to find the page you're looking for.
|
||||
error.404.2=Something went wrong
|
||||
error.github=Submit a ticket on GitHub
|
||||
error.showStack=Show Stack Trace
|
||||
error.copyStack=Copy Stack Trace
|
||||
error.githubSubmit=GitHub - Submit a ticket
|
||||
error.discordSubmit=Discord - Submit Support post
|
||||
|
||||
|
||||
@@ -54,16 +54,27 @@ notAuthenticatedMessage=Utilisateur non authentifié.
|
||||
userNotFoundMessage=Utilisateur non trouvé.
|
||||
incorrectPasswordMessage=Le mot de passe actuel est incorrect.
|
||||
usernameExistsMessage=Le nouveau nom d’utilisateur existe déjà.
|
||||
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
|
||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||
invalidUsernameMessage=Nom d’utilisateur invalide, le nom d’utilisateur ne peut contenir que des chiffres et des lettres.
|
||||
deleteCurrentUserMessage=Impossible de supprimer l’utilisateur actuellement connecté.
|
||||
deleteUsernameExistsMessage=Le nom d’utilisateur n’existe pas et ne peut pas être supprimé.
|
||||
error=Erreur
|
||||
oops=Oups !
|
||||
help=Aide
|
||||
goHomepage=Aller à la page d’accueil
|
||||
joinDiscord=Rejoignez notre serveur Discord
|
||||
seeDockerHub=Consulter le Docker Hub
|
||||
visitGithub=Visiter le dépôt Github
|
||||
donate=Faire un don
|
||||
color=Couleur
|
||||
sponsor=Sponsor
|
||||
|
||||
|
||||
|
||||
###############
|
||||
# Pipeline #
|
||||
###############
|
||||
pipeline.header=Menu Pipeline (Alpha)
|
||||
pipeline.uploadButton=Télécharger une personnalisation
|
||||
pipeline.uploadButton=Charger une personnalisation
|
||||
pipeline.configureButton=Configurer
|
||||
pipeline.defaultOption=Personnaliser
|
||||
pipeline.submitButton=Soumettre
|
||||
@@ -101,6 +112,7 @@ navbar.settings=Paramètres
|
||||
#############
|
||||
settings.title=Paramètres
|
||||
settings.update=Mise à jour disponible
|
||||
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
|
||||
settings.appVersion=Version de l’application :
|
||||
settings.downloadOption.title=Choisissez l’option de téléchargement (pour les téléchargements à fichier unique non ZIP) :
|
||||
settings.downloadOption.1=Ouvrir dans la même fenêtre
|
||||
@@ -109,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.signOut=Déconnexion
|
||||
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.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 d’utilisateur
|
||||
changeCreds.oldPassword=Mot de passe actuel
|
||||
changeCreds.newPassword=Nouveau mot de passe
|
||||
@@ -149,12 +162,12 @@ adminUserSettings.header=Administration des paramètres des utilisateurs
|
||||
adminUserSettings.admin=Administateur
|
||||
adminUserSettings.user=Utilisateur
|
||||
adminUserSettings.addUser=Ajouter un utilisateur
|
||||
adminUserSettings.usernameInfo=Username must only contain letters and numbers, no spaces or special characters.
|
||||
adminUserSettings.usernameInfo=Le nom d’utilisateur ne doit contenir que des lettres et des chiffres, sans espaces ni caractères spéciaux.
|
||||
adminUserSettings.roles=Rôles
|
||||
adminUserSettings.role=Rôle
|
||||
adminUserSettings.actions=Actions
|
||||
adminUserSettings.apiUser=Utilisateur API limité
|
||||
adminUserSettings.extraApiUser=Additional Limited API User
|
||||
adminUserSettings.extraApiUser=Utilisateur limité supplémentaire de l’API
|
||||
adminUserSettings.webOnlyUser=Utilisateur Web uniquement
|
||||
adminUserSettings.demoUser=Demo User (Paramètres par défaut)
|
||||
adminUserSettings.internalApiUser=Internal API User
|
||||
@@ -796,17 +809,17 @@ rotate.selectAngle=Angle de rotation (par multiples de 90 degrés)
|
||||
rotate.submit=Pivoter
|
||||
|
||||
|
||||
#merge
|
||||
#split-pdfs
|
||||
split.title=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.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.4=Document #2: Page 2 et 3
|
||||
split.desc.5=Document #3: Page 4, 5 et 6
|
||||
split.desc.6=Document #4: Page 7
|
||||
split.desc.7=Document #5: Page 8
|
||||
split.desc.8=Document #6: Page 9 et 10
|
||||
split.desc.5=Document #3: Page 4, 5, 6 et 7
|
||||
split.desc.6=Document #4: Page 8
|
||||
split.desc.7=Document #5: Page 9
|
||||
split.desc.8=Document #6: Page 10
|
||||
split.splitPages=Pages sur lesquelles diviser
|
||||
split.submit=Diviser
|
||||
|
||||
@@ -957,7 +970,7 @@ PDFToText.submit=Convertir
|
||||
#PDFToHTML
|
||||
PDFToHTML.title=PDF en HTML
|
||||
PDFToHTML.header=PDF en HTML
|
||||
PDFToHTML.credit=Ce service utilise LibreOffice pour la conversion de fichiers.
|
||||
PDFToHTML.credit=Ce service utilise pdftohtml pour la conversion de fichiers.
|
||||
PDFToHTML.submit=Convertir
|
||||
|
||||
|
||||
@@ -1009,7 +1022,16 @@ split-by-sections.vertical.label=Divisions verticales
|
||||
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.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.nav=Licences
|
||||
@@ -1020,3 +1042,16 @@ licenses.version=Version
|
||||
licenses.license=Licence
|
||||
|
||||
|
||||
# error
|
||||
error.sorry=Désolé pour ce problème !
|
||||
error.needHelp=Besoin d’aide / Vous avez trouvé un problème ?
|
||||
error.contactTip=Si vous avez encore des problèmes, n’hésitez pas à nous contacter pour obtenir de l’aide. Vous pouvez soumettre un ticket sur notre page GitHub ou nous contacter via Discord :
|
||||
error.404.head=404 - Page non trouvée | oups on s’est foiré !
|
||||
error.404.1=Nous ne parvenons pas à trouver la page que vous recherchez.
|
||||
error.404.2=Quelque chose n’a pas fonctionné
|
||||
error.github=Créer un ticket sur GitHub
|
||||
error.showStack=Afficher la Stack Trace
|
||||
error.copyStack=Copier la Stack Trace
|
||||
error.githubSubmit=GitHub - Créer un ticket
|
||||
error.discordSubmit=Discord - Poster un message de demande d’assistance
|
||||
|
||||
|
||||
@@ -57,6 +57,17 @@ usernameExistsMessage=नया उपयोगकर्ता नाम पह
|
||||
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
|
||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||
error=Error
|
||||
oops=Oops!
|
||||
help=Help
|
||||
goHomepage=Go to Homepage
|
||||
joinDiscord=Join our Discord server
|
||||
seeDockerHub=See Docker Hub
|
||||
visitGithub=Visit Github Repository
|
||||
donate=Donate
|
||||
color=Color
|
||||
sponsor=Sponsor
|
||||
|
||||
|
||||
|
||||
###############
|
||||
@@ -101,6 +112,7 @@ navbar.settings=सेटिंग्स
|
||||
#############
|
||||
settings.title=सेटिंग्स
|
||||
settings.update=अपडेट उपलब्ध है
|
||||
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
|
||||
settings.appVersion=ऐप संस्करण:
|
||||
settings.downloadOption.title=डाउनलोड विकल्प चुनें (एकल फ़ाइल गैर-ज़िप डाउनलोड के लिए):
|
||||
settings.downloadOption.1=एक ही विंडो में खोलें
|
||||
@@ -109,8 +121,9 @@ settings.downloadOption.3=फ़ाइल डाउनलोड करें
|
||||
settings.zipThreshold=जब डाउनलोड की गई फ़ाइलों की संख्या सीमा से अधिक हो
|
||||
settings.signOut=साइन आउट
|
||||
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.header=अपना खाता विवरण अपडेट करें
|
||||
@@ -796,17 +809,17 @@ rotate.selectAngle=चुनें घुमाने का कोण (90 ड
|
||||
rotate.submit=घुमाएं
|
||||
|
||||
|
||||
#merge
|
||||
#split-pdfs
|
||||
split.title=पीडीएफ को विभाजित करें
|
||||
split.header=पीडीएफ को विभाजित करें
|
||||
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.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.7=दस्तावेज़ #5: पृष्ठ 8
|
||||
split.desc.8=दस्तावेज़ #6: पृष्ठ 9 और 10
|
||||
split.desc.8=दस्तावेज़ #6: पृष्ठ 10
|
||||
split.splitPages=विभाजन करने के लिए पृष्ठ दर्ज करें:
|
||||
split.submit=विभाजित करें
|
||||
|
||||
@@ -957,7 +970,7 @@ PDFToText.submit=परिवर्तित करें
|
||||
#PDFToHTML
|
||||
PDFToHTML.title=PDF से HTML
|
||||
PDFToHTML.header=PDF से HTML
|
||||
PDFToHTML.credit=यह सेवा फ़ाइल परिवर्तन के लिए LibreOffice का उपयोग करती है।
|
||||
PDFToHTML.credit=यह सेवा फ़ाइल परिवर्तन के लिए pdftohtml का उपयोग करती है।
|
||||
PDFToHTML.submit=परिवर्तित करें
|
||||
|
||||
|
||||
@@ -1011,6 +1024,15 @@ split-by-sections.vertical.placeholder=लंबवत विभाजन की
|
||||
split-by-sections.submit=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.nav=Licenses
|
||||
licenses.title=3rd Party Licenses
|
||||
@@ -1020,3 +1042,16 @@ licenses.version=Version
|
||||
licenses.license=License
|
||||
|
||||
|
||||
# error
|
||||
error.sorry=Sorry for the issue!
|
||||
error.needHelp=Need help / Found an issue?
|
||||
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.404.head=404 - Page Not Found | Oops, we tripped in the code!
|
||||
error.404.1=We can't seem to find the page you're looking for.
|
||||
error.404.2=Something went wrong
|
||||
error.github=Submit a ticket on GitHub
|
||||
error.showStack=Show Stack Trace
|
||||
error.copyStack=Copy Stack Trace
|
||||
error.githubSubmit=GitHub - Submit a ticket
|
||||
error.discordSubmit=Discord - Submit Support post
|
||||
|
||||
|
||||
@@ -57,6 +57,17 @@ usernameExistsMessage=Az új felhasználónév már létezik.
|
||||
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
|
||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||
error=Error
|
||||
oops=Oops!
|
||||
help=Help
|
||||
goHomepage=Go to Homepage
|
||||
joinDiscord=Join our Discord server
|
||||
seeDockerHub=See Docker Hub
|
||||
visitGithub=Visit Github Repository
|
||||
donate=Donate
|
||||
color=Color
|
||||
sponsor=Sponsor
|
||||
|
||||
|
||||
|
||||
###############
|
||||
@@ -101,6 +112,7 @@ navbar.settings=Beállítások
|
||||
#############
|
||||
settings.title=Beállítások
|
||||
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.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
|
||||
@@ -109,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.signOut=Kijelentkezés
|
||||
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.header=Frissítse fiókadatait
|
||||
@@ -796,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
|
||||
|
||||
|
||||
#merge
|
||||
#split-pdfs
|
||||
split.title=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.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.4=Dokumentum #2: Oldal 2 és 3
|
||||
split.desc.5=Dokumentum #3: Oldal 4, 5 és 6
|
||||
split.desc.6=Dokumentum #4: Oldal 7
|
||||
split.desc.7=Dokumentum #5: Oldal 8
|
||||
split.desc.8=Dokumentum #6: Oldal 9 és 10
|
||||
split.desc.5=Dokumentum #3: Oldal 4, 5, 6 és 7
|
||||
split.desc.6=Dokumentum #4: Oldal 8
|
||||
split.desc.7=Dokumentum #5: Oldal 9
|
||||
split.desc.8=Dokumentum #6: Oldal 10
|
||||
split.splitPages=Adja meg az oldalakat, amelyekre szét akarja választani:
|
||||
split.submit=Szétválasztás
|
||||
|
||||
@@ -957,7 +970,7 @@ PDFToText.submit=Konvertálás
|
||||
#PDFToHTML
|
||||
PDFToHTML.title=PDF >> HTML
|
||||
PDFToHTML.header=PDF >> HTML
|
||||
PDFToHTML.credit=Ez a szolgáltatás a LibreOffice-t használja a fájlkonverzióhoz.
|
||||
PDFToHTML.credit=Ez a szolgáltatás a pdftohtml-t használja a fájlkonverzióhoz.
|
||||
PDFToHTML.submit=Konvertálás
|
||||
|
||||
|
||||
@@ -1011,6 +1024,15 @@ split-by-sections.vertical.placeholder=Adja meg a függőleges szakaszok számá
|
||||
split-by-sections.submit=Felosztás
|
||||
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.nav=Licenses
|
||||
licenses.title=3rd Party Licenses
|
||||
@@ -1020,3 +1042,16 @@ licenses.version=Version
|
||||
licenses.license=License
|
||||
|
||||
|
||||
# error
|
||||
error.sorry=Sorry for the issue!
|
||||
error.needHelp=Need help / Found an issue?
|
||||
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.404.head=404 - Page Not Found | Oops, we tripped in the code!
|
||||
error.404.1=We can't seem to find the page you're looking for.
|
||||
error.404.2=Something went wrong
|
||||
error.github=Submit a ticket on GitHub
|
||||
error.showStack=Show Stack Trace
|
||||
error.copyStack=Copy Stack Trace
|
||||
error.githubSubmit=GitHub - Submit a ticket
|
||||
error.discordSubmit=Discord - Submit Support post
|
||||
|
||||
|
||||
@@ -57,6 +57,17 @@ usernameExistsMessage=Nama pengguna baru sudah ada.
|
||||
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
|
||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||
error=Error
|
||||
oops=Oops!
|
||||
help=Help
|
||||
goHomepage=Go to Homepage
|
||||
joinDiscord=Join our Discord server
|
||||
seeDockerHub=See Docker Hub
|
||||
visitGithub=Visit Github Repository
|
||||
donate=Donate
|
||||
color=Color
|
||||
sponsor=Sponsor
|
||||
|
||||
|
||||
|
||||
###############
|
||||
@@ -101,6 +112,7 @@ navbar.settings=Pengaturan
|
||||
#############
|
||||
settings.title=Pengaturan
|
||||
settings.update=Pembaruan tersedia
|
||||
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
|
||||
settings.appVersion=Versi Aplikasi:
|
||||
settings.downloadOption.title=Pilih opsi unduhan (Untuk unduhan berkas tunggal non zip):
|
||||
settings.downloadOption.1=Buka di jendela yang sama
|
||||
@@ -109,8 +121,9 @@ settings.downloadOption.3=Unduh berkas
|
||||
settings.zipThreshold=Berkas zip ketika jumlah berkas yang diunduh melebihi
|
||||
settings.signOut=Keluar
|
||||
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.header=Perbarui Detail Akun Anda
|
||||
@@ -796,17 +809,17 @@ rotate.selectAngle=Pilih sudut rotasi (dalam kelipatan 90 derajat):
|
||||
rotate.submit=Rotasi
|
||||
|
||||
|
||||
#merge
|
||||
#split-pdfs
|
||||
split.title=Membagi PDF
|
||||
split.header=Membagi PDF
|
||||
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.4=Dokumen #2: Halaman 2 dan 3
|
||||
split.desc.5=Dokumen #3: Halaman 4, 5 dan 6
|
||||
split.desc.6=Dokumen #4: Halaman 7
|
||||
split.desc.7=Dokumen #5: Halaman 8
|
||||
split.desc.8=Dokumen #6: Halaman 9 dan 10
|
||||
split.desc.5=Dokumen #3: Halaman 4, 5, 6 dan 7
|
||||
split.desc.6=Dokumen #4: Halaman 8
|
||||
split.desc.7=Dokumen #5: Halaman 9
|
||||
split.desc.8=Dokumen #6: Halaman 10
|
||||
split.splitPages=Masukkan halaman yang akan dipisah:
|
||||
split.submit=Pisahkan
|
||||
|
||||
@@ -957,7 +970,7 @@ PDFToText.submit=Konversi
|
||||
#PDFToHTML
|
||||
PDFToHTML.title=PDF Ke HTML
|
||||
PDFToHTML.header=PDF ke HTML
|
||||
PDFToHTML.credit=Layanan ini menggunakan LibreOffice untuk konversi berkas.
|
||||
PDFToHTML.credit=Layanan ini menggunakan pdftohtml untuk konversi berkas.
|
||||
PDFToHTML.submit=Konversi
|
||||
|
||||
|
||||
@@ -1011,6 +1024,15 @@ split-by-sections.vertical.placeholder=Input angka untuk pembagian vertikal
|
||||
split-by-sections.submit=Pisahkan 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.nav=Licenses
|
||||
licenses.title=3rd Party Licenses
|
||||
@@ -1020,3 +1042,16 @@ licenses.version=Version
|
||||
licenses.license=License
|
||||
|
||||
|
||||
# error
|
||||
error.sorry=Sorry for the issue!
|
||||
error.needHelp=Need help / Found an issue?
|
||||
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.404.head=404 - Page Not Found | Oops, we tripped in the code!
|
||||
error.404.1=We can't seem to find the page you're looking for.
|
||||
error.404.2=Something went wrong
|
||||
error.github=Submit a ticket on GitHub
|
||||
error.showStack=Show Stack Trace
|
||||
error.copyStack=Copy Stack Trace
|
||||
error.githubSubmit=GitHub - Submit a ticket
|
||||
error.discordSubmit=Discord - Submit Support post
|
||||
|
||||
|
||||
@@ -57,6 +57,17 @@ usernameExistsMessage=Il nuovo nome utente esiste già.
|
||||
invalidUsernameMessage=Nome utente non valido, il nome utente deve contenere solo caratteri alfabetici e numeri.
|
||||
deleteCurrentUserMessage=Impossibile eliminare l'utente attualmente connesso.
|
||||
deleteUsernameExistsMessage=Il nome utente non esiste e non può essere eliminato.
|
||||
error=Errore
|
||||
oops=Oops!
|
||||
help=Aiuto
|
||||
goHomepage=Vai alla Homepage
|
||||
joinDiscord=Unisciti al nostro server Discord
|
||||
seeDockerHub=Vedi DockerHub
|
||||
visitGithub=Visita il repository Github
|
||||
donate=Donazione
|
||||
color=Colore
|
||||
sponsor=Sponsor
|
||||
|
||||
|
||||
|
||||
###############
|
||||
@@ -67,8 +78,8 @@ pipeline.uploadButton=Caricamento personalizzato
|
||||
pipeline.configureButton=Configura
|
||||
pipeline.defaultOption=Personalizzato
|
||||
pipeline.submitButton=Invia
|
||||
pipeline.help=Pipeline Help
|
||||
pipeline.scanHelp=Folder Scanning Help
|
||||
pipeline.help=Aiuto sulla pipeline
|
||||
pipeline.scanHelp=Aiuto per la scansione delle cartelle
|
||||
|
||||
######################
|
||||
# Pipeline Options #
|
||||
@@ -101,6 +112,7 @@ navbar.settings=Impostazioni
|
||||
#############
|
||||
settings.title=Impostazioni
|
||||
settings.update=Aggiornamento disponibile
|
||||
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
|
||||
settings.appVersion=Versione App:
|
||||
settings.downloadOption.title=Scegli opzione di download (Per file singoli non compressi):
|
||||
settings.downloadOption.1=Apri in questa finestra
|
||||
@@ -109,8 +121,9 @@ settings.downloadOption.3=Scarica file
|
||||
settings.zipThreshold=Comprimi file in .zip quando il numero di download supera
|
||||
settings.signOut=Logout
|
||||
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.header=Aggiorna i dettagli del tuo account
|
||||
@@ -118,7 +131,7 @@ changeCreds.changePassword=Stai utilizzando le credenziali di accesso predefinit
|
||||
changeCreds.newUsername=Nuovo nome utente
|
||||
changeCreds.oldPassword=Password attuale
|
||||
changeCreds.newPassword=Nuova Password
|
||||
changeCreds.confirmNewPassword=Conferma Nuova Password
|
||||
changeCreds.confirmNewPassword=Conferma nuova Password
|
||||
changeCreds.submit=Invia modifiche
|
||||
|
||||
|
||||
@@ -178,7 +191,7 @@ multiTool.tags=Strumento multiplo,operazione multipla,interfaccia utente,trascin
|
||||
|
||||
home.merge.title=Unisci
|
||||
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.desc=Dividi un singolo PDF in più documenti.
|
||||
@@ -247,7 +260,7 @@ ocr.tags=riconoscimento,testo,immagine,scansione,lettura,identificazione,rilevam
|
||||
|
||||
home.extractImages.title=Estrai immagini
|
||||
home.extractImages.desc=Estrai tutte le immagini da un PDF e salvale come zip.
|
||||
extractImages.tags=immagine,photo,save,archive,zip,capture,grab
|
||||
extractImages.tags=immagine,foto,salva,archivio,zip,catturare,prendere
|
||||
|
||||
home.pdfToPDFA.title=Converti in PDF/A
|
||||
home.pdfToPDFA.desc=Converti un PDF nel formato PDF/A per archiviazione a lungo termine.
|
||||
@@ -395,11 +408,11 @@ overlay-pdfs.tags=Svrapponi
|
||||
|
||||
home.split-by-sections.title=Dividi PDF per sezioni
|
||||
home.split-by-sections.desc=Dividi ciascuna pagina di un PDF in sezioni orizzontali e verticali più piccole
|
||||
split-by-sections.tags=Dividi sezione, dividi, personalizza
|
||||
split-by-sections.tags=Dividi sezione,dividi,personalizza
|
||||
|
||||
home.AddStampRequest.title=Aggiungi timbro al PDF
|
||||
home.AddStampRequest.desc=Aggiungi testo o aggiungi timbri immagine nelle posizioni prestabilite
|
||||
AddStampRequest.tags=Timbro, Aggiungi immagine, Centra immagine, Filigrana, PDF, Incorpora, Personalizza
|
||||
AddStampRequest.tags=Timbro,Aggiungi immagine,Centra immagine,Filigrana,PDF,Incorpora,Personalizza
|
||||
|
||||
|
||||
home.PDFToBook.title=PDF in libro
|
||||
@@ -456,7 +469,7 @@ pdfToSinglePage.submit=Converti in pagina singola
|
||||
pageExtracter.title=Estrai pagine
|
||||
pageExtracter.header=Estrai pagine
|
||||
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
|
||||
@@ -759,23 +772,23 @@ merge.submit=Unisci
|
||||
pdfOrganiser.title=Organizza pagine
|
||||
pdfOrganiser.header=Organizza le pagine di un PDF
|
||||
pdfOrganiser.submit=Riordina pagine
|
||||
pdfOrganiser.mode=Mode
|
||||
pdfOrganiser.mode.1=Custom Page Order
|
||||
pdfOrganiser.mode.2=Reverse Order
|
||||
pdfOrganiser.mode.3=Duplex Sort
|
||||
pdfOrganiser.mode.4=Booklet Sort
|
||||
pdfOrganiser.mode.5=Side Stitch Booklet Sort
|
||||
pdfOrganiser.mode.6=Odd-Even Split
|
||||
pdfOrganiser.mode.7=Remove First
|
||||
pdfOrganiser.mode.8=Remove Last
|
||||
pdfOrganiser.mode.9=Remove First and Last
|
||||
pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
||||
pdfOrganiser.mode=Modalità
|
||||
pdfOrganiser.mode.1=Ordine delle pagine personalizzato
|
||||
pdfOrganiser.mode.2=Ordine inverso
|
||||
pdfOrganiser.mode.3=Ordinamento fronte-retro
|
||||
pdfOrganiser.mode.4=Ordinamento a libretto
|
||||
pdfOrganiser.mode.5=Ordinamento libretto con cucitura laterale
|
||||
pdfOrganiser.mode.6=Divisione pari-dispari
|
||||
pdfOrganiser.mode.7=Rimuovi prima
|
||||
pdfOrganiser.mode.8=Rimuovi ultima
|
||||
pdfOrganiser.mode.9=Rimuovi la prima e l'ultima
|
||||
pdfOrganiser.placeholder=(ad es. 1,3,2 o 4-8,2,10-12 o 2n-1)
|
||||
|
||||
|
||||
#multiTool
|
||||
multiTool.title=Multifunzione PDF
|
||||
multiTool.header=Multifunzione PDF
|
||||
multiTool.uploadPrompts=Please Upload PDF
|
||||
multiTool.uploadPrompts=Caricare il PDF
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=Visualizza PDF
|
||||
@@ -786,7 +799,7 @@ pageRemover.title=Rimuovi pagine
|
||||
pageRemover.header=Rimuovi pagine da un PDF
|
||||
pageRemover.pagesToDelete=Pagine da eliminare (inserisci una lista di numeri separati da virgola):
|
||||
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
|
||||
@@ -796,17 +809,17 @@ rotate.selectAngle=Scegli angolo di rotazione (in multipli di 90 gradi):
|
||||
rotate.submit=Ruota
|
||||
|
||||
|
||||
#merge
|
||||
#split-pdfs
|
||||
split.title=Dividi PDF
|
||||
split.header=Dividi PDF
|
||||
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.4=Documento #2: Pagine 2 e 3
|
||||
split.desc.5=Documento #3: Pagine 4, 5 e 6
|
||||
split.desc.6=Documento #4: Pagina 7
|
||||
split.desc.7=Documento #5: Pagina 8
|
||||
split.desc.8=Documento #6: Pagine 9 e 10
|
||||
split.desc.5=Documento #3: Pagine 4, 5, 6 e 7
|
||||
split.desc.6=Documento #4: Pagina 8
|
||||
split.desc.7=Documento #5: Pagina 9
|
||||
split.desc.8=Documento #6: Pagine 10
|
||||
split.splitPages=Inserisci pagine a cui dividere:
|
||||
split.submit=Dividi
|
||||
|
||||
@@ -874,8 +887,8 @@ watermark.selectText.7=Opacità (0% - 100%):
|
||||
watermark.selectText.8=Tipo di filigrana:
|
||||
watermark.selectText.9=Immagine filigrana:
|
||||
watermark.submit=Aggiungi Filigrana
|
||||
watermark.type.1=Text
|
||||
watermark.type.2=Image
|
||||
watermark.type.1=Testo
|
||||
watermark.type.2=Immagine
|
||||
|
||||
|
||||
#Change permissions
|
||||
@@ -919,7 +932,7 @@ changeMetadata.subject=Oggetto:
|
||||
changeMetadata.trapped=Recuperato:
|
||||
changeMetadata.selectText.4=Altre proprietà:
|
||||
changeMetadata.selectText.5=Aggiungi proprietà personalizzata:
|
||||
changeMetadata.submit=Cambia Proprietà
|
||||
changeMetadata.submit=Cambia proprietà
|
||||
|
||||
|
||||
#pdfToPDFA
|
||||
@@ -927,7 +940,7 @@ pdfToPDFA.title=Da PDF a PDF/A
|
||||
pdfToPDFA.header=Da PDF a PDF/A
|
||||
pdfToPDFA.credit=Questo servizio utilizza OCRmyPDF per la conversione in PDF/A.
|
||||
pdfToPDFA.submit=Converti
|
||||
pdfToPDFA.tip=Currently does not work for multiple inputs at once
|
||||
pdfToPDFA.tip=Attualmente non funziona per più input contemporaneamente
|
||||
|
||||
|
||||
#PDFToWord
|
||||
@@ -957,7 +970,7 @@ PDFToText.submit=Converti
|
||||
#PDFToHTML
|
||||
PDFToHTML.title=Da PDF a HTML
|
||||
PDFToHTML.header=Da PDF a HTML
|
||||
PDFToHTML.credit=Questo servizio utilizza LibreOffice per la conversione.
|
||||
PDFToHTML.credit=Questo servizio utilizza pdftohtml per la conversione.
|
||||
PDFToHTML.submit=Converti
|
||||
|
||||
|
||||
@@ -1011,6 +1024,15 @@ split-by-sections.vertical.placeholder=Inserire il numero di divisioni verticali
|
||||
split-by-sections.submit=Dividi 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.nav=Licenze
|
||||
licenses.title=Licenze di terze parti
|
||||
@@ -1020,3 +1042,16 @@ licenses.version=Versione
|
||||
licenses.license=Licenza
|
||||
|
||||
|
||||
# error
|
||||
error.sorry=Ci scusiamo per il problema!
|
||||
error.needHelp=Hai bisogno di aiuto / trovato un problema?
|
||||
error.contactTip=Se i problemi persistono, non esitare a contattarci per chiedere aiuto. Puoi inviare un ticket sulla nostra pagina GitHub o contattarci tramite Discord:
|
||||
error.404.head=404 - Pagina non trovata | Spiacenti, siamo inciampati nel codice!
|
||||
error.404.1=Non riusciamo a trovare la pagina che stai cercando.
|
||||
error.404.2=Qualcosa è andato storto
|
||||
error.github=Invia un ticket su GitHub
|
||||
error.showStack=Mostra traccia dello stack
|
||||
error.copyStack=Copia traccia dello stack
|
||||
error.githubSubmit=GitHub: invia un ticket
|
||||
error.discordSubmit=Discord: invia post di supporto
|
||||
|
||||
|
||||
@@ -57,6 +57,17 @@ usernameExistsMessage=新しいユーザー名はすでに存在します。
|
||||
invalidUsernameMessage=ユーザー名が無効です。ユーザー名にはアルファベットと数字のみを使用してください。
|
||||
deleteCurrentUserMessage=現在ログインしているユーザーは削除できません。
|
||||
deleteUsernameExistsMessage=そのユーザー名は存在しないため削除できません。
|
||||
error=エラー
|
||||
oops=おっと!
|
||||
help=ヘルプ
|
||||
goHomepage=ホームページへ移動
|
||||
joinDiscord=Discordサーバーに参加する
|
||||
seeDockerHub=Docker Hubを見る
|
||||
visitGithub=Githubリポジトリを訪問する
|
||||
donate=寄付する
|
||||
color=色
|
||||
sponsor=スポンサー
|
||||
|
||||
|
||||
|
||||
###############
|
||||
@@ -101,6 +112,7 @@ navbar.settings=設定
|
||||
#############
|
||||
settings.title=設定
|
||||
settings.update=利用可能なアップデート
|
||||
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
|
||||
settings.appVersion=Appバージョン:
|
||||
settings.downloadOption.title=ダウンロードオプション (zip以外の単一ファイル):
|
||||
settings.downloadOption.1=同じウィンドウで開く
|
||||
@@ -109,8 +121,9 @@ settings.downloadOption.3=ファイルをダウンロード
|
||||
settings.zipThreshold=このファイル数を超えたときにファイルを圧縮する
|
||||
settings.signOut=サインアウト
|
||||
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.header=アカウントの詳細を更新する
|
||||
@@ -796,17 +809,17 @@ rotate.selectAngle=回転角度を選択 (90度の倍数):
|
||||
rotate.submit=回転
|
||||
|
||||
|
||||
#merge
|
||||
#split-pdfs
|
||||
split.title=PDFの分割
|
||||
split.header=PDFの分割
|
||||
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.4=ドキュメント #2: ページ 2, 3
|
||||
split.desc.5=ドキュメント #3: ページ 4, 5, 6
|
||||
split.desc.6=ドキュメント #4: ページ 7
|
||||
split.desc.7=ドキュメント #5: ページ 8
|
||||
split.desc.8=ドキュメント #6: ページ 9, 10
|
||||
split.desc.5=ドキュメント #3: ページ 4, 5, 6, 7
|
||||
split.desc.6=ドキュメント #4: ページ 8
|
||||
split.desc.7=ドキュメント #5: ページ 9
|
||||
split.desc.8=ドキュメント #6: ページ 10
|
||||
split.splitPages=分割するページ番号を入力:
|
||||
split.submit=分割
|
||||
|
||||
@@ -957,7 +970,7 @@ PDFToText.submit=変換
|
||||
#PDFToHTML
|
||||
PDFToHTML.title=PDFをHTMLに変換
|
||||
PDFToHTML.header=PDFをHTMLに変換
|
||||
PDFToHTML.credit=本サービスはファイル変換にLibreOfficeを使用しています。
|
||||
PDFToHTML.credit=本サービスはファイル変換にpdftohtmlを使用しています。
|
||||
PDFToHTML.submit=変換
|
||||
|
||||
|
||||
@@ -1011,6 +1024,15 @@ split-by-sections.vertical.placeholder=垂直方向の分割数を選択
|
||||
split-by-sections.submit=分割
|
||||
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.nav=ライセンス
|
||||
licenses.title=サードパーティライセンス
|
||||
@@ -1020,3 +1042,16 @@ licenses.version=バージョン
|
||||
licenses.license=ライセンス
|
||||
|
||||
|
||||
# error
|
||||
error.sorry=問題が発生したことをお詫び申し上げます!
|
||||
error.needHelp=助けが必要/問題が見つかりましたか?
|
||||
error.contactTip=まだ問題が解決していない場合は、お手数ですが、GitHubページでチケットを提出するか、Discordで私たちに連絡してください:
|
||||
error.404.head=404 - ページが見つかりません | おっと、コードでつまずきました!
|
||||
error.404.1=あなたが探しているページが見つかりません。
|
||||
error.404.2=何か問題が発生しました
|
||||
error.github=GitHubでチケットを提出
|
||||
error.showStack=スタックトレースを表示
|
||||
error.copyStack=スタックトレースをコピー
|
||||
error.githubSubmit=GitHub - チケットを提出
|
||||
error.discordSubmit=Discord - サポート投稿を提出
|
||||
|
||||
|
||||
@@ -11,17 +11,17 @@ imgPrompt=이미지 선택
|
||||
genericSubmit=확인
|
||||
processTimeWarning=경고: 파일 크기에 따라 1분 정도 소요될 수 있습니다
|
||||
pageOrderPrompt=페이지 순서(쉼표로 구분된 페이지 번호 목록 입력):
|
||||
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=이동
|
||||
true=참
|
||||
false=거짓
|
||||
unknown=알 수 없음
|
||||
save=저장
|
||||
saveToBrowser=Save to Browser
|
||||
saveToBrowser=브라우저에 저장
|
||||
close=닫기
|
||||
filesSelected=개 파일 선택됨
|
||||
noFavourites=즐겨찾기 없음
|
||||
downloadComplete=Download Complete
|
||||
downloadComplete=다운로드 완료
|
||||
bored=기다리는 게 지루하신가요?
|
||||
alphabet=알파벳
|
||||
downloadPdf=PDF 다운로드
|
||||
@@ -29,59 +29,70 @@ text=텍스트
|
||||
font=폰트
|
||||
selectFillter=-- 선택 --
|
||||
pageNum=페이지 번호
|
||||
sizes.small=Small
|
||||
sizes.medium=Medium
|
||||
sizes.large=Large
|
||||
sizes.x-large=X-Large
|
||||
sizes.small=작은 크기
|
||||
sizes.medium=중간 사이즈
|
||||
sizes.large=큰 사이즈
|
||||
sizes.x-large=초대형 사이즈
|
||||
error.pdfPassword=이 PDF는 비밀번호로 보호되어 있으며, 비밀번호를 입력하지 않았거나, 입력된 비밀번호가 올바르지 않습니다.
|
||||
delete=삭제
|
||||
username=사용자명
|
||||
password=비밀번호
|
||||
welcome=환영합니다.
|
||||
property=Property
|
||||
black=Black
|
||||
white=White
|
||||
red=Red
|
||||
green=Green
|
||||
blue=Blue
|
||||
custom=Custom...
|
||||
WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
|
||||
property=재산
|
||||
black=검정
|
||||
white=하얀
|
||||
red=빨강
|
||||
green=녹색
|
||||
blue=파랑
|
||||
custom=관습...
|
||||
WorkInProgess=작업 진행 중, 작동하지 않거나 버그가 있을 수 있음, 문제가 있으면 보고하십시오!
|
||||
poweredBy=Powered by
|
||||
yes=Yes
|
||||
no=No
|
||||
yes=예
|
||||
no=아니요
|
||||
changedCredsMessage=계정 정보 변경 성공!
|
||||
notAuthenticatedMessage=User not authenticated.
|
||||
notAuthenticatedMessage=사용자가 인증되지 않았습니다.
|
||||
userNotFoundMessage=사용자를 찾을 수 없습니다.
|
||||
incorrectPasswordMessage=현재 비밀번호가 틀립니다.
|
||||
usernameExistsMessage=새 사용자명이 이미 존재합니다.
|
||||
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
|
||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||
invalidUsernameMessage=사용자 이름이 잘못되었습니다. 사용자 이름에는 알파벳 문자와 숫자만 포함되어야 합니다.
|
||||
deleteCurrentUserMessage=현재 로그인한 사용자를 삭제할 수 없습니다.
|
||||
deleteUsernameExistsMessage=사용자 이름이 존재하지 않으며 삭제할 수 없습니다.
|
||||
error=오류
|
||||
oops=어머나!
|
||||
help=도움말
|
||||
goHomepage=홈페이지로 이동
|
||||
joinDiscord=Discord 서버에 참여하기
|
||||
seeDockerHub=Docker Hub에서 확인하기
|
||||
visitGithub=GitHub 저장소 방문하기
|
||||
donate=기부하기
|
||||
color=색상
|
||||
sponsor=스폰서
|
||||
|
||||
|
||||
|
||||
###############
|
||||
# Pipeline #
|
||||
###############
|
||||
pipeline.header=Pipeline Menu (Beta)
|
||||
pipeline.uploadButton=Upload Custom
|
||||
pipeline.configureButton=Configure
|
||||
pipeline.defaultOption=Custom
|
||||
pipeline.submitButton=Submit
|
||||
pipeline.help=Pipeline Help
|
||||
pipeline.scanHelp=Folder Scanning Help
|
||||
pipeline.header=파이프라인 메뉴 (Beta)
|
||||
pipeline.uploadButton=사용자 지정 업로드
|
||||
pipeline.configureButton=구성
|
||||
pipeline.defaultOption=관습
|
||||
pipeline.submitButton=전송
|
||||
pipeline.help=파이프라인 도움말
|
||||
pipeline.scanHelp=폴더 스캔 도움말
|
||||
|
||||
######################
|
||||
# Pipeline Options #
|
||||
######################
|
||||
pipelineOptions.header=Pipeline Configuration
|
||||
pipelineOptions.pipelineNameLabel=Pipeline Name
|
||||
pipelineOptions.saveSettings=Save Operation Settings
|
||||
pipelineOptions.pipelineNamePrompt=Enter pipeline name here
|
||||
pipelineOptions.selectOperation=Select Operation
|
||||
pipelineOptions.addOperationButton=Add operation
|
||||
pipelineOptions.pipelineHeader=Pipeline:
|
||||
pipelineOptions.saveButton=Download
|
||||
pipelineOptions.validateButton=Validate
|
||||
pipelineOptions.header=파이프라인 구성
|
||||
pipelineOptions.pipelineNameLabel=파이프라인 이름
|
||||
pipelineOptions.saveSettings=작업 설정 저장
|
||||
pipelineOptions.pipelineNamePrompt=여기에 파이프라인 이름을 입력합니다.
|
||||
pipelineOptions.selectOperation=작업 선택
|
||||
pipelineOptions.addOperationButton=작업 추가
|
||||
pipelineOptions.pipelineHeader=파이프라인:
|
||||
pipelineOptions.saveButton=다운로드
|
||||
pipelineOptions.validateButton=확인
|
||||
|
||||
|
||||
|
||||
@@ -101,6 +112,7 @@ navbar.settings=설정
|
||||
#############
|
||||
settings.title=설정
|
||||
settings.update=업데이트 가능
|
||||
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
|
||||
settings.appVersion=앱 버전:
|
||||
settings.downloadOption.title=다운로드 옵션 선택 (zip 파일이 아닌 단일 파일 다운로드 시):
|
||||
settings.downloadOption.1=현재 창에서 열기
|
||||
@@ -109,12 +121,13 @@ settings.downloadOption.3=다운로드
|
||||
settings.zipThreshold=다운로드한 파일 수가 초과된 경우 파일 압축하기
|
||||
settings.signOut=로그아웃
|
||||
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.header=계정 정보 업데이트
|
||||
changeCreds.changePassword=You are using default login credentials. Please enter a new password
|
||||
changeCreds.changePassword=기본 로그인 자격 증명을 사용하고 있습니다. 새 비밀번호를 입력해 주세요.
|
||||
changeCreds.newUsername=새 사용자명
|
||||
changeCreds.oldPassword=현재 비밀번호
|
||||
changeCreds.newPassword=새 비밀번호
|
||||
@@ -126,20 +139,20 @@ changeCreds.submit=변경
|
||||
account.title=계정 설정
|
||||
account.accountSettings=계정 설정
|
||||
account.adminSettings=관리자 설정 - 사용자 추가 및 확인
|
||||
account.userControlSettings=User Control Settings
|
||||
account.userControlSettings=사용자 컨트롤 설정
|
||||
account.changeUsername=사용자명 변경
|
||||
account.newUsername=새 사용자 이름
|
||||
account.password=Confirmation Password
|
||||
account.password=확인 비밀번호
|
||||
account.oldPassword=이전 비밀번호
|
||||
account.newPassword=새 비밀번호
|
||||
account.changePassword=비밀번호 변경
|
||||
account.confirmNewPassword=새 비밀번호 확인
|
||||
account.signOut=로그아웃
|
||||
account.yourApiKey=API 키
|
||||
account.syncTitle=Sync browser settings with Account
|
||||
account.settingsCompare=Settings Comparison:
|
||||
account.property=Property
|
||||
account.webBrowserSettings=Web Browser Setting
|
||||
account.syncTitle=브라우저 설정을 계정과 동기화
|
||||
account.settingsCompare=설정 비교:
|
||||
account.property=재산
|
||||
account.webBrowserSettings=웹 브라우저 설정
|
||||
account.syncToBrowser=계정 -> 브라우저로 동기화
|
||||
account.syncToAccount=브라우저 -> 계정으로 동기화
|
||||
|
||||
@@ -149,15 +162,15 @@ adminUserSettings.header=사용자 관리
|
||||
adminUserSettings.admin=관리자
|
||||
adminUserSettings.user=사용자
|
||||
adminUserSettings.addUser=새 사용자 추가
|
||||
adminUserSettings.usernameInfo=Username must only contain letters and numbers, no spaces or special characters.
|
||||
adminUserSettings.usernameInfo=사용자 이름은 문자와 숫자만 포함해야 하며 공백이나 특수 문자는 포함할 수 없습니다.
|
||||
adminUserSettings.roles=역할
|
||||
adminUserSettings.role=역할
|
||||
adminUserSettings.actions=동작
|
||||
adminUserSettings.apiUser=제한된 API 사용
|
||||
adminUserSettings.extraApiUser=Additional Limited API User
|
||||
adminUserSettings.extraApiUser=제한된 API 사용자 추가
|
||||
adminUserSettings.webOnlyUser=웹 사용만 허용
|
||||
adminUserSettings.demoUser=Demo User (No custom settings)
|
||||
adminUserSettings.internalApiUser=Internal API User
|
||||
adminUserSettings.demoUser=데모 사용자(사용자 지정 설정 없음)
|
||||
adminUserSettings.internalApiUser=내부 API 사용자
|
||||
adminUserSettings.forceChange=다음 로그인 때 사용자명과 비밀번호를 변경하도록 강제
|
||||
adminUserSettings.submit=사용자 저장
|
||||
|
||||
@@ -189,11 +202,11 @@ home.rotate.desc=PDF 페이지를 회전합니다.
|
||||
rotate.tags=server side
|
||||
|
||||
|
||||
home.imageToPdf.title=Image to PDF
|
||||
home.imageToPdf.title=이미지를 PDF로
|
||||
home.imageToPdf.desc=이미지(PNG, JPEG, GIF)를 PDF 문서로 변환합니다.
|
||||
imageToPdf.tags=conversion,img,jpg,picture,photo
|
||||
|
||||
home.pdfToImage.title=PDF to Image
|
||||
home.pdfToImage.title=PDF를 이미지로
|
||||
home.pdfToImage.desc=PDF 문서을 이미지(PNG, JPEG, GIF)로 변환합니다.
|
||||
pdfToImage.tags=conversion,img,jpg,picture,photo
|
||||
|
||||
@@ -249,15 +262,15 @@ home.extractImages.title=이미지 추출
|
||||
home.extractImages.desc=PDF에서 모든 이미지를 추출하여 zip으로 저장합니다.
|
||||
extractImages.tags=picture,photo,save,archive,zip,capture,grab
|
||||
|
||||
home.pdfToPDFA.title=PDF to PDF/A
|
||||
home.pdfToPDFA.title=PDF를 PDF/A로 변환
|
||||
home.pdfToPDFA.desc=장기 보관을 위해 PDF 문서를 PDF/A 문서로 변환합니다.
|
||||
pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation
|
||||
|
||||
home.PDFToWord.title=PDF to Word
|
||||
home.PDFToWord.title=PDF를 Word로
|
||||
home.PDFToWord.desc=PDF 문서를 Word 형식으로 변환합니다. (DOC, DOCX, ODT)
|
||||
PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile
|
||||
|
||||
home.PDFToPresentation.title=PDF to Presentation
|
||||
home.PDFToPresentation.title=PDF를 프리젠테이션으로
|
||||
home.PDFToPresentation.desc=PDF 문서를 프리젠테이션 형식으로 변환합니다. (PPT, PPTX, ODP)
|
||||
PDFToPresentation.tags=slides,show,office,microsoft
|
||||
|
||||
@@ -265,12 +278,12 @@ home.PDFToText.title=PDF to 텍스트/RTF
|
||||
home.PDFToText.desc=PDF 문서를 텍스트 또는 RTF 형식으로 변환합니다.
|
||||
PDFToText.tags=richformat,richtextformat,rich text format
|
||||
|
||||
home.PDFToHTML.title=PDF to HTML
|
||||
home.PDFToHTML.title=PDF를 HTML로
|
||||
home.PDFToHTML.desc=PDF 문서를 HTML 형식으로 변환합니다.
|
||||
PDFToHTML.tags=web content,browser friendly
|
||||
|
||||
|
||||
home.PDFToXML.title=PDF to XML
|
||||
home.PDFToXML.title=PDF를 XML로 변환
|
||||
home.PDFToXML.desc=PDF 문서를 XML 형식으로 변환합니다.
|
||||
PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert
|
||||
|
||||
@@ -294,8 +307,8 @@ home.removeBlanks.title=빈 페이지 제거
|
||||
home.removeBlanks.desc=PDF 문서에서 빈 페이지를 감지하고 제거합니다.
|
||||
removeBlanks.tags=cleanup,streamline,non-content,organize
|
||||
|
||||
home.removeAnnotations.title=Remove Annotations
|
||||
home.removeAnnotations.desc=Removes all comments/annotations from a PDF
|
||||
home.removeAnnotations.title=주석 제거
|
||||
home.removeAnnotations.desc=PDF에서 모든 주석/주석을 제거합니다.
|
||||
removeAnnotations.tags=comments,highlight,notes,markup,remove
|
||||
|
||||
home.compare.title=비교
|
||||
@@ -342,16 +355,16 @@ home.sanitizePdf.title=정제
|
||||
home.sanitizePdf.desc=PDF 문서에서 스크립트와 같은 요소들을 제거합니다.
|
||||
sanitizePdf.tags=clean,secure,safe,remove-threats
|
||||
|
||||
home.URLToPDF.title=URL/Website To PDF
|
||||
home.URLToPDF.title=URL/웹사이트를 PDF로
|
||||
home.URLToPDF.desc=http(s) 웹사이트를 PDF 문서로 변환합니다.
|
||||
URLToPDF.tags=web-capture,save-page,web-to-doc,archive
|
||||
|
||||
home.HTMLToPDF.title=HTML to PDF
|
||||
home.HTMLToPDF.title=HTML에서 PDF로
|
||||
home.HTMLToPDF.desc=HTML 파일, 또는 ZIP 파일을 PDF로 변환합니다.
|
||||
HTMLToPDF.tags=markup,web-content,transformation,convert
|
||||
|
||||
|
||||
home.MarkdownToPDF.title=Markdown to PDF
|
||||
home.MarkdownToPDF.title=Markdown에서 PDF로
|
||||
home.MarkdownToPDF.desc=마크다운 파일을 PDF 문서로 변환합니다.
|
||||
MarkdownToPDF.tags=markup,web-content,transformation,convert
|
||||
|
||||
@@ -379,35 +392,35 @@ home.autoRedact.title=자동 검열
|
||||
home.autoRedact.desc=PDF 문서에서 입력된 텍스트들을 자동으로 검열(모자이크)합니다.
|
||||
autoRedact.tags=Redact,Hide,black out,black,marker,hidden
|
||||
|
||||
home.tableExtraxt.title=PDF to CSV
|
||||
home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV
|
||||
home.tableExtraxt.title=PDF에서 CSV로
|
||||
home.tableExtraxt.desc=PDF에서 표를 추출하여 CSV로 변환
|
||||
tableExtraxt.tags=CSV,Table Extraction,extract,convert
|
||||
|
||||
|
||||
home.autoSizeSplitPDF.title=Auto Split by Size/Count
|
||||
home.autoSizeSplitPDF.desc=Split a single PDF into multiple documents based on size, page count, or document count
|
||||
home.autoSizeSplitPDF.title=크기/개수로 자동 분할
|
||||
home.autoSizeSplitPDF.desc=단일 PDF를 크기, 페이지 수 또는 문서 수에 따라 여러 문서로 분할
|
||||
autoSizeSplitPDF.tags=pdf,split,document,organization
|
||||
|
||||
|
||||
home.overlay-pdfs.title=Overlay PDFs
|
||||
home.overlay-pdfs.desc=Overlays PDFs on-top of another PDF
|
||||
home.overlay-pdfs.title=PDF 오버레이
|
||||
home.overlay-pdfs.desc=PDF를 다른 PDF 위에 오버레이
|
||||
overlay-pdfs.tags=Overlay
|
||||
|
||||
home.split-by-sections.title=Split PDF by Sections
|
||||
home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections
|
||||
home.split-by-sections.title=섹션별로 PDF 분할
|
||||
home.split-by-sections.desc=PDF의 각 페이지를 더 작은 가로와 세로 구역으로 나눕니다
|
||||
split-by-sections.tags=Section Split, Divide, Customize
|
||||
|
||||
home.AddStampRequest.title=Add Stamp to PDF
|
||||
home.AddStampRequest.desc=Add text or add image stamps at set locations
|
||||
home.AddStampRequest.title=PDF에 스탬프 추가
|
||||
home.AddStampRequest.desc=설정된 위치에 텍스트 추가 또는 이미지 스탬프 추가
|
||||
AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize
|
||||
|
||||
|
||||
home.PDFToBook.title=PDF to Book
|
||||
home.PDFToBook.desc=Converts PDF to Book/Comic formats using calibre
|
||||
home.PDFToBook.title=PDF를 책으로
|
||||
home.PDFToBook.desc=구경을 사용하여 PDF를 책/만화 형식으로 변환
|
||||
PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle
|
||||
|
||||
home.BookToPDF.title=Book to PDF
|
||||
home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre
|
||||
home.BookToPDF.title=책을 PDF로
|
||||
home.BookToPDF.desc=구경을 사용하여 책/만화 형식을 PDF로 변환
|
||||
BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle
|
||||
|
||||
|
||||
@@ -456,7 +469,7 @@ pdfToSinglePage.submit=단일 페이지로 통합
|
||||
pageExtracter.title=페이지 추출
|
||||
pageExtracter.header=페이지 추출
|
||||
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
|
||||
@@ -467,7 +480,7 @@ getPdfInfo.downloadJson=JSON으로 다운로드
|
||||
|
||||
|
||||
#markdown-to-pdf
|
||||
MarkdownToPDF.title=Markdown To PDF
|
||||
MarkdownToPDF.title=Markdown에서 PDF로
|
||||
MarkdownToPDF.header=Markdown 문서를 PDF 문서로 변환
|
||||
MarkdownToPDF.submit=변환
|
||||
MarkdownToPDF.help=변환중
|
||||
@@ -476,49 +489,49 @@ MarkdownToPDF.credit=이 기능은 WeasyPrint를 사용합니다.
|
||||
|
||||
|
||||
#url-to-pdf
|
||||
URLToPDF.title=URL To PDF
|
||||
URLToPDF.title=URL을 PDF로
|
||||
URLToPDF.header=URL을 PDF 문서로 변환
|
||||
URLToPDF.submit=변환
|
||||
URLToPDF.credit=이 기능은 WeasyPrint를 사용합니다.
|
||||
|
||||
|
||||
#html-to-pdf
|
||||
HTMLToPDF.title=HTML To PDF
|
||||
HTMLToPDF.title=HTML을 PDF로
|
||||
HTMLToPDF.header=HTML 파일을 PDF 문서로 변환
|
||||
HTMLToPDF.help=HTML 파일, 또는 html/css/이미지 등을 포함한 ZIP 파일을 받습니다.
|
||||
HTMLToPDF.submit=변환
|
||||
HTMLToPDF.credit=이 기능은 WeasyPrint를 사용합니다.
|
||||
HTMLToPDF.zoom=Zoom level for displaying the website.
|
||||
HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default)
|
||||
HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default)
|
||||
HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default)
|
||||
HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default)
|
||||
HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default)
|
||||
HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default)
|
||||
HTMLToPDF.printBackground=Render the background of websites.
|
||||
HTMLToPDF.defaultHeader=Enable Default Header (Name and page number)
|
||||
HTMLToPDF.cssMediaType=Change the CSS media type of the page.
|
||||
HTMLToPDF.none=None
|
||||
HTMLToPDF.print=Print
|
||||
HTMLToPDF.screen=Screen
|
||||
HTMLToPDF.zoom=웹 사이트를 표시하기 위한 확대/축소 수준입니다.
|
||||
HTMLToPDF.pageWidth=센티미터 단위의 페이지 너비입니다. (기본값은 비어 있음)
|
||||
HTMLToPDF.pageHeight=페이지 높이(센티미터)입니다. (기본값은 비어 있음)
|
||||
HTMLToPDF.marginTop=페이지의 위쪽 여백(밀리미터)입니다. (기본값은 비어 있음)
|
||||
HTMLToPDF.marginBottom=페이지의 아래쪽 여백(밀리미터)입니다. (기본값은 비어 있음)
|
||||
HTMLToPDF.marginLeft=페이지의 왼쪽 여백(밀리미터)입니다. (기본값은 비어 있음)
|
||||
HTMLToPDF.marginRight=페이지의 오른쪽 여백(밀리미터)입니다. (기본값은 비어 있음)
|
||||
HTMLToPDF.printBackground=웹 사이트의 배경을 렌더링합니다.
|
||||
HTMLToPDF.defaultHeader=기본 헤더 활성화(이름 및 페이지 번호)
|
||||
HTMLToPDF.cssMediaType=페이지의 CSS 미디어 유형을 변경합니다.
|
||||
HTMLToPDF.none=없음
|
||||
HTMLToPDF.print=인쇄하다
|
||||
HTMLToPDF.screen=화면
|
||||
|
||||
|
||||
#AddStampRequest
|
||||
AddStampRequest.header=Stamp PDF
|
||||
AddStampRequest.title=Stamp PDF
|
||||
AddStampRequest.stampType=Stamp Type
|
||||
AddStampRequest.stampText=Stamp Text
|
||||
AddStampRequest.stampImage=Stamp Image
|
||||
AddStampRequest.alphabet=Alphabet
|
||||
AddStampRequest.fontSize=Font/Image Size
|
||||
AddStampRequest.rotation=Rotation
|
||||
AddStampRequest.opacity=Opacity
|
||||
AddStampRequest.position=Position
|
||||
AddStampRequest.overrideX=Override X Coordinate
|
||||
AddStampRequest.overrideY=Override Y Coordinate
|
||||
AddStampRequest.customMargin=Custom Margin
|
||||
AddStampRequest.customColor=Custom Text Color
|
||||
AddStampRequest.submit=Submit
|
||||
AddStampRequest.header=스탬프 PDF
|
||||
AddStampRequest.title=스탬프 PDF
|
||||
AddStampRequest.stampType=스탬프 유형
|
||||
AddStampRequest.stampText=스탬프 텍스트
|
||||
AddStampRequest.stampImage=스탬프 이미지
|
||||
AddStampRequest.alphabet=알파벳
|
||||
AddStampRequest.fontSize=글꼴/이미지 크기
|
||||
AddStampRequest.rotation=회전
|
||||
AddStampRequest.opacity=불투명도
|
||||
AddStampRequest.position=위치
|
||||
AddStampRequest.overrideX=X 좌표 재정의
|
||||
AddStampRequest.overrideY=Y 좌표 재정의
|
||||
AddStampRequest.customMargin=맞춤 마진
|
||||
AddStampRequest.customColor=사용자 정의 텍스트 색상
|
||||
AddStampRequest.submit=전송
|
||||
|
||||
|
||||
#sanitizePDF
|
||||
@@ -607,11 +620,11 @@ scalePages.submit=제출
|
||||
certSign.title=인증서로 서명
|
||||
certSign.header=인증서로 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=참고: 인증서 유형이 아래에 나열되지 않은 경우 keytool 명령줄 도구를 사용하여 Java 키 저장소(.jks) 파일로 변환하십시오. 그런 다음 아래의 .jks 파일 옵션을 선택합니다.
|
||||
certSign.selectKey=개인 키 파일을 선택합니다 (PKCS#8 형식, .pem 또는 .der):
|
||||
certSign.selectCert=인증서 파일을 선택합니다 (X.509 형식, .pem 또는 .der):
|
||||
certSign.selectP12=PKCS#12 키 저장소 파일을 선택합니다 (.p12 or .pfx) (선택 사항, 선택할 경우, 개인 키와 인증서를 포함하고 있어야 합니다):
|
||||
certSign.selectJKS=Select Your Java Keystore File (.jks or .keystore):
|
||||
certSign.selectJKS=Java 키 저장소 파일(.jks 또는 .keystore)을 선택합니다.
|
||||
certSign.certType=인증서 유형
|
||||
certSign.password=키 저장소 또는 개인 키 비밀번호를 입력합니다 (있는 경우):
|
||||
certSign.showSig=서명 보기
|
||||
@@ -632,9 +645,9 @@ removeBlanks.submit=빈 페이지 제거
|
||||
|
||||
|
||||
#removeAnnotations
|
||||
removeAnnotations.title=Remove Annotations
|
||||
removeAnnotations.header=Remove Annotations
|
||||
removeAnnotations.submit=Remove
|
||||
removeAnnotations.title=주석 제거
|
||||
removeAnnotations.header=주석 제거
|
||||
removeAnnotations.submit=제거하다
|
||||
|
||||
|
||||
#compare
|
||||
@@ -645,17 +658,17 @@ compare.document.2=문서 2
|
||||
compare.submit=비교
|
||||
|
||||
#BookToPDF
|
||||
BookToPDF.title=Books and Comics to PDF
|
||||
BookToPDF.header=Book to PDF
|
||||
BookToPDF.credit=Uses Calibre
|
||||
BookToPDF.submit=Convert
|
||||
BookToPDF.title=책과 만화를 PDF로
|
||||
BookToPDF.header=책을 PDF로
|
||||
BookToPDF.credit=이 서비스는 파일 변환을 위해 Calibre 사용합니다.
|
||||
BookToPDF.submit=변환
|
||||
|
||||
#PDFToBook
|
||||
PDFToBook.title=PDF to Book
|
||||
PDFToBook.header=PDF to Book
|
||||
PDFToBook.selectText.1=Format
|
||||
PDFToBook.credit=Uses Calibre
|
||||
PDFToBook.submit=Convert
|
||||
PDFToBook.title=PDF를 책으로
|
||||
PDFToBook.header=PDF를 책으로
|
||||
PDFToBook.selectText.1=판
|
||||
PDFToBook.credit=이 서비스는 파일 변환을 위해 Calibre 사용합니다.
|
||||
PDFToBook.submit=변환
|
||||
|
||||
#sign
|
||||
sign.title=서명
|
||||
@@ -750,8 +763,8 @@ addImage.submit=이미지 추가
|
||||
#merge
|
||||
merge.title=병합
|
||||
merge.header=여러 개의 PDF 병합 (2개 이상)
|
||||
merge.sortByName=Sort by name
|
||||
merge.sortByDate=Sort by date
|
||||
merge.sortByName=이름순 정렬
|
||||
merge.sortByDate=날짜순 정렬
|
||||
merge.submit=병합
|
||||
|
||||
|
||||
@@ -759,23 +772,23 @@ merge.submit=병합
|
||||
pdfOrganiser.title=페이지 정렬
|
||||
pdfOrganiser.header=PDF 페이지 정렬
|
||||
pdfOrganiser.submit=페이지 재정렬
|
||||
pdfOrganiser.mode=Mode
|
||||
pdfOrganiser.mode.1=Custom Page Order
|
||||
pdfOrganiser.mode.2=Reverse Order
|
||||
pdfOrganiser.mode.3=Duplex Sort
|
||||
pdfOrganiser.mode.4=Booklet Sort
|
||||
pdfOrganiser.mode.5=Side Stitch Booklet Sort
|
||||
pdfOrganiser.mode.6=Odd-Even Split
|
||||
pdfOrganiser.mode.7=Remove First
|
||||
pdfOrganiser.mode.8=Remove Last
|
||||
pdfOrganiser.mode.9=Remove First and Last
|
||||
pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
||||
pdfOrganiser.mode=모드
|
||||
pdfOrganiser.mode.1=사용자 지정 페이지 순서
|
||||
pdfOrganiser.mode.2=역순
|
||||
pdfOrganiser.mode.3=양면 정렬(Duplex Sort)
|
||||
pdfOrganiser.mode.4=소책자 정렬
|
||||
pdfOrganiser.mode.5=사이드 스티치 소책자 정렬
|
||||
pdfOrganiser.mode.6=홀수-짝수 분할
|
||||
pdfOrganiser.mode.7=첫 번째 항목 삭제
|
||||
pdfOrganiser.mode.8=마지막 항목 제거
|
||||
pdfOrganiser.mode.9=첫 번째와 마지막 제거
|
||||
pdfOrganiser.placeholder=(예: 1,3,2 또는 4-8,2,10-12 또는 2n-1)
|
||||
|
||||
|
||||
#multiTool
|
||||
multiTool.title=PDF 멀티툴
|
||||
multiTool.header=PDF 멀티툴
|
||||
multiTool.uploadPrompts=Please Upload PDF
|
||||
multiTool.uploadPrompts=PDF를 업로드하십시오
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=PDF 뷰어
|
||||
@@ -786,7 +799,7 @@ pageRemover.title=페이지 제거
|
||||
pageRemover.header=PDF 페이지 제거
|
||||
pageRemover.pagesToDelete=제거할 페이지 (쉼표로 구분된 페이지 번호 입력):
|
||||
pageRemover.submit=페이지 제거
|
||||
pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30)
|
||||
pageRemover.placeholder=(예: 1,2,6 또는 1-10,15-30)
|
||||
|
||||
|
||||
#rotate
|
||||
@@ -796,23 +809,23 @@ rotate.selectAngle=회전 각도 선택 (90도의 배수로):
|
||||
rotate.submit=회전
|
||||
|
||||
|
||||
#merge
|
||||
#split-pdfs
|
||||
split.title=PDF 분할
|
||||
split.header=PDF 분할
|
||||
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.4=문서 #2: 페이지 2, 3
|
||||
split.desc.5=문서 #3: 페이지 4, 5, 6
|
||||
split.desc.6=문서 #4: 페이지 7
|
||||
split.desc.7=문서 #5: 페이지 8
|
||||
split.desc.8=문서 #6: 페이지 9, 10
|
||||
split.desc.5=문서 #3: 페이지 4, 5, 6, 7
|
||||
split.desc.6=문서 #4: 페이지 8
|
||||
split.desc.7=문서 #5: 페이지 9
|
||||
split.desc.8=문서 #6: 페이지 10
|
||||
split.splitPages=분할할 페이지 입력:
|
||||
split.submit=분할
|
||||
|
||||
|
||||
#merge
|
||||
imageToPDF.title=Image to PDF
|
||||
imageToPDF.title=이미지를 PDF로
|
||||
imageToPDF.header=이미지를 PDF로 변환
|
||||
imageToPDF.submit=변환
|
||||
imageToPDF.selectLabel=이미지 맞춤 방법
|
||||
@@ -826,7 +839,7 @@ imageToPDF.selectText.5=별도의 PDF로 변환
|
||||
|
||||
|
||||
#pdfToImage
|
||||
pdfToImage.title=PDF to Image
|
||||
pdfToImage.title=PDF를 이미지로
|
||||
pdfToImage.header=PDF 문서를 이미지로 변환
|
||||
pdfToImage.selectText=이미지 형식
|
||||
pdfToImage.singleOrMultiple=이미지 결과 유형
|
||||
@@ -874,8 +887,8 @@ watermark.selectText.7=투명도 (0% - 100%):
|
||||
watermark.selectText.8=워터마크 유형:
|
||||
watermark.selectText.9=워터마크 이미지:
|
||||
watermark.submit=워터마크 추가
|
||||
watermark.type.1=Text
|
||||
watermark.type.2=Image
|
||||
watermark.type.1=텍스트
|
||||
watermark.type.2=이미지
|
||||
|
||||
|
||||
#Change permissions
|
||||
@@ -923,15 +936,15 @@ changeMetadata.submit=변경
|
||||
|
||||
|
||||
#pdfToPDFA
|
||||
pdfToPDFA.title=PDF To PDF/A
|
||||
pdfToPDFA.title=PDF를 PDF/A로
|
||||
pdfToPDFA.header=PDF 문서를 PDF/A로 변환
|
||||
pdfToPDFA.credit=이 서비스는 PDF/A 변환을 위해 OCRmyPDF 문서를 사용합니다.
|
||||
pdfToPDFA.submit=변환
|
||||
pdfToPDFA.tip=Currently does not work for multiple inputs at once
|
||||
pdfToPDFA.tip=현재 한 번에 여러 입력에 대해 작동하지 않습니다.
|
||||
|
||||
|
||||
#PDFToWord
|
||||
PDFToWord.title=PDF to Word
|
||||
PDFToWord.title=PDF를 Word로
|
||||
PDFToWord.header=PDF 문서를 Word 문서로 변환
|
||||
PDFToWord.selectText.1=출력 파일 형식
|
||||
PDFToWord.credit=이 서비스는 파일 변환을 위해 LibreOffice를 사용합니다.
|
||||
@@ -939,7 +952,7 @@ PDFToWord.submit=변환
|
||||
|
||||
|
||||
#PDFToPresentation
|
||||
PDFToPresentation.title=PDF to Presentation
|
||||
PDFToPresentation.title=PDF를 프리젠테이션으로
|
||||
PDFToPresentation.header=PDF 문서를 프레젠테이션으로 변환
|
||||
PDFToPresentation.selectText.1=출력 파일 형식
|
||||
PDFToPresentation.credit=이 서비스는 파일 변환을 위해 LibreOffice를 사용합니다.
|
||||
@@ -947,7 +960,7 @@ PDFToPresentation.submit=변환
|
||||
|
||||
|
||||
#PDFToText
|
||||
PDFToText.title=PDF to RTF
|
||||
PDFToText.title=PDF에서 RTF로
|
||||
PDFToText.header=PDF 문서를 RTF(서식 있는 텍스트 문서)로 변환
|
||||
PDFToText.selectText.1=출력 파일 형식
|
||||
PDFToText.credit=이 서비스는 파일 변환을 위해 LibreOffice를 사용합니다.
|
||||
@@ -955,68 +968,90 @@ PDFToText.submit=변환
|
||||
|
||||
|
||||
#PDFToHTML
|
||||
PDFToHTML.title=PDF to HTML
|
||||
PDFToHTML.title=PDF를 HTML로
|
||||
PDFToHTML.header=PDF 문서를 HTML로 변환
|
||||
PDFToHTML.credit=이 서비스는 파일 변환을 위해 LibreOffice를 사용합니다.
|
||||
PDFToHTML.credit=이 서비스는 파일 변환을 위해 pdftohtml를 사용합니다.
|
||||
PDFToHTML.submit=변환
|
||||
|
||||
|
||||
#PDFToXML
|
||||
PDFToXML.title=PDF to XML
|
||||
PDFToXML.title=PDF를 XML로 변환
|
||||
PDFToXML.header=PDF 문서를 XML로 변환
|
||||
PDFToXML.credit=이 서비스는 파일 변환을 위해 LibreOffice를 사용합니다.
|
||||
PDFToXML.submit=변환
|
||||
|
||||
#PDFToCSV
|
||||
PDFToCSV.title=PDF? CSV?
|
||||
PDFToCSV.header=PDF? CSV?
|
||||
PDFToCSV.prompt=Choose page to extract table
|
||||
PDFToCSV.submit=??
|
||||
PDFToCSV.title=PDF에서 CSV로
|
||||
PDFToCSV.header=PDF에서 CSV로
|
||||
PDFToCSV.prompt=테이블을 추출할 페이지 선택
|
||||
PDFToCSV.submit=추출물
|
||||
|
||||
#split-by-size-or-count
|
||||
split-by-size-or-count.title=Split PDF by Size or Count
|
||||
split-by-size-or-count.header=Split PDF by Size or Count
|
||||
split-by-size-or-count.type.label=Select Split Type
|
||||
split-by-size-or-count.type.size=By Size
|
||||
split-by-size-or-count.type.pageCount=By Page Count
|
||||
split-by-size-or-count.type.docCount=By Document Count
|
||||
split-by-size-or-count.value.label=Enter Value
|
||||
split-by-size-or-count.value.placeholder=Enter size (e.g., 2MB or 3KB) or count (e.g., 5)
|
||||
split-by-size-or-count.submit=Submit
|
||||
split-by-size-or-count.title=크기 또는 개수로 PDF 분할
|
||||
split-by-size-or-count.header=크기 또는 개수로 PDF 분할
|
||||
split-by-size-or-count.type.label=분할 유형 선택
|
||||
split-by-size-or-count.type.size=크기별
|
||||
split-by-size-or-count.type.pageCount=페이지 수별
|
||||
split-by-size-or-count.type.docCount=문서 수 기준
|
||||
split-by-size-or-count.value.label=값 입력
|
||||
split-by-size-or-count.value.placeholder=크기(예: 2MB 또는 3KB) 또는 개수(예: 5)를 입력합니다.
|
||||
split-by-size-or-count.submit=전송
|
||||
|
||||
|
||||
#overlay-pdfs
|
||||
overlay-pdfs.header=Overlay PDF Files
|
||||
overlay-pdfs.baseFile.label=Select Base PDF File
|
||||
overlay-pdfs.overlayFiles.label=Select Overlay PDF Files
|
||||
overlay-pdfs.mode.label=Select Overlay Mode
|
||||
overlay-pdfs.mode.sequential=Sequential Overlay
|
||||
overlay-pdfs.mode.interleaved=Interleaved Overlay
|
||||
overlay-pdfs.mode.fixedRepeat=Fixed Repeat Overlay
|
||||
overlay-pdfs.counts.label=Overlay Counts (for Fixed Repeat Mode)
|
||||
overlay-pdfs.counts.placeholder=Enter comma-separated counts (e.g., 2,3,1)
|
||||
overlay-pdfs.position.label=Select Overlay Position
|
||||
overlay-pdfs.position.foreground=Foreground
|
||||
overlay-pdfs.position.background=Background
|
||||
overlay-pdfs.submit=Submit
|
||||
overlay-pdfs.header=PDF 파일 오버레이
|
||||
overlay-pdfs.baseFile.label=기본 PDF 파일 선택
|
||||
overlay-pdfs.overlayFiles.label=오버레이 PDF 파일 선택
|
||||
overlay-pdfs.mode.label=오버레이 모드 선택
|
||||
overlay-pdfs.mode.sequential=순차 오버레이
|
||||
overlay-pdfs.mode.interleaved=인터리브 오버레이
|
||||
overlay-pdfs.mode.fixedRepeat=고정 반복 오버레이
|
||||
overlay-pdfs.counts.label=오버레이 카운트(고정 반복 모드의 경우)
|
||||
overlay-pdfs.counts.placeholder=쉼표로 구분된 개수를 입력합니다(예: 2,3,1).
|
||||
overlay-pdfs.position.label=오버레이 위치 선택
|
||||
overlay-pdfs.position.foreground=전경
|
||||
overlay-pdfs.position.background=배경
|
||||
overlay-pdfs.submit=전송
|
||||
|
||||
|
||||
#split-by-sections
|
||||
split-by-sections.title=Split PDF by Sections
|
||||
split-by-sections.header=Split PDF into Sections
|
||||
split-by-sections.horizontal.label=Horizontal Divisions
|
||||
split-by-sections.vertical.label=Vertical Divisions
|
||||
split-by-sections.horizontal.placeholder=Enter number of horizontal divisions
|
||||
split-by-sections.vertical.placeholder=Enter number of vertical divisions
|
||||
split-by-sections.submit=Split PDF
|
||||
split-by-sections.merge=Merge Into One PDF
|
||||
split-by-sections.title=섹션별로 PDF 분할
|
||||
split-by-sections.header=PDF를 섹션으로 분할
|
||||
split-by-sections.horizontal.label=수평 분할
|
||||
split-by-sections.vertical.label=수직 분할
|
||||
split-by-sections.horizontal.placeholder=수평 분할 수를 입력합니다
|
||||
split-by-sections.vertical.placeholder=수직 분할 수를 입력합니다
|
||||
split-by-sections.submit=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.nav=Licenses
|
||||
licenses.title=3rd Party Licenses
|
||||
licenses.header=3rd Party Licenses
|
||||
licenses.module=Module
|
||||
licenses.version=Version
|
||||
licenses.license=License
|
||||
licenses.nav=라이센스
|
||||
licenses.title=제3자 라이선스
|
||||
licenses.header=제3자 라이선스
|
||||
licenses.module=모듈
|
||||
licenses.version=버전
|
||||
licenses.license=라이센스
|
||||
|
||||
|
||||
# error
|
||||
error.sorry=문제를 끼친 점 죄송합니다!
|
||||
error.needHelp=도움이 필요하신가요 / 문제가 있으신가요?
|
||||
error.contactTip=여전히 문제가 해결되지 않는다면 망설이지 마시고 도움을 요청하십시오. GitHub 페이지에서 티켓을 제출하거나 Discord를 통해 우리에게 연락하실 수 있습니다:
|
||||
error.404.head=404 - 페이지를 찾을 수 없습니다 | 이런, 코드에 걸려 넘어졌어요!
|
||||
error.404.1=원하시는 페이지를 찾을 수가 없네요.
|
||||
error.404.2=문제가 발생했습니다
|
||||
error.github=GitHub에서 티켓 제출
|
||||
error.showStack=스택 추적 보기
|
||||
error.copyStack=스택 추적 복사
|
||||
error.githubSubmit=GitHub - 티켓 제출
|
||||
error.discordSubmit=Discord - 문의 게시
|
||||
|
||||
|
||||
@@ -57,6 +57,17 @@ usernameExistsMessage=Nieuwe gebruikersnaam bestaat al.
|
||||
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
|
||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||
error=Error
|
||||
oops=Oops!
|
||||
help=Help
|
||||
goHomepage=Go to Homepage
|
||||
joinDiscord=Join our Discord server
|
||||
seeDockerHub=See Docker Hub
|
||||
visitGithub=Visit Github Repository
|
||||
donate=Donate
|
||||
color=Color
|
||||
sponsor=Sponsor
|
||||
|
||||
|
||||
|
||||
###############
|
||||
@@ -101,6 +112,7 @@ navbar.settings=Instellingen
|
||||
#############
|
||||
settings.title=Instellingen
|
||||
settings.update=Update beschikbaar
|
||||
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
|
||||
settings.appVersion=App versie:
|
||||
settings.downloadOption.title=Kies download optie (Voor enkelvoudige bestanddownloads zonder zip):
|
||||
settings.downloadOption.1=Open in hetzelfde venster
|
||||
@@ -109,8 +121,9 @@ settings.downloadOption.3=Download bestand
|
||||
settings.zipThreshold=Bestanden zippen wanneer het aantal gedownloade bestanden meer is dan
|
||||
settings.signOut=Uitloggen
|
||||
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.header=Werk je accountgegevens bij
|
||||
@@ -796,17 +809,17 @@ rotate.selectAngle=Selecteer rotatiehoek (in veelvouden van 90 graden):
|
||||
rotate.submit=Roteren
|
||||
|
||||
|
||||
#merge
|
||||
#split-pdfs
|
||||
split.title=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.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.4=Document #2: Pagina 2 en 3
|
||||
split.desc.5=Document #3: Pagina 4, 5 en 6
|
||||
split.desc.6=Document #4: Pagina 7
|
||||
split.desc.7=Document #5: Pagina 8
|
||||
split.desc.8=Document #6: Pagina 9 en 10
|
||||
split.desc.5=Document #3: Pagina 4, 5, 6 en 7
|
||||
split.desc.6=Document #4: Pagina 8
|
||||
split.desc.7=Document #5: Pagina 9
|
||||
split.desc.8=Document #6: Pagina 10
|
||||
split.splitPages=Voer pagina's in om op te splitsen:
|
||||
split.submit=Splitsen
|
||||
|
||||
@@ -957,7 +970,7 @@ PDFToText.submit=Converteren
|
||||
#PDFToHTML
|
||||
PDFToHTML.title=PDF naar HTML
|
||||
PDFToHTML.header=PDF naar HTML
|
||||
PDFToHTML.credit=Deze service gebruikt LibreOffice voor bestandsconversie.
|
||||
PDFToHTML.credit=Deze service gebruikt pdftohtml voor bestandsconversie.
|
||||
PDFToHTML.submit=Converteren
|
||||
|
||||
|
||||
@@ -1011,6 +1024,15 @@ split-by-sections.vertical.placeholder=Voer het aantal verticale secties in
|
||||
split-by-sections.submit=PDF splitsen
|
||||
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.nav=Licenties
|
||||
licenses.title=Licenties van derden
|
||||
@@ -1020,3 +1042,16 @@ licenses.version=Versie
|
||||
licenses.license=Licentie
|
||||
|
||||
|
||||
# error
|
||||
error.sorry=Sorry for the issue!
|
||||
error.needHelp=Need help / Found an issue?
|
||||
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.404.head=404 - Page Not Found | Oops, we tripped in the code!
|
||||
error.404.1=We can't seem to find the page you're looking for.
|
||||
error.404.2=Something went wrong
|
||||
error.github=Submit a ticket on GitHub
|
||||
error.showStack=Show Stack Trace
|
||||
error.copyStack=Copy Stack Trace
|
||||
error.githubSubmit=GitHub - Submit a ticket
|
||||
error.discordSubmit=Discord - Submit Support post
|
||||
|
||||
|
||||
@@ -57,6 +57,17 @@ usernameExistsMessage=New Username already exists.
|
||||
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
|
||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||
error=Error
|
||||
oops=Oops!
|
||||
help=Help
|
||||
goHomepage=Go to Homepage
|
||||
joinDiscord=Join our Discord server
|
||||
seeDockerHub=See Docker Hub
|
||||
visitGithub=Visit Github Repository
|
||||
donate=Donate
|
||||
color=Color
|
||||
sponsor=Sponsor
|
||||
|
||||
|
||||
|
||||
###############
|
||||
@@ -101,6 +112,7 @@ navbar.settings=Ustawienia
|
||||
#############
|
||||
settings.title=Ustawienia
|
||||
settings.update=Dostępna aktualizacja
|
||||
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
|
||||
settings.appVersion=Wersia aplikacji:
|
||||
settings.downloadOption.title=Wybierz opcję pobierania (w przypadku pobierania pojedynczych plików innych niż ZIP):
|
||||
settings.downloadOption.1=Otwórz w tym samym oknie
|
||||
@@ -109,8 +121,9 @@ settings.downloadOption.3=Pobierz plik
|
||||
settings.zipThreshold=Spakuj pliki, gdy liczba pobranych plików przekroczy
|
||||
settings.signOut=Sign Out
|
||||
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.header=Update Your Account Details
|
||||
@@ -796,17 +809,17 @@ rotate.selectAngle=Wybierz kąt obrotu (domyślnie 90 stopni):
|
||||
rotate.submit=Obróć
|
||||
|
||||
|
||||
#merge
|
||||
#split-pdfs
|
||||
split.title=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.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.4=Dokument #2: Strona 2 i 3
|
||||
split.desc.5=Dokument #3: Strona 4, 5 i 6
|
||||
split.desc.6=Dokument #4: Strona 7
|
||||
split.desc.7=Dokument #5: Strona 8
|
||||
split.desc.8=Dokument #6: Strona 9 i 10
|
||||
split.desc.5=Dokument #3: Strona 4, 5, 6 i 7
|
||||
split.desc.6=Dokument #4: Strona 8
|
||||
split.desc.7=Dokument #5: Strona 9
|
||||
split.desc.8=Dokument #6: Strona 10
|
||||
split.splitPages=Wprowadź strony do podziału na:
|
||||
split.submit=Podziel
|
||||
|
||||
@@ -957,7 +970,7 @@ PDFToText.submit=Konwertuj
|
||||
#PDFToHTML
|
||||
PDFToHTML.title=PDF na HTML
|
||||
PDFToHTML.header=PDF na HTML
|
||||
PDFToHTML.credit=Ta usługa używa LibreOffice do konwersji plików.
|
||||
PDFToHTML.credit=Ta usługa używa pdftohtml do konwersji plików.
|
||||
PDFToHTML.submit=Konwertuj
|
||||
|
||||
|
||||
@@ -1011,6 +1024,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions
|
||||
split-by-sections.submit=Split 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.nav=Licenses
|
||||
licenses.title=3rd Party Licenses
|
||||
@@ -1020,3 +1042,16 @@ licenses.version=Version
|
||||
licenses.license=License
|
||||
|
||||
|
||||
# error
|
||||
error.sorry=Sorry for the issue!
|
||||
error.needHelp=Need help / Found an issue?
|
||||
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.404.head=404 - Page Not Found | Oops, we tripped in the code!
|
||||
error.404.1=We can't seem to find the page you're looking for.
|
||||
error.404.2=Something went wrong
|
||||
error.github=Submit a ticket on GitHub
|
||||
error.showStack=Show Stack Trace
|
||||
error.copyStack=Copy Stack Trace
|
||||
error.githubSubmit=GitHub - Submit a ticket
|
||||
error.discordSubmit=Discord - Submit Support post
|
||||
|
||||
|
||||
@@ -57,6 +57,17 @@ usernameExistsMessage=New Username already exists.
|
||||
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
|
||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||
error=Error
|
||||
oops=Oops!
|
||||
help=Help
|
||||
goHomepage=Go to Homepage
|
||||
joinDiscord=Join our Discord server
|
||||
seeDockerHub=See Docker Hub
|
||||
visitGithub=Visit Github Repository
|
||||
donate=Donate
|
||||
color=Color
|
||||
sponsor=Sponsor
|
||||
|
||||
|
||||
|
||||
###############
|
||||
@@ -101,6 +112,7 @@ navbar.settings=Configurações
|
||||
#############
|
||||
settings.title=Configurações
|
||||
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.downloadOption.title=Escolha a opção de download (para downloads não compactados de arquivo único):
|
||||
settings.downloadOption.1=Abrir na mesma janela
|
||||
@@ -109,8 +121,9 @@ settings.downloadOption.3=⇬ Fazer download do arquivo
|
||||
settings.zipThreshold=Compactar arquivos quando o número de arquivos baixados exceder
|
||||
settings.signOut=Sign Out
|
||||
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.header=Update Your Account Details
|
||||
@@ -796,17 +809,17 @@ rotate.selectAngle=Selecione o ângulo de rotação (múltiplos de 90 graus):
|
||||
rotate.submit=Girar
|
||||
|
||||
|
||||
#merge
|
||||
#split-pdfs
|
||||
split.title=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.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.4=Documento Nº2: Páginas 2 e 3
|
||||
split.desc.5=Documento Nº3: Páginas 4, 5 e 6
|
||||
split.desc.6=Documento Nº4: Página 7
|
||||
split.desc.7=Documento Nº5: Página 8
|
||||
split.desc.8=Documento Nº6: Páginas 9 e 10
|
||||
split.desc.5=Documento Nº3: Páginas 4, 5, 6 e 7
|
||||
split.desc.6=Documento Nº4: Página 8
|
||||
split.desc.7=Documento Nº5: Página 9
|
||||
split.desc.8=Documento Nº6: Páginas 10
|
||||
split.splitPages=Digite as páginas para a divisão:
|
||||
split.submit=Dividir
|
||||
|
||||
@@ -957,7 +970,7 @@ PDFToText.submit=Converter
|
||||
#PDFToHTML
|
||||
PDFToHTML.title=PDF para HTML
|
||||
PDFToHTML.header=PDF para HTML
|
||||
PDFToHTML.credit=Este serviço usa o LibreOffice para Conversão de Arquivos.
|
||||
PDFToHTML.credit=Este serviço usa o pdftohtml para Conversão de Arquivos.
|
||||
PDFToHTML.submit=Converter
|
||||
|
||||
|
||||
@@ -1011,6 +1024,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions
|
||||
split-by-sections.submit=Split 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.nav=Licenses
|
||||
licenses.title=3rd Party Licenses
|
||||
@@ -1020,3 +1042,16 @@ licenses.version=Version
|
||||
licenses.license=License
|
||||
|
||||
|
||||
# error
|
||||
error.sorry=Sorry for the issue!
|
||||
error.needHelp=Need help / Found an issue?
|
||||
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.404.head=404 - Page Not Found | Oops, we tripped in the code!
|
||||
error.404.1=We can't seem to find the page you're looking for.
|
||||
error.404.2=Something went wrong
|
||||
error.github=Submit a ticket on GitHub
|
||||
error.showStack=Show Stack Trace
|
||||
error.copyStack=Copy Stack Trace
|
||||
error.githubSubmit=GitHub - Submit a ticket
|
||||
error.discordSubmit=Discord - Submit Support post
|
||||
|
||||
|
||||
@@ -57,6 +57,17 @@ usernameExistsMessage=Esse utilizador já existe.
|
||||
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
|
||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||
error=Error
|
||||
oops=Oops!
|
||||
help=Help
|
||||
goHomepage=Go to Homepage
|
||||
joinDiscord=Join our Discord server
|
||||
seeDockerHub=See Docker Hub
|
||||
visitGithub=Visit Github Repository
|
||||
donate=Donate
|
||||
color=Color
|
||||
sponsor=Sponsor
|
||||
|
||||
|
||||
|
||||
###############
|
||||
@@ -101,6 +112,7 @@ navbar.settings=Configurações
|
||||
#############
|
||||
settings.title=Configurações
|
||||
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.downloadOption.title=Escolha a opção de download (para downloads não compactados de ficheiro único):
|
||||
settings.downloadOption.1=Abrir na mesma janela
|
||||
@@ -109,8 +121,9 @@ settings.downloadOption.3=⇬ Fazer download do ficheiro
|
||||
settings.zipThreshold=Compactar ficheiros quando o número de ficheiros baixados exceder
|
||||
settings.signOut=Terminar Sessão
|
||||
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.header=Alterar dados da sua conta
|
||||
@@ -796,17 +809,17 @@ rotate.selectAngle=Seleccione o ângulo de rotação (múltiplos de 90 graus):
|
||||
rotate.submit=Girar
|
||||
|
||||
|
||||
#merge
|
||||
#split-pdfs
|
||||
split.title=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.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.4=Documento Nº2: Páginas 2 e 3
|
||||
split.desc.5=Documento Nº3: Páginas 4, 5 e 6
|
||||
split.desc.6=Documento Nº4: Página 7
|
||||
split.desc.7=Documento Nº5: Página 8
|
||||
split.desc.8=Documento Nº6: Páginas 9 e 10
|
||||
split.desc.5=Documento Nº3: Páginas 4, 5, 6 e 7
|
||||
split.desc.6=Documento Nº4: Página 8
|
||||
split.desc.7=Documento Nº5: Página 9
|
||||
split.desc.8=Documento Nº6: Páginas 10
|
||||
split.splitPages=Digite as páginas para a divisão:
|
||||
split.submit=Dividir
|
||||
|
||||
@@ -957,7 +970,7 @@ PDFToText.submit=Converter
|
||||
#PDFToHTML
|
||||
PDFToHTML.title=PDF para HTML
|
||||
PDFToHTML.header=PDF para HTML
|
||||
PDFToHTML.credit=Este serviço usa o LibreOffice para Conversão de ficheiros.
|
||||
PDFToHTML.credit=Este serviço usa o pdftohtml para Conversão de ficheiros.
|
||||
PDFToHTML.submit=Converter
|
||||
|
||||
|
||||
@@ -1011,6 +1024,15 @@ split-by-sections.vertical.placeholder=Introduza o número de divisões verticai
|
||||
split-by-sections.submit=Dividir 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.nav=Licenças
|
||||
licenses.title=Licenças de terceiros
|
||||
@@ -1020,3 +1042,16 @@ licenses.version=Versão
|
||||
licenses.license=Licença
|
||||
|
||||
|
||||
# error
|
||||
error.sorry=Sorry for the issue!
|
||||
error.needHelp=Need help / Found an issue?
|
||||
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.404.head=404 - Page Not Found | Oops, we tripped in the code!
|
||||
error.404.1=We can't seem to find the page you're looking for.
|
||||
error.404.2=Something went wrong
|
||||
error.github=Submit a ticket on GitHub
|
||||
error.showStack=Show Stack Trace
|
||||
error.copyStack=Copy Stack Trace
|
||||
error.githubSubmit=GitHub - Submit a ticket
|
||||
error.discordSubmit=Discord - Submit Support post
|
||||
|
||||
|
||||
@@ -57,6 +57,17 @@ usernameExistsMessage=New Username already exists.
|
||||
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
|
||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||
error=Error
|
||||
oops=Oops!
|
||||
help=Help
|
||||
goHomepage=Go to Homepage
|
||||
joinDiscord=Join our Discord server
|
||||
seeDockerHub=See Docker Hub
|
||||
visitGithub=Visit Github Repository
|
||||
donate=Donate
|
||||
color=Color
|
||||
sponsor=Sponsor
|
||||
|
||||
|
||||
|
||||
###############
|
||||
@@ -101,6 +112,7 @@ navbar.settings=Setări
|
||||
#############
|
||||
settings.title=Setări
|
||||
settings.update=Actualizare disponibilă
|
||||
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
|
||||
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.1=Deschide în aceeași fereastră
|
||||
@@ -109,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.signOut=Sign Out
|
||||
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.header=Update Your Account Details
|
||||
@@ -796,17 +809,17 @@ rotate.selectAngle=Selectați un unghi de rotație (în multiplicate de 90 de gr
|
||||
rotate.submit=Rotește
|
||||
|
||||
|
||||
#merge
|
||||
#split-pdfs
|
||||
split.title=Î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.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.4=Documentul #2: Paginile 2 și 3
|
||||
split.desc.5=Documentul #3: Paginile 4, 5 și 6
|
||||
split.desc.6=Documentul #4: Pagina 7
|
||||
split.desc.7=Documentul #5: Pagina 8
|
||||
split.desc.8=Documentul #6: Paginile 9 și 10
|
||||
split.desc.5=Documentul #3: Paginile 4, 5, 6 și 7
|
||||
split.desc.6=Documentul #4: Pagina 8
|
||||
split.desc.7=Documentul #5: Pagina 9
|
||||
split.desc.8=Documentul #6: Pagina 10
|
||||
split.splitPages=Introduceți paginile pe care să le împărțiți:
|
||||
split.submit=Împarte
|
||||
|
||||
@@ -957,7 +970,7 @@ PDFToText.submit=Convert
|
||||
#PDFToHTML
|
||||
PDFToHTML.title=PDF către HTML
|
||||
PDFToHTML.header=PDF către HTML
|
||||
PDFToHTML.credit=Acest serviciu utilizează LibreOffice pentru conversia fișierului.
|
||||
PDFToHTML.credit=Acest serviciu utilizează pdftohtml pentru conversia fișierului.
|
||||
PDFToHTML.submit=Convert
|
||||
|
||||
|
||||
@@ -1011,6 +1024,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions
|
||||
split-by-sections.submit=Split 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.nav=Licenses
|
||||
licenses.title=3rd Party Licenses
|
||||
@@ -1020,3 +1042,16 @@ licenses.version=Version
|
||||
licenses.license=License
|
||||
|
||||
|
||||
# error
|
||||
error.sorry=Sorry for the issue!
|
||||
error.needHelp=Need help / Found an issue?
|
||||
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.404.head=404 - Page Not Found | Oops, we tripped in the code!
|
||||
error.404.1=We can't seem to find the page you're looking for.
|
||||
error.404.2=Something went wrong
|
||||
error.github=Submit a ticket on GitHub
|
||||
error.showStack=Show Stack Trace
|
||||
error.copyStack=Copy Stack Trace
|
||||
error.githubSubmit=GitHub - Submit a ticket
|
||||
error.discordSubmit=Discord - Submit Support post
|
||||
|
||||
|
||||
@@ -11,17 +11,17 @@ imgPrompt=Выберите картинку(и)
|
||||
genericSubmit=Отправить
|
||||
processTimeWarning=Внимание: Этот процесс может занять до минуты в зависимости от размера файла.
|
||||
pageOrderPrompt=Порядок страниц (введите список номеров страниц через запятую):
|
||||
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=Вперед
|
||||
true=Истина
|
||||
false=Ложь
|
||||
unknown=Неизвестно
|
||||
save=Сохранить
|
||||
saveToBrowser=Save to Browser
|
||||
saveToBrowser=Сохранить в браузере
|
||||
close=Закрыть
|
||||
filesSelected=файлов выбрано
|
||||
noFavourites=Нет избранного
|
||||
downloadComplete=Download Complete
|
||||
downloadComplete=Загрузка завершена
|
||||
bored=Скучно ждать?
|
||||
alphabet=Алфавит
|
||||
downloadPdf=Скачать PDF
|
||||
@@ -29,59 +29,70 @@ text=Текст
|
||||
font=Шрифт
|
||||
selectFillter=-- Выбрать --
|
||||
pageNum=номер страницы
|
||||
sizes.small=Small
|
||||
sizes.medium=Medium
|
||||
sizes.large=Large
|
||||
sizes.x-large=X-Large
|
||||
error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect
|
||||
delete=Delete
|
||||
username=Username
|
||||
password=Password
|
||||
welcome=Welcome
|
||||
property=Property
|
||||
black=Black
|
||||
white=White
|
||||
red=Red
|
||||
green=Green
|
||||
blue=Blue
|
||||
custom=Custom...
|
||||
WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
|
||||
sizes.small=Маленький
|
||||
sizes.medium=Середина
|
||||
sizes.large=Большой
|
||||
sizes.x-large=очень большой
|
||||
error.pdfPassword=Документ PDF имеет пароль, и пароль не был предоставлен или был неверным
|
||||
delete=Удалить
|
||||
username=Имя пользователя
|
||||
password=Пароль
|
||||
welcome=Добро пожаловать
|
||||
property=Свойство
|
||||
black=Чёрный
|
||||
white=Белый
|
||||
red=Красный
|
||||
green=Зеленый
|
||||
blue=Синий
|
||||
custom=Обычай...
|
||||
WorkInProgess=Работа продолжается, может не работать или глючить, пожалуйста, сообщайте о любых проблемах!
|
||||
poweredBy=Powered by
|
||||
yes=Yes
|
||||
no=No
|
||||
changedCredsMessage=Credentials changed!
|
||||
notAuthenticatedMessage=User not authenticated.
|
||||
userNotFoundMessage=User not found.
|
||||
incorrectPasswordMessage=Current password is incorrect.
|
||||
usernameExistsMessage=New Username already exists.
|
||||
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
|
||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||
yes=Да
|
||||
no=Нет
|
||||
changedCredsMessage=Учетные данные изменены!
|
||||
notAuthenticatedMessage=Пользователь не прошел проверку подлинности.
|
||||
userNotFoundMessage=Пользователь не найден.
|
||||
incorrectPasswordMessage=Текущий пароль неверен.
|
||||
usernameExistsMessage=Новое имя пользователя уже существует.
|
||||
invalidUsernameMessage=Недопустимое имя пользователя, Имя пользователя должно содержать только буквы алфавита и цифры.
|
||||
deleteCurrentUserMessage=Невозможно удалить пользователя, вошедшего в систему.
|
||||
deleteUsernameExistsMessage=Имя пользователя не существует и не может быть удалено.
|
||||
error=Ошибка
|
||||
oops=Ой!
|
||||
help=Помощь
|
||||
goHomepage=Перейти на главную страницу
|
||||
joinDiscord=Присоединиться к нашему серверу Discord
|
||||
seeDockerHub=Посмотреть в Docker Hub
|
||||
visitGithub=Посетить репозиторий на GitHub
|
||||
donate=Пожертвовать
|
||||
color=Цвет
|
||||
sponsor=Спонсор
|
||||
|
||||
|
||||
|
||||
###############
|
||||
# Pipeline #
|
||||
###############
|
||||
pipeline.header=Pipeline Menu (Beta)
|
||||
pipeline.uploadButton=Upload Custom
|
||||
pipeline.configureButton=Configure
|
||||
pipeline.defaultOption=Custom
|
||||
pipeline.submitButton=Submit
|
||||
pipeline.help=Pipeline Help
|
||||
pipeline.scanHelp=Folder Scanning Help
|
||||
pipeline.header=Меню конвейерной обработки (Бета)
|
||||
pipeline.uploadButton=Загрузить Пользовательский
|
||||
pipeline.configureButton=Настройка
|
||||
pipeline.defaultOption=Пользовательский
|
||||
pipeline.submitButton=Отправить
|
||||
pipeline.help=Справка по конвейерной обработке
|
||||
pipeline.scanHelp=Справка по сканированию папок
|
||||
|
||||
######################
|
||||
# Pipeline Options #
|
||||
######################
|
||||
pipelineOptions.header=Pipeline Configuration
|
||||
pipelineOptions.pipelineNameLabel=Pipeline Name
|
||||
pipelineOptions.saveSettings=Save Operation Settings
|
||||
pipelineOptions.pipelineNamePrompt=Enter pipeline name here
|
||||
pipelineOptions.selectOperation=Select Operation
|
||||
pipelineOptions.addOperationButton=Add operation
|
||||
pipelineOptions.pipelineHeader=Pipeline:
|
||||
pipelineOptions.saveButton=Download
|
||||
pipelineOptions.validateButton=Validate
|
||||
pipelineOptions.header=Настройка конвейерной обработки
|
||||
pipelineOptions.pipelineNameLabel=Название конвейера
|
||||
pipelineOptions.saveSettings=Сохранить настройки операции
|
||||
pipelineOptions.pipelineNamePrompt=Введите имя конвейера здесь
|
||||
pipelineOptions.selectOperation=Выбрать операцию
|
||||
pipelineOptions.addOperationButton=Добавить операцию
|
||||
pipelineOptions.pipelineHeader=Конвейер:
|
||||
pipelineOptions.saveButton=Скачать
|
||||
pipelineOptions.validateButton=Проверить
|
||||
|
||||
|
||||
|
||||
@@ -101,75 +112,77 @@ navbar.settings=Настройки
|
||||
#############
|
||||
settings.title=Настройки
|
||||
settings.update=Доступно обновление
|
||||
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
|
||||
settings.appVersion=Версия приложения:
|
||||
settings.downloadOption.title=Выберите вариант загрузки (для загрузки одного файла без zip):
|
||||
settings.downloadOption.1=Открыть в том же окне
|
||||
settings.downloadOption.2=Открыть в новом окне
|
||||
settings.downloadOption.3=Загрузить файл
|
||||
settings.zipThreshold=Zip-файлы, когда количество загруженных файлов превышает
|
||||
settings.signOut=Sign Out
|
||||
settings.accountSettings=Account Settings
|
||||
settings.signOut=Выйти
|
||||
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.header=Обновите данные вашей учетной записи
|
||||
changeCreds.changePassword=Вы используете предустановленные учетные данные для входа. Пожалуйста, введите новый пароль
|
||||
changeCreds.newUsername=Новое имя пользователя
|
||||
changeCreds.oldPassword=Текущий пароль
|
||||
changeCreds.newPassword=Новый пароль
|
||||
changeCreds.confirmNewPassword=Подтвердите новый пароль
|
||||
changeCreds.submit=Отправить изменения
|
||||
|
||||
|
||||
|
||||
changeCreds.title=Change Credentials
|
||||
changeCreds.header=Update Your Account Details
|
||||
changeCreds.changePassword=You are using default login credentials. Please enter a new password
|
||||
changeCreds.newUsername=New Username
|
||||
changeCreds.oldPassword=Current Password
|
||||
changeCreds.newPassword=New Password
|
||||
changeCreds.confirmNewPassword=Confirm New Password
|
||||
changeCreds.submit=Submit Changes
|
||||
account.title=Настройки аккаунта
|
||||
account.accountSettings=Настройки аккаунта
|
||||
account.adminSettings=Настройки администратора - Просмотр и добавление пользователей
|
||||
account.userControlSettings=Настройки контроля пользователя
|
||||
account.changeUsername=Изменить имя пользователя
|
||||
account.newUsername=Новое имя пользователя
|
||||
account.password=Подтверждение пароля
|
||||
account.oldPassword=Старый пароль
|
||||
account.newPassword=Новый пароль
|
||||
account.changePassword=Изменить пароль
|
||||
account.confirmNewPassword=Подтвердите новый пароль
|
||||
account.signOut=Выйти
|
||||
account.yourApiKey=Ваш API-ключ
|
||||
account.syncTitle=Синхронизировать настройки браузера с учетной записью
|
||||
account.settingsCompare=Сравнение настроек:
|
||||
account.property=Свойство
|
||||
account.webBrowserSettings=Настройка веб-браузера
|
||||
account.syncToBrowser=Синхронизировать учетную запись -> Браузер
|
||||
account.syncToAccount=Синхронизировать учетную запись <- Браузер
|
||||
|
||||
|
||||
|
||||
account.title=Account Settings
|
||||
account.accountSettings=Account Settings
|
||||
account.adminSettings=Admin Settings - View and Add Users
|
||||
account.userControlSettings=User Control Settings
|
||||
account.changeUsername=Change Username
|
||||
account.newUsername=New Username
|
||||
account.password=Confirmation Password
|
||||
account.oldPassword=Old password
|
||||
account.newPassword=New Password
|
||||
account.changePassword=Change Password
|
||||
account.confirmNewPassword=Confirm New Password
|
||||
account.signOut=Sign Out
|
||||
account.yourApiKey=Your API Key
|
||||
account.syncTitle=Sync browser settings with Account
|
||||
account.settingsCompare=Settings Comparison:
|
||||
account.property=Property
|
||||
account.webBrowserSettings=Web Browser Setting
|
||||
account.syncToBrowser=Sync Account -> Browser
|
||||
account.syncToAccount=Sync Account <- Browser
|
||||
|
||||
|
||||
adminUserSettings.title=User Control Settings
|
||||
adminUserSettings.header=Admin User Control Settings
|
||||
adminUserSettings.admin=Admin
|
||||
adminUserSettings.user=User
|
||||
adminUserSettings.addUser=Add New User
|
||||
adminUserSettings.usernameInfo=Username must only contain letters and numbers, no spaces or special characters.
|
||||
adminUserSettings.roles=Roles
|
||||
adminUserSettings.role=Role
|
||||
adminUserSettings.actions=Actions
|
||||
adminUserSettings.apiUser=Limited API User
|
||||
adminUserSettings.extraApiUser=Additional Limited API User
|
||||
adminUserSettings.webOnlyUser=Web Only User
|
||||
adminUserSettings.demoUser=Demo User (No custom settings)
|
||||
adminUserSettings.internalApiUser=Internal API User
|
||||
adminUserSettings.forceChange=Force user to change password on login
|
||||
adminUserSettings.submit=Save User
|
||||
adminUserSettings.title=Настройки контроля пользователя
|
||||
adminUserSettings.header=Настройки контроля пользователя администратора
|
||||
adminUserSettings.admin=Администратор
|
||||
adminUserSettings.user=Пользователь
|
||||
adminUserSettings.addUser=Добавить нового пользователя
|
||||
adminUserSettings.usernameInfo=Имя пользователя должно содержать только буквы и цифры, без пробелов и специальных символов.
|
||||
adminUserSettings.roles=Роли
|
||||
adminUserSettings.role=Роль
|
||||
adminUserSettings.actions=Действия
|
||||
adminUserSettings.apiUser=Ограниченный пользователь API
|
||||
adminUserSettings.extraApiUser=Дополнительный ограниченный пользователь API
|
||||
adminUserSettings.webOnlyUser=Только веб-пользователь
|
||||
adminUserSettings.demoUser=Демо-пользователь (без настраиваемых параметров)
|
||||
adminUserSettings.internalApiUser=Внутренний пользователь API
|
||||
adminUserSettings.forceChange=Просить пользователя изменить пароль при входе в систему
|
||||
adminUserSettings.submit=Сохранить пользователя
|
||||
|
||||
#############
|
||||
# HOME-PAGE #
|
||||
#############
|
||||
home.desc=Ваш локальный универсальный магазин для всех ваших потребностей в PDF.
|
||||
home.searchBar=Search for features...
|
||||
home.searchBar=Поиск функций...
|
||||
|
||||
|
||||
home.viewPdf.title=View PDF
|
||||
home.viewPdf.desc=View, annotate, add text or images
|
||||
home.viewPdf.title=Просмотр PDF
|
||||
home.viewPdf.desc=Просмотр, аннотация, добавление текста или изображений
|
||||
viewPdf.tags=view,read,annotate,text,image
|
||||
|
||||
home.multiTool.title=Мультиинструмент PDF
|
||||
@@ -375,39 +388,39 @@ home.showJS.title=Показать Javascript
|
||||
home.showJS.desc=Ищет и отображает любой JS, внедренный в PDF-файл.
|
||||
showJS.tags=JS
|
||||
|
||||
home.autoRedact.title=Auto Redact
|
||||
home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text
|
||||
home.autoRedact.title=Автоматическое редактирование
|
||||
home.autoRedact.desc=Автоматическое затемнение (чернение) текста в PDF на основе входного текста
|
||||
autoRedact.tags=Redact,Hide,black out,black,marker,hidden
|
||||
|
||||
home.tableExtraxt.title=PDF to CSV
|
||||
home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV
|
||||
home.tableExtraxt.title=PDF в CSV
|
||||
home.tableExtraxt.desc=Извлекает таблицы из PDF и преобразует их в CSV
|
||||
tableExtraxt.tags=CSV,Table Extraction,extract,convert
|
||||
|
||||
|
||||
home.autoSizeSplitPDF.title=Auto Split by Size/Count
|
||||
home.autoSizeSplitPDF.desc=Split a single PDF into multiple documents based on size, page count, or document count
|
||||
home.autoSizeSplitPDF.title=Автоматическое разделение по размеру/количеству
|
||||
home.autoSizeSplitPDF.desc=Разделяет один PDF на несколько документов на основе размера, количества страниц или количества документов
|
||||
autoSizeSplitPDF.tags=pdf,split,document,organization
|
||||
|
||||
|
||||
home.overlay-pdfs.title=Overlay PDFs
|
||||
home.overlay-pdfs.desc=Overlays PDFs on-top of another PDF
|
||||
home.overlay-pdfs.title=Наложение PDF
|
||||
home.overlay-pdfs.desc=Наложение одного PDF поверх другого PDF
|
||||
overlay-pdfs.tags=Overlay
|
||||
|
||||
home.split-by-sections.title=Split PDF by Sections
|
||||
home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections
|
||||
home.split-by-sections.title=Разделение PDF по секциям
|
||||
home.split-by-sections.desc=Разделение каждой страницы PDF на более мелкие горизонтальные и вертикальные секции
|
||||
split-by-sections.tags=Section Split, Divide, Customize
|
||||
|
||||
home.AddStampRequest.title=Add Stamp to PDF
|
||||
home.AddStampRequest.desc=Add text or add image stamps at set locations
|
||||
home.AddStampRequest.title=Добавить печать на PDF
|
||||
home.AddStampRequest.desc=Добавление текстовой или изображенческой печати в заданные места
|
||||
AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize
|
||||
|
||||
|
||||
home.PDFToBook.title=PDF to Book
|
||||
home.PDFToBook.desc=Converts PDF to Book/Comic formats using calibre
|
||||
home.PDFToBook.title=PDF в книгу/комикс
|
||||
home.PDFToBook.desc=Конвертирует PDF в формат книги/комикса с помощью calibre
|
||||
PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle
|
||||
|
||||
home.BookToPDF.title=Book to PDF
|
||||
home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre
|
||||
home.BookToPDF.title=Книга в PDF
|
||||
home.BookToPDF.desc=Конвертирует форматы книги/комикса в PDF с помощью calibre
|
||||
BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle
|
||||
|
||||
|
||||
@@ -417,26 +430,26 @@ BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle
|
||||
# #
|
||||
###########################
|
||||
#login
|
||||
login.title=Sign in
|
||||
login.header=Sign in
|
||||
login.signin=Sign in
|
||||
login.rememberme=Remember me
|
||||
login.invalid=Invalid username or password.
|
||||
login.locked=Your account has been locked.
|
||||
login.signinTitle=Please sign in
|
||||
login.title=Вход
|
||||
login.header=Вход
|
||||
login.signin=Войти
|
||||
login.rememberme=Запомнить меня
|
||||
login.invalid=Недействительное имя пользователя или пароль.
|
||||
login.locked=Ваша учетная запись заблокирована.
|
||||
login.signinTitle=Пожалуйста, войдите
|
||||
|
||||
|
||||
#auto-redact
|
||||
autoRedact.title=Auto Redact
|
||||
autoRedact.header=Auto Redact
|
||||
autoRedact.colorLabel=Colour
|
||||
autoRedact.textsToRedactLabel=Text to Redact (line-separated)
|
||||
autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret
|
||||
autoRedact.useRegexLabel=Use Regex
|
||||
autoRedact.wholeWordSearchLabel=Whole Word Search
|
||||
autoRedact.customPaddingLabel=Custom Extra Padding
|
||||
autoRedact.convertPDFToImageLabel=Convert PDF to PDF-Image (Used to remove text behind the box)
|
||||
autoRedact.submitButton=Submit
|
||||
autoRedact.title=Автоматическое редактирование
|
||||
autoRedact.header=Автоматическое редактирование
|
||||
autoRedact.colorLabel=Цвет
|
||||
autoRedact.textsToRedactLabel=Текст для сокрытия (каждая строка отдельно)
|
||||
autoRedact.textsToRedactPlaceholder=например \nКонфиденциально \nСовершенно секретно
|
||||
autoRedact.useRegexLabel=Использовать регулярные выражения
|
||||
autoRedact.wholeWordSearchLabel=Поиск целых слов
|
||||
autoRedact.customPaddingLabel=Дополнительное отступление по настраиваемому значению
|
||||
autoRedact.convertPDFToImageLabel=Преобразовать PDF в изображение PDF (используется для удаления текста за рамкой)
|
||||
autoRedact.submitButton=Отправить
|
||||
|
||||
|
||||
#showJS
|
||||
@@ -456,7 +469,7 @@ pdfToSinglePage.submit=Преобразовать в одну страницу
|
||||
pageExtracter.title=Извлечь страницы
|
||||
pageExtracter.header=Извлечь страницы
|
||||
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
|
||||
@@ -488,37 +501,37 @@ HTMLToPDF.header=HTML в PDF
|
||||
HTMLToPDF.help=Принимает файлы HTML и ZIP-файлы, содержащие html/css/изображения и т. д.
|
||||
HTMLToPDF.submit=Конвертировать
|
||||
HTMLToPDF.credit=Использует WeasyPrint
|
||||
HTMLToPDF.zoom=Zoom level for displaying the website.
|
||||
HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default)
|
||||
HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default)
|
||||
HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default)
|
||||
HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default)
|
||||
HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default)
|
||||
HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default)
|
||||
HTMLToPDF.printBackground=Render the background of websites.
|
||||
HTMLToPDF.defaultHeader=Enable Default Header (Name and page number)
|
||||
HTMLToPDF.cssMediaType=Change the CSS media type of the page.
|
||||
HTMLToPDF.none=None
|
||||
HTMLToPDF.print=Print
|
||||
HTMLToPDF.screen=Screen
|
||||
HTMLToPDF.zoom=Уровень масштабирования для отображения веб-сайта.
|
||||
HTMLToPDF.pageWidth=Ширина страницы в сантиметрах. (Пусто - по умолчанию)
|
||||
HTMLToPDF.pageHeight=Высота страницы в сантиметрах. (Пусто - по умолчанию)
|
||||
HTMLToPDF.marginTop=Верхний отступ страницы в миллиметрах. (Пусто - по умолчанию)
|
||||
HTMLToPDF.marginBottom=Нижний отступ страницы в миллиметрах. (Пусто - по умолчанию)
|
||||
HTMLToPDF.marginLeft=Левый отступ страницы в миллиметрах. (Пусто - по умолчанию)
|
||||
HTMLToPDF.marginRight=Правый отступ страницы в миллиметрах. (Пусто - по умолчанию)
|
||||
HTMLToPDF.printBackground=Визуализировать фон веб-сайтов.
|
||||
HTMLToPDF.defaultHeader=Включить заголовок по умолчанию (Имя и номер страницы)
|
||||
HTMLToPDF.cssMediaType=Изменить тип медиа CSS страницы.
|
||||
HTMLToPDF.none=Нет
|
||||
HTMLToPDF.print=Печать
|
||||
HTMLToPDF.screen=Экран
|
||||
|
||||
|
||||
#AddStampRequest
|
||||
AddStampRequest.header=Stamp PDF
|
||||
AddStampRequest.title=Stamp PDF
|
||||
AddStampRequest.stampType=Stamp Type
|
||||
AddStampRequest.stampText=Stamp Text
|
||||
AddStampRequest.stampImage=Stamp Image
|
||||
AddStampRequest.alphabet=Alphabet
|
||||
AddStampRequest.fontSize=Font/Image Size
|
||||
AddStampRequest.rotation=Rotation
|
||||
AddStampRequest.opacity=Opacity
|
||||
AddStampRequest.position=Position
|
||||
AddStampRequest.overrideX=Override X Coordinate
|
||||
AddStampRequest.overrideY=Override Y Coordinate
|
||||
AddStampRequest.customMargin=Custom Margin
|
||||
AddStampRequest.customColor=Custom Text Color
|
||||
AddStampRequest.submit=Submit
|
||||
AddStampRequest.header=Штамповать PDF
|
||||
AddStampRequest.title=Штамповать PDF
|
||||
AddStampRequest.stampType=Тип штампа
|
||||
AddStampRequest.stampText=Текст штампа
|
||||
AddStampRequest.stampImage=Изображение штампа
|
||||
AddStampRequest.alphabet=Алфавит
|
||||
AddStampRequest.fontSize=Размер шрифта/изображения
|
||||
AddStampRequest.rotation=Поворот
|
||||
AddStampRequest.opacity=Прозрачность
|
||||
AddStampRequest.position=Позиция
|
||||
AddStampRequest.overrideX=Переопределить координату X
|
||||
AddStampRequest.overrideY=Переопределить координату Y
|
||||
AddStampRequest.customMargin=Настроенный отступ
|
||||
AddStampRequest.customColor=Настроенный цвет текста
|
||||
AddStampRequest.submit=Отправить
|
||||
|
||||
|
||||
#sanitizePDF
|
||||
@@ -541,9 +554,9 @@ addPageNumbers.selectText.3=Позиция
|
||||
addPageNumbers.selectText.4=Стартовый номер
|
||||
addPageNumbers.selectText.5=Страницы для нумерации
|
||||
addPageNumbers.selectText.6=Свой текст
|
||||
addPageNumbers.customTextDesc=Custom Text
|
||||
addPageNumbers.numberPagesDesc=Which pages to number, default 'all', also accepts 1-5 or 2,5,9 etc
|
||||
addPageNumbers.customNumberDesc=Defaults to {n}, also accepts 'Page {n} of {total}', 'Text-{n}', '{filename}-{n}
|
||||
addPageNumbers.customTextDesc=Пользовательский текст
|
||||
addPageNumbers.numberPagesDesc=Какие страницы нумеровать, по умолчанию 'все', также принимает 1-5 или 2,5,9 и т.д.
|
||||
addPageNumbers.customNumberDesc=По умолчанию {n}, также можно использовать 'Страница {n} из {total}', 'Текст-{n}', '{filename}-{n}'
|
||||
addPageNumbers.submit=Добавить номера страниц
|
||||
|
||||
|
||||
@@ -584,14 +597,14 @@ autoSplitPDF.submit=Отравить
|
||||
|
||||
|
||||
#pipeline
|
||||
pipeline.title=Pipeline
|
||||
pipeline.title=Пайплайн
|
||||
|
||||
|
||||
#pageLayout
|
||||
pageLayout.title=Многостраничный макет
|
||||
pageLayout.header=Многостраничный макет
|
||||
pageLayout.pagesPerSheet=Страниц на одном листе:
|
||||
pageLayout.addBorder=Add Borders
|
||||
pageLayout.addBorder=Добавить границы
|
||||
pageLayout.submit=Отправить
|
||||
|
||||
|
||||
@@ -607,11 +620,11 @@ scalePages.submit=Отправить
|
||||
certSign.title=Подписание сертификата
|
||||
certSign.header=Подпишите 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.selectCert=Выберите файл сертификата (формат X.509, может быть .pem или .der):
|
||||
certSign.selectP12=Выберите файл хранилища ключей PKCS#12 (.p12 или .pfx) (необязательно, если он предоставлен, он должен содержать ваш закрытый ключ и сертификат):
|
||||
certSign.selectJKS=Select Your Java Keystore File (.jks or .keystore):
|
||||
certSign.selectJKS=Выберите файл хранилища Java Keystore (.jks или .keystore):
|
||||
certSign.certType=Тип сертификата
|
||||
certSign.password=Введите пароль от хранилища ключей или личного ключа (если есть):
|
||||
certSign.showSig=Показать подпись
|
||||
@@ -632,9 +645,9 @@ removeBlanks.submit=Удалить Пустые
|
||||
|
||||
|
||||
#removeAnnotations
|
||||
removeAnnotations.title=Remove Annotations
|
||||
removeAnnotations.header=Remove Annotations
|
||||
removeAnnotations.submit=Remove
|
||||
removeAnnotations.title=Удалить аннотации
|
||||
removeAnnotations.header=Удалить аннотации
|
||||
removeAnnotations.submit=Удалить
|
||||
|
||||
|
||||
#compare
|
||||
@@ -645,17 +658,17 @@ compare.document.2=Документ 2
|
||||
compare.submit=Сравнить
|
||||
|
||||
#BookToPDF
|
||||
BookToPDF.title=Books and Comics to PDF
|
||||
BookToPDF.header=Book to PDF
|
||||
BookToPDF.credit=Uses Calibre
|
||||
BookToPDF.submit=Convert
|
||||
BookToPDF.title=Книги и комиксы в PDF
|
||||
BookToPDF.header=Конвертировать книгу в PDF
|
||||
BookToPDF.credit=Используется Calibre
|
||||
BookToPDF.submit=Конвертировать
|
||||
|
||||
#PDFToBook
|
||||
PDFToBook.title=PDF to Book
|
||||
PDFToBook.header=PDF to Book
|
||||
PDFToBook.selectText.1=Format
|
||||
PDFToBook.credit=Uses Calibre
|
||||
PDFToBook.submit=Convert
|
||||
PDFToBook.title=PDF в книгу
|
||||
PDFToBook.header=PDF в книгу
|
||||
PDFToBook.selectText.1=Формат
|
||||
PDFToBook.credit=Используется Calibre
|
||||
PDFToBook.submit=Конвертировать
|
||||
|
||||
#sign
|
||||
sign.title=Подпись
|
||||
@@ -750,8 +763,8 @@ addImage.submit=Добавить изображение
|
||||
#merge
|
||||
merge.title=Объединить
|
||||
merge.header=Объединение нескольких PDF-файлов (2+)
|
||||
merge.sortByName=Sort by name
|
||||
merge.sortByDate=Sort by date
|
||||
merge.sortByName=Сортировка по имени
|
||||
merge.sortByDate=Сортировка по дате
|
||||
merge.submit=Объединить
|
||||
|
||||
|
||||
@@ -759,34 +772,34 @@ merge.submit=Объединить
|
||||
pdfOrganiser.title=Организатор страниц
|
||||
pdfOrganiser.header=Организатор PDF-страниц
|
||||
pdfOrganiser.submit=Переупорядочить страницы
|
||||
pdfOrganiser.mode=Mode
|
||||
pdfOrganiser.mode.1=Custom Page Order
|
||||
pdfOrganiser.mode.2=Reverse Order
|
||||
pdfOrganiser.mode.3=Duplex Sort
|
||||
pdfOrganiser.mode.4=Booklet Sort
|
||||
pdfOrganiser.mode.5=Side Stitch Booklet Sort
|
||||
pdfOrganiser.mode.6=Odd-Even Split
|
||||
pdfOrganiser.mode.7=Remove First
|
||||
pdfOrganiser.mode.8=Remove Last
|
||||
pdfOrganiser.mode.9=Remove First and Last
|
||||
pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
||||
pdfOrganiser.mode=Режим
|
||||
pdfOrganiser.mode.1=Пользовательский порядок страниц
|
||||
pdfOrganiser.mode.2=Обратный порядок
|
||||
pdfOrganiser.mode.3=Сортировка дуплекса
|
||||
pdfOrganiser.mode.4=Сортировка брошюры
|
||||
pdfOrganiser.mode.5=Сортировка брошюры со стежкой по боковой стороне
|
||||
pdfOrganiser.mode.6=Разделение на чётные и нечётные страницы
|
||||
pdfOrganiser.mode.7=Удалить первую
|
||||
pdfOrganiser.mode.8=Удалить последнюю
|
||||
pdfOrganiser.mode.9=Удалить первую и последнюю
|
||||
pdfOrganiser.placeholder=(например, 1,3,2 или 4-8,2,10-12 или 2n-1)
|
||||
|
||||
|
||||
#multiTool
|
||||
multiTool.title=Мультиинструмент PDF
|
||||
multiTool.header=Мультиинструмент PDF
|
||||
multiTool.uploadPrompts=Please Upload PDF
|
||||
multiTool.uploadPrompts=Пожалуйста, загрузите PDF
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=View PDF
|
||||
viewPdf.header=View PDF
|
||||
viewPdf.title=Просмотреть PDF
|
||||
viewPdf.header=Просмотреть PDF
|
||||
|
||||
#pageRemover
|
||||
pageRemover.title=Удаление страниц
|
||||
pageRemover.header=Удаление PDF-страниц
|
||||
pageRemover.pagesToDelete=Страницы для удаления (введите список номеров страниц через запятую):
|
||||
pageRemover.submit=Удалить страницы
|
||||
pageRemover.placeholder=(e.g. 1,2,6 or 1-10,15-30)
|
||||
pageRemover.placeholder=(например, 1,2,6 или 1-10,15-30)
|
||||
|
||||
|
||||
#rotate
|
||||
@@ -796,17 +809,17 @@ rotate.selectAngle=Выберите угол поворота (кратный 90
|
||||
rotate.submit=Повернуть
|
||||
|
||||
|
||||
#merge
|
||||
#split-pdfs
|
||||
split.title=Разделить PDF
|
||||
split.header=Разделить PDF
|
||||
split.desc.1=Выбранные вами числа — это номера страниц, на которых вы хотите сделать разделение.
|
||||
split.desc.2=Таким образом, выбор 1,3,7-8 разделит 10-страничный документ на 6 отдельных PDF-файлов с:
|
||||
split.desc.3=Документ #1: Page 1
|
||||
split.desc.4=Документ #2: Page 2 and 3
|
||||
split.desc.5=Документ #3: Page 4, 5 and 6
|
||||
split.desc.6=Документ #4: Page 7
|
||||
split.desc.7=Документ #5: Page 8
|
||||
split.desc.8=Документ #6: Page 9 and 10
|
||||
split.desc.2=Таким образом, выбор 1,3,7-9 разделит 10-страничный документ на 6 отдельных PDF-файлов с:
|
||||
split.desc.3=Документ #1: Страница 1
|
||||
split.desc.4=Документ #2: Страница 2 и 3
|
||||
split.desc.5=Документ #3: Страница 4, 5, 6 aиnd 7
|
||||
split.desc.6=Документ #4: Страница 8
|
||||
split.desc.7=Документ #5: Страница 9
|
||||
split.desc.8=Документ #6: Страница 10
|
||||
split.splitPages=Введите страницы для разделения:
|
||||
split.submit=Разделить
|
||||
|
||||
@@ -815,10 +828,10 @@ split.submit=Разделить
|
||||
imageToPDF.title=Изображение в PDF
|
||||
imageToPDF.header=Изображение в PDF
|
||||
imageToPDF.submit=Конвертировать
|
||||
imageToPDF.selectLabel=Image Fit Options
|
||||
imageToPDF.fillPage=Fill Page
|
||||
imageToPDF.fitDocumentToImage=Fit Page to Image
|
||||
imageToPDF.maintainAspectRatio=Maintain Aspect Ratios
|
||||
imageToPDF.selectLabel=Выберите режим отображения изображения
|
||||
imageToPDF.fillPage=Заполнение страницы
|
||||
imageToPDF.fitDocumentToImage=Подогнать документ под изображение
|
||||
imageToPDF.maintainAspectRatio=Сохранить пропорции
|
||||
imageToPDF.selectText.2=Автоматический поворот PDF
|
||||
imageToPDF.selectText.3=Многофайловая логика (включена только при работе с несколькими изображениями)
|
||||
imageToPDF.selectText.4=Объединить в один PDF
|
||||
@@ -855,9 +868,9 @@ addPassword.selectText.10=Предотвратить модификацию
|
||||
addPassword.selectText.11=Запретить модификацию аннотаций
|
||||
addPassword.selectText.12=Запретить печать
|
||||
addPassword.selectText.13=Запретить печать разных форматов
|
||||
addPassword.selectText.14=Owner Password
|
||||
addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers)
|
||||
addPassword.selectText.16=Restricts the opening of the document itself
|
||||
addPassword.selectText.14=Владельческий пароль
|
||||
addPassword.selectText.15=Ограничивает то, что можно сделать с документом после его открытия (не поддерживается всеми программами чтения)
|
||||
addPassword.selectText.16=Ограничивает открытие самого документа
|
||||
addPassword.submit=Шифровать
|
||||
|
||||
|
||||
@@ -871,11 +884,11 @@ watermark.selectText.4=Поворот (0-360):
|
||||
watermark.selectText.5=widthSpacer (пробел между каждым водяным знаком по горизонтали):
|
||||
watermark.selectText.6=heightSpacer (пробел между каждым водяным знаком по вертикали):
|
||||
watermark.selectText.7=Непрозрачность (0% - 100%):
|
||||
watermark.selectText.8=Watermark Type:
|
||||
watermark.selectText.9=Watermark Image:
|
||||
watermark.selectText.8=Тип водяного знака:
|
||||
watermark.selectText.9=Изображение водяного знака:
|
||||
watermark.submit=Добавить водяной знак
|
||||
watermark.type.1=Text
|
||||
watermark.type.2=Image
|
||||
watermark.type.1=Текст
|
||||
watermark.type.2=Изображение
|
||||
|
||||
|
||||
#Change permissions
|
||||
@@ -957,7 +970,7 @@ PDFToText.submit=Конвертировать
|
||||
#PDFToHTML
|
||||
PDFToHTML.title=PDF в HTML
|
||||
PDFToHTML.header=PDF в HTML
|
||||
PDFToHTML.credit=Этот сервис использует LibreOffice для преобразования файлов.
|
||||
PDFToHTML.credit=Этот сервис использует pdftohtml для преобразования файлов.
|
||||
PDFToHTML.submit=Конвертировать
|
||||
|
||||
|
||||
@@ -968,55 +981,77 @@ PDFToXML.credit=Этот сервис использует LibreOffice для п
|
||||
PDFToXML.submit=Конвертировать
|
||||
|
||||
#PDFToCSV
|
||||
PDFToCSV.title=PDF ? CSV
|
||||
PDFToCSV.header=PDF ? CSV
|
||||
PDFToCSV.prompt=Choose page to extract table
|
||||
PDFToCSV.submit=???????
|
||||
PDFToCSV.title=PDF в CSV
|
||||
PDFToCSV.header=PDF в CSV
|
||||
PDFToCSV.prompt=Выберите страницу для извлечения таблицы
|
||||
PDFToCSV.submit=Извлечь
|
||||
|
||||
#split-by-size-or-count
|
||||
split-by-size-or-count.title=Split PDF by Size or Count
|
||||
split-by-size-or-count.header=Split PDF by Size or Count
|
||||
split-by-size-or-count.type.label=Select Split Type
|
||||
split-by-size-or-count.type.size=By Size
|
||||
split-by-size-or-count.type.pageCount=By Page Count
|
||||
split-by-size-or-count.type.docCount=By Document Count
|
||||
split-by-size-or-count.value.label=Enter Value
|
||||
split-by-size-or-count.value.placeholder=Enter size (e.g., 2MB or 3KB) or count (e.g., 5)
|
||||
split-by-size-or-count.submit=Submit
|
||||
split-by-size-or-count.title=Разделить PDF по размеру или количеству
|
||||
split-by-size-or-count.header=Разделить PDF по размеру или количеству
|
||||
split-by-size-or-count.type.label=Выберите тип разделения
|
||||
split-by-size-or-count.type.size=По размеру
|
||||
split-by-size-or-count.type.pageCount=По количеству страниц
|
||||
split-by-size-or-count.type.docCount=По количеству документов
|
||||
split-by-size-or-count.value.label=Введите значение
|
||||
split-by-size-or-count.value.placeholder=Введите размер (например, 2MB или 3KB) или количество (например, 5)
|
||||
split-by-size-or-count.submit=Отправить
|
||||
|
||||
|
||||
#overlay-pdfs
|
||||
overlay-pdfs.header=Overlay PDF Files
|
||||
overlay-pdfs.baseFile.label=Select Base PDF File
|
||||
overlay-pdfs.overlayFiles.label=Select Overlay PDF Files
|
||||
overlay-pdfs.mode.label=Select Overlay Mode
|
||||
overlay-pdfs.mode.sequential=Sequential Overlay
|
||||
overlay-pdfs.mode.interleaved=Interleaved Overlay
|
||||
overlay-pdfs.mode.fixedRepeat=Fixed Repeat Overlay
|
||||
overlay-pdfs.counts.label=Overlay Counts (for Fixed Repeat Mode)
|
||||
overlay-pdfs.counts.placeholder=Enter comma-separated counts (e.g., 2,3,1)
|
||||
overlay-pdfs.position.label=Select Overlay Position
|
||||
overlay-pdfs.position.foreground=Foreground
|
||||
overlay-pdfs.position.background=Background
|
||||
overlay-pdfs.submit=Submit
|
||||
overlay-pdfs.header=Наложение файлов PDF
|
||||
overlay-pdfs.baseFile.label=Выберите основной файл PDF
|
||||
overlay-pdfs.overlayFiles.label=Выберите налагаемые файлы PDF
|
||||
overlay-pdfs.mode.label=Выберите режим наложения
|
||||
overlay-pdfs.mode.sequential=Последовательное наложение
|
||||
overlay-pdfs.mode.interleaved=Перекрестное наложение
|
||||
overlay-pdfs.mode.fixedRepeat=Наложение с фиксированным повторением
|
||||
overlay-pdfs.counts.label=Количество наложений (для режима с фиксированным повторением)
|
||||
overlay-pdfs.counts.placeholder=Введите через запятую количество повторений (например, 2,3,1)
|
||||
overlay-pdfs.position.label=Выберите позицию наложения
|
||||
overlay-pdfs.position.foreground=Поверх основного
|
||||
overlay-pdfs.position.background=Позади основного
|
||||
overlay-pdfs.submit=Отправить
|
||||
|
||||
|
||||
#split-by-sections
|
||||
split-by-sections.title=Split PDF by Sections
|
||||
split-by-sections.header=Split PDF into Sections
|
||||
split-by-sections.horizontal.label=Horizontal Divisions
|
||||
split-by-sections.vertical.label=Vertical Divisions
|
||||
split-by-sections.horizontal.placeholder=Enter number of horizontal divisions
|
||||
split-by-sections.vertical.placeholder=Enter number of vertical divisions
|
||||
split-by-sections.submit=Split PDF
|
||||
split-by-sections.merge=Merge Into One PDF
|
||||
split-by-sections.title=Разделить PDF по разделам
|
||||
split-by-sections.header=Разделить PDF на секции
|
||||
split-by-sections.horizontal.label=Горизонтальное деление
|
||||
split-by-sections.vertical.label=Вертикальное деление
|
||||
split-by-sections.horizontal.placeholder=Введите количество горизонтальных разделов
|
||||
split-by-sections.vertical.placeholder=Введите количество вертикальных разделов
|
||||
split-by-sections.submit=Разделить 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.nav=Licenses
|
||||
licenses.title=3rd Party Licenses
|
||||
licenses.header=3rd Party Licenses
|
||||
licenses.module=Module
|
||||
licenses.version=Version
|
||||
licenses.license=License
|
||||
licenses.nav=Лицензии
|
||||
licenses.title=Лицензии от третьих сторон
|
||||
licenses.header=Лицензии от третьих сторон
|
||||
licenses.module=Модуль
|
||||
licenses.version=Версия
|
||||
licenses.license=Лицензия
|
||||
|
||||
|
||||
# error
|
||||
error.sorry=Извините за проблему!
|
||||
error.needHelp=Нужна помощь / Нашли проблему?
|
||||
error.contactTip=Если у вас все еще есть проблемы, не стесняйтесь обращаться к нам за помощью. Вы можете отправить заявку на нашей странице GitHub или связаться с нами через Discord:
|
||||
error.404.head=404 - Страница не найдена | Ой, мы запутались в коде!
|
||||
error.404.1=Мы не можем найти страницу, которую вы ищете.
|
||||
error.404.2=Произошла ошибка
|
||||
error.github=Отправить заявку на GitHub
|
||||
error.showStack=Показать стек вызовов
|
||||
error.copyStack=Скопировать стек вызовов
|
||||
error.githubSubmit=GitHub - Отправить заявку
|
||||
error.discordSubmit=Discord - Отправить запрос в поддержку
|
||||
|
||||
|
||||
@@ -57,6 +57,17 @@ usernameExistsMessage=Novi korisnik već postoji
|
||||
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
|
||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||
error=Error
|
||||
oops=Oops!
|
||||
help=Help
|
||||
goHomepage=Go to Homepage
|
||||
joinDiscord=Join our Discord server
|
||||
seeDockerHub=See Docker Hub
|
||||
visitGithub=Visit Github Repository
|
||||
donate=Donate
|
||||
color=Color
|
||||
sponsor=Sponsor
|
||||
|
||||
|
||||
|
||||
###############
|
||||
@@ -101,6 +112,7 @@ navbar.settings=Podešavanja
|
||||
#############
|
||||
settings.title=Podešavanja
|
||||
settings.update=Dostupno ažuriranje
|
||||
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
|
||||
settings.appVersion=Verzija aplikacije:
|
||||
settings.downloadOption.title=Odaberite opciju preuzimanja (Za preuzimanje pojedinačnih fajlova bez zip formata):
|
||||
settings.downloadOption.1=Otvori u istom prozoru
|
||||
@@ -109,8 +121,9 @@ settings.downloadOption.3=Preuzmi fajl
|
||||
settings.zipThreshold=Zipuj fajlove kada pređe broj preuzetih fajlova
|
||||
settings.signOut=Odjava
|
||||
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.header=Ažurirajte detalje svog naloga
|
||||
@@ -796,17 +809,17 @@ rotate.selectAngle=Izaberite ugao rotacije (u višestrukim od 90 stepeni):
|
||||
rotate.submit=Rotiraj
|
||||
|
||||
|
||||
#merge
|
||||
#split-pdfs
|
||||
split.title=Razdvajanje PDF-a
|
||||
split.header=Razdvajanje PDF-a
|
||||
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.4=Dokument #2: Stranice 2 i 3
|
||||
split.desc.5=Dokument #3: Stranice 4, 5 i 6
|
||||
split.desc.6=Dokument #4: Stranica 7
|
||||
split.desc.7=Dokument #5: Stranica 8
|
||||
split.desc.8=Dokument #6: Stranice 9 i 10
|
||||
split.desc.5=Dokument #3: Stranice 4, 5, 6 i 7
|
||||
split.desc.6=Dokument #4: Stranica 8
|
||||
split.desc.7=Dokument #5: Stranica 9
|
||||
split.desc.8=Dokument #6: Stranice 10
|
||||
split.splitPages=Unesite stranice za razdvajanje:
|
||||
split.submit=Razdvoji
|
||||
|
||||
@@ -957,7 +970,7 @@ PDFToText.submit=Konvertuj
|
||||
#PDFToHTML
|
||||
PDFToHTML.title=PDF u HTML
|
||||
PDFToHTML.header=PDF u HTML
|
||||
PDFToHTML.credit=Ova usluga koristi LibreOffice za konverziju fajlova.
|
||||
PDFToHTML.credit=Ova usluga koristi pdftohtml za konverziju fajlova.
|
||||
PDFToHTML.submit=Konvertuj
|
||||
|
||||
|
||||
@@ -1011,6 +1024,15 @@ split-by-sections.vertical.placeholder=Unesite broj vertikalnih podele
|
||||
split-by-sections.submit=Razdvoji 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.nav=Licenses
|
||||
licenses.title=3rd Party Licenses
|
||||
@@ -1020,3 +1042,16 @@ licenses.version=Version
|
||||
licenses.license=License
|
||||
|
||||
|
||||
# error
|
||||
error.sorry=Sorry for the issue!
|
||||
error.needHelp=Need help / Found an issue?
|
||||
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.404.head=404 - Page Not Found | Oops, we tripped in the code!
|
||||
error.404.1=We can't seem to find the page you're looking for.
|
||||
error.404.2=Something went wrong
|
||||
error.github=Submit a ticket on GitHub
|
||||
error.showStack=Show Stack Trace
|
||||
error.copyStack=Copy Stack Trace
|
||||
error.githubSubmit=GitHub - Submit a ticket
|
||||
error.discordSubmit=Discord - Submit Support post
|
||||
|
||||
|
||||
@@ -57,6 +57,17 @@ usernameExistsMessage=New Username already exists.
|
||||
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
|
||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||
error=Error
|
||||
oops=Oops!
|
||||
help=Help
|
||||
goHomepage=Go to Homepage
|
||||
joinDiscord=Join our Discord server
|
||||
seeDockerHub=See Docker Hub
|
||||
visitGithub=Visit Github Repository
|
||||
donate=Donate
|
||||
color=Color
|
||||
sponsor=Sponsor
|
||||
|
||||
|
||||
|
||||
###############
|
||||
@@ -101,6 +112,7 @@ navbar.settings=Inställningar
|
||||
#############
|
||||
settings.title=Inställningar
|
||||
settings.update=Uppdatering tillgänglig
|
||||
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
|
||||
settings.appVersion=Appversion:
|
||||
settings.downloadOption.title=Välj nedladdningsalternativ (för nedladdning av en fil utan zip):
|
||||
settings.downloadOption.1=Öppnas i samma fönster
|
||||
@@ -109,8 +121,9 @@ settings.downloadOption.3=Ladda ner fil
|
||||
settings.zipThreshold=Zip-filer när antalet nedladdade filer överskrider
|
||||
settings.signOut=Sign Out
|
||||
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.header=Update Your Account Details
|
||||
@@ -796,17 +809,17 @@ rotate.selectAngle=Välj rotationsvinkel (i multipler av 90 grader):
|
||||
rotate.submit=Rotera
|
||||
|
||||
|
||||
#merge
|
||||
#split-pdfs
|
||||
split.title=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.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.4=Dokument #2: Sida 2 och 3
|
||||
split.desc.5=Dokument #3: Sida 4, 5 och 6
|
||||
split.desc.6=Dokument #4: Sida 7
|
||||
split.desc.7=Dokument #5: Sida 8
|
||||
split.desc.8=Dokument #6: Sida 9 och 10
|
||||
split.desc.5=Dokument #3: Sida 4, 5, 6 och 7
|
||||
split.desc.6=Dokument #4: Sida 8
|
||||
split.desc.7=Dokument #5: Sida 9
|
||||
split.desc.8=Dokument #6: Sida 10
|
||||
split.splitPages=Ange sidor att dela på:
|
||||
split.submit=Dela
|
||||
|
||||
@@ -957,7 +970,7 @@ PDFToText.submit=Konvertera
|
||||
#PDFToHTML
|
||||
PDFToHTML.title=PDF till HTML
|
||||
PDFToHTML.header=PDF till HTML
|
||||
PDFToHTML.credit=Denna tjänst använder LibreOffice för filkonvertering.
|
||||
PDFToHTML.credit=Denna tjänst använder pdftohtml för filkonvertering.
|
||||
PDFToHTML.submit=Konvertera
|
||||
|
||||
|
||||
@@ -1011,6 +1024,15 @@ split-by-sections.vertical.placeholder=Enter number of vertical divisions
|
||||
split-by-sections.submit=Split 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.nav=Licenses
|
||||
licenses.title=3rd Party Licenses
|
||||
@@ -1020,3 +1042,16 @@ licenses.version=Version
|
||||
licenses.license=License
|
||||
|
||||
|
||||
# error
|
||||
error.sorry=Sorry for the issue!
|
||||
error.needHelp=Need help / Found an issue?
|
||||
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.404.head=404 - Page Not Found | Oops, we tripped in the code!
|
||||
error.404.1=We can't seem to find the page you're looking for.
|
||||
error.404.2=Something went wrong
|
||||
error.github=Submit a ticket on GitHub
|
||||
error.showStack=Show Stack Trace
|
||||
error.copyStack=Copy Stack Trace
|
||||
error.githubSubmit=GitHub - Submit a ticket
|
||||
error.discordSubmit=Discord - Submit Support post
|
||||
|
||||
|
||||
@@ -11,17 +11,17 @@ imgPrompt=Resim(leri) seçin
|
||||
genericSubmit=Gönder
|
||||
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) :
|
||||
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
|
||||
true=Doğru
|
||||
false=Yanlış
|
||||
unknown=Bilinmeyen
|
||||
save=Kaydet
|
||||
saveToBrowser=Save to Browser
|
||||
saveToBrowser=Tarayıcıya Kaydet
|
||||
close=Kapat
|
||||
filesSelected=dosya seçildi
|
||||
noFavourites=Favori eklenmedi
|
||||
downloadComplete=Download Complete
|
||||
downloadComplete=İndirme Tamamlandı
|
||||
bored=Sıkıldınız mı?
|
||||
alphabet=Alfabe
|
||||
downloadPdf=PDF İndir
|
||||
@@ -45,43 +45,54 @@ red=Kırmızı
|
||||
green=Yeşil
|
||||
blue=Mavi
|
||||
custom=Özel
|
||||
WorkInProgess=Work in progress, May not work or be buggy, Please report any problems!
|
||||
poweredBy=Powered by
|
||||
yes=Yes
|
||||
no=No
|
||||
WorkInProgess=Çalışmalar devam ediyor, Çalışmayabilir veya hatalı olabilir, Lütfen herhangi bir sorunu bildirin!
|
||||
poweredBy=Tarafından desteklenmektedir
|
||||
yes=Evet
|
||||
no=Hayır
|
||||
changedCredsMessage=Bilgiler değiştirildi!
|
||||
notAuthenticatedMessage=Kullanıcı doğrulanmadı.
|
||||
userNotFoundMessage=Kullanıcı bulunamadı.
|
||||
incorrectPasswordMessage=Mevcut şifre yanlış.
|
||||
usernameExistsMessage=Yeni Kullanıcı Adı zaten var.
|
||||
invalidUsernameMessage=Invalid username, Username must only contain alphabet characters and numbers.
|
||||
deleteCurrentUserMessage=Cannot delete currently logged in user.
|
||||
deleteUsernameExistsMessage=The username does not exist and cannot be deleted.
|
||||
invalidUsernameMessage=Geçersiz kullanıcı adı, Kullanıcı adı yalnızca alfabe karakterleri ve sayılar içermelidir.
|
||||
deleteCurrentUserMessage=Şu anda oturum açmış olan kullanıcı silinemiyor.
|
||||
deleteUsernameExistsMessage=Kullanıcı adı mevcut değil ve silinemez.
|
||||
error=Hata
|
||||
oops=Tüh!
|
||||
help=Yardım
|
||||
goHomepage=Anasayfa'ya git
|
||||
joinDiscord=Discord sunucumuza katılın
|
||||
seeDockerHub=Docker Hub'a bakın
|
||||
visitGithub=Github Deposunu Ziyaret Edin
|
||||
donate=Bağış Yapın
|
||||
color=Renk
|
||||
sponsor=Sponsor
|
||||
|
||||
|
||||
|
||||
###############
|
||||
# Pipeline #
|
||||
###############
|
||||
pipeline.header=Pipeline Menu (Beta)
|
||||
pipeline.uploadButton=Upload Custom
|
||||
pipeline.configureButton=Configure
|
||||
pipeline.defaultOption=Custom
|
||||
pipeline.submitButton=Submit
|
||||
pipeline.help=Pipeline Help
|
||||
pipeline.scanHelp=Folder Scanning Help
|
||||
pipeline.header=Çoklu İşlemler Menü (Beta)
|
||||
pipeline.uploadButton=Upload edin
|
||||
pipeline.configureButton=Yapılandır
|
||||
pipeline.defaultOption=Özel
|
||||
pipeline.submitButton=Gönder
|
||||
pipeline.help=Çoklu İşlemler Yardım
|
||||
pipeline.scanHelp=Klasör Tarama Yardımı
|
||||
|
||||
######################
|
||||
# Pipeline Options #
|
||||
######################
|
||||
pipelineOptions.header=Pipeline Configuration
|
||||
pipelineOptions.pipelineNameLabel=Pipeline Name
|
||||
pipelineOptions.saveSettings=Save Operation Settings
|
||||
pipelineOptions.pipelineNamePrompt=Enter pipeline name here
|
||||
pipelineOptions.selectOperation=Select Operation
|
||||
pipelineOptions.addOperationButton=Add operation
|
||||
pipelineOptions.pipelineHeader=Pipeline:
|
||||
pipelineOptions.saveButton=Download
|
||||
pipelineOptions.validateButton=Validate
|
||||
pipelineOptions.header=Çoklu İşlemler Yapılandırma
|
||||
pipelineOptions.pipelineNameLabel=Çoklu İşlemler İsim
|
||||
pipelineOptions.saveSettings=Ayarları Kaydet
|
||||
pipelineOptions.pipelineNamePrompt=Buraya isim girin
|
||||
pipelineOptions.selectOperation=İşlem Seçin
|
||||
pipelineOptions.addOperationButton=İşlem ekle
|
||||
pipelineOptions.pipelineHeader=Çoklu İşlemler:
|
||||
pipelineOptions.saveButton=İndir
|
||||
pipelineOptions.validateButton=Doğrula
|
||||
|
||||
|
||||
|
||||
@@ -101,6 +112,7 @@ navbar.settings=Ayarlar
|
||||
#############
|
||||
settings.title=Ayarlar
|
||||
settings.update=Güncelleme mevcut
|
||||
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
|
||||
settings.appVersion=Uygulama Sürümü:
|
||||
settings.downloadOption.title=İndirme seçeneği seçin (Zip olmayan tek dosya indirmeler için):
|
||||
settings.downloadOption.1=Aynı pencerede aç
|
||||
@@ -109,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.signOut=Oturumu Kapat
|
||||
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.header=Hesap Detaylarınızı Güncelleyin
|
||||
@@ -149,15 +162,15 @@ adminUserSettings.header=Yönetici Kullanıcı Kontrol Ayarları
|
||||
adminUserSettings.admin=Yönetici
|
||||
adminUserSettings.user=Kullanıcı
|
||||
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.role=Rol
|
||||
adminUserSettings.actions=Eylemler
|
||||
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.demoUser=Demo User (No custom settings)
|
||||
adminUserSettings.internalApiUser=Internal API User
|
||||
adminUserSettings.demoUser=Demo Kullanıcısı (Özel ayar yok)
|
||||
adminUserSettings.internalApiUser=Dahili API Kullanıcısı
|
||||
adminUserSettings.forceChange=Kullanıcının girişte kullanıcı adı/şifre değiştirmesini zorla
|
||||
adminUserSettings.submit=Kullanıcıyı Kaydet
|
||||
|
||||
@@ -165,12 +178,12 @@ adminUserSettings.submit=Kullanıcıyı Kaydet
|
||||
# HOME-PAGE #
|
||||
#############
|
||||
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.desc=View, annotate, add text or images
|
||||
viewPdf.tags=view,read,annotate,text,image
|
||||
home.viewPdf.title=PDF Görüntüle
|
||||
home.viewPdf.desc=Görüntüleyin, açıklama ekleyin, metin veya resim ekleyin
|
||||
viewPdf.tags=görüntüle,oku,açıklama ekle,metin,görüntü
|
||||
|
||||
home.multiTool.title=PDF Çoklu Araç
|
||||
home.multiTool.desc=Birleştir, Döndür, Yeniden Düzenle ve Sayfaları Kaldır
|
||||
@@ -294,9 +307,9 @@ home.removeBlanks.title=Boş Sayfaları Kaldır
|
||||
home.removeBlanks.desc=Bir belgeden boş sayfaları tespit eder ve kaldırır
|
||||
removeBlanks.tags=temizle,sadeleştir,içeriksiz,düzenle
|
||||
|
||||
home.removeAnnotations.title=Remove Annotations
|
||||
home.removeAnnotations.desc=Removes all comments/annotations from a PDF
|
||||
removeAnnotations.tags=comments,highlight,notes,markup,remove
|
||||
home.removeAnnotations.title=Ek Açıklamaları Kaldır
|
||||
home.removeAnnotations.desc=PDF'deki tüm yorumları/açıklamaları kaldırır
|
||||
removeAnnotations.tags=yorumlar,vurgulama,notlar,işaretleme,kaldırma
|
||||
|
||||
home.compare.title=Karşılaştır
|
||||
home.compare.desc=2 PDF Belgesi arasındaki farkları karşılaştırır ve gösterir
|
||||
@@ -314,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
|
||||
scalePages.tags=boyutlandır,değiştir,boyut,uyarla
|
||||
|
||||
home.pipeline.title=Hattı (İleri Seviye)
|
||||
home.pipeline.desc=Hattı betikleri tanımlayarak PDF'lere birden fazla işlemi çalıştır
|
||||
home.pipeline.title=Çoklu İşlemler (İleri Seviye)
|
||||
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
|
||||
|
||||
home.add-page-numbers.title=Sayfa Numaraları Ekle
|
||||
@@ -379,36 +392,36 @@ home.autoRedact.title=Otomatik Karartma
|
||||
home.autoRedact.desc=Giriş metnine dayanarak bir PDF'teki metni Otomatik Karartır (Redakte)
|
||||
autoRedact.tags=Karart,Gizle,karartma,siyah,markör,gizli
|
||||
|
||||
home.tableExtraxt.title=PDF to CSV
|
||||
home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV
|
||||
tableExtraxt.tags=CSV,Table Extraction,extract,convert
|
||||
home.tableExtraxt.title=PDF'den CSV'ye
|
||||
home.tableExtraxt.desc=PDF'den Tabloları çıkarır ve CSV'ye dönüştürür
|
||||
tableExtraxt.tags=CSV, Tablo Çıkarma, ayıklama, dönüştürme
|
||||
|
||||
|
||||
home.autoSizeSplitPDF.title=Auto Split by Size/Count
|
||||
home.autoSizeSplitPDF.desc=Split a single PDF into multiple documents based on size, page count, or document count
|
||||
autoSizeSplitPDF.tags=pdf,split,document,organization
|
||||
home.autoSizeSplitPDF.title=Boyut/Sayıya Göre Otomatik Bölme
|
||||
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,bölme,belge,organizasyon
|
||||
|
||||
|
||||
home.overlay-pdfs.title=Overlay PDFs
|
||||
home.overlay-pdfs.desc=Overlays PDFs on-top of another PDF
|
||||
overlay-pdfs.tags=Overlay
|
||||
home.overlay-pdfs.title=PDF'leri Bindirme
|
||||
home.overlay-pdfs.desc=PDF'leri başka bir PDF'nin üzerine bindirir
|
||||
overlay-pdfs.tags=Bindirme
|
||||
|
||||
home.split-by-sections.title=Split PDF by Sections
|
||||
home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections
|
||||
split-by-sections.tags=Section Split, Divide, Customize
|
||||
home.split-by-sections.title=PDF'yi Bölümlere Ayırma
|
||||
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=Bölümlere Ayırma, Bölme, Özelleştirme
|
||||
|
||||
home.AddStampRequest.title=Add Stamp to PDF
|
||||
home.AddStampRequest.desc=Add text or add image stamps at set locations
|
||||
AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize
|
||||
home.AddStampRequest.title=PDF'ye Damga Ekleme
|
||||
home.AddStampRequest.desc=Belirlenen konumlara metin veya resim damgaları ekleyin
|
||||
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.desc=Converts PDF to Book/Comic formats using calibre
|
||||
PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle
|
||||
home.PDFToBook.title=PDF'den Kitaba
|
||||
home.PDFToBook.desc=Calibre kullanarak PDF'yi Kitap/Komik formatlarına dönüştürür
|
||||
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.desc=Converts Books/Comics formats to PDF using calibre
|
||||
BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle
|
||||
home.BookToPDF.title=Kitaptan PDF'ye
|
||||
home.BookToPDF.desc=calibre kullanarak Kitap/Karikatür formatlarını PDF'ye dönüştürür
|
||||
BookToPDF.tags=Kitap,Çizgi Roman,Calibre,Dönüştür,manga,amazon,kindle,epub,mobi,azw3,docx,rtf,txt,html,lit,fb2,pdb,lrf
|
||||
|
||||
|
||||
###########################
|
||||
@@ -456,7 +469,7 @@ pdfToSinglePage.submit=Tek Sayfaya Dönüştür
|
||||
pageExtracter.title=Sayfaları Çıkar
|
||||
pageExtracter.header=Sayfaları Çı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
|
||||
@@ -488,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.submit=Dönüştür
|
||||
HTMLToPDF.credit=WeasyPrint Kullanıyor
|
||||
HTMLToPDF.zoom=Zoom level for displaying the website.
|
||||
HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default)
|
||||
HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default)
|
||||
HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default)
|
||||
HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default)
|
||||
HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default)
|
||||
HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default)
|
||||
HTMLToPDF.printBackground=Render the background of websites.
|
||||
HTMLToPDF.defaultHeader=Enable Default Header (Name and page number)
|
||||
HTMLToPDF.cssMediaType=Change the CSS media type of the page.
|
||||
HTMLToPDF.none=None
|
||||
HTMLToPDF.print=Print
|
||||
HTMLToPDF.screen=Screen
|
||||
HTMLToPDF.zoom=Web sitesini görüntülemek için yakınlaştırma düzeyi.
|
||||
HTMLToPDF.pageWidth=Sayfanın santimetre cinsinden genişliği. (Varsayılan olarak boş)
|
||||
HTMLToPDF.pageHeight=Sayfanın santimetre cinsinden yüksekliği. (Varsayılan olarak boş)
|
||||
HTMLToPDF.marginTop=Sayfanın milimetre cinsinden üst kenar boşluğu. (Varsayılan olarak boş)
|
||||
HTMLToPDF.marginBottom=Sayfanın milimetre cinsinden alt kenar boşluğu. (Varsayılan olarak boş)
|
||||
HTMLToPDF.marginLeft=Sayfanın milimetre cinsinden sol kenar boşluğu. (Varsayılan olarak boş)
|
||||
HTMLToPDF.marginRight=Sayfanın milimetre cinsinden sağ kenar boşluğu. (Varsayılan olarak boş)
|
||||
HTMLToPDF.printBackground=Web sitelerinin arka planını oluşturun.
|
||||
HTMLToPDF.defaultHeader=Varsayılan Üstbilgiyi Etkinleştir (Ad ve sayfa numarası)
|
||||
HTMLToPDF.cssMediaType=Sayfanın CSS ortam türünü değiştirin.
|
||||
HTMLToPDF.none=Hiçbiri
|
||||
HTMLToPDF.print=Yazdır
|
||||
HTMLToPDF.screen=Ekran
|
||||
|
||||
|
||||
#AddStampRequest
|
||||
AddStampRequest.header=Stamp PDF
|
||||
AddStampRequest.title=Stamp PDF
|
||||
AddStampRequest.stampType=Stamp Type
|
||||
AddStampRequest.stampText=Stamp Text
|
||||
AddStampRequest.stampImage=Stamp Image
|
||||
AddStampRequest.alphabet=Alphabet
|
||||
AddStampRequest.fontSize=Font/Image Size
|
||||
AddStampRequest.rotation=Rotation
|
||||
AddStampRequest.opacity=Opacity
|
||||
AddStampRequest.position=Position
|
||||
AddStampRequest.overrideX=Override X Coordinate
|
||||
AddStampRequest.overrideY=Override Y Coordinate
|
||||
AddStampRequest.customMargin=Custom Margin
|
||||
AddStampRequest.customColor=Custom Text Color
|
||||
AddStampRequest.submit=Submit
|
||||
AddStampRequest.header=Damga PDF
|
||||
AddStampRequest.title=Damga PDF
|
||||
AddStampRequest.stampType=Damga Türü
|
||||
AddStampRequest.stampText=Damga Metni
|
||||
AddStampRequest.stampImage=Damga Resmi
|
||||
AddStampRequest.alphabet=Alfabe
|
||||
AddStampRequest.fontSize=Yazı Tipi/Görüntü Boyutu
|
||||
AddStampRequest.rotation=Döndürme
|
||||
AddStampRequest.opacity=Opaklık
|
||||
AddStampRequest.position=Konum
|
||||
AddStampRequest.overrideX=X Koordinatını geçersiz kıl
|
||||
AddStampRequest.overrideY=Y Koordinatını Geçersiz Kıl
|
||||
AddStampRequest.customMargin=Özel Kenar Boşluğu
|
||||
AddStampRequest.customColor=Özel Metin Rengi
|
||||
AddStampRequest.submit=Gönder
|
||||
|
||||
|
||||
#sanitizePDF
|
||||
@@ -584,7 +597,7 @@ autoSplitPDF.submit=Gönder
|
||||
|
||||
|
||||
#pipeline
|
||||
pipeline.title=Pipeline
|
||||
pipeline.title=Çoklu İşlemler
|
||||
|
||||
|
||||
#pageLayout
|
||||
@@ -607,11 +620,11 @@ scalePages.submit=Gönder
|
||||
certSign.title=Sertifika İmzalama
|
||||
certSign.header=Sertifikanızla bir PDF imzalayın (Devam eden iş)
|
||||
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.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.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.password=Anahtar Deposu veya Özel Anahtar Şifrenizi Girin (Varsa):
|
||||
certSign.showSig=İmzayı Göster
|
||||
@@ -632,9 +645,9 @@ removeBlanks.submit=Boşları Kaldır
|
||||
|
||||
|
||||
#removeAnnotations
|
||||
removeAnnotations.title=Remove Annotations
|
||||
removeAnnotations.header=Remove Annotations
|
||||
removeAnnotations.submit=Remove
|
||||
removeAnnotations.title=Ek Açıklamaları Kaldır
|
||||
removeAnnotations.header=Ek Açıklamaları Kaldır
|
||||
removeAnnotations.submit=Kaldır
|
||||
|
||||
|
||||
#compare
|
||||
@@ -645,17 +658,17 @@ compare.document.2=Belge 2
|
||||
compare.submit=Karşılaştır
|
||||
|
||||
#BookToPDF
|
||||
BookToPDF.title=Books and Comics to PDF
|
||||
BookToPDF.header=Book to PDF
|
||||
BookToPDF.credit=Uses Calibre
|
||||
BookToPDF.submit=Convert
|
||||
BookToPDF.title=Kitapları ve Çizgi Romanları PDF'e Dönüştürme
|
||||
BookToPDF.header=Kitaptan PDF'ye
|
||||
BookToPDF.credit=Kalibre Kullanır
|
||||
BookToPDF.submit=Dönüştür
|
||||
|
||||
#PDFToBook
|
||||
PDFToBook.title=PDF to Book
|
||||
PDFToBook.header=PDF to Book
|
||||
PDFToBook.title=PDF'den Kitaba
|
||||
PDFToBook.header=PDF'den Kitaba
|
||||
PDFToBook.selectText.1=Format
|
||||
PDFToBook.credit=Uses Calibre
|
||||
PDFToBook.submit=Convert
|
||||
PDFToBook.credit=Kalibre Kullanır
|
||||
PDFToBook.submit=Dönüştür
|
||||
|
||||
#sign
|
||||
sign.title=İmzala
|
||||
@@ -759,34 +772,34 @@ merge.submit=Birleştir
|
||||
pdfOrganiser.title=Sayfa Organizatörü
|
||||
pdfOrganiser.header=PDF Sayfa Organizatörü
|
||||
pdfOrganiser.submit=Sayfaları Yeniden Düzenle
|
||||
pdfOrganiser.mode=Mode
|
||||
pdfOrganiser.mode.1=Custom Page Order
|
||||
pdfOrganiser.mode.2=Reverse Order
|
||||
pdfOrganiser.mode.3=Duplex Sort
|
||||
pdfOrganiser.mode.4=Booklet Sort
|
||||
pdfOrganiser.mode.5=Side Stitch Booklet Sort
|
||||
pdfOrganiser.mode.6=Odd-Even Split
|
||||
pdfOrganiser.mode.7=Remove First
|
||||
pdfOrganiser.mode.8=Remove Last
|
||||
pdfOrganiser.mode.9=Remove First and Last
|
||||
pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
||||
pdfOrganiser.mode=Mod
|
||||
pdfOrganiser.mode.1=Özel Sayfa Düzeni
|
||||
pdfOrganiser.mode.2=Ters Sıralama
|
||||
pdfOrganiser.mode.3=Çift Taraflı Sıralama
|
||||
pdfOrganiser.mode.4=Kitapçık Sıralama
|
||||
pdfOrganiser.mode.5=Yandan Dikişli Kitapçık Sıralama
|
||||
pdfOrganiser.mode.6=Tek-Çift Ayrımı
|
||||
pdfOrganiser.mode.7=İlk Önce Kaldır
|
||||
pdfOrganiser.mode.8=Sonuncuyu Kaldır
|
||||
pdfOrganiser.mode.9=İlk ve Sonu Kaldır
|
||||
pdfOrganiser.placeholder=(örn. 1,3,2 veya 4-8,2,10-12 veya 2n-1)
|
||||
|
||||
|
||||
#multiTool
|
||||
multiTool.title=PDF Çoklu Araç
|
||||
multiTool.header=PDF Çoklu Araç
|
||||
multiTool.uploadPrompts=Please Upload PDF
|
||||
multiTool.uploadPrompts=Lütfen PDF Yükleyin
|
||||
|
||||
#view pdf
|
||||
viewPdf.title=View PDF
|
||||
viewPdf.header=View PDF
|
||||
viewPdf.title=PDF Görüntüle
|
||||
viewPdf.header=PDF Görüntüle
|
||||
|
||||
#pageRemover
|
||||
pageRemover.title=Sayfa Silici
|
||||
pageRemover.header=PDF Sayfa silici
|
||||
pageRemover.pagesToDelete=Silinmesi gereken sayfalar (Virgülle ayrılmış sayfa numaraları listesi girin):
|
||||
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
|
||||
@@ -796,17 +809,17 @@ rotate.selectAngle=Döndürme açısını seçin (90 derecenin katları olarak):
|
||||
rotate.submit=Döndür
|
||||
|
||||
|
||||
#merge
|
||||
#split-pdfs
|
||||
split.title=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.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.4=Belge #2: Sayfa 2 ve 3
|
||||
split.desc.5=Belge #3: Sayfa 4, 5 ve 6
|
||||
split.desc.6=Belge #4: Sayfa 7
|
||||
split.desc.7=Belge #5: Sayfa 8
|
||||
split.desc.8=Belge #6: Sayfa 9 ve 10
|
||||
split.desc.5=Belge #3: Sayfa 4, 5, 6 ve 7
|
||||
split.desc.6=Belge #4: Sayfa 8
|
||||
split.desc.7=Belge #5: Sayfa 9
|
||||
split.desc.8=Belge #6: Sayfa 10
|
||||
split.splitPages=Ayrılacak sayfaları girin:
|
||||
split.submit=Ayır
|
||||
|
||||
@@ -874,8 +887,8 @@ watermark.selectText.7=Opaklık (0% - 100%):
|
||||
watermark.selectText.8=Filigran Türü:
|
||||
watermark.selectText.9=Filigran Resmi:
|
||||
watermark.submit=Filigran Ekle
|
||||
watermark.type.1=Text
|
||||
watermark.type.2=Image
|
||||
watermark.type.1=Metin
|
||||
watermark.type.2=Resim
|
||||
|
||||
|
||||
#Change permissions
|
||||
@@ -927,7 +940,7 @@ pdfToPDFA.title=PDF'den PDF/A'ya
|
||||
pdfToPDFA.header=PDF'den PDF/A'ya
|
||||
pdfToPDFA.credit=Bu hizmet PDF/A dönüşümü için OCRmyPDF kullanı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
|
||||
|
||||
|
||||
#PDFToWord
|
||||
@@ -957,7 +970,7 @@ PDFToText.submit=Dönüştür
|
||||
#PDFToHTML
|
||||
PDFToHTML.title=PDF'den HTML'e
|
||||
PDFToHTML.header=PDF'den HTML'e
|
||||
PDFToHTML.credit=Bu hizmet dosya dönüşümü için LibreOffice kullanır.
|
||||
PDFToHTML.credit=Bu hizmet dosya dönüşümü için pdftohtml kullanır.
|
||||
PDFToHTML.submit=Dönüştür
|
||||
|
||||
|
||||
@@ -968,55 +981,77 @@ PDFToXML.credit=Bu hizmet dosya dönüşümü için LibreOffice kullanır.
|
||||
PDFToXML.submit=Dönüştür
|
||||
|
||||
#PDFToCSV
|
||||
PDFToCSV.title=PDF to CSV
|
||||
PDFToCSV.header=PDF to CSV
|
||||
PDFToCSV.prompt=Choose page to extract table
|
||||
PDFToCSV.submit=Extract
|
||||
PDFToCSV.title=PDF'den CSV'ye
|
||||
PDFToCSV.header=PDF'den CSV'ye
|
||||
PDFToCSV.prompt=Tabloyu çıkarmak için sayfa seçin
|
||||
PDFToCSV.submit=Çıkart
|
||||
|
||||
#split-by-size-or-count
|
||||
split-by-size-or-count.title=Split PDF by Size or Count
|
||||
split-by-size-or-count.header=Split PDF by Size or Count
|
||||
split-by-size-or-count.type.label=Select Split Type
|
||||
split-by-size-or-count.type.size=By Size
|
||||
split-by-size-or-count.type.pageCount=By Page Count
|
||||
split-by-size-or-count.type.docCount=By Document Count
|
||||
split-by-size-or-count.value.label=Enter Value
|
||||
split-by-size-or-count.value.placeholder=Enter size (e.g., 2MB or 3KB) or count (e.g., 5)
|
||||
split-by-size-or-count.submit=Submit
|
||||
split-by-size-or-count.title=PDF'yi Boyuta veya Sayıya Göre Bölme
|
||||
split-by-size-or-count.header=PDF'yi Boyuta veya Sayıya Göre Bölme
|
||||
split-by-size-or-count.type.label=Bölme Türünü Seçin
|
||||
split-by-size-or-count.type.size=Boyuta Göre
|
||||
split-by-size-or-count.type.pageCount=Sayfa Sayısına Göre
|
||||
split-by-size-or-count.type.docCount=Belge Sayısına Göre
|
||||
split-by-size-or-count.value.label=Değer Girin
|
||||
split-by-size-or-count.value.placeholder=Boyutu (örn. 2MB veya 3KB) veya sayıyı (örn. 5) girin
|
||||
split-by-size-or-count.submit=Gönder
|
||||
|
||||
|
||||
#overlay-pdfs
|
||||
overlay-pdfs.header=Overlay PDF Files
|
||||
overlay-pdfs.baseFile.label=Select Base PDF File
|
||||
overlay-pdfs.overlayFiles.label=Select Overlay PDF Files
|
||||
overlay-pdfs.mode.label=Select Overlay Mode
|
||||
overlay-pdfs.mode.sequential=Sequential Overlay
|
||||
overlay-pdfs.mode.interleaved=Interleaved Overlay
|
||||
overlay-pdfs.mode.fixedRepeat=Fixed Repeat Overlay
|
||||
overlay-pdfs.counts.label=Overlay Counts (for Fixed Repeat Mode)
|
||||
overlay-pdfs.counts.placeholder=Enter comma-separated counts (e.g., 2,3,1)
|
||||
overlay-pdfs.position.label=Select Overlay Position
|
||||
overlay-pdfs.position.foreground=Foreground
|
||||
overlay-pdfs.position.background=Background
|
||||
overlay-pdfs.submit=Submit
|
||||
overlay-pdfs.header=PDF Dosyalarını Bindirme
|
||||
overlay-pdfs.baseFile.label=Temel PDF Dosyasını Seçin
|
||||
overlay-pdfs.overlayFiles.label=İkinci PDF Dosyalarını Seçin
|
||||
overlay-pdfs.mode.label=Bindirme Modunu Seçin
|
||||
overlay-pdfs.mode.sequential=Sıralı Bindirme
|
||||
overlay-pdfs.mode.interleaved=Serpiştirilmiş Bindirme
|
||||
overlay-pdfs.mode.fixedRepeat=Sabit Tekrar Bindirme
|
||||
overlay-pdfs.counts.label=Bindirme Sayıları (Sabit Tekrar Modu için)
|
||||
overlay-pdfs.counts.placeholder=Virgülle ayrılmış sayıları girin (örn. 2,3,1)
|
||||
overlay-pdfs.position.label=Bindirme Konumunu Seçin
|
||||
overlay-pdfs.position.foreground=Ön plan
|
||||
overlay-pdfs.position.background=Arka plan
|
||||
overlay-pdfs.submit=Gönder
|
||||
|
||||
|
||||
#split-by-sections
|
||||
split-by-sections.title=Split PDF by Sections
|
||||
split-by-sections.header=Split PDF into Sections
|
||||
split-by-sections.horizontal.label=Horizontal Divisions
|
||||
split-by-sections.vertical.label=Vertical Divisions
|
||||
split-by-sections.horizontal.placeholder=Enter number of horizontal divisions
|
||||
split-by-sections.vertical.placeholder=Enter number of vertical divisions
|
||||
split-by-sections.submit=Split PDF
|
||||
split-by-sections.merge=Merge Into One PDF
|
||||
split-by-sections.title=PDF'yi Bölümlere Ayırma
|
||||
split-by-sections.header=PDF'yi Bölümlere Ayırma
|
||||
split-by-sections.horizontal.label=Yatay Bölümler
|
||||
split-by-sections.vertical.label=Dikey Bölümler
|
||||
split-by-sections.horizontal.placeholder=Yatay bölme sayısını girin
|
||||
split-by-sections.vertical.placeholder=Dikey bölme sayısını girin
|
||||
split-by-sections.submit=PDF'yi Böl
|
||||
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.nav=Licenses
|
||||
licenses.title=3rd Party Licenses
|
||||
licenses.header=3rd Party Licenses
|
||||
licenses.module=Module
|
||||
licenses.version=Version
|
||||
licenses.license=License
|
||||
licenses.nav=Lisanslar
|
||||
licenses.title=3. Taraf Lisansları
|
||||
licenses.header=3. Taraf Lisansları
|
||||
licenses.module=Modül
|
||||
licenses.version=Versiyon
|
||||
licenses.license=Lisans
|
||||
|
||||
|
||||
# error
|
||||
error.sorry=Sorun için özür dileriz!
|
||||
error.needHelp=Yardıma mı ihtiyacınız var / Bir sorun mu buldunuz?
|
||||
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 - Sayfa Bulunamadı | Tüh, kodda takıldık!
|
||||
error.404.1=Aradığınız sayfayı bulamıyoruz.
|
||||
error.404.2=Bir şeyler ters gitti
|
||||
error.github=GitHub üzerinden bir hata bildirin
|
||||
error.showStack=Yığın İzlemesini Göster
|
||||
error.copyStack=Yığın İzini Kopyala
|
||||
error.githubSubmit=GitHub - Hata gönderin
|
||||
error.discordSubmit=Discord - Destek gönderisi gönderin
|
||||
|
||||
|
||||
1057
src/main/resources/messages_uk_UA.properties
Normal file
1057
src/main/resources/messages_uk_UA.properties
Normal file
File diff suppressed because it is too large
Load Diff
@@ -57,6 +57,17 @@ usernameExistsMessage=新用户名已存在。
|
||||
invalidUsernameMessage=用户名无效,用户名只能由字母字符和数字组成。
|
||||
deleteCurrentUserMessage=无法删除当前登录的用户。
|
||||
deleteUsernameExistsMessage=用户名不存在,无法删除。
|
||||
error=错误
|
||||
oops=哎呀!
|
||||
help=帮助
|
||||
goHomepage=返回主页
|
||||
joinDiscord=加入我们的Discord服务器
|
||||
seeDockerHub=查看Docker Hub
|
||||
visitGithub=访问Github仓库
|
||||
donate=捐款
|
||||
color=颜色
|
||||
sponsor=赞助
|
||||
|
||||
|
||||
|
||||
###############
|
||||
@@ -101,6 +112,7 @@ navbar.settings=设置
|
||||
#############
|
||||
settings.title=设置
|
||||
settings.update=可更新
|
||||
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
|
||||
settings.appVersion=应用程序版本:
|
||||
settings.downloadOption.title=选择下载选项(单个文件非压缩文件):
|
||||
settings.downloadOption.1=在同一窗口打开
|
||||
@@ -109,8 +121,9 @@ settings.downloadOption.3=下载文件
|
||||
settings.zipThreshold=当下载的文件数量超过限制时,将文件压缩。
|
||||
settings.signOut=登出
|
||||
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.header=更新您的账户详情
|
||||
@@ -796,14 +809,14 @@ rotate.selectAngle=选择旋转角度(以90度的倍数):
|
||||
rotate.submit=旋转
|
||||
|
||||
|
||||
#merge
|
||||
#split-pdfs
|
||||
split.title=拆分PDF
|
||||
split.header=拆分PDF
|
||||
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.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.7=文档 #5:第8页
|
||||
split.desc.8=文档 #6:第9页和第10页
|
||||
@@ -957,7 +970,7 @@ PDFToText.submit=转换
|
||||
#PDFToHTML
|
||||
PDFToHTML.title=PDF To HTML
|
||||
PDFToHTML.header=将PDF转换成HTML
|
||||
PDFToHTML.credit=此服务使用LibreOffice进行文件转换。
|
||||
PDFToHTML.credit=此服务使用pdftohtml进行文件转换。
|
||||
PDFToHTML.submit=转换
|
||||
|
||||
|
||||
@@ -1011,6 +1024,15 @@ split-by-sections.vertical.placeholder=输入垂直分割数
|
||||
split-by-sections.submit=分割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.nav=许可证
|
||||
licenses.title=第三方许可证
|
||||
@@ -1020,3 +1042,16 @@ licenses.version=版本
|
||||
licenses.license=许可证
|
||||
|
||||
|
||||
# error
|
||||
error.sorry=对此问题感到抱歉!
|
||||
error.needHelp=需要帮助 / 发现问题?
|
||||
error.contactTip=如果你仍然遇到问题,不要犹豫,向我们寻求帮助。你可以在我们的GitHub页面上提交工单,或者通过Discord与我们联系:
|
||||
error.404.head=404 - 页面未找到 | 哎呀,我们在代码中触发了错误!
|
||||
error.404.1=我们似乎找不到你寻找的页面。
|
||||
error.404.2=出了些问题
|
||||
error.github=在GitHub上提交工单
|
||||
error.showStack=显示堆栈跟踪
|
||||
error.copyStack=复制堆栈跟踪
|
||||
error.githubSubmit=GitHub - 提交工单
|
||||
error.discordSubmit=Discord - 提交支持帖子
|
||||
|
||||
|
||||
@@ -57,6 +57,17 @@ usernameExistsMessage=新使用者名稱已存在。
|
||||
invalidUsernameMessage=使用者名無效,使用者名只能包含字母字元和數位。
|
||||
deleteCurrentUserMessage=無法刪除目前登錄的使用者。
|
||||
deleteUsernameExistsMessage=使用者名不存在,無法刪除。
|
||||
error=錯誤
|
||||
oops=哎呀!
|
||||
help=幫助
|
||||
goHomepage=前往首頁
|
||||
joinDiscord=加入我們的Discord服務器
|
||||
seeDockerHub=查看Docker Hub
|
||||
visitGithub=訪問Github存儲庫
|
||||
donate=捐贈
|
||||
color=顏色
|
||||
sponsor=贊助
|
||||
|
||||
|
||||
|
||||
###############
|
||||
@@ -101,6 +112,7 @@ navbar.settings=設定
|
||||
#############
|
||||
settings.title=設定
|
||||
settings.update=有更新可用
|
||||
settings.updateAvailable={0} is the current installed version. A new version ({1}) is available.
|
||||
settings.appVersion=應用版本:
|
||||
settings.downloadOption.title=選擇下載選項(對於單一檔案非壓縮下載):
|
||||
settings.downloadOption.1=在同一視窗中開啟
|
||||
@@ -109,8 +121,9 @@ settings.downloadOption.3=下載檔案
|
||||
settings.zipThreshold=當下載的檔案數量超過時,壓縮檔案
|
||||
settings.signOut=登出
|
||||
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.header=更新您的帳戶詳細資訊
|
||||
@@ -796,17 +809,17 @@ rotate.selectAngle=選擇旋轉角度(以 90 度的倍數):
|
||||
rotate.submit=旋轉
|
||||
|
||||
|
||||
#merge
|
||||
#split-pdfs
|
||||
split.title=分割 PDF
|
||||
split.header=分割 PDF
|
||||
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.4=文件 #2:頁面 2 和 3
|
||||
split.desc.5=文件 #3:頁面 4、5 和 6
|
||||
split.desc.6=文件 #4:頁面 7
|
||||
split.desc.7=文件 #5:頁面 8
|
||||
split.desc.8=文件 #6:頁面 9 和 10
|
||||
split.desc.5=文件 #3:頁面 4、5、6 和 7
|
||||
split.desc.6=文件 #4:頁面 8
|
||||
split.desc.7=文件 #5:頁面 9
|
||||
split.desc.8=文件 #6:頁面 10
|
||||
split.splitPages=輸入要分割的頁面:
|
||||
split.submit=分割
|
||||
|
||||
@@ -957,7 +970,7 @@ PDFToText.submit=轉換
|
||||
#PDFToHTML
|
||||
PDFToHTML.title=PDF 轉 HTML
|
||||
PDFToHTML.header=PDF 轉 HTML
|
||||
PDFToHTML.credit=此服務使用 LibreOffice 進行檔案轉換。
|
||||
PDFToHTML.credit=此服務使用 pdftohtml 進行檔案轉換。
|
||||
PDFToHTML.submit=轉換
|
||||
|
||||
|
||||
@@ -1011,6 +1024,15 @@ split-by-sections.vertical.placeholder=輸入垂直劃分的數量
|
||||
split-by-sections.submit=分割 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.nav=許可證
|
||||
licenses.title=第三方許可證
|
||||
@@ -1020,3 +1042,16 @@ licenses.version=版本
|
||||
licenses.license=許可證
|
||||
|
||||
|
||||
# error
|
||||
error.sorry=對於這個問題,我們感到抱歉!
|
||||
error.needHelp=需要幫助/發現了一個問題?
|
||||
error.contactTip=如果你仍然遇到問題,請不要猶豫,隨時向我們尋求幫助。你可以在我們的GitHub頁面提交工單,或通過Discord與我們聯繋:
|
||||
error.404.head=404 - 找不到頁面 | 哎呀,我們在代碼中走錯了路!
|
||||
error.404.1=我們好像找不到你正在尋找的頁面。
|
||||
error.404.2=出了點錯誤
|
||||
error.github=在GitHub上提交工單
|
||||
error.showStack=顯示堆疊追蹤
|
||||
error.copyStack=複製堆疊追蹤
|
||||
error.githubSubmit=GitHub - 提交工單
|
||||
error.discordSubmit=Discord - 提交支援帖子
|
||||
|
||||
|
||||
@@ -12,7 +12,9 @@ system:
|
||||
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
|
||||
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'
|
||||
|
||||
#ui:
|
||||
# appName: exampleAppName # Application's visible name
|
||||
# homeDescription: I am a description # Short description or tagline shown on homepage.
|
||||
|
||||
@@ -89,3 +89,38 @@
|
||||
.jumbotron {
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
6
src/main/resources/static/images/flags/ua.svg
Normal file
6
src/main/resources/static/images/flags/ua.svg
Normal 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 |
1
src/main/resources/static/images/update.svg
Normal file
1
src/main/resources/static/images/update.svg
Normal 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 |
82
src/main/resources/static/js/cacheFormInputs.js
Normal file
82
src/main/resources/static/js/cacheFormInputs.js
Normal 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);
|
||||
});
|
||||
});
|
||||
@@ -30,19 +30,39 @@ async function getLatestReleaseVersion() {
|
||||
|
||||
async function checkForUpdate() {
|
||||
// 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) {
|
||||
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();
|
||||
console.log("latestVersion=" + latestVersion);
|
||||
console.log("currentVersion=" + currentVersion);
|
||||
console.log("compareVersions(latestVersion, currentVersion) > 0)=" + compareVersions(latestVersion, currentVersion));
|
||||
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");
|
||||
} else {
|
||||
if (updateLink !== null) {
|
||||
if (!updateLink.classList.contains("visually-hidden")) {
|
||||
updateLink.classList.add("visually-hidden");
|
||||
}
|
||||
}
|
||||
console.log("hidden");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -46,6 +46,12 @@ function reorderCards() {
|
||||
cards.sort(function (a, b) {
|
||||
var aIsFavorite = localStorage.getItem(a.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) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -31,3 +31,12 @@ document.getElementById("boredWaiting").addEventListener("change", function () {
|
||||
boredWaiting = this.checked ? "enabled" : "disabled";
|
||||
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);
|
||||
});
|
||||
|
||||
|
||||
@@ -17,6 +17,13 @@
|
||||
<p th:text="#{pdfToPDFA.tip}"></p>
|
||||
<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 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>
|
||||
<button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{pdfToPDFA.submit}"></button>
|
||||
</form>
|
||||
@@ -28,4 +35,4 @@
|
||||
<th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
|
||||
@@ -19,14 +19,13 @@
|
||||
<div class="mb-3">
|
||||
<label th:text="#{PDFToText.selectText.1}"></label>
|
||||
<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>
|
||||
</select>
|
||||
</div>
|
||||
<br>
|
||||
<button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{PDFToText.submit}"></button>
|
||||
</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>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<!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='404 - Page Not Found | Oops, we tripped in the code!')}"></th:block>
|
||||
<th:block th:insert="~{fragments/common :: head(title=#{error.404.head})}"></th:block>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
@@ -11,25 +11,17 @@
|
||||
<div th:insert="~{fragments/errorBanner.html :: errorBanner}"></div>
|
||||
<div class="container">
|
||||
<div id="support-section">
|
||||
<h1 class="display-2">Oops!</h1>
|
||||
<p class="lead" th:if="${param.status == '404'}">
|
||||
We can't seem to find the page you're looking for.
|
||||
</p>
|
||||
<p class="lead" th:unless="${param.status == '404'}">
|
||||
Something went wrong
|
||||
</p>
|
||||
<h1 class="display-2" th:text="#{oops}"></h1>
|
||||
<p class="lead" th:if="${param.status == '404'}" th:text="#{error.404.1}"></p>
|
||||
<p class="lead" th:unless="${param.status == '404'}" th:text="#{error.404.2}"></p>
|
||||
<br>
|
||||
<h2>Need help / Found a issue?</h2>
|
||||
<p>
|
||||
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:
|
||||
</p>
|
||||
<h2 th:text="#{error.needHelp}"></h2>
|
||||
<p th:text="#{error.contactTip}"></p>
|
||||
<div id="button-group">
|
||||
<a href="https://github.com/Stirling-Tools/Stirling-PDF/issues" id="github-button" target="_blank">Submit a ticket on GitHub</a>
|
||||
<a href="https://discord.gg/Cn8pWhQRxZ" id="discord-button" target="_blank">Join our Discord server</a>
|
||||
<a href="https://github.com/Stirling-Tools/Stirling-PDF/issues" id="github-button" target="_blank" th:text="#{error.github}"></a>
|
||||
<a href="https://discord.gg/Cn8pWhQRxZ" id="discord-button" target="_blank" th:text="#{joinDiscord}"></a>
|
||||
</div>
|
||||
<a href="/" class="home-button">Go back to homepage</a>
|
||||
<a href="/" class="home-button" th:text="#{goHomepage}"></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
|
||||
<!-- Help Modal -->
|
||||
<link rel="stylesheet" href="css/errorBanner.css">
|
||||
|
||||
<script src="js/cacheFormInputs.js"></script>
|
||||
<script src="js/tab-container.js"></script>
|
||||
<script src="js/darkmode.js"></script>
|
||||
</th:block>
|
||||
|
||||
@@ -4,8 +4,8 @@
|
||||
<div id="errorContainer" th:if="${message}" class="alert alert-danger alert-dismissible fade show" role="alert">
|
||||
<h4 class="alert-heading" th:text="'Error: ' + ${status} + ' ' + ${error}"></h4>
|
||||
<p th:text="${message} + ' for path: ' + ${path}"></p>
|
||||
<button type="button" class="btn btn-danger" th:if="${trace}" onclick="toggletrace()">Show Stack Trace</button>
|
||||
<button type="button" class="btn btn-secondary" th:if="${trace}" onclick="copytrace()">Copy Stack Trace</button>
|
||||
<button type="button" class="btn btn-danger" th:if="${trace}" onclick="toggletrace()" th:text="#{error.showStack}"></button>
|
||||
<button type="button" class="btn btn-secondary" th:if="${trace}" onclick="copytrace()" th:text="#{error.copyStack}"></button>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close" onclick="dismissError()"></button>
|
||||
<!-- Stack trace section -->
|
||||
<div id="trace" th:if="${trace}" style="max-height: 0; overflow: hidden;">
|
||||
@@ -13,8 +13,8 @@
|
||||
<pre id="traceContent" th:text="${trace}"></pre>
|
||||
</div>
|
||||
<!-- Buttons to submit a ticket on GitHub and join Discord server -->
|
||||
<a href="https://github.com/Stirling-Tools/Stirling-PDF/issues" id="github-button" target="_blank">Submit a ticket on GitHub</a>
|
||||
<a href="https://discord.gg/Cn8pWhQRxZ" id="discord-button" target="_blank">Join our Discord server</a>
|
||||
<a href="https://github.com/Stirling-Tools/Stirling-PDF/issues" id="github-button" target="_blank" th:text="#{error.github}"></a>
|
||||
<a href="https://discord.gg/Cn8pWhQRxZ" id="discord-button" target="_blank" th:text="#{joinDiscord}"></a>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
<th:block th:fragment="errorBannerPerPage">
|
||||
<div id="errorContainer" class="alert alert-danger alert-dismissible fade show" role="alert" style="display: none;">
|
||||
<h4 class="alert-heading">Error</h4>
|
||||
<h4 class="alert-heading" th:text="#{error}"></h4>
|
||||
<p></p>
|
||||
<button type="button" class="btn btn-danger" onclick="toggletrace()">Show Stack Trace</button>
|
||||
<button type="button" class="btn btn-secondary" onclick="copytrace()">Copy Stack Trace</button>
|
||||
<button type="button" class="btn btn-info" onclick="showHelp()">Help</button>
|
||||
<button type="button" class="btn btn-danger" onclick="toggletrace()" th:text="#{error.showStack}"></button>
|
||||
<button type="button" class="btn btn-secondary" onclick="copytrace()" th:text="#{error.copyStack}"></button>
|
||||
<button type="button" class="btn btn-info" onclick="showHelp()" th:text="#{help}"></button>
|
||||
<button type="button" class="close" data-bs-dismiss="alert" aria-label="Close" onclick="dismissError()">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
@@ -20,7 +20,7 @@
|
||||
<div class="modal-dialog modal-dialog-centered" role="document" id="helpModalDialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="helpModalLabel">Help</h5>
|
||||
<h5 class="modal-title" id="helpModalLabel" th:text="#{help}"></h5>
|
||||
<button type="button" class="close" data-bs-dismiss="modal" aria-label="Close">
|
||||
<span aria-hidden="true">×</span>
|
||||
</button>
|
||||
@@ -28,17 +28,17 @@
|
||||
<div class="modal-body">
|
||||
<div class="container">
|
||||
<div id="support-section">
|
||||
<h1 class="display-2">Oops!</h1>
|
||||
<p class="lead">Sorry for the issue!.</p>
|
||||
<h1 class="display-2" th:text="#{oops}"></h1>
|
||||
<p class="lead" th:text="#{error.sorry}"></p>
|
||||
<br>
|
||||
<h2>Need help / Found an issue?</h2>
|
||||
<p>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:</p>
|
||||
<h2 th:text="#{error.needHelp}"></h2>
|
||||
<p th:text="#{error.contactTip}"></p>
|
||||
<div id="button-group">
|
||||
<a href="https://github.com/Stirling-Tools/Stirling-PDF/issues" id="github-button" target="_blank">GitHub - Submit a ticket</a>
|
||||
<a href="https://discord.gg/Cn8pWhQRxZ" id="discord-button" target="_blank">Discord - Submit Support post</a>
|
||||
<a href="https://github.com/Stirling-Tools/Stirling-PDF/issues" id="github-button" target="_blank" th:text="#{error.githubSubmit}"></a>
|
||||
<a href="https://discord.gg/Cn8pWhQRxZ" id="discord-button" target="_blank" th:text="#{error.discordSubmit}"></a>
|
||||
</div>
|
||||
<a href="/" class="home-button">Go to Homepage</a>
|
||||
<a data-bs-dismiss="modal" class="home-button">Close</a>
|
||||
<a href="/" class="home-button" th:text="#{goHomepage}"></a>
|
||||
<a data-bs-dismiss="modal" class="home-button" th:text="#{close}"></a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user